mathgl-8.0.1/0000775000175000017500000000000014167366474012604 5ustar balakinbalakinmathgl-8.0.1/mathgl_ru.po0000664000175000017500000060211414167366465015132 0ustar balakinbalakin# Russian translations for MathGL2 package. # Copyright (C) 2017 THE MathGL2'S COPYRIGHT HOLDER # This file is distributed under the same license as the MathGL2 package. # Alexey Balakin , 2017. # msgid "" msgstr "" "Project-Id-Version: MathGL2 2.4.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-27 05:03+0300\n" "PO-Revision-Date: 2017-04-19 01:17+0300\n" "Last-Translator: Alexey Balakin \n" "Language-Team: Russian\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #: mgllab/mgllab.cpp:424 #, c-format msgid "" "\t-1 str set str as argument $1 for script\n" "\t... ...\n" "\t-9 str set str as argument $9 for script\n" "\t-L loc set locale to loc\n" "\t-h print this message\n" msgstr "" "\t-1 str установить аргумент $1 равным str\n" "\t... ...\n" "\t-9 str установить аргумент $9 равным str\n" "\t-L loc изменить локаль на loc\n" "\t-h показать справку \n" #: utils/mglconv.cpp:86 #, c-format msgid "" "\t-1 str set str as argument $1 for script\n" "\t... ...\n" "\t-9 str set str as argument $9 for script\n" "\t-L loc set locale to loc\n" "\t-s fname set MGL script for setting up the plot\n" "\t-S val set scaling factor for images\n" "\t-q val set quality for output (val=0...9)\n" "\t-g val set gray-scale mode (val=0|1)\n" "\t-v val set variant of arguments\n" "\t-o name set output file name\n" "\t-n no default output (script should save results by itself)\n" "\t-A val add animation value val\n" "\t-C n1:n2:dn add animation value in range [n1,n2] with step dn\n" "\t-C n1:n2 add animation value in range [n1,n2] with step 1\n" "\t- get script from standard input\n" "\t-h print this message\n" msgstr "" "\t-1 str установить аргумент $1 равным str\n" "\t... ...\n" "\t-9 str установить аргумент $9 равным str\n" "\t-L loc изменить локаль на loc\n" "\t-s fname дополнительный скрипт с настройками графика\n" "\t-S val масштабирование для рисунка\n" "\t-q val качество рисунка по умолчанию (val=0...9)\n" "\t-g val режим оттенков серого (val=0|1)\n" "\t-v val задать вариант аргументов\n" "\t-o name имя файла для сохранения рисунка\n" "\t-n нет вывода по умолчанию (скрипт должен сохранить рисунок " "сам)\n" "\t-A val добавить значение val в анимацию\n" "\t-C n1:n2:dn добавить диапазон [n1,n2] с шагом dn анимацию\n" "\t-C n1:n2 добавить диапазон [n1,n2] с шагом 1 анимацию\n" "\t- загрузить скрипт из стандартного ввода\n" "\t-h показать справку\n" #: utils/mglview.cpp:85 #, c-format msgid "" "\t-1 str set str as argument $1 for script\n" "\t... ...\n" "\t-9 str set str as argument $9 for script\n" "\t-g val set gray-scale mode (val=0|1)\n" "\t-v val set variant of arguments\n" "\t-s opt set MGL script for setting up the plot\n" "\t-L loc set locale to loc\n" "\t- get script from standard input\n" "\t-h print this message\n" msgstr "" "\t-1 str установить аргумент $1 равным str\n" "\t... ...\n" "\t-9 str установить аргумент $9 равным str\n" "\t-g val режим оттенков серого (val=0|1)\n" "\t-v val задать вариант аргументов\n" "\t-s opt дополнительный скрипт с настройками графика\n" "\t-L loc изменить локаль на loc\n" "\t- загрузить скрипт из стандартного ввода\n" "\t-h показать справку\n" #: widgets/qt.cpp:876 msgid "" "\n" "(c) Alexey Balakin, 2007\n" "http://mathgl.sourceforge.net/" msgstr "" "\n" "(c) Алексей Балакин, 2007\n" "http://mathgl.sourceforge.net/" #: src/parser.cpp:1075 #, c-format msgid "" "\n" "Change temporary data in line %ld" msgstr "" "\n" "Попытка изменить временные данные в строке %ld" #: src/parser.cpp:1073 #, c-format msgid "" "\n" "String too long in line %ld" msgstr "" "\n" "Строковый аргумент слишком длинный в строке %ld" #: src/parser.cpp:1074 #, c-format msgid "" "\n" "Unbalanced ' in line %ld" msgstr "" "\n" "Лишняя кавычка ' в строке %ld" #: src/parser.cpp:1071 #, c-format msgid "" "\n" "Wrong argument(s) in line %ld" msgstr "" "\n" "Неправильные аргументы в строке %ld" #: src/parser.cpp:1072 #, c-format msgid "" "\n" "Wrong command in line %ld" msgstr "" "\n" "Неправильная команда в строке %ld" #: udav/mem_pnl.cpp:136 udav/dat_pnl.cpp:153 msgid " - UDAV preview" msgstr " - UDAV предпросмотр" #: udav/dat_pnl.cpp:152 msgid " - UDAV variable" msgstr " - UDAV переменная" #. o = new Fl_Button(420, yy, 90, 25, _(" Refresh")); o->callback(mem_update_cb,w); #. o->image(img_update); o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT); #. o->tooltip(_("Refresh list of variables.")); #: mgllab/help.cpp:180 msgid " Del.all" msgstr " Удал.все" #: mgllab/help.cpp:168 msgid " Delete" msgstr " Удалить" #: mgllab/help.cpp:162 msgid " Edit" msgstr " Правка" #: mgllab/help.cpp:165 msgid " Info" msgstr " Инфо" #: mgllab/help.cpp:171 msgid " New" msgstr " Новый" #: mgllab/help.cpp:174 msgid " Save" msgstr " Сохранить" #: mgllab/mgllab.cpp:233 msgid " Yes " msgstr "Да" #: udav/plot_pnl.cpp:192 #, c-format msgid "%d - %d of %d" msgstr "%d - %d из %d" #. : #: udav/style_dlg.cpp:316 mgllab/dialogs.cpp:208 msgid "' ' none" msgstr "' ' нет" #: udav/style_dlg.cpp:397 msgid "'#*' Y-sign" msgstr "'#*' знак Y" #: udav/style_dlg.cpp:398 msgid "'#+' squared plus" msgstr "'#+' плюс в квадрате" #: udav/style_dlg.cpp:396 msgid "'#.' circled dot" msgstr "'#.' точка в круге" #: udav/style_dlg.cpp:405 msgid "'#<' solid triangle left" msgstr "'#<' треуг.влево сплошной" #: udav/style_dlg.cpp:406 msgid "'#>' solid triangle right" msgstr "'#>' треуг.вправо сплошной" #: udav/style_dlg.cpp:404 msgid "'#^' solid triangle up" msgstr "'#^' треуг.вверх сплошной" #: udav/style_dlg.cpp:402 msgid "'#d' solid rhomb" msgstr "'#d' ромб сплошной" #: udav/style_dlg.cpp:407 msgid "'#o' solid circle" msgstr "'#o' круг" #: udav/style_dlg.cpp:401 msgid "'#s' solid square" msgstr "'#s' квадрат сплошной" #: udav/style_dlg.cpp:403 msgid "'#v' solid triangle down" msgstr "'#v' треуг.вниз сплошной" #: udav/style_dlg.cpp:399 msgid "'#x' squared cross" msgstr "'#x' крест в квадрате" #. D #: udav/style_dlg.cpp:354 mgllab/dialogs.cpp:245 msgid "'*' cross" msgstr "'*' крест" #. #: udav/style_dlg.cpp:387 mgllab/dialogs.cpp:215 msgid "'*' star" msgstr "'*' звезда" #. o #. - #: udav/style_dlg.cpp:341 udav/style_dlg.cpp:385 mgllab/dialogs.cpp:217 #: mgllab/dialogs.cpp:232 msgid "'+' plus" msgstr "'+' плюс" #. #: udav/style_dlg.cpp:340 mgllab/dialogs.cpp:231 msgid "'-' lines" msgstr "'-' линии" #. "-|;=ji: " #: udav/style_dlg.cpp:309 mgllab/dialogs.cpp:201 msgid "'-' solid" msgstr "'-' сплошная" #. d #: udav/style_dlg.cpp:384 mgllab/dialogs.cpp:221 msgid "'.' dot" msgstr "'.' точка" #. = #: udav/style_dlg.cpp:315 mgllab/dialogs.cpp:207 msgid "':' dots" msgstr "':' точками" #. j #. = #: udav/style_dlg.cpp:311 udav/style_dlg.cpp:343 mgllab/dialogs.cpp:204 #: mgllab/dialogs.cpp:234 msgid "';' dash" msgstr "';' пунктир" #. ~ #: udav/style_dlg.cpp:349 mgllab/dialogs.cpp:241 msgid "'<' left sign" msgstr "'<' знак влево" #. v #: udav/style_dlg.cpp:392 mgllab/dialogs.cpp:224 msgid "'<' triangle left" msgstr "'<' треуг.влево" #. + #: udav/style_dlg.cpp:342 mgllab/dialogs.cpp:233 msgid "'=' double lines" msgstr "'=' двойные линии" #. i #: udav/style_dlg.cpp:312 mgllab/dialogs.cpp:206 msgid "'=' small dash" msgstr "'=' мелкий пунктир" #. < #: udav/style_dlg.cpp:350 mgllab/dialogs.cpp:242 msgid "'>' right sign" msgstr "'>' знак вправо" #. < #: udav/style_dlg.cpp:393 mgllab/dialogs.cpp:225 msgid "'>' triangle right" msgstr "'>' треуг.вправо" #. _ #: udav/style_dlg.cpp:265 udav/style_dlg.cpp:288 mgllab/dialogs.cpp:188 msgid "'A' arrow" msgstr "'A' стрелка" #. S #: udav/style_dlg.cpp:271 udav/style_dlg.cpp:294 mgllab/dialogs.cpp:194 msgid "'D' rhomb" msgstr "'D' ромб" #. d #: udav/style_dlg.cpp:353 mgllab/dialogs.cpp:244 msgid "'D' solid rhomb" msgstr "'D' ромб сплошной" #. V #: udav/style_dlg.cpp:267 udav/style_dlg.cpp:290 mgllab/dialogs.cpp:191 msgid "'I' stop" msgstr "'I' стоп" #. A #: udav/style_dlg.cpp:268 udav/style_dlg.cpp:291 mgllab/dialogs.cpp:189 msgid "'K' size" msgstr "'K' размер" #. D #: udav/style_dlg.cpp:272 udav/style_dlg.cpp:295 mgllab/dialogs.cpp:195 msgid "'O' circle" msgstr "'O' круг" #. o #: udav/style_dlg.cpp:345 mgllab/dialogs.cpp:237 msgid "'O' solid circle" msgstr "'O' круг" #. s #: udav/style_dlg.cpp:347 mgllab/dialogs.cpp:239 msgid "'S' solid square" msgstr "'S' квадрат сплошной" #. T #: udav/style_dlg.cpp:270 udav/style_dlg.cpp:293 mgllab/dialogs.cpp:193 msgid "'S' square" msgstr "'S' квадрат" #. I #: udav/style_dlg.cpp:269 udav/style_dlg.cpp:292 mgllab/dialogs.cpp:192 msgid "'T' triangle" msgstr "'T' треугольник" #. K #: udav/style_dlg.cpp:266 udav/style_dlg.cpp:289 mgllab/dialogs.cpp:190 msgid "'V' back arrow" msgstr "'V' обр.стрелка" #. O #: mgllab/dialogs.cpp:196 msgid "'X' cross" msgstr "'X' крест" #. * #: udav/style_dlg.cpp:355 mgllab/dialogs.cpp:246 msgid "'^' hats" msgstr "'^' шляпы" #. . #: udav/style_dlg.cpp:391 mgllab/dialogs.cpp:222 msgid "'^' triangle up" msgstr "'^' треуг.вверх" #. "AVIKTSDO" #: udav/style_dlg.cpp:264 udav/style_dlg.cpp:287 mgllab/dialogs.cpp:187 msgid "'_' none" msgstr "'_' нет" #. s #. > #: udav/style_dlg.cpp:352 udav/style_dlg.cpp:389 mgllab/dialogs.cpp:220 #: mgllab/dialogs.cpp:243 msgid "'d' rhomb" msgstr "'d' ромб" #. ; #: udav/style_dlg.cpp:314 mgllab/dialogs.cpp:205 msgid "'i' small dash dot" msgstr "'i' точка-пунктир" #. | #. ; #: udav/style_dlg.cpp:313 udav/style_dlg.cpp:351 mgllab/dialogs.cpp:203 #: mgllab/dialogs.cpp:235 msgid "'j' dash dot" msgstr "'j' точка-штрих" #. * #. j #: udav/style_dlg.cpp:344 udav/style_dlg.cpp:394 mgllab/dialogs.cpp:216 #: mgllab/dialogs.cpp:236 msgid "'o' circle" msgstr "'o' окружность" #. x #. O #: udav/style_dlg.cpp:346 udav/style_dlg.cpp:388 mgllab/dialogs.cpp:219 #: mgllab/dialogs.cpp:238 msgid "'s' square" msgstr "'s' квадрат" #. ^ #: udav/style_dlg.cpp:390 mgllab/dialogs.cpp:223 msgid "'v' triangle down" msgstr "'v' треуг.вниз" #. + #: udav/style_dlg.cpp:386 mgllab/dialogs.cpp:218 msgid "'x' skew cross" msgstr "'x' косой крест" #. - #: udav/style_dlg.cpp:310 mgllab/dialogs.cpp:202 msgid "'|' long dash" msgstr "'|' штрихи" #. S #: udav/style_dlg.cpp:348 mgllab/dialogs.cpp:240 msgid "'~' waves" msgstr "'~' волны" #: src/parser.cpp:53 msgid "0 - special plot" msgstr "0 - специальные графики" #: src/parser.cpp:53 msgid "1 - other plot" msgstr "1 - прочие графики" #: src/parser.cpp:53 msgid "10 - dd plot" msgstr "10 - двойный графики" #: src/parser.cpp:53 msgid "11 - vector plot" msgstr "11 - векторные графики" #: src/parser.cpp:53 msgid "12 - axis" msgstr "12 - оси координат" #: src/parser.cpp:53 msgid "13 - primitives" msgstr "13 - примитивы" #: src/parser.cpp:53 msgid "14 - axis setup" msgstr "14 - настройка осей" #: src/parser.cpp:53 msgid "15 - text/legend" msgstr "15 - текст/легенда" #: src/parser.cpp:53 msgid "16 - data transform" msgstr "16 - преобразования данных" #: udav/info_dlg.cpp:49 msgid "1D plot" msgstr "1D график" #: udav/newcmd_dlg.cpp:166 mgllab/dialogs.cpp:707 msgid "1D plots" msgstr "1D графики" #: mgllab/help.cpp:341 msgid "1D view" msgstr "1D вид" #: src/parser.cpp:53 msgid "2 - setup" msgstr "2 - настройки" #: udav/info_dlg.cpp:49 msgid "2D plot" msgstr "2D график" #: udav/newcmd_dlg.cpp:167 mgllab/dialogs.cpp:708 msgid "2D plots" msgstr "2D графики" #: mgllab/help.cpp:343 msgid "2D view" msgstr "2D вид" #: src/parser.cpp:53 msgid "3 - data handle" msgstr "3 - изменение данных" #: udav/open_dlg.cpp:71 msgid "3D data with sizes from file" msgstr "3D данные с размерами из файла" #: udav/newcmd_dlg.cpp:168 mgllab/dialogs.cpp:709 msgid "3D plots" msgstr "3D графики" #: mgllab/help.cpp:345 msgid "3D view" msgstr "3D вид" #: src/parser.cpp:53 msgid "4 - data create" msgstr "4 - создание данных" #: src/parser.cpp:53 msgid "5 - subplot" msgstr "5 - картинка в картинке" #: src/parser.cpp:53 msgid "6 - program flow" msgstr "6 - команды управления" #: src/parser.cpp:53 msgid "7 - 1d plot" msgstr "7 - 1D графики" #: src/parser.cpp:53 msgid "8 - 2d plot" msgstr "8 - 2D графики" #: src/parser.cpp:53 msgid "9 - 3d plot" msgstr "9 - 3D графики" #: udav/udav_wnd.cpp:455 msgid "" "
(c) Alexey Balakin, 2007-present

License is GPL v.2 or later." msgstr "" "
(c) Алексей Балакин, 2007-наст.вр.

Лицензия GPL v.2 или более поздняя." #: mgllab/help.cpp:285 msgid "@<- Prev" msgstr "@<- Пред." #: widgets/qt.cpp:1294 udav/udav_wnd.cpp:331 mgllab/mgllab.cpp:338 msgid "About" msgstr "О программе" #. ----------------------------------------------------------------------------- #: widgets/qt.cpp:880 widgets/qt.cpp:1295 udav/udav_wnd.cpp:332 #: udav/udav_wnd.cpp:460 msgid "About Qt" msgstr "О версии Qt" #: widgets/qt.cpp:1173 udav/plot_pnl.cpp:373 msgid "Add arc" msgstr "Добавить дугу" #: widgets/qt.cpp:1176 udav/plot_pnl.cpp:376 msgid "Add arc which properties can be changed later by mouse." msgstr "Добавить дугу. Ее свойства можно изменить позже мышью." #: mgllab/dialogs.cpp:84 msgid "Add command option(s)" msgstr "Добавить опции команды" #: widgets/qt.cpp:1178 udav/plot_pnl.cpp:379 msgid "Add curve" msgstr "Добавить кривую" #: widgets/qt.cpp:1181 udav/plot_pnl.cpp:382 msgid "Add curve which properties can be changed later by mouse." msgstr "Добавить кривую. Ее свойства можно изменить позже мышью." #: src/exec_dat.cpp:1728 msgid "Add data or number" msgstr "Прибавить массив или число" #: widgets/qt.cpp:1193 udav/plot_pnl.cpp:397 msgid "Add ellipse" msgstr "Добавить эллипс" #: widgets/qt.cpp:1196 udav/plot_pnl.cpp:400 udav/plot_pnl.cpp:406 msgid "Add ellipse which properties can be changed later by mouse." msgstr "Добавить эллипс. Его свойства можно изменить позже мышью." #: mgllab/dialogs.cpp:1229 msgid "Add inplot" msgstr "Добавить под-график" #: src/exec_set.cpp:808 msgid "Add legend entry" msgstr "Добавить запись легенды" #: mgllab/dialogs.cpp:119 msgid "Add legend entry for the plot" msgstr "Добавить запись легенды для графика" #: widgets/qt.cpp:1168 udav/plot_pnl.cpp:367 msgid "Add line" msgstr "Добавить линию" #: widgets/qt.cpp:1171 udav/plot_pnl.cpp:370 msgid "Add line which properties can be changed later by mouse." msgstr "Добавить линию. Ее свойства можно изменить позже мышью." #: widgets/qt.cpp:1203 udav/plot_pnl.cpp:409 msgid "Add mark" msgstr "Добавить маркер" #: widgets/qt.cpp:1206 udav/plot_pnl.cpp:412 msgid "Add marker which properties can be changed later by mouse." msgstr "Добавить маркер. Его свойства можно изменить позже мышью." #: widgets/qt.cpp:1198 udav/plot_pnl.cpp:403 msgid "Add polygon" msgstr "Добавить полигон" #: widgets/qt.cpp:1201 msgid "Add polygon which properties can be changed later by mouse." msgstr "Добавить полигон. Его свойства можно изменить позже мышью." #: mgllab/dialogs.cpp:1453 msgid "Add primitive" msgstr "Добавить примитивы" #: widgets/qt.cpp:1183 udav/plot_pnl.cpp:385 msgid "Add rect" msgstr "Добавить прямоугольник" #: widgets/qt.cpp:1186 udav/plot_pnl.cpp:388 msgid "Add rectangle which properties can be changed later by mouse." msgstr "Добавить прямоугольник. Его свойства можно изменить позже мышью." #: widgets/qt.cpp:1188 udav/plot_pnl.cpp:391 msgid "Add rhombus" msgstr "Добавить ромб" #: widgets/qt.cpp:1191 udav/plot_pnl.cpp:394 msgid "Add rhombus which properties can be changed later by mouse." msgstr "Добавить ромб. Его свойства можно изменить позже мышью." #: widgets/qt.cpp:1208 udav/plot_pnl.cpp:415 msgid "Add text" msgstr "Добавить текст" #: widgets/qt.cpp:1211 udav/plot_pnl.cpp:418 msgid "Add text which properties can be changed later by mouse." msgstr "Добавить текст. Его свойства можно изменить позже мышью." #: src/exec_prm.cpp:663 msgid "Add title for current subplot/inplot" msgstr "Добавить заголовок к текущему под-графику" #: mgllab/table.cpp:796 msgid "Add to" msgstr "Добавить к" #: src/exec_set.cpp:809 msgid "Add user-defined symbol" msgstr "Добавить пользовательский символ" #: widgets/fltk.cpp:883 msgid "Adjust picture size to fill drawing area" msgstr "Подогнать размер картинки под область окна" #: widgets/fltk.cpp:846 widgets/qt.cpp:1156 udav/plot_pnl.cpp:338 msgid "Adjust size" msgstr "Подогнать размер" #: src/exec_set.cpp:810 msgid "Adjust ticks for best view" msgstr "Подобрать метки осей для лучшего вида" #: udav/calc_dlg.cpp:193 msgid "Airy and Gamma" msgstr "Эйри и Гамма" #: src/window.cpp:417 msgid "" "All indexes (of data arrays, subplots and so on) are always start from 0." msgstr "Все индексы (данных, под-графиков и пр.) всегда начинаются с 0." #. graphics menu #: widgets/qt.cpp:1115 udav/opt_dlg.cpp:51 udav/setup_dlg.cpp:109 #: udav/plot_pnl.cpp:291 mgllab/dialogs.cpp:109 msgid "Alpha" msgstr "" #: mgllab/dialogs.cpp:110 msgid "Alpha value (transparency) of surface or cloud" msgstr "Значение прозрачности для поверхностей и облаков" #: udav/setup_dlg.cpp:93 mgllab/dialogs.cpp:1003 msgid "AlphaDef" msgstr "" #: udav/opt_dlg.cpp:56 udav/setup_dlg.cpp:95 mgllab/dialogs.cpp:111 #: mgllab/dialogs.cpp:1004 msgid "Ambient" msgstr "Фон.свет" #: udav/subplot_dlg.cpp:167 msgid "Angle around x axis (in degrees)" msgstr "Угол относительно оси x (в градусах)" #: udav/subplot_dlg.cpp:171 msgid "Angle around z axis (in degrees)" msgstr "Угол относительно оси z (в градусах)" #. animation menu #: widgets/qt.cpp:1261 widgets/qt.cpp:1262 udav/plot_pnl.cpp:560 #: mgllab/mathgl.cpp:185 msgid "Animation" msgstr "Анимация" #: mgllab/table.cpp:788 msgid "Another" msgstr "Другой" #: mgllab/table.cpp:854 msgid "Apply operator (smoothing, integration, difference ...) to data" msgstr "" "Применить к данным оператор (сглаживание, интегрирование, дифференцирование " "и пр.)" #: mgllab/dialogs.cpp:103 msgid "Approximate number of mesh lines in plot" msgstr "Примерное число линий сетки на графике" #: mgllab/help.cpp:135 msgid "Are you sure that you want to delete ALL data arrays?" msgstr "Вы уверены, что хотите удалит ВСЕ данные?" #: udav/newcmd_dlg.cpp:67 msgid "Argument" msgstr "Аргумент" #: mgllab/dialogs.cpp:738 msgid "Arguments" msgstr "Аргументы" #: udav/style_dlg.cpp:63 mgllab/dialogs.cpp:321 msgid "Arrow at end" msgstr "Стрелка кон." #. g->setColStretch(0, 1); g->setColStretch(1, 1); g->setColStretch(2, 1); #: udav/style_dlg.cpp:61 mgllab/dialogs.cpp:315 msgid "Arrow at start" msgstr "Стрелка нач." #: widgets/qt.cpp:1154 msgid "Ask to stop plot drawing (F7)." msgstr "Запрос на остановку рисования (F7)" #: udav/subplot_dlg.cpp:175 msgid "Aspect" msgstr "Соотношение сторон" #: udav/subplot_dlg.cpp:178 msgid "Aspect ratio of x-scale to z-scale" msgstr "Соотношение сторон по x и z" #: udav/subplot_dlg.cpp:182 msgid "Aspect ratio of y-scale to z-scale" msgstr "Соотношение сторон по y и z" #: mgllab/dialogs.cpp:1298 msgid "Aspect x/z" msgstr "Стороны x/z" #: src/exec_set.cpp:816 msgid "Attach light settings to inplot" msgstr "Привязать настройки света к под-графику" #: udav/open_dlg.cpp:60 msgid "Auto detect data sizes" msgstr "Автоматически определят размер данных" #: udav/open_dlg.cpp:177 msgid "Auto detect data sizes (%1 x %2 x %3)" msgstr "Автоматически определят размер данных (%1 x %2 x %3)" #: udav/prop_dlg.cpp:100 msgid "AutoKey" msgstr "" #: udav/prop_dlg.cpp:159 msgid "Automatically execute script after loading" msgstr "Выполнить скрипт после загрузки" #: udav/prop_dlg.cpp:165 msgid "Automatically save before redrawing (F5)" msgstr "Сохранять скрипт перед рисованием (F5)" #: src/data.cpp:1557 #, c-format msgid "" "Averages are:\n" " = %g\t = %g\t = %g\t = %g\n" msgstr "Средние: = %g\t = %g\t = %g\t = %g\n" #: udav/style_dlg.cpp:122 mgllab/dialogs.cpp:340 msgid "Axial direction" msgstr "Ось вращения" #: udav/setup_dlg.cpp:101 msgid "AxialDir" msgstr "Ось вращ." #: mgllab/dialogs.cpp:1008 msgid "Axis" msgstr "Оси" #: udav/newcmd_dlg.cpp:176 mgllab/dialogs.cpp:717 msgid "Axis and colorbar" msgstr "Оси и цв.шкала" #: udav/newcmd_dlg.cpp:177 mgllab/dialogs.cpp:718 mgllab/dialogs.cpp:949 msgid "Axis setup" msgstr "Настройка осей" #. W #: udav/style_dlg.cpp:237 mgllab/dialogs.cpp:45 msgid "B - navy" msgstr "B - темно-синий" #: udav/help_pnl.cpp:48 msgid "Backward" msgstr "Назад" #: src/font.cpp:1005 #, c-format msgid "Bad '%ls' at %zu\n" msgstr "Неправильный '%ls' при %zu\n" #: src/parser.cpp:778 #, c-format msgid "Bad arguments for %ls: %ld instead of %d\n" msgstr "Неправильные аргументы для %ls: %ld вместо %d\n" #: udav/setup_dlg.cpp:97 msgid "BaseWidth" msgstr "Баз.Ширина" #: udav/calc_dlg.cpp:192 msgid "Basic" msgstr "Базовые" #: mgllab/dialogs.cpp:1461 msgid "Begin" msgstr "Начало" #: src/parser.cpp:1492 msgid "Begin of do-while loop" msgstr "Начало цикла do-while" #: udav/calc_dlg.cpp:193 msgid "Bessel" msgstr "Бессель" #: udav/style_dlg.cpp:157 mgllab/dialogs.cpp:368 msgid "Bold style" msgstr "Жирный шрифт" #: udav/opt_dlg.cpp:115 msgid "Both fields in crange must be filled" msgstr "Оба поля в crange должны быть заполнены" #: udav/opt_dlg.cpp:94 msgid "Both fields in xrange must be filled" msgstr "Оба поля в xrange должны быть заполнены" #: udav/opt_dlg.cpp:101 msgid "Both fields in yrange must be filled" msgstr "Оба поля в yrange должны быть заполнены" #: udav/opt_dlg.cpp:108 msgid "Both fields in zrange must be filled" msgstr "Оба поля в zrange должны быть заполнены" #: src/parser.cpp:1489 msgid "Break for-loop" msgstr "Прервать выполнение цикла for" #: udav/setup_dlg.cpp:122 mgllab/dialogs.cpp:1069 msgid "Brightness" msgstr "Яркость" #: mgllab/dialogs.cpp:401 msgid "Brightness of i-th color" msgstr "Яркость i-го цвета" #: mgllab/table.cpp:768 msgid "By formula" msgstr "По формуле" #. R #: udav/style_dlg.cpp:240 mgllab/dialogs.cpp:48 msgid "C - teal" msgstr "C - бирюзовый" #: udav/setup_dlg.cpp:51 mgllab/dialogs.cpp:989 msgid "C axis" msgstr "Цв. ось" #: udav/opt_dlg.cpp:47 mgllab/dialogs.cpp:97 msgid "C-range" msgstr "Цв.диапазон" #: widgets/qt.cpp:1280 msgid "Calculations" msgstr "Вычисления" #. TODO #. connect(hidden,SIGNAL(cursorPositionChanged()),this,SLOT(hiddenClicked())); #: udav/udav_wnd.cpp:194 udav/udav_wnd.cpp:206 mgllab/mgllab.cpp:332 #: mgllab/mgllab.cpp:567 msgid "Calculator" msgstr "Калькулятор" #: udav/anim_dlg.cpp:67 udav/prop_dlg.cpp:180 udav/args_dlg.cpp:63 #: udav/newcmd_dlg.cpp:78 udav/open_dlg.cpp:90 udav/dat_pnl.cpp:460 #: udav/dat_pnl.cpp:510 udav/dat_pnl.cpp:552 udav/dat_pnl.cpp:629 #: udav/opt_dlg.cpp:78 udav/setup_dlg.cpp:145 udav/files_dlg.cpp:58 #: udav/style_dlg.cpp:206 udav/data_dlg.cpp:90 udav/subplot_dlg.cpp:219 #: mgllab/editor.cpp:286 mgllab/mathgl.cpp:166 mgllab/mathgl.cpp:197 #: mgllab/dialogs.cpp:120 mgllab/dialogs.cpp:164 mgllab/dialogs.cpp:410 #: mgllab/dialogs.cpp:584 mgllab/dialogs.cpp:749 mgllab/dialogs.cpp:1071 #: mgllab/dialogs.cpp:1318 mgllab/dialogs.cpp:1473 mgllab/mgllab.cpp:490 #: mgllab/table.cpp:101 mgllab/table.cpp:179 mgllab/table.cpp:353 #: mgllab/table.cpp:556 mgllab/table.cpp:619 mgllab/table.cpp:675 msgid "Cancel" msgstr "Отмена" #: src/crust.cpp:617 msgid "Cannot triangulate this set!" msgstr "Не могу построить триангуляцию!" #: udav/udav_wnd.cpp:226 mgllab/mgllab.cpp:361 mgllab/mgllab.cpp:362 msgid "Canvas" msgstr "График" #: udav/subplot_dlg.cpp:59 udav/subplot_dlg.cpp:101 udav/subplot_dlg.cpp:118 #: udav/subplot_dlg.cpp:135 msgid "Cell index" msgstr "Индекс ячейки" #: mgllab/table.cpp:103 mgllab/table.cpp:558 mgllab/table.cpp:772 msgid "Change" msgstr "Изменить" #: mgllab/table.cpp:104 msgid "Change (resize) data" msgstr "Изменить размер данных" #: widgets/qt.cpp:1158 udav/plot_pnl.cpp:340 msgid "Change canvas size to fill whole region (F6)." msgstr "Подогнать размер рисунка под размер окна (F6)." #: src/exec_set.cpp:820 msgid "Change current directory" msgstr "Сменить директорию" #: mgllab/table.cpp:168 msgid "Change data" msgstr "Изменить данные" #: mgllab/table.cpp:91 msgid "Change data sizes" msgstr "Изменить размер данных" #: mgllab/table.cpp:559 mgllab/table.cpp:622 mgllab/table.cpp:678 msgid "Change data values and close this window" msgstr "Изменить данные и закрыть окно" #: udav/prop_dlg.cpp:71 msgid "Change font" msgstr "Изменить шрифт" #: src/exec_set.cpp:873 msgid "Change view angles - use 'rotate' for plot rotation" msgstr "Изменяет углы обзора, а не поворот как 'rotate'" #: udav/calc_dlg.cpp:68 msgid "Clear" msgstr "Очистить" #: udav/text_pnl.cpp:527 msgid "Clear all" msgstr "Удалить все" #: src/exec_set.cpp:821 msgid "Clear legend entries" msgstr "Удалить записи легенды" #: src/exec_set.cpp:822 msgid "Clear picture" msgstr "Очистить рисунок" #. o = new Fl_Button(180, 130, 25, 25);o->image(img_save); o->tooltip("img_save"); #: widgets/fltk.cpp:1118 widgets/qt.cpp:1108 udav/find_dlg.cpp:52 #: udav/hint_dlg.cpp:52 mgllab/editor.cpp:570 mgllab/help.cpp:289 #: mgllab/help.cpp:349 mgllab/help.cpp:465 msgid "Close" msgstr "Закрыть" #: udav/dat_pnl.cpp:833 msgid "Close tab" msgstr "Закрыть вкладку" #: udav/dat_pnl.cpp:835 msgid "Close this data tab." msgstr "Закрыть вкладку с данными" #: udav/setup_dlg.cpp:121 udav/style_dlg.cpp:67 mgllab/dialogs.cpp:1068 #: mgllab/dialogs.cpp:1459 msgid "Color" msgstr "Цвет" #. g->setColStretch(0, 1); g->setColStretch(1, 1); #: udav/style_dlg.cpp:106 msgid "Color order" msgstr "Порядок цветов" #: udav/style_dlg.cpp:150 mgllab/dialogs.cpp:339 msgid "Color scheme" msgstr "Цветовая схема" #: mgllab/dialogs.cpp:384 msgid "Color(s) or color scheme" msgstr "Цвет(а) или цветовая схема" #: mgllab/dialogs.cpp:1002 msgid "Colors" msgstr "Цвета" #: mgllab/table.cpp:881 msgid "" "Colors denote values: magenta - local max, cyan - local min,\n" "\tred - Re(v)>0, blue - Re(v)<0, purple - Im(v)>0, teal - Im(v)<0." msgstr "" "Цветом выделены значения: фуксия - лок.максимум, голубой - лок.минимум,\n" "\tкрасный - Re(v)>0, синий - Re(v)<0, пурпурный - Im(v)>0, бирюзовый - " "Im(v)<0." #: mgllab/dialogs.cpp:577 msgid "Column expr" msgstr "" #: mgllab/dialogs.cpp:724 mgllab/mgllab.cpp:311 msgid "Command" msgstr "Команда" #: udav/newcmd_dlg.cpp:64 mgllab/dialogs.cpp:740 msgid "" "Command arguments. Bold ones are required arguments.\n" "Other are optional arguments but its order is required.\n" "You can use '' for default format. See help at right\n" "for default values." msgstr "" "Аргументы команды. Жирным обозначены обязательные аргументы.\n" "Прочие - опциональные, но их порядок фиксирован.\n" "Можно использовать '' для стиля по умолчанию.\n" "См. справку справа для значений по умолчанию." #: udav/text_pnl.cpp:575 msgid "Command options" msgstr "Опции команды" #: udav/prop_dlg.cpp:82 msgid "Comments" msgstr "Комментарий" #: src/exec_prm.cpp:651 msgid "Computes the attractor of an IFS" msgstr "Вычисляет точки фрактала IFS" #: src/exec_prm.cpp:652 msgid "Computes the attractor of an IFS for 3d case" msgstr "Вычисляет точки фрактала IFS в 3d случае" #: src/exec_prm.cpp:653 msgid "Computes the attractor of an IFS with parameters from *.ifs file" msgstr "Вычисляет точки фрактала IFS с параметрами из файла" #: src/exec_prm.cpp:647 msgid "Computes the flame fractal" msgstr "Вычисляет точки фрактала flame" #: src/parser.cpp:1508 msgid "Condition of do-while loop" msgstr "Условие do-while цикла" #: src/parser.cpp:1498 src/parser.cpp:1502 msgid "Conditional operator" msgstr "Условный оператор" #: udav/plot_pnl.cpp:359 msgid "Copy click coor." msgstr "Копировать коор. мыши" #: udav/plot_pnl.cpp:361 msgid "Copy coordinates of last mouse click to clipboard." msgstr "Копировать координаты последнего нажатия в буфер обмена" #: udav/dat_pnl.cpp:707 msgid "Copy data" msgstr "Копировать данные" #: src/exec_dat.cpp:1736 msgid "Copy data from another variable" msgstr "Копировать данные из другой переменной" #: widgets/fltk.cpp:843 msgid "Copy graphics" msgstr "Копировать рисунок" #: widgets/qt.cpp:1162 udav/plot_pnl.cpp:355 msgid "Copy graphics to clipboard (Ctrl+Shift+G)." msgstr "Копировать рисунок в буфер обмена (Ctrl+Shift+G)." #: widgets/fltk.cpp:887 msgid "Copy image to clipboard" msgstr "Копировать рисунок в буфер обмена" #: widgets/qt.cpp:1160 udav/plot_pnl.cpp:353 msgid "Copy plot" msgstr "Копировать рисунок" #: udav/dat_pnl.cpp:709 msgid "Copy range of numbers to clipboard (Ctrl+Shift+C)." msgstr "Копировать диапазон чисел в буфер обмена (Ctrl+Shift+C)." #: udav/text_pnl.cpp:535 msgid "Copy selected text or data to clipboard (Ctrl+C)." msgstr "Копировать выделенный текст или данные в буфер обмена (Ctrl+C)." #: mgllab/editor.cpp:516 msgid "Copy selection to clipboard" msgstr "Копировать выделение в буфер обмена" #: udav/text_pnl.cpp:533 mgllab/mgllab.cpp:301 msgid "Copy text" msgstr "Копировать текст" #: mgllab/table.cpp:780 msgid "Cos FFT" msgstr "Косинус-Фурье" #: udav/dat_pnl.cpp:621 msgid "Cos-Fourier transform along direction(s)" msgstr "Косинус-Фурье преобразование вдоль направления(й)" #: src/exec_dat.cpp:1738 msgid "Cos-Fourier transform at some direction" msgstr "Косинус-Фурье преобразование вдоль направления" #: mgllab/table.cpp:165 msgid "Cosine FFT" msgstr "Косинус-Фурье" #: udav/text_pnl.cpp:365 udav/text_pnl.cpp:482 msgid "Could not write to %1" msgstr "Не могу записать в %1" #: udav/setup_dlg.cpp:159 msgid "Could not write to file" msgstr "Не могу записать в файл" #: udav/udav_wnd.cpp:570 msgid "Couldn't change to folder " msgstr "Не могу сменить папку " #: udav/text_pnl.cpp:431 msgid "Couldn't open file " msgstr "Не могу открыть файл " #: mgllab/dialogs.cpp:1190 #, c-format msgid "Couldn't open file %s" msgstr "Не могу открыть файл %s" #: udav/newcmd_dlg.cpp:173 msgid "Create data and I/O" msgstr "Создание данных и I/O" #: mgllab/dialogs.cpp:714 msgid "Create data and IO" msgstr "Создание данных и ввод-вывод" #: src/exec_dat.cpp:1765 msgid "Create histogram (distribution) of data values" msgstr "Создать гистограмму (распределение) значений данных" #: udav/dat_pnl.cpp:766 mgllab/table.cpp:760 msgid "Create new" msgstr "Создать новый" #: src/exec_dat.cpp:1828 msgid "Create new 1D data and fill it in range" msgstr "Создать новые 1d данные и заполнить их в диапазоне" #: src/exec_dat.cpp:1782 msgid "Create new data" msgstr "Создать новый массив данных" #: udav/mem_pnl.cpp:58 msgid "Create new data array" msgstr "Создать новый массив данных" #: mgllab/table.cpp:838 msgid "Create new data with zero filling" msgstr "Создать новый массив данных, заполненный нулями" #: udav/udav_wnd.cpp:284 msgid "Create new empty script window (Ctrl+N)." msgstr "Создать новое окно скрипта (Ctrl+N)." #: src/parser.cpp:1503 msgid "Creates new variable from list of numbers or data" msgstr "Создать новый массив из списка значений или данных" #: udav/dat_pnl.cpp:784 mgllab/table.cpp:763 msgid "Crop" msgstr "Обрезать" #: mgllab/table.cpp:860 msgid "Crop (cut off edges) data" msgstr "Обрезать края массива данных" #: mgllab/table.cpp:607 msgid "Crop data" msgstr "Обрезать данные" #: src/exec_dat.cpp:1739 msgid "Crop edge of data" msgstr "Обрезать края массива данных" #: udav/dat_pnl.cpp:786 msgid "Crop the data edges. Useful to cut off the zero-filled area." msgstr "" "Обрезать края массива данных. Полезно для удаления краев заполненных нулями." #: mgllab/table.cpp:163 mgllab/table.cpp:774 msgid "CumSum" msgstr "" #: src/exec_dat.cpp:1740 msgid "Cumulative summation along direction(s)" msgstr "Накопительное суммирование данных по направлению" #: udav/prop_dlg.cpp:106 msgid "CurrLine" msgstr "Тек.строка" #: udav/prop_dlg.cpp:68 msgid "Current font" msgstr "Текущий шрифт" #: udav/text_pnl.cpp:530 msgid "Cut selected text to clipboard (Ctrl+X)." msgstr "Вырезать выбранный текст в буфер обмена (Ctrl+X)." #: udav/text_pnl.cpp:528 mgllab/mgllab.cpp:300 msgid "Cut text" msgstr "Вырезать текст" #: udav/opt_dlg.cpp:61 mgllab/dialogs.cpp:106 msgid "Cutting" msgstr "Обрезание" #: mgllab/help.cpp:255 mgllab/table.cpp:428 mgllab/table.cpp:457 msgid "" "DAT Files \t*.{dat,csv}\n" "HDF Files \t*.{h5,hdf}" msgstr "" "DAT файлы \t*.{dat,csv}\n" "HDF файлы \t*.{h5,hdf}" #: mgllab/dialogs.cpp:1465 msgid "Dash" msgstr "Пунктир" #: udav/style_dlg.cpp:62 mgllab/dialogs.cpp:318 msgid "Dashing" msgstr "Штриховка" #: udav/dat_pnl.cpp:66 msgid "Data" msgstr "Данные" #: udav/dat_pnl.cpp:249 udav/dat_pnl.cpp:271 msgid "" "Data files (*.dat)\n" "HDF5 files (*.h5 *.hdf)\n" "PNG files (*.png)\n" "All files (*.*)" msgstr "" "DAT файлы (*.dat)\n" "HDF5 файлы (*.h5 *.hdf)\n" "PNG файлы (*.png)\n" "Все файлы (*.*)" #: udav/newcmd_dlg.cpp:175 mgllab/dialogs.cpp:716 msgid "Data handling" msgstr "Изменение данных" #: mgllab/help.cpp:167 mgllab/table.cpp:851 msgid "Data information and preview." msgstr "Информация и просмотр данных." #: udav/open_dlg.cpp:56 udav/data_dlg.cpp:42 mgllab/dialogs.cpp:566 msgid "Data name" msgstr "Имя данных" #. mgl->autoResize = true; // TODO: something strange here !!! #: udav/info_dlg.cpp:43 msgid "Data preview" msgstr "Просмотр данных" #: udav/info_dlg.cpp:44 msgid "Data preview for current slice." msgstr "Просмотр текущего среза данных." #: udav/newcmd_dlg.cpp:174 mgllab/dialogs.cpp:715 msgid "Data transform" msgstr "Преобразование данных" #: udav/plot_pnl.cpp:557 msgid "Decrease \\phi angle by 10 degrees." msgstr "Уменьшить угол φ на 10 градусов." #: udav/plot_pnl.cpp:549 msgid "Decrease \\theta angle by 10 degrees." msgstr "Уменьшить угол θ на 10 градусов." #: mgllab/help.cpp:105 msgid "Decrease font size" msgstr "Уменьшить размер шрифта" #: src/parser.cpp:1494 msgid "Define constant or parameter" msgstr "Определит постоянную или параметр" #: src/parser.cpp:1493 msgid "Define parameter as character" msgstr "Определить параметр как символ" #: src/parser.cpp:1495 msgid "Define parameter as numerical value" msgstr "Определить параметр как значение выражения" #: src/parser.cpp:1488 msgid "Define parameter from user input" msgstr "Определить параметр по вводу пользователя" #: udav/anim_dlg.cpp:76 msgid "Delay (in ms)" msgstr "Задержка, мс" #: mgllab/mathgl.cpp:204 msgid "Delay (in sec)" msgstr "Задержка, с" #: mgllab/help.cpp:182 msgid "Delete @b all@. data arrays." msgstr "Удалить @b все@. массивы данных." #: udav/mem_pnl.cpp:64 msgid "Delete ALL data arrays" msgstr "Удалить ВСЕ массивы данных" #: src/exec_dat.cpp:1743 msgid "Delete data or slice of data" msgstr "Удалить данные или их срез" #: udav/plot_pnl.cpp:427 msgid "Delete selected" msgstr "Удалить выбранное" #: udav/mem_pnl.cpp:60 msgid "Delete selected data array" msgstr "Удалить выбранные данные" #: mgllab/help.cpp:170 msgid "Delete selected data." msgstr "Удалить выбранные данные." #: udav/plot_pnl.cpp:429 msgid "Delete selected plot." msgstr "Удалить выбранный график" #: mgllab/dialogs.cpp:734 msgid "Description" msgstr "Описание" #: src/exec_dat.cpp:1744 msgid "Detect curves for maximums of data array" msgstr "Найти кривые по максимумам массива данных" #: mgllab/table.cpp:164 mgllab/table.cpp:776 msgid "Difference" msgstr "Дифференцировать" #: udav/dat_pnl.cpp:616 msgid "Differentiate data along direction(s)" msgstr "Дифференцировать данные по направлению(ям)" #: udav/opt_dlg.cpp:58 mgllab/dialogs.cpp:113 mgllab/dialogs.cpp:1005 msgid "Diffuse" msgstr "Расс.свет" #: src/exec_dat.cpp:1748 msgid "Dilate data larger val" msgstr "Расширить данные большие val" #: src/exec_dat.cpp:1733 msgid "Direct multiplication of arrays" msgstr "Прямое произведение массивов" #: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:377 udav/dat_pnl.cpp:424 #: mgllab/dialogs.cpp:161 mgllab/table.cpp:549 msgid "Direction" msgstr "Направление" #: mgllab/table.cpp:551 msgid "Direction along which data will be filled" msgstr "Направление по которому данные будут заполняться" #: src/exec_set.cpp:830 msgid "Disable accurate primitive cutting at axis borders" msgstr "" #: udav/subplot_dlg.cpp:105 udav/subplot_dlg.cpp:122 msgid "Distance between cells" msgstr "Расстояние между ячейками" #: mgllab/table.cpp:799 msgid "Divide by" msgstr "Разделить на" #: src/exec_dat.cpp:1749 msgid "Divide by data or number" msgstr "Разделить данные поэлементно на массив или число" #: mgllab/table.cpp:180 mgllab/table.cpp:354 mgllab/table.cpp:677 msgid "Do" msgstr "OK" #: src/exec_dat.cpp:1817 msgid "Do STFA transform" msgstr "Выполнить преобразование STFA" #: src/exec_dat.cpp:1823 src/exec_dat.cpp:1824 msgid "Do integral transform of data" msgstr "Выполнить интегральное преобразование данных" #: mgllab/table.cpp:102 mgllab/table.cpp:557 mgllab/table.cpp:620 #: mgllab/table.cpp:676 msgid "Do nothing and close this window" msgstr "Закрыть это окно ничего не выполняя" #: udav/mem_pnl.cpp:122 msgid "Do you want to delete all data?" msgstr "Вы хотите удалить все данные?" #: udav/udav_wnd.cpp:341 udav/udav_wnd.cpp:580 udav/udav_wnd.cpp:622 msgid "Do you want to save the changes to the document?" msgstr "Вы хотите сохранить изменения в документе?" #: mgllab/editor.cpp:286 msgid "Don't Save" msgstr "Не сохранять" #: mgllab/table.cpp:164 msgid "Double diff." msgstr "Вторая производная" #: src/exec_gr.cpp:1213 msgid "Draw Bifurcation diagram" msgstr "Нарисовать бифуркационную диаграмму" #: src/exec_gr.cpp:1250 msgid "Draw Iris plots" msgstr "Нарисовать график Iris" #: src/exec_gr.cpp:1252 msgid "Draw Lamerey diagram" msgstr "Нарисовать диаграмму Ламерея" #: src/exec_gr.cpp:1257 msgid "Draw Open-High-Low-Close (OHLC) diagram" msgstr "Нарисовать диаграмму OHLC (Open-High-Low-Close)" #: src/exec_gr.cpp:1260 msgid "Draw Poincare map" msgstr "Нарисовать диаграмму Пуанкаре" #: src/exec_gr.cpp:1266 msgid "Draw STFA diagram" msgstr "Нарисовать диаграмму STFA" #: src/exec_gr.cpp:1278 msgid "Draw TeX mark at point position" msgstr "Нарисовать ТеХ символы в положении точек" #: src/exec_prm.cpp:629 msgid "Draw angle arc" msgstr "Нарисовать дугу" #: src/exec_gr.cpp:1206 msgid "Draw area plot for 1D data" msgstr "Закрасить область между кривой и осью" #: src/exec_gr.cpp:1209 msgid "Draw bars for 1D data" msgstr "Нарисовать график из вертикальных полос" #: src/exec_gr.cpp:1211 msgid "Draw belts" msgstr "Нарисовать поверхность ленточками" #: src/exec_gr.cpp:1212 msgid "Draw belts colored by other data" msgstr "Нарисовать поверхность ленточками с заданным цветом" #: src/exec_gr.cpp:1276 msgid "Draw binormales for 1D data" msgstr "Нарисовать нормаль и бинормаль для кривой" #: src/exec_prm.cpp:656 msgid "Draw bitmap (logo) along axis range" msgstr "Нарисовать растр (логотип) в области осей координат" #: src/exec_prm.cpp:633 msgid "Draw bounding box" msgstr "Нарисовать ограничивающий параллелепипед" #: src/exec_gr.cpp:1215 msgid "Draw boxes" msgstr "Нарисовать поверхность ящиками" #: src/exec_gr.cpp:1214 msgid "Draw boxplot for 2D data" msgstr "Нарисовать box-and-whisker диаграмму" #: src/exec_gr.cpp:1216 msgid "Draw candlestick chart" msgstr "Нарисовать свечной график" #: src/exec_gr.cpp:1217 msgid "Draw chart" msgstr "Нарисовать линейчатую (круговую) диаграмму" #: src/exec_prm.cpp:634 msgid "Draw circle" msgstr "Нарисовать окружность (круг)" #: src/exec_gr.cpp:1218 msgid "Draw cloud" msgstr "Нарисовать облако для 3D данных" #: src/exec_prm.cpp:636 msgid "Draw colorbar" msgstr "Нарисовать цветовую шкалу" #: src/exec_prm.cpp:637 msgid "Draw cone" msgstr "Нарисовать конус" #: src/exec_gr.cpp:1219 msgid "Draw cones for 1D data" msgstr "Нарисовать конусы для 1D данных" #: src/exec_gr.cpp:1220 msgid "Draw contour lines" msgstr "Нарисовать линии уровня" #: src/exec_gr.cpp:1230 msgid "Draw contour lines at x-slice (or x-plane)" msgstr "Нарисовать линии уровня на x-срезе" #: src/exec_gr.cpp:1231 msgid "Draw contour lines at y-slice (or y-plane)" msgstr "Нарисовать линии уровня на y-срезе" #: src/exec_gr.cpp:1232 msgid "Draw contour lines at z-slice (or z-plane)" msgstr "Нарисовать линии уровня на z-срезе" #: src/exec_gr.cpp:1221 msgid "Draw contour lines for 3D data" msgstr "Нарисовать линии уровня на срезах 3D данных" #: src/exec_gr.cpp:1283 msgid "Draw contour lines for surface of triangles" msgstr "Нарисовать линии уровня для поверхности из треугольников" #: src/exec_gr.cpp:1228 msgid "Draw contour lines on parametric surface" msgstr "Нарисовать линии уровня на параметрической поверхности" #: src/exec_gr.cpp:1229 msgid "Draw contour tubes" msgstr "Нарисовать цилиндры по линиям уровней" #: src/exec_gr.cpp:1284 msgid "Draw contour tubes for surface of triangles" msgstr "Нарисовать цилиндры по линиям уровней для поверхности из треугольников" #: src/exec_prm.cpp:638 msgid "Draw curve" msgstr "Нарисовать кривую" #: src/exec_gr.cpp:1286 msgid "Draw curve by tube" msgstr "Нарисовать трубу около кривой" #: src/exec_gr.cpp:1234 msgid "Draw curves of cross-section of isosurfaces a,b for 3D data" msgstr "Нарисовать линии пересечения поверхностей постоянного уровня" #: src/exec_gr.cpp:1235 msgid "Draw density plot" msgstr "Нарисовать график плотности" #: src/exec_gr.cpp:1236 msgid "Draw density plot at slices of 3D data" msgstr "Нарисовать график плотности на срезе 3D данных" #: src/exec_gr.cpp:1237 msgid "Draw density plot at x-slice (or x-plane)" msgstr "Нарисовать график плотности на x-срезе" #: src/exec_gr.cpp:1238 msgid "Draw density plot at y-slice (or y-plane)" msgstr "Нарисовать график плотности на y-срезе" #: src/exec_gr.cpp:1239 msgid "Draw density plot at z-slice (or z-plane)" msgstr "Нарисовать график плотности на z-срезе" #: src/exec_gr.cpp:1240 msgid "Draw dew plot" msgstr "Нарисовать векторное поле каплями" #: src/exec_gr.cpp:1241 msgid "Draw dots for arbitrary data points" msgstr "Нарисовать набор точек" #: src/exec_prm.cpp:639 msgid "Draw drop" msgstr "Нарисовать каплю" #: src/exec_prm.cpp:640 msgid "Draw ellipse" msgstr "Нарисовать эллипс" #: src/exec_prm.cpp:641 msgid "Draw error box" msgstr "Нарисовать размер ошибки" #: src/exec_gr.cpp:1242 msgid "Draw error boxes" msgstr "Нарисовать размеры ошибок для 1D данных" #: src/exec_prm.cpp:642 msgid "Draw face (quadrangle)" msgstr "Нарисовать грань (четырехугольник)" #: src/exec_prm.cpp:643 msgid "Draw face perpendicular to x-axis" msgstr "Нарисовать грань поперек оси x" #: src/exec_prm.cpp:644 msgid "Draw face perpendicular to y-axis" msgstr "Нарисовать грань поперек оси y" #: src/exec_prm.cpp:645 msgid "Draw face perpendicular to z-axis" msgstr "Нарисовать грань поперек оси z" #: src/exec_gr.cpp:1263 msgid "Draw filled region (ribbon) between 2 curves" msgstr "Закрасить область между двумя кривыми" #: src/exec_gr.cpp:1258 msgid "Draw flow pipes for vector field" msgstr "Нарисовать трубки тока для векторного поля" #: src/exec_gr.cpp:1244 msgid "Draw flow threads for vector field" msgstr "Нарисовать линии тока для векторного поля" #: src/exec_gr.cpp:1246 msgid "Draw flow threads from plain for vector field" msgstr "Нарисовать линии тока для векторного поля, начинающиеся с плоскости" #: src/exec_gr.cpp:1247 msgid "Draw gradient lines for scalar field" msgstr "Нарисовать линии градиента для скалярного поля" #: src/exec_prm.cpp:650 msgid "Draw grid" msgstr "Нарисовать сетку осей координат" #: src/exec_gr.cpp:1249 msgid "Draw grid at slices of 3D data" msgstr "Нарисовать сетку на срезе 3D данных" #: src/exec_gr.cpp:1248 msgid "Draw grid for data array(s)" msgstr "Нарисовать сетку для массива" #: src/exec_gr.cpp:1208 msgid "Draw horizontal bars for 1D data" msgstr "Нарисовать график из горизонтальных полос" #: src/exec_gr.cpp:1279 msgid "Draw horizontal tiles" msgstr "Нарисовать поверхность горизонтальными плитками" #: src/exec_gr.cpp:1280 msgid "Draw horizontal tiles with variable size" msgstr "Нарисовать поверхность плитками переменного размера" #: src/exec_gr.cpp:1268 msgid "Draw isosurface for 3D data" msgstr "Нарисовать поверхность постоянного уровня" #: src/exec_gr.cpp:1271 msgid "Draw isosurface for 3D data colored and transpared by other data" msgstr "Нарисовать поверхность уровня с заданными цветом и прозрачностью" #: src/exec_gr.cpp:1270 msgid "Draw isosurface for 3D data colored by other data" msgstr "Нарисовать поверхность уровня с заданным цветом" #: src/exec_gr.cpp:1269 msgid "Draw isosurface for 3D data transpared by other data" msgstr "Нарисовать поверхность уровня с заданной прозрачностью" #: src/exec_gr.cpp:1251 msgid "Draw label at arbitrary position" msgstr "Вывести надписи для 1D данных" #: src/exec_prm.cpp:635 msgid "Draw label for colorbar" msgstr "Вывести подпись colorbar" #: src/exec_prm.cpp:664 msgid "Draw label for t-axis" msgstr "Вывести подпись оси t" #: src/exec_prm.cpp:665 msgid "Draw label for x-axis" msgstr "Вывести подпись оси x" #: src/exec_prm.cpp:666 msgid "Draw label for y-axis" msgstr "Вывести подпись оси y" #: src/exec_prm.cpp:667 msgid "Draw label for z-axis" msgstr "Вывести подпись оси z" #: src/exec_prm.cpp:654 msgid "Draw legend" msgstr "Нарисовать легенду графика" #: src/exec_prm.cpp:655 msgid "Draw line" msgstr "Нарисовать прямую линию" #: src/exec_gr.cpp:1253 msgid "Draw lines with arrows for 1D data" msgstr "Нарисовать график из стрелок" #: src/exec_gr.cpp:1254 msgid "Draw mapping plot" msgstr "Нарисовать отображение матрицы" #: src/exec_gr.cpp:1255 msgid "Draw mark plot for 1D data" msgstr "Нарисовать маркеры переменного размера" #: src/exec_gr.cpp:1256 msgid "Draw mesh surface" msgstr "Нарисовать сетчатую поверхность" #: src/exec_prm.cpp:632 msgid "Draw point (ball)" msgstr "Нарисовать точку" #: src/exec_prm.cpp:657 msgid "Draw polygon" msgstr "Нарисовать полигон" #: src/exec_gr.cpp:1210 msgid "Draw quasi-optical beam" msgstr "Нарисовать квазиоптический пучок" #: src/exec_gr.cpp:1262 msgid "Draw radar chart" msgstr "Нарисовать круговой график" #: src/exec_gr.cpp:1233 msgid "Draw reconstructed surface for arbitrary data points" msgstr "Нарисовать поверхность по произвольным точкам" #: src/exec_prm.cpp:658 msgid "Draw rectangle" msgstr "Нарисовать прямоугольник" #: src/exec_prm.cpp:659 msgid "Draw rhombus" msgstr "Нарисовать ромб" #: src/exec_gr.cpp:1225 msgid "Draw solid contour lines at x-slice (or x-plane)" msgstr "Закрасить линии уровня на x-срезе" #: src/exec_gr.cpp:1226 msgid "Draw solid contour lines at y-slice (or y-plane)" msgstr "Закрасить линии уровня на y-срезе" #: src/exec_gr.cpp:1227 msgid "Draw solid contour lines at z-slice (or z-plane)" msgstr "Закрасить линии уровня на z-срезе" #: src/exec_gr.cpp:1224 msgid "Draw solid contour lines for 3D data" msgstr "Закрасить линии уровня на 3D данных" #: src/exec_gr.cpp:1223 msgid "Draw solid contours" msgstr "Закрасить линии уровня" #: src/exec_gr.cpp:1222 msgid "Draw solid contours with manual colors" msgstr "Закрасить линии уровня заданными цветами" #: src/exec_gr.cpp:1267 msgid "Draw solid surface" msgstr "Нарисовать поверхность" #: src/exec_gr.cpp:1274 msgid "Draw solid surface colored and transpared by other data" msgstr "Нарисовать поверхность с заданными цветом и прозрачностью" #: src/exec_gr.cpp:1273 msgid "Draw solid surface colored by other data" msgstr "Нарисовать поверхность с заданным цветом" #: src/exec_gr.cpp:1272 msgid "Draw solid surface transpared by other data" msgstr "Нарисовать поверхность с заданной прозрачностью" #: src/exec_prm.cpp:660 msgid "Draw sphere" msgstr "Нарисовать сферу" #: src/exec_gr.cpp:1264 msgid "Draw stem plot for 1D data" msgstr "Нарисовать линии от 1D данных до оси" #: src/exec_gr.cpp:1265 msgid "Draw step plot for 1D data" msgstr "Нарисовать ступеньки" #: src/exec_gr.cpp:1281 msgid "Draw surface of curve rotation" msgstr "Нарисовать поверхность вращения" #: src/exec_gr.cpp:1261 msgid "Draw surface of quadrangles" msgstr "Нарисовать поверхность из четырехугольников" #: src/exec_gr.cpp:1285 msgid "Draw surface of triangles" msgstr "Нарисовать поверхность из треугольников" #: src/exec_gr.cpp:1207 msgid "Draw surfaces of contour lines rotation" msgstr "Нарисовать поверхность вращения линий уровня" #: src/exec_gr.cpp:1275 msgid "Draw table with data values" msgstr "Нарисовать таблицу значений данных" #: src/exec_gr.cpp:1277 msgid "Draw tension plot for 1D data" msgstr "Нарисовать кривую с заданным цветом" #: src/exec_prm.cpp:662 msgid "Draw text at some position or along curve" msgstr "Вывести текст в точке или вдоль кривой" #: src/exec_prm.cpp:661 msgid "Draw user-defined symbol at given position and direction" msgstr "Нарисовать символ в заданных точке и направлении" #: src/exec_gr.cpp:1259 msgid "Draw usual plot for 1D data" msgstr "Нарисовать кривую для 1D данных" #: src/exec_gr.cpp:1287 msgid "Draw vector field" msgstr "Нарисовать векторное поле" #: src/exec_gr.cpp:1288 msgid "Draw vector field at slices of 3D data" msgstr "Нарисовать векторное поле на срезах 3D данных" #: src/exec_gr.cpp:1282 msgid "Draw vectors along a curve" msgstr "Нарисовать вектора вдоль кривой" #: src/exec_gr.cpp:1243 msgid "Draw waterfalls" msgstr "Нарисовать поверхность набором линий (водопад)" #: udav/plot_pnl.cpp:112 udav/plot_pnl.cpp:131 msgid "Drawing time %1 ms" msgstr "Время рисования %1 мс" #: udav/newcmd_dlg.cpp:169 mgllab/dialogs.cpp:710 msgid "Dual plots" msgstr "Двойные графики" #. L #: udav/style_dlg.cpp:244 mgllab/dialogs.cpp:52 msgid "E - darklawn" msgstr "E - темно-салатовый" #: mgllab/dialogs.cpp:1469 msgid "Edges" msgstr "Края" #: udav/text_pnl.cpp:84 mgllab/mgllab.cpp:298 msgid "Edit" msgstr "Правка" #: udav/mem_pnl.cpp:59 msgid "Edit selected data array" msgstr "Редактировать выбранный массив данных" #: udav/calc_dlg.cpp:193 msgid "Elliptic" msgstr "Эллиптические" #: udav/prop_dlg.cpp:171 mgllab/mgllab.cpp:481 msgid "Enable keywords completion" msgstr "Разрешить дополнение команд" #. pure = new QCheckBox(_("Disable face drawing (faster) for mouse rotation/shift/zoom."), this); #. pure->setChecked(mglAutoPure); v->addWidget(pure); pure->setEnabled(false); #: udav/prop_dlg.cpp:169 mgllab/mgllab.cpp:483 msgid "Enable mouse wheel for zooming" msgstr "Колесо мыши приближает график" #: mgllab/dialogs.cpp:1463 msgid "End" msgstr "Конец" #: udav/prop_dlg.cpp:141 msgid "English" msgstr "Английский" #. TODO show dialog for color scheme #: udav/dat_pnl.cpp:255 udav/dat_pnl.cpp:277 mgllab/table.cpp:477 #: mgllab/table.cpp:490 msgid "Enter color scheme" msgstr "Введите цветовую схему" #: udav/dat_pnl.cpp:261 udav/dat_pnl.cpp:283 msgid "Enter data name" msgstr "Введите имя данных" #: mgllab/table.cpp:523 msgid "" "Enter formula for data modification\n" "Here x, y, z in range [0,1], u is data value" msgstr "" "Введите формулу для изменения данных\n" "x, y, z в диапазоне [0,1], u - сами данные" #: udav/mem_pnl.cpp:85 mgllab/help.cpp:246 msgid "Enter name for new variable" msgstr "Введите имя для нового массива" #. this is HDF file #. TODO add dialog with choice of HDF names #: mgllab/table.cpp:436 msgid "Enter name of data" msgstr "Введите имя данных" #: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436 msgid "Enter new data sizes" msgstr "Введите новый размер данных" #: mgllab/table.cpp:28 msgid "Enter number for addition to data values" msgstr "Введите число для добавления" #: mgllab/table.cpp:58 msgid "Enter number for division of data values" msgstr "Введите число для делителя" #: mgllab/table.cpp:48 msgid "Enter number for multiplication of data values" msgstr "Введите число для умножения" #: mgllab/table.cpp:38 msgid "Enter number for subtraction from data values" msgstr "Введите число для вычитания" #: widgets/qt.cpp:953 msgid "Enter number of vertexes" msgstr "Введите число вершин" #: udav/dat_pnl.cpp:351 msgid "Enter range for data and direction of filling" msgstr "Введите диапазон и направление заполнения" #: udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377 msgid "Enter range for final data" msgstr "Введите диапазон для выходных данных" #: udav/dat_pnl.cpp:424 msgid "Enter range of saved date." msgstr "Введите диапазон сохраненных данных" #: udav/dat_pnl.cpp:485 msgid "Enter slice id:" msgstr "Введите номер среза:" #: udav/dat_pnl.cpp:413 msgid "" "Enter step of saved points. For example, '1' save all, '2' save each 2nd " "point, '3' save each 3rd and so on." msgstr "" "Введите шаг сохранения. Например, '1' - все точки, '2' - каждая вторая, и т." "д." #: widgets/qt.cpp:962 msgid "Enter text" msgstr "Введите текст" #: mgllab/dialogs.cpp:860 mgllab/dialogs.cpp:866 #, c-format msgid "Enter value for %s argument" msgstr "Введите значение аргумента %s" #: mgllab/table.cpp:166 mgllab/table.cpp:786 msgid "Envelop" msgstr "Огибающая" #: src/exec_dat.cpp:1752 msgid "Erode data larger val" msgstr "Сузить данные большие val" #: mgllab/editor.cpp:352 #, c-format msgid "" "Error reading from file '%s':\n" "%s." msgstr "" "Ошибка чтения файла '%s':\n" "%s." #: src/export.cpp:629 src/export.cpp:638 src/export.cpp:645 #, c-format msgid "Error to call external viewer\n" msgstr "Ошибка вызова внешнего просмотра\n" #: mgllab/editor.cpp:363 #, c-format msgid "" "Error writing to file '%s':\n" "%s." msgstr "" "Ошибка записи в файл '%s':\n" "%s." #: src/exec_dat.cpp:1753 msgid "" "Evaluate (interpolate) values of array Dat at points i=idat,j=jdat,k=kdat" msgstr "Интерполирует значения в точках i=idat,j=jdat,k=kdat" #. {"defpal",_("Define parameter as palette color"),"defpal $N val", 0, 6}, #: src/parser.cpp:1497 msgid "Execute if condition is false" msgstr "Выполнить если условие ложно" #: mgllab/mgllab.cpp:479 msgid "Execute script after loading" msgstr "Выполнить скрипт после загрузки" #: widgets/qt.cpp:1149 udav/plot_pnl.cpp:334 msgid "Execute script and redraw graphics (F5)." msgstr "Выполнить скрипт и обновить рисунок (F5)." #: src/parser.cpp:1490 msgid "Execute script in external file" msgstr "Выполнить скрипт из внешнего файла" #: mgllab/help.cpp:148 msgid "Existing data arrays" msgstr "Массивы данных" #: mgllab/mgllab.cpp:296 msgid "Exit" msgstr "Выход" #: udav/calc_dlg.cpp:192 msgid "Exp and log" msgstr "Exp и log" #: udav/calc_dlg.cpp:194 msgid "Exp-integrals" msgstr "Exp-интегралы" #: mgllab/table.cpp:473 msgid "Export Data?" msgstr "Экспорт данных?" #: widgets/fltk.cpp:821 msgid "Export as ..." msgstr "Экспорт как ..." #: widgets/qt.cpp:1084 udav/plot_pnl.cpp:475 msgid "Export as 2D ..." msgstr "Экспорт как 2D ..." #: widgets/qt.cpp:1093 udav/plot_pnl.cpp:485 msgid "Export as 3D ..." msgstr "Экспорт как 3D ..." #: src/exec_dat.cpp:1754 mgllab/table.cpp:846 msgid "Export data to PNG file" msgstr "Экспорт данных в PNG файл" #. fname = new QLineEdit(this); a->addWidget(fname); #: udav/anim_dlg.cpp:82 msgid "Export to GIF" msgstr "Экспорт в GIF" #: mgllab/table.cpp:754 msgid "Export to PNG" msgstr "Экспорт в PNG" #: src/exec_dat.cpp:1755 msgid "Extend data array" msgstr "Расширить массив данных" #: mgllab/table.cpp:343 msgid "Extract data" msgstr "Выделить данные" #: src/exec_dat.cpp:1818 msgid "Extract sub-array" msgstr "Выделить под-массив" #: src/exec_dat.cpp:1810 msgid "Extract sub-array between values" msgstr "Выделить под-массив в диапазоне между значениями" #: mgllab/dialogs.cpp:962 msgid "Factor" msgstr "Фактор" #. file menu #: widgets/qt.cpp:1083 udav/udav_wnd.cpp:281 udav/dat_pnl.cpp:681 #: mgllab/mgllab.cpp:283 mgllab/table.cpp:750 msgid "File" msgstr "Файл" #: udav/text_pnl.cpp:405 udav/text_pnl.cpp:489 msgid "File %1 saved" msgstr "Файл %1 сохранен." #: mgllab/mgllab.cpp:233 msgid "File exist. Overwrite it?" msgstr "Файл существует. Переписать?" #: udav/text_pnl.cpp:583 msgid "File name" msgstr "Имя файла" #: mgllab/mgllab.cpp:309 msgid "File path" msgstr "Путь к файлу" #: mgllab/dialogs.cpp:1073 msgid "File to export" msgstr "Экспорт в файл" #: mgllab/editor.cpp:271 mgllab/mgllab.cpp:403 msgid "File/Recent files" msgstr "Файл/Последние файлы" #: mgllab/table.cpp:767 msgid "Fill" msgstr "Заполнить" #: udav/dat_pnl.cpp:611 mgllab/table.cpp:856 msgid "Fill data by formula" msgstr "Заполнить по формуле" #: src/exec_dat.cpp:1763 msgid "Fill data by global spline of Vdat" msgstr "Заполнить данные по глобальному сплайну Vdat" #: src/exec_dat.cpp:1802 msgid "Fill data by interpolation of Vdat" msgstr "Заполнить данные интерполяцией Vdat" #: src/exec_dat.cpp:1741 msgid "Fill data by triangulated values" msgstr "Заполнить данные триангуляцией" #: src/exec_dat.cpp:1757 msgid "Fill data linearly in range [v1, v2]" msgstr "Заполнить данные линейно в диапазоне [v1, v2]" #: mgllab/table.cpp:578 mgllab/table.cpp:592 msgid "Fill in range" msgstr "Заполнить в диапазоне" #: src/exec_dat.cpp:1758 msgid "Fill x-,k-samples for transforms" msgstr "Заполнить как x-,k-координаты для трансформации" #: src/random.cpp:345 msgid "Fills by fractional brownian motion" msgstr "Заполнить броуновским движением" #: src/random.cpp:351 msgid "Fills by random integers uniformly chosen in [lo, hi)" msgstr "Заполнить случайными целыми числами в интервале [lo, hi)" #: src/random.cpp:343 msgid "" "Fills by random numbers according to Bernoulli distribution with probability " "p" msgstr "Заполнить случайными числами с распределением Бернулли" #: src/random.cpp:348 msgid "Fills by random numbers according to Gaussian distribution" msgstr "Заполнить случайными числами с гауссовым распределением" #: src/random.cpp:344 msgid "" "Fills by random numbers according to binomial distribution in n coin flips " "with probability p" msgstr "Заполнить случайными числами с биномиальным распределением" #: src/random.cpp:346 msgid "Fills by random numbers according to discrete distribution" msgstr "Заполнить случайными числами с дискретным распределением" #: src/random.cpp:347 msgid "" "Fills by random numbers according to exponential distribution with " "probability p" msgstr "Заполнить случайными числами с экспоненциальным распределением" #: src/random.cpp:350 msgid "Fills by random numbers uniformly chosen in [lo,hi)" msgstr "Заполнить случайными числами в интервале [lo, hi)" #: udav/find_dlg.cpp:48 mgllab/editor.cpp:564 msgid "Find" msgstr "Найти" #: src/exec_dat.cpp:1737 msgid "Find correlation between data arrays" msgstr "Найти корреляцию между данными" #: src/exec_dat.cpp:1751 msgid "Find envelop for the data" msgstr "Найти огибающую данных" #: udav/dat_pnl.cpp:624 msgid "Find envelope along direction(s)" msgstr "Найти огибающую в направлении" #: src/exec_dat.cpp:1759 msgid "Find first indexes of values larger val over direction" msgstr "Найти первый индекс значения большего val по направлению" #: udav/dat_pnl.cpp:804 msgid "Find histogram of data." msgstr "Найти гистограмму данных" #: src/exec_dat.cpp:1773 msgid "Find last indexes of values larger val over direction" msgstr "Найти последний индекс значения большего val по направлению" #: src/exec_dat.cpp:1776 msgid "Find maximal value over direction" msgstr "Найти максимум по направлению" #: src/exec_dat.cpp:1777 msgid "Find minimal value over direction" msgstr "Найти минимум по направлению" #: udav/text_pnl.cpp:551 mgllab/mgllab.cpp:307 msgid "Find next" msgstr "Найти следующее" #: mgllab/editor.cpp:520 msgid "Find or replace text" msgstr "Найти или заменить" #: src/exec_dat.cpp:1814 msgid "Find root Dat[i,j,k]=val (inverse evaluate)" msgstr "Найти корень Dat[i,j,k]=val (обратно evaluate)" #: src/exec_dat.cpp:1806 msgid "Find roots using data as initial values" msgstr "Найти корни используя данные как начальные условия" #: src/exec_dat.cpp:1820 msgid "Find summation over direction" msgstr "Найти сумму по направлению" #: src/exec_dat.cpp:1826 msgid "Find triangles of randomly placed points" msgstr "Триангулировать произвольно расположенные точки" #: udav/find_dlg.cpp:36 mgllab/editor.cpp:563 msgid "Find what:" msgstr "Найти что:" #: udav/text_pnl.cpp:546 mgllab/editor.cpp:562 msgid "Find/Replace" msgstr "Найти/Заменить" #: mgllab/mgllab.cpp:306 msgid "Find|Replace" msgstr "Найти|Заменить" #: src/parser.cpp:1499 msgid "Finish if/else block" msgstr "Окончание блока if/else" #: mgllab/table.cpp:806 msgid "First cell" msgstr "Первая ячейка" #: udav/dat_pnl.cpp:721 mgllab/table.cpp:802 msgid "First slice" msgstr "Первый срез" #: src/exec_dat.cpp:1760 src/exec_dat.cpp:1761 msgid "Fit data to formula" msgstr "Подогнать данные по формуле" #: udav/text_pnl.cpp:567 mgllab/mgllab.cpp:313 msgid "Fitted formula" msgstr "Подобранная формула" #: udav/prop_dlg.cpp:103 msgid "FlowKey" msgstr "" #: mgllab/dialogs.cpp:1009 msgid "Fog" msgstr "Туман" #: mgllab/dialogs.cpp:1010 msgid "Fog dist." msgstr "глубина" #: mgllab/mgllab.cpp:543 msgid "Folder for help files" msgstr "Папка для файлов справки" #: udav/text_pnl.cpp:587 mgllab/mgllab.cpp:310 msgid "Folder path" msgstr "Путь к папке" #: udav/setup_dlg.cpp:105 mgllab/dialogs.cpp:1007 msgid "Font" msgstr "Шрифт" #: mgllab/mgllab.cpp:534 msgid "Font file name" msgstr "Имя файла шрифта" #: udav/prop_dlg.cpp:199 msgid "Font files (*.vfm)" msgstr "Файлы шрифтов (*.vfm)" #: mgllab/mgllab.cpp:470 msgid "Font kind" msgstr "Шрифт" #: mgllab/mgllab.cpp:472 msgid "Font size" msgstr "Размер" #: udav/style_dlg.cpp:183 msgid "Font style" msgstr "Шрифт" #: udav/setup_dlg.cpp:107 msgid "FontSize" msgstr "Размер" #: src/parser.cpp:1500 msgid "For loop" msgstr "Цикл for" #: udav/help_pnl.cpp:52 msgid "Forward" msgstr "Вперед" #: udav/plot_pnl.cpp:193 msgid "Frame %1 of %2" msgstr "Кадр %1 из %2" #: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377 #: udav/dat_pnl.cpp:424 udav/dat_pnl.cpp:452 mgllab/table.cpp:608 msgid "From" msgstr "от" #: mgllab/mgllab.cpp:602 msgid "Function" msgstr "Функция" #. B #: udav/style_dlg.cpp:238 mgllab/dialogs.cpp:46 msgid "G - green" msgstr "G - зеленый" #: src/export.cpp:306 src/export.cpp:375 src/export.cpp:388 msgid "GIF support was disabled. Please, enable it and rebuild MathGL." msgstr "GIF поддержка отключена. Включите ее и пересоберите MathGL." #: udav/newcmd_dlg.cpp:178 udav/setup_dlg.cpp:112 mgllab/dialogs.cpp:719 #: mgllab/dialogs.cpp:1001 msgid "General setup" msgstr "Общие настройки" #: src/exec_dat.cpp:1771 msgid "Get Jacobian" msgstr "Вычислить якобиан" #: src/exec_dat.cpp:1735 msgid "Get contour lines for dat[i,j]=val, separated by NAN" msgstr "Найти координаты линий уровня dat[i,j]=val, разделенных NAN" #: src/exec_dat.cpp:1732 msgid "Get data column filled by formula on column ids" msgstr "Вычислить данные по формуле из имен колонок" #: src/exec_dat.cpp:1809 msgid "Get formatted data from file" msgstr "Загрузить форматированные данные из файла" #: src/exec_dat.cpp:1734 msgid "" "Get indexes or resort data for found connected surfaces dependent on j,k" msgstr "" "Найти индексы или пересортировать данные для поиска связанных поверхностей, " "зависящих от j,k" #: src/exec_dat.cpp:1780 msgid "Get momentum along direction" msgstr "Вычислить момент по направлению" #: src/exec_dat.cpp:1756 msgid "Get positions of local maximums and minimums" msgstr "Найти положение локальных максимумов и минимумов" #: src/exec_dat.cpp:1790 msgid "Get pulse properties" msgstr "Найти параметры импульса" #: src/exec_dat.cpp:1822 msgid "Get trace of array" msgstr "Найти след матрицы" #: src/base_cf.cpp:86 #, c-format msgid "Global message - %s\n" msgstr "Общее сообщение - %s\n" #: udav/dat_pnl.cpp:723 mgllab/table.cpp:867 msgid "Go to first slice for 3D data (Ctrl-F1)." msgstr "Перейти к первому срезу 3D данных (Ctrl-F1)" #: udav/dat_pnl.cpp:753 mgllab/table.cpp:871 msgid "Go to last slice for 3D data (Ctrl-F4)." msgstr "Перейти к последнему срезу 3D данных (Ctrl-F1)" #: udav/dat_pnl.cpp:740 msgid "Go to slice" msgstr "Перейти к срезу" #: udav/dat_pnl.cpp:747 msgid "Go to the next slice for 3D data." msgstr "Перейти к следующему срезу 3D данных" #: udav/dat_pnl.cpp:729 msgid "Go to the previous slice for 3D data." msgstr "Перейти к предыдущему срезу 3D данных" #: udav/dat_pnl.cpp:735 udav/dat_pnl.cpp:742 msgid "Go to the specified slice for 3D data." msgstr "Перейти к указанному срезу 3D данных" #: widgets/qt.cpp:1112 widgets/qt.cpp:1114 udav/plot_pnl.cpp:67 #: mgllab/mgllab.cpp:325 msgid "Graphics" msgstr "Графика" #: udav/text_pnl.cpp:596 msgid "Graphics setup" msgstr "Настройка графика" #: widgets/fltk.cpp:970 msgid "Graphics/Adjust size" msgstr "Графика/Подогнать размер" #. ----------------------------------------------------------------------------- #: widgets/fltk.cpp:964 widgets/fltk.cpp:1094 msgid "Graphics/Alpha" msgstr "Графика/Прозрачность" #: widgets/fltk.cpp:999 msgid "Graphics/Animation/Next frame" msgstr "Графика/Анимация/Следующий" #: widgets/fltk.cpp:1000 msgid "Graphics/Animation/Prev frame" msgstr "Графика/Анимация/Предыдущий" #: mgllab/mgllab.cpp:377 msgid "Graphics/Animation/Setup animation" msgstr "Графика/Анимация/Настройка" #: widgets/fltk.cpp:998 widgets/fltk.cpp:1096 msgid "Graphics/Animation/Slideshow" msgstr "Графика/Анимация/Запустить" #: widgets/fltk.cpp:974 msgid "Graphics/Copy click coor." msgstr "Графика/Копировать коор." #: widgets/fltk.cpp:973 msgid "Graphics/Copy graphics" msgstr "Графика/Копировать рисунок" #: widgets/fltk.cpp:987 msgid "Graphics/Export/as BMP" msgstr "Графика/Экспорт/как BMP" #: widgets/fltk.cpp:985 msgid "Graphics/Export/as GIF" msgstr "Графика/Экспорт/как GIF" #: widgets/fltk.cpp:982 msgid "Graphics/Export/as JPEG" msgstr "Графика/Экспорт/как JPEG" #: widgets/fltk.cpp:993 msgid "Graphics/Export/as OBJ" msgstr "Графика/Экспорт/как OBJ" #: widgets/fltk.cpp:994 msgid "Graphics/Export/as OFF" msgstr "Графика/Экспорт/как OFF" #: widgets/fltk.cpp:978 msgid "Graphics/Export/as PNG" msgstr "Графика/Экспорт/как PNG" #: widgets/fltk.cpp:992 msgid "Graphics/Export/as PRC" msgstr "Графика/Экспорт/как PRC" #: widgets/fltk.cpp:995 msgid "Graphics/Export/as STL" msgstr "Графика/Экспорт/как STL" #: widgets/fltk.cpp:988 msgid "Graphics/Export/as SVG" msgstr "Графика/Экспорт/как SVG" #: widgets/fltk.cpp:991 msgid "Graphics/Export/as TeX" msgstr "Графика/Экспорт/как TeX" #: widgets/fltk.cpp:996 msgid "Graphics/Export/as XYZ" msgstr "Графика/Экспорт/как XYZ" #: widgets/fltk.cpp:990 msgid "Graphics/Export/as bitmap EPS" msgstr "Графика/Экспорт/как растровый EPS" #: widgets/fltk.cpp:979 msgid "Graphics/Export/as solid PNG" msgstr "Графика/Экспорт/как PNG с заливкой" #: widgets/fltk.cpp:989 msgid "Graphics/Export/as vector EPS" msgstr "Графика/Экспорт/как EPS" #: widgets/fltk.cpp:966 widgets/fltk.cpp:1097 msgid "Graphics/Grid" msgstr "Графика/Сетка" #: widgets/fltk.cpp:965 widgets/fltk.cpp:1095 msgid "Graphics/Light" msgstr "Графика/Освещение" #: widgets/fltk.cpp:975 widgets/fltk.cpp:1098 mgllab/mgllab.cpp:378 msgid "Graphics/Pause calc" msgstr "Графика/Пауза расчета" #: mgllab/mgllab.cpp:376 msgid "Graphics/Primitive" msgstr "Графика/Примитивы" #: widgets/fltk.cpp:969 msgid "Graphics/Redraw" msgstr "Графика/Перерисовать" #: widgets/fltk.cpp:971 msgid "Graphics/Reload data" msgstr "Графика/Перезагрузить" #: widgets/fltk.cpp:968 msgid "Graphics/Restore" msgstr "Графика/Восстановить" #: widgets/fltk.cpp:972 msgid "Graphics/Stop" msgstr "Графика/Стоп" #: widgets/fltk.cpp:1006 msgid "Graphics/Transform/Move down" msgstr "Графика/Сдвиг/Вниз" #: widgets/fltk.cpp:1002 msgid "Graphics/Transform/Move left" msgstr "Графика/Сдвиг/Влево" #: widgets/fltk.cpp:1007 msgid "Graphics/Transform/Move right" msgstr "Графика/Сдвиг/Вправо" #: widgets/fltk.cpp:1003 msgid "Graphics/Transform/Move up" msgstr "Графика/Сдвиг/Вверх" #: widgets/fltk.cpp:1004 msgid "Graphics/Transform/Zoom in" msgstr "Графика/Сдвиг/Приблизить" #: widgets/fltk.cpp:1005 msgid "Graphics/Transform/Zoom out" msgstr "Графика/Сдвиг/Отдалить" #: udav/plot_pnl.cpp:305 msgid "Grid" msgstr "Сетка" #: udav/newcmd_dlg.cpp:50 mgllab/dialogs.cpp:705 msgid "Groups of MGL commands" msgstr "Группы команд MGL" #. P #: udav/style_dlg.cpp:249 mgllab/dialogs.cpp:57 msgid "H - darkgray" msgstr "H - темно-серый" #: src/data_io.cpp:1204 msgid "HDF4 support was disabled. Please, enable it and rebuild MathGL." msgstr "HDF4 поддержка отключена. Включите ее и пересоберите MathGL." #: src/complex_io.cpp:924 src/complex_io.cpp:926 src/data_io.cpp:1359 #: src/data_io.cpp:1361 src/data_io.cpp:1363 src/data_io.cpp:1365 #: src/data_io.cpp:1367 src/data_io.cpp:1369 src/data_io.cpp:1371 msgid "HDF5 support was disabled. Please, enable it and rebuild MathGL." msgstr "HDF5 поддержка отключена. Включите ее и пересоберите MathGL." #: mgllab/table.cpp:165 mgllab/table.cpp:781 msgid "Hankel" msgstr "Ханкель" #: udav/dat_pnl.cpp:622 msgid "Hankel transform along direction(s)" msgstr "Преобразование Ханкеля по направлению(ям)" #: src/exec_dat.cpp:1764 msgid "Hankel transform at some direction" msgstr "Преобразование Ханкеля по направлению" #: udav/subplot_dlg.cpp:84 msgid "Height of selected cells" msgstr "Высота выбранных ячеек" #: widgets/qt.cpp:1293 udav/help_pnl.cpp:57 udav/udav_wnd.cpp:231 #: udav/udav_wnd.cpp:323 mgllab/mgllab.cpp:335 mgllab/mgllab.cpp:336 #: mgllab/mgllab.cpp:364 msgid "Help" msgstr "Справка" #: udav/newcmd_dlg.cpp:73 msgid "" "Here you can specify command options.\n" "Options are used for additional plot tunning." msgstr "" "Здесь можно задать опции команды, \n" "которые используются для доп.настройки графика." #: udav/udav_wnd.cpp:186 mgllab/mgllab.cpp:304 msgid "Hidden plots" msgstr "Скрытые графики" #: udav/plot_pnl.cpp:432 msgid "Hide selected" msgstr "Скрыть выделенное" #: udav/plot_pnl.cpp:434 msgid "Hide selected plots." msgstr "Скрыть выделенные графики" #: udav/prop_dlg.cpp:173 mgllab/mgllab.cpp:482 msgid "Highlight current object(s)" msgstr "Выделить текущие графики" #: udav/udav_wnd.cpp:328 mgllab/mgllab.cpp:337 msgid "Hints" msgstr "Подсказки" #: udav/dat_pnl.cpp:802 msgid "Histogram (Ctrl+Shift+H)" msgstr "Гистограмма (Ctrl+Shift+H)" #: udav/subplot_dlg.cpp:51 udav/subplot_dlg.cpp:68 udav/subplot_dlg.cpp:93 msgid "Horizontal size" msgstr "Горизонтальный размер" #: udav/calc_dlg.cpp:192 msgid "Hyperbolic" msgstr "Гиперболические" #: udav/setup_dlg.cpp:116 msgid "ID" msgstr "" #: mgllab/mgllab.cpp:339 msgid "Icon list" msgstr "Список иконок" #: mgllab/table.cpp:869 msgid "Id of slice on third (z-) dimension" msgstr "Номер среза в z-направлении" #: udav/prop_dlg.cpp:154 msgid "Image size" msgstr "Размер рисунка" #: src/exec_dat.cpp:1789 msgid "Immediately display the progress of calculation" msgstr "Показать прогресс вычислений сразу" #: src/exec_dat.cpp:1788 msgid "Immediately print the message" msgstr "Напечатать это сообщение сразу же" #: mgllab/table.cpp:485 msgid "Import Data?" msgstr "Импортировать данные?" #: src/exec_dat.cpp:1767 mgllab/table.cpp:842 msgid "Import data from PNG file" msgstr "Импортировать данные из PNG файла" #: mgllab/table.cpp:752 msgid "Import from PNG" msgstr "Импортировать из PNG" #: mgllab/table.cpp:769 msgid "In range" msgstr "В диапазоне" #: src/exec_dat.cpp:1762 msgid "In-place Fourier transform" msgstr "Фурье преобразование по месту" #: mgllab/mathgl.cpp:247 msgid "Incompatible loop parameters!" msgstr "Неверные параметры цикла!" #: mgllab/table.cpp:503 msgid "Incorrect type of base data" msgstr "Неверный тип данных" #: udav/plot_pnl.cpp:553 msgid "Increase \\phi angle by 10 degrees." msgstr "Увеличить угол φ на 10 градусов" #: udav/plot_pnl.cpp:545 msgid "Increase \\theta angle by 10 degrees." msgstr "Увеличить угол θ на 10 градусов" #: mgllab/help.cpp:103 msgid "Increase font size" msgstr "Увеличить размер шрифта" #: udav/udav_wnd.cpp:229 msgid "Info" msgstr "Инфо" #: udav/info_dlg.cpp:57 mgllab/help.cpp:335 msgid "Information" msgstr "Информация" #: mgllab/mgllab.cpp:312 msgid "Inplot" msgstr "Под-график" #. insert menu #: udav/text_pnl.cpp:557 mgllab/mgllab.cpp:308 msgid "Insert" msgstr "Вставить" #: mgllab/editor.cpp:523 msgid "Insert MGL command" msgstr "Вставить команду MGL" #: mgllab/table.cpp:755 msgid "Insert as 'list'" msgstr "Вставить как 'list'" #: mgllab/editor.cpp:525 msgid "Insert filename" msgstr "Вставить имя файла" #: mgllab/editor.cpp:527 msgid "Insert inplot command" msgstr "Вставить под-график" #: udav/text_pnl.cpp:569 msgid "Insert last fitted formula with found coefficients." msgstr "Вставить последнюю подогнанную формулу с найденными коэффициентами" #: src/exec_dat.cpp:1769 msgid "Insert slice of data" msgstr "Вставить срез данных" #: mgllab/table.cpp:849 msgid "Insert to script as 'list' command" msgstr "Вставить в скрипт как команду 'list'" #: mgllab/table.cpp:163 mgllab/table.cpp:775 msgid "Integrate" msgstr "Интегрировать" #: src/exec_dat.cpp:1770 udav/dat_pnl.cpp:615 msgid "Integrate data along direction(s)" msgstr "Интегрировать данные по направлению" #: mgllab/dialogs.cpp:114 msgid "Intensity of diffuse light" msgstr "Интенсивность рассеянного света" #: udav/style_dlg.cpp:158 mgllab/dialogs.cpp:369 msgid "Italic style" msgstr "Курсив" #: widgets/qt.cpp:1087 udav/plot_pnl.cpp:478 msgid "JPEG" msgstr "" #: src/data_png.cpp:158 src/export.cpp:192 msgid "JPEG support was disabled. Please, enable it and rebuild MathGL." msgstr "JPEG поддержка отключена. Включите ее и пересоберите MathGL." #: udav/calc_dlg.cpp:193 msgid "Jacobi" msgstr "Якоби" #: src/exec_dat.cpp:1772 msgid "Join data arrays" msgstr "Объединить массивы данных" #: mgllab/dialogs.cpp:1075 msgid "Keep empty to put at beginning of main script." msgstr "Оставьте пустым для добавления в начало скрипта." #: udav/dat_pnl.cpp:780 msgid "Keep only each n-th element of the data array." msgstr "Сохранить каждый n-ый элемент массива данных" #: src/exec_dat.cpp:1774 msgid "Keep phase/amplitude along line" msgstr "Сохраняет фазу/амплитуду вдоль линии" #: mgllab/mathgl.cpp:200 msgid "Keep slides in memory (faster animation but require more memory)" msgstr "Хранить кадры в памяти (быстрее анимация, но требуется больше памяти)" #: udav/prop_dlg.cpp:88 msgid "Keywords" msgstr "Ключевые слова" #: mgllab/dialogs.cpp:354 mgllab/dialogs.cpp:704 mgllab/dialogs.cpp:1457 msgid "Kind" msgstr "Тип" #: udav/newcmd_dlg.cpp:58 msgid "" "Kind of command argument order. The notation is:\n" " * Capital arguments are data (like, Ydat);\n" " * Argument in '' are strings (like, 'fmt');\n" " * Other arguments are numbers (like, zval);\n" " * Arguments in [] are optional arguments." msgstr "" "Вариант аргументов команды. Обозначения:\n" " * Заглавные -- данные (например, Ydat);\n" " * В кавычках '' -- строки (например, 'fmt');\n" " * Прочие -- числа (например, zval);\n" " * В скобках [] -- опциональные аргументы." #: udav/info_dlg.cpp:52 msgid "Kind of plots: lines for 1D, density for 2D." msgstr "Тип графика: кривые для 1D, график плотности для 2D." #. Y #: udav/style_dlg.cpp:243 mgllab/dialogs.cpp:51 msgid "L - seagreen" msgstr "L - морской волны" #: widgets/qt.cpp:1091 udav/plot_pnl.cpp:482 msgid "LaTeX" msgstr "LaTeX" #: udav/setup_dlg.cpp:66 mgllab/dialogs.cpp:954 msgid "Label" msgstr "Надпись" #: udav/prop_dlg.cpp:139 msgid "Language for UDAV" msgstr "Язык для UDAV" #: mgllab/mgllab.cpp:486 msgid "Language for mgllab" msgstr "Язык для mgllab" #: udav/dat_pnl.cpp:617 msgid "Laplace transform along direction(s)" msgstr "Преобразование Лапласа" #: mgllab/table.cpp:777 msgid "Laplacian" msgstr "Лапласиан" #: udav/dat_pnl.cpp:751 mgllab/table.cpp:805 msgid "Last slice" msgstr "Последний срез" #: udav/subplot_dlg.cpp:144 msgid "Left bottom edge" msgstr "Левый нижний угол" #: udav/subplot_dlg.cpp:152 msgid "Left top edge" msgstr "Левый верхний угол" #: udav/opt_dlg.cpp:74 mgllab/dialogs.cpp:118 msgid "Legend" msgstr "Легенда" #: widgets/qt.cpp:1121 udav/opt_dlg.cpp:64 udav/setup_dlg.cpp:110 #: udav/plot_pnl.cpp:298 mgllab/dialogs.cpp:115 msgid "Light" msgstr "Свет" #: udav/setup_dlg.cpp:190 msgid "Light position should be filled. Ignore it." msgstr "Положение источника света должно быть заполнено." #: udav/setup_dlg.cpp:136 mgllab/dialogs.cpp:1053 msgid "Light settings" msgstr "Настройки освещения" #: src/exec_dat.cpp:1775 msgid "Limit data to be inside [-v,v]" msgstr "Ограничить данные диапазоном [-v,v]" #: udav/style_dlg.cpp:99 mgllab/dialogs.cpp:314 msgid "Line style" msgstr "Стиль линии" #: udav/style_dlg.cpp:78 msgid "Line width" msgstr "Толщина линии" #: mgllab/table.cpp:167 msgid "Linear *3" msgstr "Линейно *3" #: mgllab/table.cpp:167 msgid "Linear *5" msgstr "Линейно *5" #: mgllab/help.cpp:159 msgid "List of available data." msgstr "Список доступных данных." #: mgllab/table.cpp:427 msgid "Load Data?" msgstr "Загрузить данные?" #: src/exec_set.cpp:838 msgid "Load commands from external DLL" msgstr "Загрузить команды из внешней DLL" #: udav/dat_pnl.cpp:682 msgid "Load data" msgstr "Загрузить данные" #: mgllab/table.cpp:840 msgid "Load data from file" msgstr "Загрузить данные из файла" #: udav/dat_pnl.cpp:684 msgid "" "Load data from file. Data will be deleted only\n" "at exit but UDAV will not ask to save it (Ctrl+Shift+O)." msgstr "" "Загрузить данные. Данные будут удалены только\n" "при выходе из программы без запроса на сохранение (Ctrl+Shift+O)." #: src/exec_set.cpp:839 msgid "Load fontfaces" msgstr "Загрузить шрифт" #: mgllab/table.cpp:751 msgid "Load from file" msgstr "Загрузить из файла" #: src/exec_prm.cpp:631 msgid "Load image for background" msgstr "Загрузить фоновое изображение" #: udav/prop_dlg.cpp:163 msgid "Load script to new window" msgstr "Загрузить скрипт в новое окно" #: udav/text_pnl.cpp:467 msgid "Loaded document " msgstr "Загруженные документы " #: udav/text_pnl.cpp:325 msgid "Loaded document %1" msgstr "Загруженные документы %1" #: udav/udav_wnd.cpp:638 msgid "Loading aborted" msgstr "Загрузка отменена" #: mgllab/dialogs.cpp:98 msgid "Low border for determining color or alpha" msgstr "Нижняя граница для цвета или прозрачности" #. C #: udav/style_dlg.cpp:241 mgllab/dialogs.cpp:49 msgid "M - purple" msgstr "M - пурпурный" #: src/parser.cpp:1083 msgid "MGL Parser" msgstr "MGL парсер" #: udav/newcmd_dlg.cpp:53 mgllab/dialogs.cpp:725 msgid "MGL commands for selected group" msgstr "Команда MGL для выбранной группы" #: mgllab/mgllab.cpp:220 msgid "MGL files \t*.mgl" msgstr "MGL файлы \t*.mgl" #: mgllab/mgllab.cpp:173 msgid "" "MGL files \t*.mgl\n" "DAT files \t*.{dat,csv}" msgstr "" "MGL файлы \t*.mgl\n" "DAT файлы \t*.{dat,csv}" #: udav/open_dlg.cpp:102 msgid "MGL files (*.mgl)" msgstr "MGL файлы (*.mgl)" #: udav/udav_wnd.cpp:324 msgid "MGL help" msgstr "Справка MGL" #: mgllab/mathgl.cpp:397 msgid "MGL messages" msgstr "Сообщение MGL" #: mgllab/help.cpp:101 msgid "MGL samples and hints" msgstr "Примеры и подсказки" #: udav/udav_wnd.cpp:670 msgid "" "MGL scripts (*.mgl)\n" "HDF5 files (*.hdf *.h5)\n" "All files (*.*)" msgstr "" "MGL файлы (*.mgl)\n" "HDF5 файлы (*.hdf *.h5)\n" "Все файлы (*.*)" #: udav/udav_wnd.cpp:635 msgid "" "MGL scripts (*.mgl)\n" "HDF5 files (*.hdf *.h5)\n" "Text files (*.txt)\n" "Data files (*.dat)\n" "All files (*.*)" msgstr "" "MGL файлы (*.mgl)\n" "HDF5 файлы (*.hdf *.h5)\n" "Text файлы (*.txt)\n" "Data файлы (*.dat)\n" "Все файлы (*.*)" #: widgets/qt.cpp:1094 udav/plot_pnl.cpp:486 msgid "MGLD" msgstr "" #: udav/dat_pnl.cpp:798 msgid "Make another data." msgstr "Создание новых данных" #: udav/dat_pnl.cpp:796 msgid "Make new (Ctrl+Shift+M)" msgstr "Создать новый (Ctrl+Shift+M)" #: udav/style_dlg.cpp:83 mgllab/dialogs.cpp:336 msgid "Manual dashing" msgstr "Штриховка вручную" #: udav/style_dlg.cpp:196 msgid "Manual mask" msgstr "Маска вручную" #: udav/text_pnl.cpp:591 mgllab/mgllab.cpp:314 msgid "Manual primitives" msgstr "Примитивы вручную" #: mgllab/dialogs.cpp:1467 msgid "Mark" msgstr "Маркер" #: udav/style_dlg.cpp:76 mgllab/dialogs.cpp:324 msgid "Marks" msgstr "Маркеры" #: mgllab/dialogs.cpp:352 msgid "Mask" msgstr "Маска" #: udav/style_dlg.cpp:124 msgid "Mask for bitmap coloring" msgstr "Маска для растровой закраски" #: udav/style_dlg.cpp:125 msgid "Mask rotation angle" msgstr "Угол поворота маски" #: udav/style_dlg.cpp:126 msgid "Mask size" msgstr "Размер маски" #: udav/find_dlg.cpp:42 mgllab/editor.cpp:567 msgid "Match case" msgstr "Учитывать регистр" #: widgets/qt.cpp:877 msgid "MathGL - about" msgstr "MathGL - о программе" #: src/base.cpp:276 #, c-format msgid "MathGL message - %s\n" msgstr "Сообщение MathGL - %s\n" #: widgets/qt.cpp:876 msgid "MathGL v. 2." msgstr "" #: udav/open_dlg.cpp:70 msgid "Matrix with sizes from file" msgstr "Матрица с размерами из файла" #: udav/dat_pnl.cpp:541 msgid "Max along direction(s)" msgstr "Максимум вдоль направления" #: udav/setup_dlg.cpp:57 mgllab/dialogs.cpp:952 msgid "Maximal" msgstr "Максимум" #: mgllab/table.cpp:546 msgid "Maximal value (v2)" msgstr "Максимальное значение (v2)" #: mgllab/table.cpp:548 msgid "Maximal value for resulting data values" msgstr "Максимальное значение для получившихся данных" #: mgllab/dialogs.cpp:88 msgid "Maximal value of X for cutting or for coordinate filling" msgstr "Максимум X для обрезания или координат" #: mgllab/dialogs.cpp:92 msgid "Maximal value of Y for cutting or for coordinate filling" msgstr "Максимум Y для обрезания или координат" #: mgllab/dialogs.cpp:96 msgid "Maximal value of Z for cutting or for coordinate filling" msgstr "Максимум Z для обрезания или координат" #: src/data.cpp:1549 #, c-format msgid "Maximum is %g\t at x = %ld\ty = %ld\tz = %ld\n" msgstr "Максимум %g\t при x = %ld\ty = %ld\tz = %ld\n" #: mgllab/table.cpp:342 mgllab/table.cpp:791 msgid "Maximum of" msgstr "Максимум от" #: udav/mem_pnl.cpp:68 udav/mem_pnl.cpp:73 mgllab/mgllab.cpp:366 msgid "Memory" msgstr "Память" #: udav/opt_dlg.cpp:53 msgid "Mesh num" msgstr "Число линий" #: udav/setup_dlg.cpp:99 mgllab/dialogs.cpp:102 msgid "MeshNum" msgstr "Число линий" #: mgllab/mgllab.cpp:333 msgid "Messages" msgstr "Сообщения" #: udav/udav_wnd.cpp:178 msgid "Messages and warnings" msgstr "Сообщения" #: udav/dat_pnl.cpp:540 msgid "Min along direction(s)" msgstr "Минимум по направления" #: udav/setup_dlg.cpp:52 mgllab/dialogs.cpp:951 msgid "Minimal" msgstr "Минимум" #: mgllab/table.cpp:543 msgid "Minimal value (v1)" msgstr "Минимальное значение (v1)" #: mgllab/table.cpp:545 msgid "Minimal value for resulting data values" msgstr "Минимальное значение для получившихся данных" #: mgllab/dialogs.cpp:86 msgid "Minimal value of X for cutting or for coordinate filling" msgstr "Минимум X для обрезания или координат" #: mgllab/dialogs.cpp:90 msgid "Minimal value of Y for cutting or for coordinate filling" msgstr "Минимум Y для обрезания или координат" #: mgllab/dialogs.cpp:94 msgid "Minimal value of Z for cutting or for coordinate filling" msgstr "Минимум Z для обрезания или координат" #: src/data.cpp:1552 #, c-format msgid "Minimum is %g\t at x = %ld\ty = %ld\tz = %ld\n" msgstr "Минимум %g\t при x = %ld\ty = %ld\tz = %ld\n" #: mgllab/table.cpp:342 mgllab/table.cpp:792 msgid "Minimum of" msgstr "Минимум от" #. { _("Wavelet"), 0, wavelet_cb }, #: mgllab/table.cpp:166 mgllab/table.cpp:783 msgid "Mirror" msgstr "Отразить" #: udav/dat_pnl.cpp:619 msgid "Mirror data along direction(s)" msgstr "Отразить данные по направлению" #: src/exec_dat.cpp:1778 msgid "Mirror data at some direction" msgstr "Отразить данные по направлению" #: src/exec_dat.cpp:1779 msgid "Modify data values by formula" msgstr "Изменить данные по формуле" #: udav/dat_pnl.cpp:542 msgid "Momentum along 'x' for function" msgstr "Момент вдоль 'x' для функции" #: udav/dat_pnl.cpp:543 msgid "Momentum along 'y' for function" msgstr "Момент вдоль 'y' для функции" #: udav/dat_pnl.cpp:544 msgid "Momentum along 'z' for function" msgstr "Момент вдоль 'z' для функции" #: widgets/qt.cpp:1250 udav/plot_pnl.cpp:528 msgid "Move down" msgstr "Сдвиг вниз" #: widgets/qt.cpp:1252 udav/plot_pnl.cpp:531 msgid "Move graphics down 1/3 of its height." msgstr "Сдвинуть графику вниз на 1/3 высоты" #: widgets/qt.cpp:1236 udav/plot_pnl.cpp:507 msgid "Move graphics left by 1/3 of its width." msgstr "Сдвинуть графику влево на 1/3 ширины" #: widgets/qt.cpp:1256 udav/plot_pnl.cpp:537 msgid "Move graphics right by 1/3 of its width." msgstr "Сдвинуть графику вправо на 1/3 ширины" #: widgets/qt.cpp:1240 udav/plot_pnl.cpp:513 msgid "Move graphics up by 1/3 of its height." msgstr "Сдвинуть графику вверх на 1/3 высоты" #: widgets/qt.cpp:1234 udav/plot_pnl.cpp:504 msgid "Move left" msgstr "Сдвиг влево" #: udav/text_pnl.cpp:593 msgid "Move mouse-handled primitives to script." msgstr "Перенести заданные вручную примитивы в скрипт." #: udav/plot_pnl.cpp:455 msgid "Move plot down" msgstr "Сдвинуть график вниз" #: udav/plot_pnl.cpp:450 msgid "Move plot up" msgstr "Сдвинуть график вверх" #: widgets/qt.cpp:1254 udav/plot_pnl.cpp:534 msgid "Move right" msgstr "Сдвиг вправо" #: udav/plot_pnl.cpp:457 msgid "Move selected plot down to next subplot." msgstr "Переместить выбранное в следующий под-график." #: udav/plot_pnl.cpp:452 msgid "Move selected plot up to previous subplot." msgstr "Переместить выбранное в предыдущий под-график." #: widgets/qt.cpp:1238 udav/plot_pnl.cpp:510 msgid "Move up" msgstr "Сдвиг вверх" #: mgllab/table.cpp:798 msgid "Multiply by" msgstr "Умножить на" #: src/exec_dat.cpp:1781 msgid "Multiply by data or number" msgstr "Умножить на массив данных или число" #. E #: udav/style_dlg.cpp:245 mgllab/dialogs.cpp:53 msgid "N - darkskyblue" msgstr "N - грозовой" #: udav/dat_pnl.cpp:500 msgid "NOTE: All fields must be filled!" msgstr "Все поля должны быть заполнены!" #: udav/mem_pnl.cpp:68 msgid "Name" msgstr "Имя" #: mgllab/table.cpp:349 msgid "Name for output" msgstr "Имя для результата" #. navigation menu #: udav/dat_pnl.cpp:720 mgllab/table.cpp:801 msgid "Navigation" msgstr "Навигация" #: udav/newcmd_dlg.cpp:101 udav/newcmd_dlg.cpp:308 udav/newcmd_dlg.cpp:336 #: udav/newcmd_dlg.cpp:340 udav/newcmd_dlg.cpp:354 udav/newcmd_dlg.cpp:367 #: udav/newcmd_dlg.cpp:375 udav/newcmd_dlg.cpp:379 udav/newcmd_dlg.cpp:383 #: udav/text_pnl.cpp:558 udav/plot_pnl.cpp:440 mgllab/dialogs.cpp:702 msgid "New command" msgstr "Новая команда" #: src/window.cpp:415 msgid "" "New drawing never clears things drawn already. For example, you can make a " "surface with contour lines by calling commands 'surf' and 'cont' one after " "another (in any order). " msgstr "" "Новый график никогда не удаляет уже нарисованный. Например, можно построить " "поверхность с линиями уровня вызывая последовательно 'surf' и 'cont' (в " "любом порядке)." #: udav/text_pnl.cpp:562 udav/plot_pnl.cpp:445 msgid "New inplot" msgstr "Новый под-график" #: mgllab/table.cpp:672 msgid "New order of dimensions" msgstr "Новый порядок размерностей" #: udav/udav_wnd.cpp:282 mgllab/mgllab.cpp:284 msgid "New script" msgstr "Новый скрипт" #: mgllab/table.cpp:95 msgid "New size of data on 1st dimension (x-direction)" msgstr "Новый размер данных по x" #: mgllab/table.cpp:97 msgid "New size of data on 2nd dimension (y-direction)" msgstr "Новый размер данных по y" #: mgllab/table.cpp:99 msgid "New size of data on 3d dimension (z-direction)" msgstr "Новый размер данных по z" #: udav/hint_dlg.cpp:50 msgid "Next" msgstr "Следующий" #: mgllab/help.cpp:287 msgid "Next @->" msgstr "Следующий @->" #: udav/dat_pnl.cpp:745 mgllab/table.cpp:804 msgid "Next slice" msgstr "Следующий срез" #: widgets/qt.cpp:1264 udav/plot_pnl.cpp:561 msgid "Next slide" msgstr "Следующий кадр" #: mgllab/help.cpp:135 mgllab/mgllab.cpp:233 msgid "No" msgstr "Нет" #: udav/dat_pnl.cpp:567 udav/dat_pnl.cpp:644 msgid "No action is selected. Do nothing." msgstr "Действие не выбрано." #: udav/newcmd_dlg.cpp:308 msgid "No argument is selected" msgstr "Аргумент не выбран" #: udav/dat_pnl.cpp:573 msgid "No direction/formula is entered. Do nothing." msgstr "Не введено направление/формула" #: widgets/qt.cpp:696 widgets/qt.cpp:708 widgets/qt.cpp:720 widgets/qt.cpp:732 #: widgets/qt.cpp:744 widgets/qt.cpp:752 widgets/qt.cpp:760 widgets/qt.cpp:768 #: widgets/qt.cpp:776 widgets/qt.cpp:784 widgets/qt.cpp:792 widgets/qt.cpp:800 #: widgets/qt.cpp:816 widgets/qt.cpp:824 widgets/qt.cpp:832 msgid "No filename." msgstr "Отсутствует имя файла." #: mgllab/editor.cpp:589 mgllab/editor.cpp:611 mgllab/editor.cpp:636 #, c-format msgid "No occurrences of '%s' found!" msgstr "Вхождения '%s' не найдены!" #: mgllab/mathgl.cpp:262 msgid "No selection. So nothing to do" msgstr "Ничего не выбрано." #: udav/text_pnl.cpp:202 msgid "No string occurrence is found" msgstr "Вхождения не найдены" #: udav/setup_dlg.cpp:111 msgid "No text rotation" msgstr "Не вращать текст" #: widgets/fltk.cpp:844 msgid "Normal view" msgstr "Обычный вид" #: mgllab/table.cpp:770 msgid "Normalize" msgstr "Нормировать" #: src/exec_dat.cpp:1783 msgid "Normalize data" msgstr "Нормировать данные" #: src/exec_dat.cpp:1784 msgid "Normalize data slice by slice" msgstr "Нормировать данные по срезам" #: mgllab/table.cpp:553 msgid "Normalize in symmetrical range: -max(|v1|,|v2|) ... max(|v1|,|v2|)" msgstr "Нормировать симметрично: -max(|v1|,|v2|) ... max(|v1|,|v2|)" #: udav/udav_wnd.cpp:444 msgid "Not recognized" msgstr "Не распознано" #: udav/dat_pnl.cpp:456 msgid "Number of points" msgstr "Число точек" #: udav/prop_dlg.cpp:97 msgid "Numbers" msgstr "Числа" #: mgllab/table.cpp:176 msgid "Numeric parameter" msgstr "Численный параметр" #: udav/text_pnl.cpp:579 msgid "Numeric value" msgstr "Численное значение" #: src/exec_dat.cpp:1745 msgid "Numerically differentiate data" msgstr "Численно дифференцировать данные" #: src/exec_dat.cpp:1746 msgid "Numerically double differentiate data" msgstr "Численно дифференцировать данные дважды" #: udav/open_dlg.cpp:64 msgid "Nx" msgstr "Nx" #: udav/open_dlg.cpp:66 msgid "Ny" msgstr "Ny" #: udav/open_dlg.cpp:68 msgid "Nz" msgstr "Nz" #: widgets/qt.cpp:1096 udav/plot_pnl.cpp:488 msgid "OBJ" msgstr "OBJ" #: udav/anim_dlg.cpp:69 udav/prop_dlg.cpp:182 udav/args_dlg.cpp:65 #: udav/newcmd_dlg.cpp:80 udav/open_dlg.cpp:92 udav/dat_pnl.cpp:462 #: udav/dat_pnl.cpp:512 udav/dat_pnl.cpp:554 udav/dat_pnl.cpp:631 #: udav/opt_dlg.cpp:80 udav/files_dlg.cpp:60 udav/style_dlg.cpp:208 #: udav/data_dlg.cpp:92 udav/subplot_dlg.cpp:221 mgllab/mathgl.cpp:198 #: mgllab/dialogs.cpp:121 mgllab/dialogs.cpp:165 mgllab/dialogs.cpp:411 #: mgllab/dialogs.cpp:585 mgllab/dialogs.cpp:750 mgllab/dialogs.cpp:1072 #: mgllab/dialogs.cpp:1319 mgllab/dialogs.cpp:1474 mgllab/mgllab.cpp:491 #: mgllab/table.cpp:621 msgid "OK" msgstr "OK" #: mgllab/table.cpp:504 msgid "Only current slice will be inserted" msgstr "Только текущий срез будет вставлен" #: mgllab/mgllab.cpp:172 msgid "Open File?" msgstr "Открыть файл?" #: src/exec_dat.cpp:1786 msgid "Open all data arrays from HDF file" msgstr "Загрузить все данные из HDF файла" #: udav/udav_wnd.cpp:198 msgid "" "Open and execute/show script or data from file (Ctrl+O).\n" "You may switch off automatic execution in UDAV properties." msgstr "" "Открыть и выполнить скрипт или данные (Ctrl+O).\n" "Вы можете отключить автоматическое выполнение в настройках." #: mgllab/help.cpp:173 msgid "Open dialog for new data creation." msgstr "Открыть диалог создания новых данных." #: udav/udav_wnd.cpp:196 msgid "Open file" msgstr "Открыть файл" #: mgllab/mgllab.cpp:285 msgid "Open file ..." msgstr "Открыть файл ..." #: widgets/qt.cpp:1105 udav/udav_wnd.cpp:298 msgid "Open printer dialog and print graphics (Ctrl+P)" msgstr "Открыть диалог и напечатать график (CTRl+P)" #: mgllab/editor.cpp:511 msgid "Open script or data file" msgstr "Загрузить скрипт или файл данных" #: mgllab/help.cpp:164 msgid "Open table with selected data for editing." msgstr "Открыть таблицу с выбранным массивом данных." #: udav/data_dlg.cpp:65 mgllab/dialogs.cpp:578 msgid "Operation" msgstr "Операция" #: mgllab/table.cpp:231 msgid "Operation is not supported for this type of data." msgstr "Операция не поддерживается для данного типа данных." #: mgllab/table.cpp:795 msgid "Operations" msgstr "Операции" #: udav/prop_dlg.cpp:91 udav/newcmd_dlg.cpp:72 mgllab/dialogs.cpp:746 #: mgllab/mgllab.cpp:316 msgid "Options" msgstr "Опции" #: udav/setup_dlg.cpp:62 mgllab/dialogs.cpp:953 msgid "Origin" msgstr "Начало" #: udav/newcmd_dlg.cpp:171 mgllab/dialogs.cpp:712 msgid "Other plots" msgstr "Другие графики" #: mgllab/dialogs.cpp:1025 msgid "Others" msgstr "Другие" #: udav/style_dlg.cpp:161 mgllab/dialogs.cpp:372 msgid "Overline" msgstr "Надчеркнутый" #: mgllab/dialogs.cpp:112 msgid "Own brightness of the surface" msgstr "Собственная яркость поверхности" #. Q #: udav/style_dlg.cpp:248 mgllab/dialogs.cpp:56 msgid "P - darkpink" msgstr "P - багровый" #: src/prc.cpp:982 msgid "PDF support was disabled. Please, enable it and rebuild MathGL." msgstr "PDF поддержка отключена. Включите ее и пересоберите MathGL." #: widgets/qt.cpp:1085 udav/plot_pnl.cpp:476 msgid "PNG" msgstr "" #: mgllab/table.cpp:474 mgllab/table.cpp:486 msgid "PNG Files \t*.png" msgstr "PNG файлы \t*.png" #: src/canvas_cf.cpp:551 src/canvas_cf.cpp:553 src/data_png.cpp:118 #: src/export.cpp:75 src/export.cpp:109 msgid "PNG support was disabled. Please, enable it and rebuild MathGL." msgstr "PNG поддержка отключена. Включите ее и пересоберите MathGL." #: widgets/qt.cpp:1095 udav/plot_pnl.cpp:487 msgid "PRC" msgstr "" #: mgllab/dialogs.cpp:1006 msgid "Palette" msgstr "Палитра" #: mgllab/table.cpp:167 msgid "Parabolic *5" msgstr "По параболе *5" #: udav/dat_pnl.cpp:713 msgid "Paste data" msgstr "Вставить данные" #: udav/dat_pnl.cpp:715 msgid "Paste range of numbers from clipboard (Ctrl+Shift+P)." msgstr "Вставить диапазон значений из буфера обмена (Ctrl+Shift+P)." #: udav/text_pnl.cpp:538 mgllab/mgllab.cpp:302 msgid "Paste text" msgstr "Вставить текст" #: mgllab/editor.cpp:518 msgid "Paste text from clipboard" msgstr "Вставить текст из буфера обмена" #: udav/text_pnl.cpp:540 msgid "Paste text or data from clipboard (Ctrl+V)." msgstr "Вставить текст из буфера обмена (Ctrl+V)." #: mgllab/mgllab.cpp:476 msgid "Path for MathGL font (without extension)" msgstr "Путь к шрифтам MathGL (без расширения)" #: udav/prop_dlg.cpp:110 mgllab/mgllab.cpp:473 msgid "Path for help files" msgstr "Путь к файлам справки" #: udav/prop_dlg.cpp:130 msgid "Path for user MathGL font files" msgstr "Путь к шрифтам MathGL" #: widgets/qt.cpp:1282 msgid "Pause calculation" msgstr "Пауза вычислений" #. Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(setPause())); #: widgets/fltk.cpp:927 widgets/qt.cpp:1287 msgid "Pause on/off external calculations" msgstr "Пауза вкл/выкл для внешних вычислений" #: src/exec_dat.cpp:1804 msgid "Perform Runge-Kutta step" msgstr "Выполнить шаг Рунге-Кутта" #: widgets/fltk.cpp:896 msgid "Phi angle (rotate in x*y plane)" msgstr "Угол Phi (вращать в плоскости x*y)" #: udav/prop_dlg.cpp:161 msgid "Place editor at top" msgstr "Поместить редактор сверху" #: mgllab/dialogs.cpp:1050 msgid "Plot ID" msgstr "ID графика" #: src/exec_prm.cpp:648 msgid "Plot curve by formula" msgstr "Построить кривую по формуле" #. o->addSeparator(); bb->addSeparator(); #. a = new QAction(QPixmap(insert_xpm), _("Insert as list"), this); #. connect(a, SIGNAL(triggered()), this, SLOT(list())); #. o->addAction(a); #. bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); #: udav/dat_pnl.cpp:701 msgid "Plot data" msgstr "Нарисовать данные" #: udav/dat_pnl.cpp:703 msgid "" "Plot data in new script window. You may select the kind\n" "of plot, its style and so on." msgstr "" "Нарисовать данные в новом окне.\n" "Вы можете выбрать тип графика, его стиль и т.д." #: mgllab/mgllab.cpp:331 msgid "Plot setup" msgstr "Настройки графика" #: udav/text_pnl.cpp:571 mgllab/dialogs.cpp:312 mgllab/mgllab.cpp:315 msgid "Plot style" msgstr "Стиль графика" #: src/exec_prm.cpp:649 msgid "Plot surface by formula" msgstr "Построить поверхность по формуле" #: mgllab/dialogs.cpp:386 msgid "Popular color schemes" msgstr "Популярные цв.схемы" #: udav/hint_dlg.cpp:48 msgid "Prev" msgstr "Предыдущий" #: udav/dat_pnl.cpp:727 mgllab/table.cpp:803 msgid "Prev slice" msgstr "Предыдущий срез" #: widgets/qt.cpp:1273 udav/plot_pnl.cpp:576 msgid "Prev slide" msgstr "Предыдущий кадр" #: udav/info_dlg.cpp:53 msgid "Preview" msgstr "Просмотр" #: mgllab/mgllab.cpp:576 msgid "Previous expressions" msgstr "Предыдущее выражение" #: udav/newcmd_dlg.cpp:181 mgllab/dialogs.cpp:722 msgid "Primitives" msgstr "Примитивы" #: widgets/qt.cpp:1167 udav/plot_pnl.cpp:366 msgid "Primitives ..." msgstr "Примитивы ..." #: src/exec_set.cpp:872 msgid "Print MathGL version or check if it is valid" msgstr "Вывести версию MathGL или проверить, что она подходит" #: src/exec_dat.cpp:1750 msgid "Print content of the data" msgstr "Вывести содержимое массива данных" #: src/exec_dat.cpp:1792 msgid "Print fitted formula" msgstr "Вывести подобранную формулу" #: widgets/qt.cpp:1103 udav/udav_wnd.cpp:296 msgid "Print graphics" msgstr "Напечатать график" #: src/exec_dat.cpp:1742 msgid "Print list of data names in HDF file" msgstr "Вывести список имен переменных в HDF файле" #: src/exec_dat.cpp:1768 msgid "Print message or information about the data" msgstr "Вывести сообщение или информацию о данных" #: mgllab/mgllab.cpp:288 msgid "Print plot" msgstr "Напечатать график" #: udav/udav_wnd.cpp:295 msgid "Print script" msgstr "Напечатать скрипт" #: src/exec_prm.cpp:646 msgid "Print string from file" msgstr "Вывести строку в файл" #: udav/text_pnl.cpp:178 msgid "Printing aborted" msgstr "Печать отменена" #: udav/text_pnl.cpp:176 msgid "Printing completed" msgstr "Печать закончена" #: udav/text_pnl.cpp:174 msgid "Printing..." msgstr "Печатаю ..." #: udav/newcmd_dlg.cpp:180 mgllab/dialogs.cpp:721 msgid "Program flow" msgstr "Команды управления" #: src/exec_dat.cpp:1731 msgid "Project periodical data in [v1,v2]" msgstr "Проецирует периодические данные в [v1,v2]" #: udav/udav_wnd.cpp:312 mgllab/mgllab.cpp:328 mgllab/mgllab.cpp:468 msgid "Properties" msgstr "Свойства" #: udav/mem_pnl.cpp:61 msgid "Properties of selected data array" msgstr "Свойства выбранного массива данных" #: mgllab/table.cpp:342 mgllab/table.cpp:793 msgid "Pulse prop." msgstr "Свойства импульса" #: udav/calc_dlg.cpp:127 mgllab/mgllab.cpp:610 msgid "Put function" msgstr "Поместить" #: udav/dat_pnl.cpp:457 msgid "Put in variable" msgstr "Поместить в переменную" #: udav/dat_pnl.cpp:548 msgid "Put into this data array" msgstr "Поместить в этот массив данных" #: udav/anim_dlg.cpp:74 mgllab/mathgl.cpp:203 msgid "Put to script" msgstr "В скрипт" #: src/exec_dat.cpp:1791 msgid "Put value (numeric or array) to given data element" msgstr "Поместить число или массив в заданный элемент данных" #. U #: udav/style_dlg.cpp:247 mgllab/dialogs.cpp:55 msgid "Q - brown" msgstr "Q - коричневый" #: udav/udav_wnd.cpp:303 msgid "Quit" msgstr "Выход" #. G #: udav/style_dlg.cpp:239 mgllab/dialogs.cpp:47 msgid "R - maroon" msgstr "R - темно-красный" #: src/exec_set.cpp:852 msgid "Rasterize plot and save to background" msgstr "Растеризовать график и установить вместо фона" #: src/exec_dat.cpp:1797 msgid "Read and join data from several files" msgstr "Загрузить и объединить данные из нескольких файлов" #: src/exec_dat.cpp:1798 msgid "Read data from binary file of specified type" msgstr "Загрузить данные из бинарного файла заданного типа" #: src/exec_dat.cpp:1796 msgid "Read data from file" msgstr "Загрузить данные из файла" #: src/exec_dat.cpp:1800 msgid "Read data from file with sizes specified in first row" msgstr "Загрузить данные из файла с размерами из первой строки" #: src/exec_dat.cpp:1799 msgid "Read data with name 'id' from HDF file" msgstr "Загрузить данные с именем 'id' из HDF файла" #: udav/udav_wnd.cpp:268 mgllab/mgllab.cpp:373 msgid "Ready" msgstr "Готов" #: src/exec_dat.cpp:1801 msgid "Rearrange data dimensions" msgstr "Упорядочить размерности массива данных" #: udav/udav_wnd.cpp:301 mgllab/mgllab.cpp:289 msgid "Recent files" msgstr "Последние файлы" #: udav/dat_pnl.cpp:768 msgid "Recreate the data with new sizes and fill it by zeros (Ctrl+Shift+N)." msgstr "Пересоздать данные с новым размером и заполнить нулями (Ctrl+Shift+N)." #: udav/text_pnl.cpp:521 msgid "Redo" msgstr "Отменить" #: udav/text_pnl.cpp:523 msgid "Redo editor change (Ctrl+Shift+Z)." msgstr "Отменить правку в редакторе (Ctrl+Shift+Z)." #: widgets/qt.cpp:1147 udav/plot_pnl.cpp:332 msgid "Redraw" msgstr "Перерисовать" #: udav/anim_dlg.cpp:41 mgllab/mathgl.cpp:186 msgid "Redraw picture for $0 equal to" msgstr "Перерисовать для $0 равного" #: widgets/fltk.cpp:845 msgid "Redraw plot" msgstr "Перерисовать график" #: mgllab/dialogs.cpp:1320 msgid "Refresh" msgstr "Обновить" #: widgets/fltk.cpp:879 msgid "Refresh the picture" msgstr "Обновить рисунок" #: mgllab/dialogs.cpp:404 msgid "Relative position of i-th color" msgstr "Положение i-го цвета" #: udav/plot_pnl.cpp:343 msgid "Reload" msgstr "Перезагрузить" #: widgets/fltk.cpp:847 msgid "Reload data" msgstr "Перезагрузить" #: widgets/fltk.cpp:885 msgid "Reload data and refresh the picture" msgstr "Перезагрузить данные и обновить рисунок" #: src/exec_dat.cpp:1730 msgid "Remove duplicate rows" msgstr "Удалить одинаковые строки" #: src/exec_dat.cpp:1811 msgid "Remove jump into the data, like phase jumps" msgstr "Убрать скачки данных, например скачки фазы" #: udav/find_dlg.cpp:50 mgllab/editor.cpp:566 msgid "Replace" msgstr "Заменить" #: mgllab/editor.cpp:569 msgid "Replace all" msgstr "Заменить все" #: udav/find_dlg.cpp:39 mgllab/editor.cpp:565 msgid "Replace by:" msgstr "Заменить на:" #: udav/text_pnl.cpp:581 msgid "Replace expression by its numerical value." msgstr "Заменить выражение на его числовое значение." #: mgllab/editor.cpp:635 #, c-format msgid "Replaced %ld occurrences." msgstr "Заменено %ld вхождений." #: mgllab/dialogs.cpp:891 #, c-format msgid "Required argument %s is not specified!" msgstr "Обязательный аргумент %s не задан!" #: udav/subplot_dlg.cpp:186 msgid "Reserve at" msgstr "Оставить место" #: mgllab/dialogs.cpp:1303 msgid "Reserve at:" msgstr "Пустое поле" #: udav/subplot_dlg.cpp:190 msgid "Reserve space for labels at bottom side (style '_')" msgstr "Оставить место для подписей снизу (стиль '_')" #: udav/subplot_dlg.cpp:188 msgid "Reserve space for labels at left side (style '<')" msgstr "Оставить место для подписей слева (стиль '<')" #: udav/subplot_dlg.cpp:194 msgid "Reserve space for labels at right side (style '>')" msgstr "Оставить место для подписей справа (стиль '>')" #: udav/subplot_dlg.cpp:192 msgid "Reserve space for labels at top side (style '^')" msgstr "Оставить место для подписей сверху (стиль '^')" #: src/exec_set.cpp:853 msgid "Reset settings and clear picture" msgstr "Сбросить настройки и обновить рисунок" #: udav/dat_pnl.cpp:772 mgllab/table.cpp:761 msgid "Resize" msgstr "Изменить размер" #: udav/dat_pnl.cpp:774 msgid "Resize (interpolate) the data to specified sizes (Ctrl+Shift+R)." msgstr "Изменить размер (интерполоировать) данных (Ctrl+Shift+R)." #: src/exec_dat.cpp:1803 msgid "Resize data array" msgstr "Изменить размер массива данных" #: mgllab/table.cpp:858 msgid "Resize data with smoothing" msgstr "Изменить размер массива данных со сглаживанием" #: widgets/qt.cpp:1140 udav/plot_pnl.cpp:326 msgid "Restore" msgstr "Восстановить" #: widgets/fltk.cpp:876 msgid "Restore default graphics rotation, zoom and perspective" msgstr "Восстановить вращение, приближение и перспективу графика" #: widgets/qt.cpp:1142 msgid "Restore default graphics rotation, zoom and perspective (Alt+Space)." msgstr "Восстановить вращение, приближение и перспективу графика (Alt+Space)." #: udav/plot_pnl.cpp:328 msgid "Restore default graphics rotation, zoom and perspective (Ctrl+Space)." msgstr "Восстановить вращение, приближение и перспективу графика (Ctrl+Space)." #: udav/plot_pnl.cpp:345 msgid "Restore status for 'once' command and reload data (F9)." msgstr "Восстановить статус команды 'once' и перезагрузить данные (F9)" #: udav/calc_dlg.cpp:63 udav/data_dlg.cpp:85 udav/data_dlg.cpp:143 #: udav/subplot_dlg.cpp:212 mgllab/dialogs.cpp:1315 msgid "Result" msgstr "Итог" #: udav/data_dlg.cpp:124 msgid "Result (will have sizes " msgstr "Результат (будет иметь размеры " #: udav/style_dlg.cpp:201 udav/subplot_dlg.cpp:214 mgllab/dialogs.cpp:408 msgid "Resulting string" msgstr "Итоговая строка" #: src/parser.cpp:1506 msgid "Return from function" msgstr "Возврат из функции" #: udav/subplot_dlg.cpp:148 msgid "Right bottom edge" msgstr "Правый нижний угол" #: udav/subplot_dlg.cpp:156 msgid "Right top edge" msgstr "Правый верхний угол" #: mgllab/table.cpp:166 mgllab/table.cpp:784 msgid "Roll" msgstr "Сдвинуть" #: src/exec_dat.cpp:1805 msgid "Roll data along direction(s)" msgstr "Сдвинуть данные по направлению" #. rotate menu #: udav/plot_pnl.cpp:541 msgid "Rotate" msgstr "Вращать" #: widgets/qt.cpp:1127 udav/plot_pnl.cpp:311 msgid "Rotate by mouse" msgstr "Вращать мышкой" #: udav/plot_pnl.cpp:546 msgid "Rotate down" msgstr "Вращать вниз" #: udav/plot_pnl.cpp:550 msgid "Rotate left" msgstr "Вращать влево" #: udav/subplot_dlg.cpp:164 mgllab/dialogs.cpp:1294 msgid "Rotate on" msgstr "Поворот" #: widgets/fltk.cpp:872 msgid "Rotate picture by holding left mouse button" msgstr "Вращать рисунок при удержании кнопок мыши" #: src/exec_set.cpp:854 msgid "Rotate plot" msgstr "Вращать график" #: udav/plot_pnl.cpp:554 msgid "Rotate right" msgstr "Вращать вправо" #: udav/plot_pnl.cpp:542 msgid "Rotate up" msgstr "Вращать вверх" #: mgllab/dialogs.cpp:356 msgid "Rotation" msgstr "Вращение" #: widgets/qt.cpp:1271 msgid "Run slideshow (CTRl+F5)." msgstr "Запустить анимацию (CTRl+F5)." #: udav/plot_pnl.cpp:571 msgid "" "Run slideshow (Ctrl+F5). If no parameter specified\n" "then the dialog with slideshow options will appear." msgstr "" "Запустить анимацию (CTRl+F5). Если ее параметры\n" "не заданы, то будет показан диалог настройки." #: widgets/fltk.cpp:918 msgid "Run/Stop slideshow (graphics animation)" msgstr "Запустить/остановить анимацию" #: udav/prop_dlg.cpp:141 msgid "Russian" msgstr "Русский" #: widgets/qt.cpp:1097 udav/plot_pnl.cpp:489 msgid "STL" msgstr "" #: widgets/qt.cpp:1090 udav/plot_pnl.cpp:481 msgid "SVG" msgstr "" #: udav/style_dlg.cpp:107 msgid "Saturation" msgstr "Насыщенность" #: udav/setup_dlg.cpp:143 mgllab/editor.cpp:286 msgid "Save" msgstr "Сохранить" #: mgllab/help.cpp:254 mgllab/table.cpp:456 msgid "Save Data?" msgstr "Сохранить данные?" #: widgets/fltk.cpp:601 mgllab/mgllab.cpp:220 msgid "Save File As?" msgstr "Сохранить файл?" #: udav/anim_dlg.cpp:83 msgid "Save JPEG frames" msgstr "Сохранить кадры в JPEG" #: udav/udav_wnd.cpp:290 mgllab/mgllab.cpp:287 msgid "Save as ..." msgstr "Сохранить как ..." #: udav/dat_pnl.cpp:688 msgid "Save data" msgstr "Сохранить данные" #: src/exec_dat.cpp:1808 msgid "Save data to HDF5 file" msgstr "Сохранить данные в HDF5 файл" #: udav/dat_pnl.cpp:690 msgid "Save data to a file (Ctrl+Shift+S)." msgstr "Сохранить данные в файл (Ctrl+Shift+S)." #: src/exec_dat.cpp:1807 mgllab/table.cpp:844 msgid "Save data to file" msgstr "Сохранить данные в файл" #: mgllab/mgllab.cpp:286 msgid "Save file" msgstr "Сохранить файл" #: mgllab/mgllab.cpp:480 msgid "Save file before redrawing" msgstr "Сохранить файл перед рисованием" #: udav/udav_wnd.cpp:201 msgid "Save script" msgstr "Сохранить скрипт" #: udav/udav_wnd.cpp:203 msgid "Save script to a file (Ctrl+S)" msgstr "Сохранить скрипт в файл (Ctrl+S)" #: mgllab/editor.cpp:513 msgid "Save script to file" msgstr "Сохранить скрипт в файл" #: mgllab/help.cpp:176 msgid "Save selected data to file." msgstr "Сохранить выбранные данные в файл." #: mgllab/table.cpp:753 msgid "Save to file" msgstr "Сохранить в файл" #: udav/udav_wnd.cpp:672 msgid "Saving aborted" msgstr "Сохранение прервано" #: udav/newcmd_dlg.cpp:179 mgllab/dialogs.cpp:720 msgid "Scale and rotate" msgstr "Масштаб и вращение" #: udav/udav_wnd.cpp:237 msgid "Script" msgstr "Скрипт" #: udav/find_dlg.cpp:43 mgllab/editor.cpp:568 msgid "Search backward" msgstr "Искать назад" #: udav/text_pnl.cpp:543 mgllab/mgllab.cpp:303 msgid "Select all" msgstr "Выделить все" #: udav/text_pnl.cpp:585 msgid "Select and insert file name." msgstr "Выбрать и вставить имя файла." #: udav/text_pnl.cpp:589 msgid "Select and insert folder name." msgstr "Выбрать и вставить путь к папке." #: mgllab/dialogs.cpp:565 msgid "Select data argument" msgstr "Выбрать данные" #: mgllab/dialogs.cpp:160 msgid "Select direction" msgstr "Выбрать направление" #: mgllab/editor.cpp:658 msgid "Select file name" msgstr "Выбрать имя файла" #: udav/newcmd_dlg.cpp:337 udav/newcmd_dlg.cpp:355 msgid "Select first the proper kind of arguments" msgstr "Сначала выберите вариант аргументов" #: mgllab/editor.cpp:671 msgid "Select folder name" msgstr "Выбрать путь к папке" #: udav/info_dlg.cpp:39 msgid "Select kind of plot" msgstr "Выбрать тип графика" #: src/exec_set.cpp:871 msgid "Select variant of plot style(s)" msgstr "Выбрать вариант стиля графика" #: mgllab/mathgl.cpp:168 msgid "Set" msgstr "Задать" #: src/exec_set.cpp:867 msgid "Set additional tick and axis labels shift" msgstr "Задает дополнительный сдвиш меток осей" #: src/exec_set.cpp:813 msgid "Set ambient light brightness" msgstr "Задает яркость фонового освещения" #: src/exec_set.cpp:835 msgid "Set arbitrary position of plot in picture" msgstr "Задать произвольную область рисования внутри рисунка" #: udav/udav_wnd.cpp:315 mgllab/mgllab.cpp:329 msgid "Set arguments" msgstr "Задать аргументы" #: src/exec_set.cpp:815 msgid "Set aspect ration" msgstr "Задать соотношение сторон" #: src/exec_set.cpp:817 msgid "Set axis and tick style" msgstr "Задать стиль осей и меток" #: src/exec_set.cpp:844 msgid "Set axis origin" msgstr "Задать начало координат" #: src/exec_set.cpp:851 msgid "Set axis ranges" msgstr "Задать диапазон осей" #: src/exec_set.cpp:859 msgid "Set bit-flags (for advanced users only)" msgstr "Задает битовый флаг (для опытных пользователей)" #: src/exec_set.cpp:819 msgid "Set bounding box for 2d export" msgstr "Задать границы для 2d экспорта" #: src/exec_set.cpp:841 msgid "Set brush for given mask id" msgstr "Задать кисть для маски с выбранным id" #: src/exec_set.cpp:824 msgid "Set color range" msgstr "Задать диапазон цвета" #: src/exec_dat.cpp:1766 msgid "Set column id for data" msgstr "Задать id колонок данных" #: mgllab/dialogs.cpp:108 msgid "Set cutting off/on for particular plot" msgstr "Вкл/выкл обрезание для конкретного графика" #: udav/open_dlg.cpp:62 msgid "Set data sizes manually" msgstr "Задать размеры данных вручную" #: src/exec_set.cpp:818 msgid "Set default bars width" msgstr "Задать размер полос по умолчанию" #: src/exec_set.cpp:849 msgid "Set default filename" msgstr "Задать имя файла по умолчанию" #: src/exec_set.cpp:812 msgid "Set default transparency" msgstr "Задать прозрачность по умолчанию" #: src/exec_set.cpp:827 msgid "Set diffusive light brightness" msgstr "Задать яркость рассеянного света" #: src/exec_set.cpp:828 msgid "Set draw region for quality&4" msgstr "Задать область рисования при quality&4" #: udav/subplot_dlg.cpp:47 udav/subplot_dlg.cpp:89 msgid "Set drawing area as cell of matrix nx*ny." msgstr "Задать область рисования как ячейку матрицы nx*ny." #: udav/subplot_dlg.cpp:110 msgid "Set drawing area as cells of column." msgstr "Задать область рисования как ячейку колонки." #: udav/subplot_dlg.cpp:64 udav/subplot_dlg.cpp:140 msgid "Set drawing area as cells of matrix nx*ny." msgstr "Задать область рисования как ячейки матрицы nx*ny." #: udav/subplot_dlg.cpp:127 msgid "Set drawing area as cells of stick." msgstr "Задать область рисования как ячейку бруска." #: mgllab/dialogs.cpp:117 msgid "Set lighting off/on for particular plot" msgstr "Вкл/выкл освещение отдельного графика" #: src/exec_set.cpp:842 msgid "Set number of lines in mesh/fall/vect and so on" msgstr "Задать примерное число линий в mesh/fall/vect ..." #: src/exec_set.cpp:836 msgid "Set number of marks in the legend" msgstr "Задать число маркеров в легенде" #: src/exec_set.cpp:829 msgid "Set number of visible faces" msgstr "Задать число видимых граней" #: src/exec_set.cpp:846 msgid "Set palette for 1D plots" msgstr "Задать палитру для 1D графиков" #: src/exec_set.cpp:848 msgid "Set perspective" msgstr "Задать перспективу" #: src/exec_set.cpp:857 msgid "Set picture size" msgstr "Задать размер рисунка" #: src/exec_set.cpp:850 msgid "Set plot quality" msgstr "Задать качество рисования картинки" #: src/exec_set.cpp:863 msgid "Set position of plot as cell of matrix" msgstr "Задать область рисования как ячейку матрицы" #: src/exec_set.cpp:843 msgid "Set position of plot block in matrix" msgstr "Задать область рисования как блок в матрице" #: src/exec_set.cpp:823 msgid "Set position of plot inside cell of column" msgstr "Задать область рисования как ячейку колонки" #: src/exec_set.cpp:834 msgid "Set position of plot inside cell of matrix" msgstr "Задать область рисования внутри ячейки колонки" #: src/exec_set.cpp:862 msgid "Set position of plot inside cell of rotated stick" msgstr "Задать область рисования как ячейку повернутого бруска" #: src/exec_set.cpp:861 msgid "Set position of plot inside cell of sheared stick" msgstr "Задать область рисования как ячейку наклоненной колонки" #: src/exec_set.cpp:875 msgid "Set range for x-axis" msgstr "Задать диапазон по x" #: src/exec_set.cpp:877 msgid "Set range for y-axis" msgstr "Задать диапазон по y" #: src/exec_set.cpp:881 msgid "Set range for z-axis" msgstr "Задать диапазон по z" #: src/exec_set.cpp:856 msgid "Set scale text in relative subplots too" msgstr "Задает масштабирование текста в отн.подграфиках" #: src/exec_set.cpp:858 msgid "Set scaling factor for further setsize" msgstr "Задать множитель для всех 'setsize'" #: mgllab/mathgl.cpp:145 msgid "Set script arguments" msgstr "Задать аргументы скрипта" #: mgllab/dialogs.cpp:105 msgid "Set size for text, marks and others" msgstr "Задать размер текста, маркеров и пр." #: src/exec_set.cpp:814 msgid "Set size of arrows" msgstr "Задать размер стрелок" #: src/exec_set.cpp:840 msgid "Set size of markers" msgstr "Задать размер маркеров" #: src/exec_set.cpp:847 msgid "Set size of semi-transparent area around line" msgstr "Задать размер полупрозрачной области около линии" #: src/exec_set.cpp:845 msgid "Set tick labels drawing at origin" msgstr "Разрешить вывод меток осей в начале координат" #: src/exec_set.cpp:866 msgid "Set tick length" msgstr "Задать длину меток осей" #: src/exec_set.cpp:825 msgid "Set ticks for colorbar" msgstr "Задать метки для цветовой шкалы" #: src/exec_set.cpp:876 msgid "Set ticks for x-axis" msgstr "Задать метки для оси x" #: src/exec_set.cpp:878 msgid "Set ticks for y-axis" msgstr "Задать метки для оси y" #: src/exec_set.cpp:882 msgid "Set ticks for z-axis" msgstr "Задать метки для оси z" #: src/exec_set.cpp:868 msgid "Set ticks in time format" msgstr "Задать метки в формате времени" #: src/exec_set.cpp:870 msgid "Set ticks tuning" msgstr "Включить оптимизацию меток осей" #: src/exec_set.cpp:855 msgid "Set to auto rotate text or not" msgstr "Разрешить поворот текста" #: udav/subplot_dlg.cpp:196 msgid "Set to use whole area (style '#')" msgstr "Задать использование всей области (стиль '#')" #: src/exec_set.cpp:869 msgid "Set type transparency" msgstr "Задать тип прозрачности" #: widgets/qt.cpp:1226 msgid "Set value of \\phi angle." msgstr "Задать значени угла φ" #: udav/plot_pnl.cpp:473 msgid "" "Set value of \\phi angle.\n" "You can use keys (Shift+Meta+Left or Shift+Meta+Right)." msgstr "" "Задать значени угла φ.\n" "Вы можете использовать клавиши (Shift+Meta+Left или Shift+Meta+Right)." #: widgets/qt.cpp:1220 msgid "Set value of \\theta angle." msgstr "Задать значени угла θ" #: udav/plot_pnl.cpp:467 msgid "" "Set value of \\theta angle.\n" "You can use keys (Shift+Meta+Up or Shift+Meta+Down)." msgstr "" "Задать значени угла θ.\n" "Вы можете использовать клавиши (Shift+Meta+Up или Shift+Meta+Down)." #: udav/udav_wnd.cpp:311 msgid "Settings" msgstr "Настройки" #: mgllab/mgllab.cpp:327 msgid "Setup" msgstr "Настройки" #: mgllab/mgllab.cpp:330 msgid "Setup animation" msgstr "Настроить анимацию" #: udav/prop_dlg.cpp:80 msgid "Setup colors for:" msgstr "Настроить цвета:" #: src/exec_set.cpp:832 msgid "Setup font" msgstr "Настроить шрифт" #: src/exec_set.cpp:837 msgid "Setup light" msgstr "Настроить освещение" #: src/exec_prm.cpp:630 msgid "Setup or draw axis" msgstr "Настроить или нарисовать оси" #: src/exec_set.cpp:826 msgid "Setup plot points cutting" msgstr "Настроить обрезание точек графика" #: mgllab/dialogs.cpp:947 msgid "Setup script" msgstr "Настроить скрипт" #: udav/plot_pnl.cpp:574 msgid "Setup show" msgstr "Настроить анимацию" #: udav/dat_pnl.cpp:623 msgid "Sew data along direction(s)" msgstr "Сшить данные по направлению" #: mgllab/table.cpp:166 mgllab/table.cpp:785 msgid "Sew phase" msgstr "Сшить фазу" #: mgllab/dialogs.cpp:350 msgid "Sharp colors" msgstr "Контрастные" #: src/exec_set.cpp:860 msgid "Shear plot" msgstr "Наклон графика" #: widgets/fltk.cpp:911 msgid "Shift the picture down" msgstr "Сдвинуть рисунок вниз" #: widgets/fltk.cpp:903 msgid "Shift the picture left" msgstr "Сдвинуть рисунок слево" #: widgets/fltk.cpp:909 msgid "Shift the picture right" msgstr "Сдвинуть рисунок вправо" #: widgets/fltk.cpp:901 msgid "Shift the picture up" msgstr "Сдвинуть рисунок вверх" #: udav/newcmd_dlg.cpp:56 mgllab/dialogs.cpp:737 msgid "Short description of selected command" msgstr "Краткое описание выбранной команды" #: udav/info_dlg.cpp:56 msgid "Short information about the data." msgstr "Краткая информация о данных" #: udav/hint_dlg.cpp:44 msgid "Show at startup" msgstr "Показать при запуске" #: udav/udav_wnd.cpp:210 msgid "" "Show calculator which evaluate and help to type textual formulas.\n" "Textual formulas may contain data variables too." msgstr "" "Показать калькулятор, который вычисляет текстовые формулы,\n" "которые могут содержать и переменные из скрипта." #: mgllab/editor.cpp:530 msgid "Show calculator window" msgstr "Показать окно калькулятора" #: widgets/fltk.cpp:922 msgid "Show custom dialog for plot setup" msgstr "Показать диалог настроек графика" #: udav/udav_wnd.cpp:314 msgid "Show dialog for UDAV properties." msgstr "Показать диалог настроек UDAV" #: udav/text_pnl.cpp:560 udav/plot_pnl.cpp:442 msgid "Show dialog for new command or edit arguments of existed one." msgstr "Показать диалог ввода новой команды или редактирования существующей" #: udav/text_pnl.cpp:564 udav/plot_pnl.cpp:447 msgid "Show dialog for new inplot and put it into the script." msgstr "Показать диалог создания под-графика и вставки его в скрипт" #: udav/text_pnl.cpp:577 msgid "" "Show dialog for options and put it into the script.\n" "Options are used for additional setup the plot." msgstr "" "Показать диалог ввода опций и вставки их в скрипт.\n" "Опции используются для дополнительной настройки графика." #: udav/text_pnl.cpp:598 msgid "" "Show dialog for plot setup and put code into the script.\n" "This dialog setup axis, labels, lighting and other general things." msgstr "Показать диалог настройки рисунка: осей, подписей, освещения и пр." #: udav/text_pnl.cpp:573 msgid "" "Show dialog for styles and put it into the script.\n" "Styles define the plot view (color scheme, marks, dashing and so on)." msgstr "" "Показать диалог стиля графика и вставить его в скрипт.\n" "Стиль задает цветовую схему, маркеры, штриховку и пр." #: udav/text_pnl.cpp:548 msgid "Show dialog for text finding (Ctrl+F)." msgstr "Показать диалог поиска текста (Ctrl+F)." #: udav/udav_wnd.cpp:326 msgid "Show help on MGL commands (F1)." msgstr "Показать справку по командам MGL (F1)." #: udav/udav_wnd.cpp:219 msgid "Show hidden plots" msgstr "Показать скрытые графики" #: mgllab/help.cpp:284 msgid "Show hint on startup" msgstr "Показать подсказки при старте" #: udav/udav_wnd.cpp:330 msgid "Show hints of MGL usage." msgstr "Показать подсказки по использованию MGL." #: udav/udav_wnd.cpp:213 msgid "Show info" msgstr "Показать информацию" #: mgllab/mgllab.cpp:305 msgid "Show lines" msgstr "Показать строки" #: widgets/fltk.cpp:919 msgid "Show next frame in slideshow" msgstr "Показать следующий кадр" #: widgets/qt.cpp:1266 udav/plot_pnl.cpp:564 msgid "Show next slide (Ctrl+.)." msgstr "Показать следующий кадр (Ctrl+.)." #: widgets/fltk.cpp:914 msgid "Show previous frame in slideshow" msgstr "Показать предыдущий кадр" #: widgets/qt.cpp:1275 udav/plot_pnl.cpp:579 msgid "Show previous slide (Ctrl+,)." msgstr "Показать предыдущий кадр (Ctrl+,)." #: mgllab/editor.cpp:532 msgid "Show window for primitives" msgstr "Показать окно для примитивов" #: src/random.cpp:349 msgid "Shuffle data cells (for dir='a') or slices (for dir='xyz')" msgstr "Перемешать ячейки (для dir='a') или срезы (для dir='xyz') данных" #: mgllab/table.cpp:779 msgid "Sin FFT" msgstr "Синус-Фурье" #: udav/dat_pnl.cpp:620 msgid "Sin-Fourier transform along direction(s)" msgstr "Синус-Фурье преобразование вдоль направления" #: src/exec_dat.cpp:1812 msgid "Sin-Fourier transform at some direction" msgstr "Синус-Фурье преобразование вдоль направления" #: mgllab/table.cpp:165 msgid "Sinus FFT" msgstr "Синус-Фурье" #: udav/opt_dlg.cpp:70 mgllab/dialogs.cpp:104 mgllab/dialogs.cpp:359 msgid "Size" msgstr "Размер" #: udav/subplot_dlg.cpp:114 msgid "Size of column" msgstr "Размер колонки" #: udav/subplot_dlg.cpp:131 msgid "Size of stick" msgstr "Размер бруска" #. size menu #: udav/mem_pnl.cpp:68 udav/dat_pnl.cpp:765 mgllab/dialogs.cpp:1015 #: mgllab/table.cpp:759 msgid "Sizes" msgstr "Размеры" #: src/parser.cpp:1491 msgid "Skip commands and iterate for-loop again" msgstr "Пропустить команды до конца цикла for" #: widgets/qt.cpp:1268 udav/plot_pnl.cpp:567 msgid "Slideshow" msgstr "Анимация" #: mgllab/table.cpp:163 mgllab/table.cpp:773 msgid "Smooth" msgstr "Сгладить" #: src/exec_dat.cpp:1813 msgid "Smooth data" msgstr "Сгладить массив данных" #: udav/dat_pnl.cpp:613 msgid "Smooth data along direction(s)" msgstr "Сгладить массив данных по направлению" #: src/exec_dat.cpp:1795 msgid "Solve Hamiltonian ODE (find GO ray or trajectory)" msgstr "Решить гамильтонову ОДУ (найти ГО луч/траекторию)" #: src/exec_dat.cpp:1785 msgid "Solve ODE" msgstr "Решить систему обыкновенных диф. уравнений" #: src/exec_dat.cpp:1787 msgid "Solve PDE" msgstr "Решить уравнение в частных производных" #: src/exec_dat.cpp:1793 msgid "Solve PDE in accompanied coordinates for 2d case" msgstr "Решить PDE в сопровождающей системе координат (2d)" #: src/exec_dat.cpp:1794 msgid "Solve PDE in accompanied coordinates for 3d case" msgstr "Решить PDE в сопровождающей системе координат (3d)" #: src/exec_dat.cpp:1729 msgid "Solve PDE using advanced method (X-Y only)" msgstr "Решить PDE (сложные уравнения, 2d случай)" #: src/exec_dat.cpp:1827 msgid "Solve tridiagonal matrix" msgstr "Решить трехдиагональную систему" #: src/exec_dat.cpp:1815 msgid "Sort data by values in column" msgstr "Сортировать данные по значениям в колонке" #: udav/prop_dlg.cpp:141 msgid "Spanish" msgstr "Испанский" #: udav/calc_dlg.cpp:194 msgid "Special" msgstr "Специальные" #: mgllab/table.cpp:129 msgid "" "Specify new data size\n" "Data will be interpolated" msgstr "" "Укажите новый размер данных.\n" "Данные будут интерполированы." #: mgllab/table.cpp:114 msgid "" "Specify new data size\n" "Data will be zero filled" msgstr "" "Укажите новый размер данных.\n" "Данные будут обнулены." #: mgllab/table.cpp:144 msgid "" "Specify the skipping step\n" "Each m-th point will be saved only" msgstr "" "Укажите шаг пропуска.\n" "Только каждая m-ая точка будет сохранена." #: udav/dat_pnl.cpp:778 mgllab/table.cpp:762 msgid "Squeeze" msgstr "Сжать" #: src/exec_dat.cpp:1816 msgid "Squeeze data" msgstr "Сжать данные" #: udav/setup_dlg.cpp:84 msgid "Start" msgstr "Старт" #: src/parser.cpp:1501 msgid "Start function definition and stop execution of main script" msgstr "Начало определения функции и остановка выполнения основного скрипта" #: src/parser.cpp:1504 msgid "Start next for-loop iteration" msgstr "Начать новую итерацию цикла for" #: src/parser.cpp:1505 msgid "Start/close commands which should executed only once" msgstr "Начало/конец блока команд, которые будут выполняться единожды" #: udav/subplot_dlg.cpp:76 msgid "Starting cell index" msgstr "Индекс начальной ячейки" #: udav/setup_dlg.cpp:117 msgid "State" msgstr "Состояние" #: src/exec_dat.cpp:1747 msgid "Step for pulse diffraction" msgstr "Шаг для расчета дифракции импульса" #: widgets/qt.cpp:1152 udav/plot_pnl.cpp:348 msgid "Stop" msgstr "Стоп" #: widgets/fltk.cpp:881 msgid "Stop drawing" msgstr "Остановить рисование" #: src/parser.cpp:1507 msgid "Stop execution" msgstr "Остановить выполнение скрипта" #: udav/plot_pnl.cpp:350 msgid "Stop script execution (F7)." msgstr "Остановить выполнение скрипта (F7)" #: udav/args_dlg.cpp:59 mgllab/mathgl.cpp:164 msgid "String for $0" msgstr "Строка для $0" #: udav/args_dlg.cpp:41 mgllab/mathgl.cpp:146 msgid "String for $1" msgstr "Строка для $1" #: udav/args_dlg.cpp:43 mgllab/mathgl.cpp:148 msgid "String for $2" msgstr "Строка для $2" #: udav/args_dlg.cpp:45 mgllab/mathgl.cpp:150 msgid "String for $3" msgstr "Строка для $3" #: udav/args_dlg.cpp:47 mgllab/mathgl.cpp:152 msgid "String for $4" msgstr "Строка для $4" #: udav/args_dlg.cpp:49 mgllab/mathgl.cpp:154 msgid "String for $5" msgstr "Строка для $5" #: udav/args_dlg.cpp:51 mgllab/mathgl.cpp:156 msgid "String for $6" msgstr "Строка для $6" #: udav/args_dlg.cpp:53 mgllab/mathgl.cpp:158 msgid "String for $7" msgstr "Строка для $7" #: udav/args_dlg.cpp:55 mgllab/mathgl.cpp:160 msgid "String for $8" msgstr "Строка для $8" #: udav/args_dlg.cpp:57 mgllab/mathgl.cpp:162 msgid "String for $9" msgstr "Строка для $9" #: udav/files_dlg.cpp:38 msgid "String for %1" msgstr "Строка для %1" #: udav/files_dlg.cpp:40 msgid "String for %2" msgstr "Строка для %2" #: udav/files_dlg.cpp:42 msgid "String for %3" msgstr "Строка для %3" #: udav/files_dlg.cpp:44 msgid "String for %4" msgstr "Строка для %4" #: udav/files_dlg.cpp:46 msgid "String for %5" msgstr "Строка для %5" #: udav/files_dlg.cpp:48 msgid "String for %6" msgstr "Строка для %6" #: udav/files_dlg.cpp:50 msgid "String for %7" msgstr "Строка для %7" #: udav/files_dlg.cpp:52 msgid "String for %8" msgstr "Строка для %8" #: udav/files_dlg.cpp:54 msgid "String for %9" msgstr "Строка для %9" #: udav/prop_dlg.cpp:85 msgid "Strings" msgstr "Строки" #: udav/subplot_dlg.cpp:208 mgllab/dialogs.cpp:1314 msgid "Style" msgstr "Стиль" #: udav/setup_dlg.cpp:80 msgid "SubTicks" msgstr "Подметки" #: mgllab/dialogs.cpp:959 msgid "Subticks" msgstr "Подметки" #: src/exec_dat.cpp:1819 msgid "Subtract data or number" msgstr "Вычесть данные или число" #: mgllab/table.cpp:797 msgid "Subtract to" msgstr "Вычесть" #: udav/prop_dlg.cpp:94 msgid "Suffixes" msgstr "Суффиксы" #: udav/dat_pnl.cpp:539 msgid "Sum along direction(s)" msgstr "Суммировать вдоль направления" #: udav/dat_pnl.cpp:614 msgid "Summarize data along direction(s)" msgstr "Суммировать вдоль направления" #. { _("Histogram of"), 0, hist_cb }, #: mgllab/table.cpp:342 mgllab/table.cpp:790 msgid "Summation of" msgstr "Сумма от" #: src/exec_dat.cpp:1821 msgid "Swap data (useful after Fourier transform)" msgstr "Поменять местами левую и правую части данных" #: udav/dat_pnl.cpp:618 msgid "Swap data along direction(s)" msgstr "Поменять местами данные по направлению" #: mgllab/table.cpp:164 mgllab/table.cpp:778 msgid "Swap parts" msgstr "Поменять местами" #: src/exec_set.cpp:865 msgid "Switch on/off TeX parsing at text output" msgstr "Вкл/выкл разбор TeX команд" #: src/exec_set.cpp:831 msgid "Switch on/off fog" msgstr "Вкл/выкл туман" #: src/exec_set.cpp:833 msgid "Switch on/off gray-scale mode" msgstr "Вкл/выкл режим оттенков серого" #: widgets/fltk.cpp:868 msgid "Switch on/off grid drawing" msgstr "Вкл/выкл рисование сетки" #: udav/plot_pnl.cpp:308 msgid "Switch on/off grid of absolute coordinates (Ctrl+G)." msgstr "Вкл/выкл сетку абсолютных координат (Ctrl+G)." #: widgets/qt.cpp:1125 msgid "Switch on/off lightning for the graphics (Alt+L)." msgstr "Вкл/выкл освещение графика (Alt+L)." #: udav/plot_pnl.cpp:302 msgid "Switch on/off lightning for the graphics (Ctrl+L)." msgstr "Вкл/выкл освещение графика (Ctrl+L)." #: widgets/fltk.cpp:865 msgid "Switch on/off lightning in the picture" msgstr "Вкл/выкл освещение графика" #: widgets/qt.cpp:1131 udav/plot_pnl.cpp:315 msgid "" "Switch on/off mouse handling of the graphics\n" "(rotation, shifting, zooming and perspective)." msgstr "" "Вкл/выкл изменение графика мышью\n" "(вращение, сдвиг, приближение и перспективу)." #: widgets/qt.cpp:1137 msgid "Switch on/off mouse zoom of selected region." msgstr "Вкл/выкл приближение мышью выбранной области." #: src/exec_set.cpp:864 msgid "Switch on/off to use ternary axis" msgstr "Указать тип тернарных координат или проекций" #: src/exec_set.cpp:811 msgid "Switch on/off transparency" msgstr "Вкл/выкл прозрачность" #: widgets/qt.cpp:1119 msgid "Switch on/off transparency for the graphics (Alt+T)." msgstr "Вкл/выкл прозрачность рисунка (Alt+T)." #: udav/plot_pnl.cpp:295 msgid "Switch on/off transparency for the graphics (Ctrl+T)." msgstr "Вкл/выкл прозрачность рисунка (Ctrl+T)." #: widgets/fltk.cpp:862 msgid "Switch on/off transparency in the picture" msgstr "Вкл/выкл прозрачность рисунка" #: mgllab/table.cpp:552 msgid "Symmetrical range" msgstr "Симметричный диапазон" #: udav/dat_pnl.cpp:366 msgid "Symmetrical?" msgstr "Симметрично?" #: src/addon.cpp:122 src/base_cf.cpp:283 #, c-format msgid "TEST: %s\n" msgstr "ТЕСТ: %s\n" #: udav/open_dlg.cpp:82 udav/setup_dlg.cpp:88 mgllab/dialogs.cpp:961 msgid "Template" msgstr "Шаблон" #: udav/setup_dlg.cpp:140 msgid "Template name" msgstr "Имя шаблона" #: udav/setup_dlg.cpp:163 msgid "Template saved" msgstr "Шаблон сохранен" #: mgllab/dialogs.cpp:1038 msgid "Ternary" msgstr "Тернарный" #: mgllab/dialogs.cpp:1472 msgid "Text" msgstr "Текст" #: udav/style_dlg.cpp:167 mgllab/dialogs.cpp:376 msgid "Text align" msgstr "Выравнивание" #: udav/newcmd_dlg.cpp:172 mgllab/dialogs.cpp:713 msgid "Text and legend" msgstr "Текст и легенда" #: udav/style_dlg.cpp:164 msgid "Text color" msgstr "Цвет текста" #: udav/style_dlg.cpp:123 mgllab/dialogs.cpp:343 msgid "Text on contours" msgstr "Текст на кривых" #: mgllab/dialogs.cpp:367 msgid "Text style" msgstr "Стиль текста" #: src/window.cpp:423 msgid "" "The calculator can help you to put complex expression in the script. Just " "type the expression (which may depend on coordinates x,y,z and so on) and " "put it into the script." msgstr "" "Калькулятор поможет вставить в скрипт сложное выражение. Просто наберите в " "калькуляторе выражение (которое может зависеть от координат x,y,z и др.) и " "вставьте его в скрипт." #: mgllab/editor.cpp:284 msgid "" "The current file has not been saved.\n" "Would you like to save it now?" msgstr "Текущий документ не сохранен. Сохранить сейчас?" #: src/window.cpp:425 msgid "" "The special dialog (Edit|Insert|New Command) help you select the command, " "fill its arguments and put it into the script." msgstr "" "Специальный диалог (Правка|Вставить|Новая команда) поможет Вам выбрать " "команду, заполнить ее аргументы и вставить в скрипт." #: src/crust.cpp:619 msgid "" "There are duplicated or indistinguishably adjacent points for triangulation." msgstr "Повторяющиеся или близкие точки при триангуляции" #. mglScrStr #: src/base.cpp:262 msgid "There is changing temporary data in script" msgstr "Попытка изменить временные данные в скрипте" #: udav/text_pnl.cpp:124 msgid "There is manual primitives." msgstr "Есть примитивы, заданные вручную" #: udav/newcmd_dlg.cpp:341 msgid "There is no 'fmt' argument for this command" msgstr "Отсутствует 'fmt' аргумент для этой команды" #: udav/text_pnl.cpp:137 mgllab/editor.cpp:685 msgid "There is no fitted formula." msgstr "Нет подобранной формулы." #: utils/mglcgi.cpp:74 #, c-format msgid "There is no query. Exit.\n" msgstr "Нет запроса. Выхожу.\n" #: udav/text_pnl.cpp:109 msgid "There is no selection to evaluate." msgstr "Ничего не выделено для вычисления." #: src/window.cpp:422 msgid "" "There is powerful calculator with a lot of special functions. You can use " "buttons or keyboard to type the expression. Also you can use existed " "variables in the expression." msgstr "" "Есть мощный калькулятор с большим числом специальных функций. Выражения " "можно набирать кнопками или с клавиатуры. Также можно использовать " "переменные из скрипта." #. mglScrCmd #: src/base.cpp:260 msgid "There is too long string(s) in script" msgstr "Слишком длинная строка в скрипте" #. mglScrLong #: src/base.cpp:261 msgid "There is unbalanced ' in script" msgstr "Лишняя кавычка ' в скрипте" #. mglWarnSpc #: src/base.cpp:258 msgid "There is wrong argument(s) in script" msgstr "Неправильные аргументы команды в скрипте" #. mglScrArg #: src/base.cpp:259 msgid "There is wrong command(s) in script" msgstr "В скрипте неправильная команд(ы)" #: widgets/fltk.cpp:894 msgid "Theta angle (tilt z-axis)" msgstr "Угол Theta (наклон оси z)" #: widgets/fltk.cpp:1206 msgid "This is for parameter " msgstr "Это для параметра " #: mgllab/table.cpp:494 msgid "This operation is not supported for this kind of data." msgstr "Операция не поддерживается для этого типа данных." #: udav/setup_dlg.cpp:76 mgllab/dialogs.cpp:955 msgid "Ticks" msgstr "Метки" #: mgllab/dialogs.cpp:960 msgid "Ticks start" msgstr "Начать с" #: mgllab/dialogs.cpp:1031 msgid "Time ticks" msgstr "Метки времени" #: udav/subplot_dlg.cpp:204 mgllab/dialogs.cpp:1313 msgid "Title" msgstr "Заголовок" #: udav/subplot_dlg.cpp:206 msgid "Title for plot. Can be used in SubPlot or MultiPlot only." msgstr "Заголовок для графика. Следует использовать в SubPlot или MultiPlot" #: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377 #: udav/dat_pnl.cpp:424 udav/dat_pnl.cpp:453 mgllab/table.cpp:609 msgid "To" msgstr "до" #: udav/calc_dlg.cpp:66 udav/setup_dlg.cpp:147 msgid "To script" msgstr "В скрипт" #: udav/dat_pnl.cpp:790 msgid "Transform" msgstr "Трансформация" #: udav/dat_pnl.cpp:792 msgid "Transform data along dimension(s) (Ctrl+Shift+T)." msgstr "Трансформация данных по направлению (Ctrl+Shift+T)." #: mgllab/dialogs.cpp:346 msgid "Transparency" msgstr "Прозрачность" #: mgllab/dialogs.cpp:1043 msgid "Transparency type" msgstr "Тип прозрачности" #: mgllab/table.cpp:764 msgid "Transpose" msgstr "Транспонировать" #: mgllab/table.cpp:671 msgid "Transpose data" msgstr "Транспонировать данные" #: src/exec_dat.cpp:1825 msgid "Transpose data array" msgstr "Транспонировать данные" #: mgllab/table.cpp:862 msgid "Transpose data dimensions" msgstr "Транспонировать данные" #: udav/dat_pnl.cpp:612 msgid "Transpose data with new dimensions" msgstr "Транспонировать данные" #: udav/calc_dlg.cpp:192 msgid "Trigonometric" msgstr "Тригонометрия" #: mgllab/dialogs.cpp:1034 msgid "Tune ticks" msgstr "Настроить метки" #: mgllab/table.cpp:169 mgllab/table.cpp:344 msgid "Type of operation" msgstr "Тип операции" #: mgllab/table.cpp:174 msgid "Type of smoothing" msgstr "Тип сглаживания" #. N #: udav/style_dlg.cpp:246 mgllab/dialogs.cpp:54 msgid "U - indigo" msgstr "U - темно-фиолетовый" #: udav/text_pnl.cpp:109 udav/text_pnl.cpp:124 udav/text_pnl.cpp:137 #: udav/udav_wnd.cpp:340 msgid "UDAV" msgstr "" #: udav/opt_dlg.cpp:31 msgid "UDAV - Add options" msgstr "UDAV - добавить опции" #: udav/anim_dlg.cpp:35 msgid "UDAV - Animation setup" msgstr "UDAV - настройка анимации" #: udav/dat_pnl.cpp:388 msgid "UDAV - Clear data" msgstr "UDAV - очистить данные" #: udav/dat_pnl.cpp:424 msgid "UDAV - Crop data" msgstr "UDAV - обрезать данные" #: udav/dat_pnl.cpp:255 msgid "UDAV - Export to PNG" msgstr "UDAV - экспорт в PNG" #: udav/dat_pnl.cpp:351 msgid "UDAV - Fill data" msgstr "UDAV - заполнить данные" #: udav/find_dlg.cpp:33 msgid "UDAV - Find" msgstr "UDAV - найти" #: udav/dat_pnl.cpp:485 msgid "UDAV - Go to slice" msgstr "UDAV - перейти к срезу" #: udav/hint_dlg.cpp:37 msgid "UDAV - Hint" msgstr "UDAV - подсказки" #: udav/dat_pnl.cpp:277 msgid "UDAV - Import PNG" msgstr "UDAV - импорт PNG" #: udav/prop_dlg.cpp:192 udav/prop_dlg.cpp:198 udav/newcmd_dlg.cpp:322 #: udav/text_pnl.cpp:145 udav/open_dlg.cpp:101 msgid "UDAV - Insert filename" msgstr "UDAV - вставить имя файла" #: udav/newcmd_dlg.cpp:327 udav/text_pnl.cpp:152 msgid "UDAV - Insert path" msgstr "UDAV - вставить путь" #: udav/style_dlg.cpp:48 udav/data_dlg.cpp:33 msgid "UDAV - Insert style/scheme" msgstr "UDAV - вставить стиль" #: udav/dat_pnl.cpp:270 msgid "UDAV - Load data" msgstr "UDAV - загрузить данные" #: udav/dat_pnl.cpp:450 msgid "UDAV - Make histogram" msgstr "UDAV - создать гистограмму" #: udav/mem_pnl.cpp:84 msgid "UDAV - New variable" msgstr "UDAV - новая переменная" #: udav/dat_pnl.cpp:377 msgid "UDAV - Normalize by slice" msgstr "UDAV - нормировать по срезам" #: udav/dat_pnl.cpp:366 msgid "UDAV - Normalize data" msgstr "UDAV - нормировать данные" #: udav/open_dlg.cpp:49 msgid "UDAV - Open data file" msgstr "UDAV - открыть файл данных" #: udav/udav_wnd.cpp:633 msgid "UDAV - Open file" msgstr "UDAV - открыть файл" #: udav/prop_dlg.cpp:60 udav/prop_dlg.cpp:285 msgid "UDAV - Properties" msgstr "UDAV - свойства" #: udav/dat_pnl.cpp:283 msgid "UDAV - Read from HDF" msgstr "UDAV - загрузить из HDF" #: udav/dat_pnl.cpp:436 msgid "UDAV - Rearrange data" msgstr "UDAV - упорядочить размеры данных" #: udav/dat_pnl.cpp:402 msgid "UDAV - Resize data" msgstr "UDAV - изменить размер данных" #: udav/setup_dlg.cpp:159 udav/setup_dlg.cpp:163 msgid "UDAV - Save template" msgstr "UDAV - сохранить шаблон" #: udav/dat_pnl.cpp:261 msgid "UDAV - Save to HDF" msgstr "UDAV - сохранить в HDF" #: udav/dat_pnl.cpp:248 msgid "UDAV - Save/export data" msgstr "UDAV - сохранить/экспортировать данные" #: udav/args_dlg.cpp:32 msgid "UDAV - Set script arguments" msgstr "UDAV - задать аргументы" #: udav/files_dlg.cpp:29 msgid "UDAV - Set template parameters" msgstr "UDAV - задать шаблон параметров" #: udav/subplot_dlg.cpp:37 msgid "UDAV - Setup inplot" msgstr "UDAV - настройки под-графика" #: udav/setup_dlg.cpp:39 udav/setup_dlg.cpp:190 msgid "UDAV - Setup plot" msgstr "UDAV - настройки графика" #: udav/dat_pnl.cpp:413 msgid "UDAV - Squeeze data" msgstr "UDAV - сжать данные" #: udav/udav_wnd.cpp:456 msgid "UDAV - about" msgstr "UDAV - о программе" #: udav/anim_dlg.cpp:104 msgid "UDAV - animation" msgstr "UDAV - анимация" #: udav/dat_pnl.cpp:608 msgid "UDAV - change data" msgstr "UDAV - изменить данные" #: udav/opt_dlg.cpp:94 udav/opt_dlg.cpp:101 udav/opt_dlg.cpp:108 #: udav/opt_dlg.cpp:115 msgid "UDAV - command options" msgstr "UDAV - опции команды" #: udav/mem_pnl.cpp:121 msgid "UDAV - delete all data" msgstr "UDAV - удалить все данные" #: udav/text_pnl.cpp:202 msgid "UDAV - find text" msgstr "UDAV - найти текст" #: udav/dat_pnl.cpp:536 udav/dat_pnl.cpp:566 udav/dat_pnl.cpp:572 #: udav/dat_pnl.cpp:643 msgid "UDAV - make new data" msgstr "UDAV - создать новый массив данных" #: udav/text_pnl.cpp:431 msgid "UDAV - open file" msgstr "UDAV - открыть файл" #: udav/udav_wnd.cpp:569 udav/udav_wnd.cpp:579 udav/udav_wnd.cpp:621 msgid "UDAV - save current" msgstr "UDAV - сохранить текущий" #: udav/udav_wnd.cpp:669 msgid "UDAV - save file" msgstr "UDAV - сохранить файл" #: udav/style_dlg.cpp:160 mgllab/dialogs.cpp:371 msgid "Underline" msgstr "Подчеркивание" #. edit menu #: udav/text_pnl.cpp:516 mgllab/mgllab.cpp:299 msgid "Undo" msgstr "Отмена" #: udav/text_pnl.cpp:518 msgid "Undo editor change (Ctrl+Z)." msgstr "Отменить изменения в редакторе (Ctrl+Z)." #: mgllab/mgllab.cpp:140 msgid "Untitled" msgstr "без имени" #: mgllab/mgllab.cpp:351 mgllab/mgllab.cpp:355 msgid "Untitled - mgllab" msgstr "без имени - mgllab" #: widgets/fltk.cpp:1120 msgid "Update" msgstr "Обновить" #: udav/mem_pnl.cpp:62 msgid "Update list of data arrays" msgstr "Обновить список массивов данных" #: mgllab/dialogs.cpp:100 msgid "Upper border for determining color or alpha" msgstr "Верхняя граница для цвета или прозрачности" #: utils/mglconv.cpp:84 #, c-format msgid "Usage:\tmglconv [parameter(s)] scriptfile\n" msgstr "Использование:\tmglconv [параметр(ы)] имя_скрипта\n" #: mgllab/mgllab.cpp:423 #, c-format msgid "Usage:\tmgllab [parameter(s)] scriptfile\n" msgstr "Использование:\tmgllab [параметр(ы)] имя_скрипта\n" #: utils/mglview.cpp:83 #, c-format msgid "Usage:\tmglview [parameter(s)] scriptfile\n" msgstr "Использование:\tmglview [параметр(ы)] имя_скрипта\n" #: widgets/glut.cpp:103 #, c-format msgid "" "Use 'a', 'd', 'w', 's', 'q', 'e' for changing view angles\n" "Use 'j', 'l', 'i', 'k' for changing light angles\n" "Use 'u', 'o' for changing distance to light\n" "Use 'r' for switching transparency\n" "Use 'f' for switching lightning\n" "Use 'E' for exporting to EPS file\n" "Use 'S' for exporting to SVG file\n" "Use 'J' for exporting to JPEG file\n" "Use 'P' for exporting to PNG file\n" "Use ',', '.' for show other frames\n" "Use 'm' for view movie\n" "Use 'h' for view this text\n" "Use 'x' for exit\n" msgstr "" "* 'a', 'd', 'w', 's', 'q', 'e' для изменения углов просмотра\n" "* 'j', 'l', 'i', 'k' для изменения углов освещения\n" "* 'u', 'o' для изменения расстояния до источника света\n" "* 'r' для переключения прозрачности\n" "* 'f' для переключения освещения\n" "* 'E' для экспорта в EPS\n" "* 'S' для экспорта в SVG\n" "* 'J' для экспорта в JPEG\n" "* 'P' для экспорта в PNG\n" "* ',', '.' для показа других кадров\n" "* 'm' для запуска анимации\n" "* 'h' для этого Сообщения\n" "* 'x' для выхода\n" #: udav/style_dlg.cpp:162 msgid "Use color scheme" msgstr "Использовать цветовую схему" #: mgllab/mgllab.cpp:485 msgid "Use dark color scheme" msgstr "Использовать темную цветовую схему" #: udav/prop_dlg.cpp:175 msgid "Use dots plot for preview" msgstr "Использовать точки для просмотра" #: mgllab/mgllab.cpp:484 msgid "Use multi-threading for drawing" msgstr "Рисование в отдельном потоке" #: udav/newcmd_dlg.cpp:67 udav/opt_dlg.cpp:68 mgllab/dialogs.cpp:101 msgid "Value" msgstr "Значение" #: mgllab/dialogs.cpp:398 msgid "Value for i-th color" msgstr "Значение для i-го цвета" #: mgllab/dialogs.cpp:727 mgllab/dialogs.cpp:1047 msgid "Variant" msgstr "Вариант" #: mgllab/dialogs.cpp:728 msgid "" "Variant of command argument order. The notation is:\n" " * Capital arguments are data (like, Ydat);\n" " * Argument in '' are strings (like, 'fmt');\n" " * Other arguments are numbers (like, zval);\n" " * Arguments in [] are optional arguments." msgstr "" "Вариант порядка аргументов команды. Обозначения:\n" " * Заглавные -- данные (например, Ydat);\n" " * В кавычках '' -- строки (например, 'fmt');\n" " * Прочие -- числа (например, zval);\n" " * Аргументы в скобках [] -- не обязательные." #: udav/newcmd_dlg.cpp:170 mgllab/dialogs.cpp:711 msgid "Vector plots" msgstr "Векторные графики" #: mgllab/dialogs.cpp:379 msgid "Vertical align" msgstr "По вертикали" #: udav/subplot_dlg.cpp:55 udav/subplot_dlg.cpp:72 udav/subplot_dlg.cpp:97 msgid "Vertical size" msgstr "Вертикальный размер" #. k #: udav/style_dlg.cpp:236 mgllab/dialogs.cpp:44 msgid "W - lightgray" msgstr "W - светло-серый" #: src/exec_dat.cpp:1829 msgid "Wavelet transform at some direction" msgstr "Wavelet преобразование вдоль направления" #: udav/subplot_dlg.cpp:195 msgid "Whole area" msgstr "Вся область" #: mgllab/mgllab.cpp:488 msgid "Widget scheme" msgstr "Вид виджетов" #: mgllab/dialogs.cpp:329 msgid "Width" msgstr "Ширина" #: udav/subplot_dlg.cpp:80 msgid "Width of selected cells" msgstr "Ширины выбранных ячеек" #: src/data.cpp:1559 #, c-format msgid "" "Widths are:\n" "Wa = %g\tWx = %g\tWy = %g\tWz = %g\n" msgstr "Ширины: Wa = %g\tWx = %g\tWy = %g\tWz = %g\n" #: mgllab/dialogs.cpp:348 msgid "Wire or mesh" msgstr "Сетчатый" #: udav/style_dlg.cpp:120 msgid "Wire or mesh plot" msgstr "Сетчатый график" #: udav/style_dlg.cpp:159 mgllab/dialogs.cpp:370 msgid "Wire style" msgstr "Контур" #: src/exec_set.cpp:874 msgid "Write current image to graphical file" msgstr "Сохранить текущий рисунок в файл" #: udav/setup_dlg.cpp:48 mgllab/dialogs.cpp:950 msgid "X axis" msgstr "Ось X" #: udav/setup_dlg.cpp:118 msgid "X pos" msgstr "X коор." #: mgllab/dialogs.cpp:1065 msgid "X position" msgstr "X коор." #: udav/dat_pnl.cpp:413 msgid "X-direction" msgstr "X-направление" #: udav/opt_dlg.cpp:38 mgllab/dialogs.cpp:85 msgid "X-range" msgstr "X-диапазон" #: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436 msgid "X-size" msgstr "Размер по X" #: mgllab/dialogs.cpp:568 msgid "X-slice from" msgstr "Х срез от" #: udav/subplot_dlg.cpp:176 msgid "X/Z" msgstr "" #: widgets/qt.cpp:1098 udav/plot_pnl.cpp:490 msgid "XYZ" msgstr "" #. M #: udav/style_dlg.cpp:242 mgllab/dialogs.cpp:50 msgid "Y - olive" msgstr "Y - оливковый" #: udav/setup_dlg.cpp:49 mgllab/dialogs.cpp:963 msgid "Y axis" msgstr "Ось Y" #: udav/setup_dlg.cpp:119 msgid "Y pos" msgstr "Y коор." #: mgllab/dialogs.cpp:1066 msgid "Y position" msgstr "Y коор." #: udav/dat_pnl.cpp:413 msgid "Y-direction" msgstr "Y-направление" #: udav/opt_dlg.cpp:41 mgllab/dialogs.cpp:89 msgid "Y-range" msgstr "Y-диапазон" #: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436 msgid "Y-size" msgstr "Размер по Y" #: mgllab/dialogs.cpp:571 msgid "Y-slice from" msgstr "Y срез от" #: udav/subplot_dlg.cpp:180 msgid "Y/Z" msgstr "" #: mgllab/help.cpp:135 msgid "Yes" msgstr "Да" #: src/window.cpp:427 msgid "" "You can concatenation of strings and numbers using `,` with out spaces (for " "example, `'max(u)=',u.max,' a.u.'` or `'u=',!(1+i2)` for complex numbers). " "Also you can get n-th symbol of the string using `[]` (for example, " "`'abc'[1]` will give 'b'), or add a value to the last character of the " "string using `+` (for example, `'abc'+3` will give 'abf'), or use it all " "together." msgstr "" "Вы можете объединять строки и числа с помощью `,` без пробелов (например, " "`'max (u) =',u.max,' a.u.' 'или`'u = ',!(1+i2)` для комплексных чисел). " "Также вы можете получить n-й символ строки с помощью `[]` (например, " "`'abc'[1]` даст 'b') или добавить значение к последнему символу строки с " "помощью `+` (например, `'abc'+3` даст 'abf') или использовать все вместе." #: src/window.cpp:411 msgid "" "You can copy the current image to clipboard by pressing Ctrl-Shift-C. Later " "you can paste it directly into yours document or presentation." msgstr "" "Текущий рисунок можно скопировать нажав Ctrl-Shift-C. Позже его можно " "вставить в документ или презентацию." #: src/window.cpp:424 msgid "" "You can easily insert file or folder names, last fitted formula or numerical " "value of selection by using menu Edit|Insert." msgstr "" "Можно легко вставить имя файла, путь к папке, последнюю подобранную формулу " "и т.л., используя меню Правка|Вставить" #: src/window.cpp:418 msgid "" "You can edit MGL file in any text editor. Also you can run it in console by " "help of commands: mglconv, mglview." msgstr "" "Скрипт MGL можно редактировать в любом текстовом редакторе. Также его можно " "запустить (и просмотреть) прямо из консоли с помошью программ mglconv, " "mglview." #: src/window.cpp:412 msgid "" "You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing " "right mouse button inside image and selecting 'Export as ...'." msgstr "" "Текущий рисунок можно экспортировать во множество форматов (EPS, SVG, PNG, " "JPEG и др.), просто нажав правой кнопкой на рисунке и выбрать 'Экспорт'" #: src/window.cpp:416 msgid "" "You can put several plots in the same image by help of commands 'subplot' or " "'inplot'." msgstr "" "Рисунок может содержать несколько вставок (под-графиков) при использовании " "команд 'subplot', 'inplot' и пр." #: src/window.cpp:426 msgid "" "You can put several plotting commands in the same line or in separate " "function, for highlighting all of them simultaneously." msgstr "" "Можно сгруппировать несколько графиков поместив их в одну строку с " "разделителем ':' или в функцию. Группа графиков будет подсвечиваться и " "перемещаться как целое." #: src/window.cpp:409 msgid "" "You can rotate/shift/zoom whole plot by mouse. Just press 'Rotate' " "toolbutton, click image and hold a mouse button: left button for rotation, " "right button for zoom/perspective, middle button for shift." msgstr "" "График можно вращать/сдвигать/приближать с помощью мыши. Просто нажмите " "кнопку 'Вращать' и удерживайте кнопку мыши: левую для вращения, правую для " "приближения/перспективы, среднюю для сдвига." #: src/window.cpp:414 msgid "" "You can save the parameter of animation inside MGL script by using comment " "started from '##a ' or '##c ' for loops." msgstr "" "Параметры анимации можно сохранить внутри скрипта с помощью комментариев " "'##a' или '##c'." #: src/window.cpp:413 msgid "" "You can setup colors for script highlighting in Property dialog. Just select " "menu item 'Settings/Properties'." msgstr "Расцветку скрипта можно настроить в диалоге 'Свойства'." #: src/window.cpp:408 msgid "" "You can shift axis range by pressing middle button and moving mouse. Also, " "you can zoom in/out axis range by using mouse wheel." msgstr "" "Диапазон осей координат можно сместить нажав среднюю кнопку мыши, при этом " "колесо мыши приближает/отдаляет график." #: src/window.cpp:421 msgid "" "You can type arbitrary expression as input argument for data or number. In " "last case (for numbers), the first value of data array is used." msgstr "" "Аргументом может быть любое выражение. Если требуется число, то будет " "использован первый элемент массива." #: src/window.cpp:419 msgid "" "You can use command 'once on|off' for marking the block which should be " "executed only once. For example, this can be the block of large data reading/" "creating/handling. Press F9 (or menu item 'Graphics/Reload') to re-execute " "this block." msgstr "" "Команда 'once on|off' позволяет выделить блок, который будет исполняться " "только один раз. Например, это могут быть команды чтения больших файлов, " "длительные вычисления и т.д. Нажмите F9 (меню 'Графика|Перезагрузить') для " "повторного выполнения этого блока команд." #: src/window.cpp:420 msgid "" "You can use command 'stop' for terminating script parsing. It is useful if " "you don't want to execute a part of script." msgstr "" "Команда 'stop' останавливает выполение скрипта. Она полезна если Вы не " "хотите выполнять часть скрипта." #: src/window.cpp:410 msgid "" "You may quickly draw the data from file. Just use: mgllab 'filename.dat' in " "command line." msgstr "" "Быстро построить данные из файла можно при использовании: mgllab 'filename." "dat'." #: mgllab/dialogs.cpp:1529 msgid "You need to enter text!" msgstr "Необходимо ввести текст!" #: mgllab/table.cpp:367 msgid "You need to provide output name" msgstr "Необходимо ввести имя" #: udav/prop_dlg.cpp:285 msgid "You need to restart UDAV for applying the changes." msgstr "Необходимо перезапустить UDAV для применения изменений." #: mgllab/dialogs.cpp:592 msgid "You need to select data array" msgstr "Необходимо выбрать массив данных" #: mgllab/dialogs.cpp:1489 msgid "You need to select marker!" msgstr "Необходимо выбрать маркер!" #: mgllab/table.cpp:190 mgllab/table.cpp:364 msgid "You need to specify direction(s)" msgstr "Необходимо указать направление" #: udav/newcmd_dlg.cpp:376 udav/newcmd_dlg.cpp:380 msgid "You should put text inside ' ' for argument " msgstr "Необходимо ввести текст в ' ' для аргумента" #: udav/anim_dlg.cpp:105 msgid "You should select one of case" msgstr "Необходимо выбрать один из вариантов" #: udav/newcmd_dlg.cpp:384 msgid "You should specify all optional arguments before " msgstr "Необходимо ввести все аргументы перед " #: udav/newcmd_dlg.cpp:368 msgid "You should specify required argument " msgstr "Необходимо ввести обязательный аргумент " #: udav/setup_dlg.cpp:50 mgllab/dialogs.cpp:976 msgid "Z axis" msgstr "Ось Z" #: udav/setup_dlg.cpp:120 msgid "Z pos" msgstr "Z коор." #: mgllab/dialogs.cpp:1067 msgid "Z position" msgstr "Z коор." #: udav/dat_pnl.cpp:413 msgid "Z-direction" msgstr "Z-направление" #: udav/opt_dlg.cpp:44 mgllab/dialogs.cpp:93 msgid "Z-range" msgstr "Z-диапазон" #: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436 msgid "Z-size" msgstr "Размер по Z" #: mgllab/dialogs.cpp:574 msgid "Z-slice from" msgstr "Z срез от" #: src/exec_set.cpp:880 msgid "Zoom axis range" msgstr "Увеличить диапазон осей координат" #: widgets/qt.cpp:1133 msgid "Zoom by mouse" msgstr "Приблизить мышкой" #: widgets/qt.cpp:1232 msgid "Zoom graphics" msgstr "Приблизить рисунок" #: widgets/qt.cpp:1242 udav/plot_pnl.cpp:516 msgid "Zoom in" msgstr "Приблизить" #: widgets/qt.cpp:1244 udav/plot_pnl.cpp:519 msgid "Zoom in graphics." msgstr "Приблизить рисунок" #: widgets/fltk.cpp:875 msgid "Zoom in selected region of the picture" msgstr "Приблизить выбранную область рисунка" #. t->addAction(QPixmap(":/png/help-faq.png"), _("Examples"), this, SLOT(showExamples())); #: udav/help_pnl.cpp:55 msgid "Zoom in text" msgstr "Увеличить текст" #: widgets/fltk.cpp:905 msgid "Zoom in the picture" msgstr "Приблизить рисунок" #: widgets/qt.cpp:1246 udav/plot_pnl.cpp:522 msgid "Zoom out" msgstr "Отдалить" #: widgets/qt.cpp:1248 udav/plot_pnl.cpp:525 msgid "Zoom out graphics." msgstr "Отдалить рисунок" #: udav/help_pnl.cpp:56 msgid "Zoom out text" msgstr "Уменьшить текст" #: widgets/fltk.cpp:907 msgid "Zoom out the picture" msgstr "Отдалить рисунок" #: src/exec_set.cpp:879 msgid "Zoom plot region" msgstr "Приблизить область рисунка" #. zooming menu #: widgets/qt.cpp:1231 udav/plot_pnl.cpp:503 msgid "Zoom/move" msgstr "Приближение/сдвиг" #: udav/style_dlg.cpp:131 msgid "above" msgstr "выше" #: mgllab/dialogs.cpp:570 mgllab/dialogs.cpp:573 mgllab/dialogs.cpp:576 msgid "all" msgstr "все" #: mgllab/dialogs.cpp:581 msgid "along" msgstr "вдоль" #: mgllab/table.cpp:171 mgllab/table.cpp:346 msgid "along x" msgstr "вдоль x" #: mgllab/table.cpp:172 mgllab/table.cpp:347 msgid "along y" msgstr "вдоль y" #: mgllab/table.cpp:173 mgllab/table.cpp:348 msgid "along z" msgstr "вдоль z" #: mgllab/dialogs.cpp:1012 msgid "alpha" msgstr "" #: mgllab/dialogs.cpp:1296 msgid "and" msgstr "и" #: mgllab/dialogs.cpp:1456 msgid "arc" msgstr "дуга" #: mgllab/dialogs.cpp:1018 msgid "arrows" msgstr "стрелки" #: udav/setup_dlg.cpp:72 udav/style_dlg.cpp:170 msgid "at center" msgstr "по центру" #: udav/setup_dlg.cpp:72 msgid "at maximum" msgstr "в максимуме" #: udav/setup_dlg.cpp:72 msgid "at minimum" msgstr "в минимуме" #: udav/setup_dlg.cpp:70 mgllab/dialogs.cpp:956 msgid "at position" msgstr "позиция" #: mgllab/dialogs.cpp:1027 msgid "attach light" msgstr "прикрепить свет" #. mglWarnFmt #: src/base.cpp:255 msgid "axis ranges are incompatible" msgstr "размеры осей неправильные" #. w #: udav/style_dlg.cpp:222 mgllab/dialogs.cpp:29 msgid "b - blue" msgstr "b - синий" #: mgllab/dialogs.cpp:1019 msgid "bars" msgstr "" #: widgets/qt.cpp:1088 udav/plot_pnl.cpp:479 msgid "bitmap EPS" msgstr "растровый EPS" #: mgllab/dialogs.cpp:1036 msgid "both" msgstr "оба" #: udav/subplot_dlg.cpp:189 mgllab/dialogs.cpp:1306 msgid "bottom" msgstr "снизу" #. r #: udav/style_dlg.cpp:225 mgllab/dialogs.cpp:32 msgid "c - cyan" msgstr "c - голубой" #: mgllab/dialogs.cpp:957 mgllab/dialogs.cpp:970 mgllab/dialogs.cpp:983 #: mgllab/dialogs.cpp:996 msgid "center" msgstr "центр" #: widgets/fltk.cpp:800 #, c-format msgid "click at %g, %g, %g" msgstr "клик в %g, %g, %g" #. mglWarnCnt #: src/base.cpp:251 msgid "couldn't open file" msgstr "не могу открыть файл" #: mgllab/dialogs.cpp:1455 msgid "curve" msgstr "кривая" #: mgllab/dialogs.cpp:1026 msgid "cutting" msgstr "обрезание" #. ----------------------------------------------------------------------------- #: src/base.cpp:242 msgid "data dimension(s) is incompatible" msgstr "размеры данных несовместимы" #. mglWarnDim #: src/base.cpp:243 msgid "data dimension(s) is too small" msgstr "размеры данных слишком малы" #. mglWarnMem #: src/base.cpp:247 msgid "data values are zero" msgstr "значение данных равно нулю" #: udav/open_dlg.cpp:85 udav/open_dlg.cpp:144 udav/opt_dlg.cpp:63 #: udav/opt_dlg.cpp:66 mgllab/dialogs.cpp:107 mgllab/dialogs.cpp:116 #: mgllab/dialogs.cpp:1044 msgid "default" msgstr "по умолчанию" #: mgllab/help.cpp:151 msgid "dimensions" msgstr "размерности" #. l #: udav/style_dlg.cpp:229 mgllab/dialogs.cpp:36 msgid "e - lawngreen" msgstr "e - салатовый" #: mgllab/dialogs.cpp:1455 msgid "ellipse" msgstr "эллипс" #: mgllab/dialogs.cpp:1017 msgid "facenum" msgstr "" #: mgllab/dialogs.cpp:1035 msgid "factor" msgstr "множитель" #. mglWarnSize #: src/base.cpp:254 msgid "format is not supported for that build" msgstr "формат не поддерживается для этой сборки" #: src/canvas.cpp:31 msgid "frame" msgstr "кадр" #: udav/anim_dlg.cpp:55 mgllab/mathgl.cpp:192 msgid "from" msgstr "от" #. b #: udav/style_dlg.cpp:223 mgllab/dialogs.cpp:30 msgid "g - lime" msgstr "g - липовый" #: mgllab/dialogs.cpp:1044 msgid "glass-like" msgstr "стеклянная" #: mgllab/dialogs.cpp:1011 msgid "grayscale" msgstr "черно-белый" #. p #: udav/style_dlg.cpp:234 mgllab/dialogs.cpp:41 msgid "h - gray" msgstr "h - серый" #: src/parser.cpp:1076 #, c-format msgid "in line %ld" msgstr "в строке %ld" #: mgllab/dialogs.cpp:1036 msgid "increment" msgstr "шаг" #: mgllab/dialogs.cpp:1236 mgllab/dialogs.cpp:1249 mgllab/dialogs.cpp:1262 #: mgllab/dialogs.cpp:1271 mgllab/dialogs.cpp:1280 msgid "ind" msgstr "№" #. h #: udav/style_dlg.cpp:235 mgllab/dialogs.cpp:43 msgid "k - black" msgstr "k - черный" #. y #: udav/style_dlg.cpp:228 mgllab/dialogs.cpp:35 msgid "l - springgreen" msgstr "l - весенне-зеленый" #: mgllab/dialogs.cpp:1045 msgid "lamp-like" msgstr "ламповая" #. vv->addSpacing(11); #: udav/style_dlg.cpp:169 udav/subplot_dlg.cpp:187 mgllab/dialogs.cpp:957 #: mgllab/dialogs.cpp:970 mgllab/dialogs.cpp:983 mgllab/dialogs.cpp:996 #: mgllab/dialogs.cpp:1304 msgid "left" msgstr "слева" #. mglWarnOpen #: src/base.cpp:252 msgid "light: ID is out of range" msgstr "light: ID вне диапазона" #: mgllab/dialogs.cpp:1013 msgid "lighting" msgstr "освещение" #: mgllab/dialogs.cpp:1454 msgid "line" msgstr "линия" #. c #: udav/style_dlg.cpp:226 mgllab/dialogs.cpp:33 msgid "m - magenta" msgstr "m - фуксия" #. #. ^ #: udav/style_dlg.cpp:317 udav/style_dlg.cpp:356 mgllab/dialogs.cpp:209 #: mgllab/dialogs.cpp:247 msgid "manual" msgstr "вручную" #: mgllab/dialogs.cpp:1454 msgid "marker" msgstr "маркер" #: mgllab/dialogs.cpp:1020 msgid "markers" msgstr "маркеры" #: udav/data_dlg.cpp:68 msgid "max" msgstr "max" #: mgllab/help.cpp:153 msgid "mem. usage" msgstr "исп.памяти" #: mgllab/dialogs.cpp:1016 msgid "meshnum" msgstr "" #: udav/newcmd_dlg.cpp:247 msgid "mgl_en" msgstr "mgl_ru" #: utils/mglconv.cpp:83 #, c-format msgid "" "mglconv convert mgl script to image file (default PNG).\n" "Current version is %s\n" msgstr "" "mglconv конвертирует mgl скрипт в рисунок (по умолчанию PNG).\n" "Текущая версия %s\n" #: mgllab/mgllab.cpp:422 #, c-format msgid "" "mgllab draw mgl script interactively.\n" "Current version is %s\n" msgstr "" "mgllab рисует mgl скрипт интерактивно.\n" "Текущая версия %s\n" #: mgllab/help.cpp:78 #, c-format msgid "" "mgllab v. %s\n" "(c) Alexey Balakin, 2017\n" "http://mathgl.sf.net/" msgstr "" "mgllab v. %s\n" "(c) Алексей Балакин, 2017\n" "http://mathgl.sf.net/" #: utils/mglview.cpp:82 #, c-format msgid "" "mglview show plot from MGL script or MGLD file.\n" "Current version is %s\n" msgstr "" "mglview показывает график MGL скрипта или MGLD файла.\n" "Текущая версия %s\n" #: udav/data_dlg.cpp:68 msgid "min" msgstr "min" #. mglWarnLow #: src/base.cpp:244 msgid "minimal data value is negative" msgstr "минимальное значение отрицательно" #. e #: udav/style_dlg.cpp:230 mgllab/dialogs.cpp:37 msgid "n - skyblue" msgstr "n - небесно-голубой" #: mgllab/help.cpp:149 msgid "name" msgstr "имя" #. mglWarnNeg #: src/base.cpp:245 msgid "no file or wrong data dimensions" msgstr "нет файла или неверные размеры" #. mglWarnZero #: src/base.cpp:248 msgid "no legend entries" msgstr "нет записей легенды" #: mgllab/dialogs.cpp:1028 msgid "no origin tick" msgstr "нет меток на пересечении" #. "-+=;oOsS~<>jdD*^" #. ".+x*sdv^<>o.*+xsdv^<>o" : nf = 10 #: udav/style_dlg.cpp:128 udav/style_dlg.cpp:131 udav/style_dlg.cpp:134 #: udav/style_dlg.cpp:339 udav/style_dlg.cpp:383 udav/data_dlg.cpp:67 #: mgllab/dialogs.cpp:214 mgllab/dialogs.cpp:230 mgllab/dialogs.cpp:1035 #: mgllab/dialogs.cpp:1039 msgid "none" msgstr "нет" #: udav/style_dlg.cpp:220 msgid "none or default" msgstr "нет или по умолчанию" #. mglWarnFile #: src/base.cpp:246 msgid "not enough memory" msgstr "не хватает памяти" #. mglWarnNull #: src/base.cpp:257 msgid "not enough space for plot" msgstr "не достаточно места для графика" #: mgllab/table.cpp:85 msgid "not used" msgstr "не используется" #. mglWarnSlc #: src/base.cpp:250 msgid "number of contours is zero or negative" msgstr "число контуров меньше или равно нуля" #: udav/opt_dlg.cpp:63 udav/opt_dlg.cpp:66 msgid "off" msgstr "выкл." #: udav/opt_dlg.cpp:63 udav/opt_dlg.cpp:66 udav/setup_dlg.cpp:128 msgid "on" msgstr "вкл." #: udav/dat_pnl.cpp:549 msgid "or enter name for new variable" msgstr "или введите имя новой переменной" #. q #: udav/style_dlg.cpp:233 mgllab/dialogs.cpp:40 msgid "p - deeppink" msgstr "p - малиновый" #: mgllab/dialogs.cpp:1023 msgid "pen blur" msgstr "размытие" #: mgllab/dialogs.cpp:392 msgid "plain" msgstr "карта" #. mglWarnTern #: src/base.cpp:256 msgid "pointer is NULL" msgstr "указатель равен NULL" #: mgllab/dialogs.cpp:1456 msgid "polygon" msgstr "полигон" #: mgllab/dialogs.cpp:1040 msgid "projection" msgstr "проекция" #. u #: udav/style_dlg.cpp:232 mgllab/dialogs.cpp:39 msgid "q - orange" msgstr "q - оранжевый" #: mgllab/dialogs.cpp:1040 msgid "quaternary" msgstr "quaternary" #: mgllab/dialogs.cpp:1041 msgid "quaternary proj" msgstr "quaternary проекция" #. g #: udav/style_dlg.cpp:224 mgllab/dialogs.cpp:31 msgid "r - red" msgstr "r - красный" #: mgllab/dialogs.cpp:1454 msgid "rectangle" msgstr "прямоугольник" #: mgllab/dialogs.cpp:1455 msgid "rhomb" msgstr "ромб" #: udav/style_dlg.cpp:172 udav/subplot_dlg.cpp:193 mgllab/dialogs.cpp:958 #: mgllab/dialogs.cpp:971 mgllab/dialogs.cpp:984 mgllab/dialogs.cpp:997 #: mgllab/dialogs.cpp:1310 msgid "right" msgstr "справа" #: mgllab/dialogs.cpp:1029 msgid "rotate text" msgstr "вращать текст" #: mgllab/mathgl.cpp:199 msgid "save slides" msgstr "сохранить кадры" #. mglWarnLId #: src/base.cpp:253 msgid "size(s) is zero or negative" msgstr "размер(ы) меньше или равны нулю" #. mglWarnLeg #: src/base.cpp:249 msgid "slice value is out of range" msgstr "срез вне диапазона" #: mgllab/table.cpp:144 msgid "smoothed" msgstr "сгладить" #: mgllab/dialogs.cpp:326 msgid "solid" msgstr "сплош." #: widgets/qt.cpp:1086 udav/plot_pnl.cpp:477 msgid "solid PNG" msgstr "PNG с заливкой" #: udav/anim_dlg.cpp:45 mgllab/mathgl.cpp:187 msgid "strings" msgstr "строки" #: udav/data_dlg.cpp:67 msgid "sum" msgstr "sum" #: mgllab/dialogs.cpp:1039 msgid "ternary" msgstr "ternary" #: mgllab/dialogs.cpp:1041 msgid "ternary proj" msgstr "ternary проекция" #: mgllab/dialogs.cpp:1021 mgllab/dialogs.cpp:1456 msgid "text" msgstr "текст" #: mgllab/dialogs.cpp:1022 msgid "ticks" msgstr "метки" #: udav/anim_dlg.cpp:59 mgllab/mathgl.cpp:193 mgllab/dialogs.cpp:569 #: mgllab/dialogs.cpp:572 mgllab/dialogs.cpp:575 msgid "to" msgstr "до" #: mgllab/mgllab.cpp:574 msgid "to script" msgstr "в скрипт" #: udav/subplot_dlg.cpp:191 mgllab/dialogs.cpp:1308 msgid "top" msgstr "сверху" #. n #: udav/style_dlg.cpp:231 mgllab/dialogs.cpp:38 msgid "u - blueviolet" msgstr "u - фиолетовый" #: udav/style_dlg.cpp:131 msgid "under" msgstr "снизу" #: udav/mem_pnl.cpp:168 mgllab/help.cpp:203 msgid "unknown" msgstr "не знаю" #: udav/udav_wnd.cpp:168 udav/udav_wnd.cpp:560 udav/udav_wnd.cpp:693 msgid "untitled - UDAV" msgstr "без имени - UDAV" #: udav/udav_wnd.cpp:686 msgid "untitled* - UDAV" msgstr "без имени* - UDAV" #: mgllab/dialogs.cpp:327 msgid "user" msgstr "символ" #: udav/anim_dlg.cpp:52 mgllab/mathgl.cpp:189 msgid "values" msgstr "значения" #: widgets/qt.cpp:1089 udav/plot_pnl.cpp:480 msgid "vector EPS" msgstr "векторный EPS" #. #: udav/style_dlg.cpp:221 mgllab/dialogs.cpp:28 msgid "w - white" msgstr "w - белый" #: mgllab/dialogs.cpp:1312 msgid "whole area" msgstr "без полей" #: mgllab/dialogs.cpp:1471 msgid "wire" msgstr "сеткой" #: udav/anim_dlg.cpp:63 mgllab/mathgl.cpp:194 msgid "with step" msgstr "с шагом" #. m #: udav/style_dlg.cpp:227 mgllab/dialogs.cpp:34 msgid "y - yellow" msgstr "y - желтый" #~ msgid "Insert file content?" #~ msgstr "Вставить содержимое файла?" #~ msgid "Insert file name?" #~ msgstr "Вставить имя файла?" #~ msgid "" #~ "You may quickly draw the data from file. Just use: udav 'filename.dat' in " #~ "command line." #~ msgstr "" #~ "Быстро построить данные из файла можно при использовании: udav 'filename." #~ "dat'." #~ msgid "Lower bound" #~ msgstr "Нижняя граница" #~ msgid "Upper bound" #~ msgstr "Верхняя граница" #~ msgid "Add" #~ msgstr "Добавить" mathgl-8.0.1/ChangeLog.txt0000664000175000017500000010413014167366465015173 0ustar balakinbalakin8.0.1 Released 12 January 2022 * Increase accuracy at line segment skipping. * Changes in SOVERSION numbering. * Minor spelling fix (thanks to Rafael Laboissière) 8.0 Released 1 January 2022 * Change version numbering according Debian rules. * Add accurate line segment and quadrangle/triangle face cutting at axis border crossing. * Add 'fastcut' for disable accurate but slow line/trig/quad primitives cutting at axis borders. * Restore back transparent background by default. You can set non-transparent background by using 'clf' or 'background' functions. * Compatibility changes for Qt5.15 and MSVC. INCOMPATIBLE: * Change colorbar C-functions by adding last argument for options. * Add alpha-value in fill_background(). * Disable Qt4 interface by default. 2.5 Released 8 December 2021 * Add 'keep' for keeping the data phase/sign or value along line i and j in given direction * Add functions 'sum', 'prod' at formula evaluation, like "sum(_i^2,5)" will produce "30"=0+1^2+2^2+3^2+4^2, and "prod(1+_i,5)" will produce 5!="120". You can nest them for variables _i,_j,...,_z, like "sum(sum(_j+_i^2,5),5)" will give "200". * Add functions 'value', 'spline' at formula evaluation, like "value(a,5)" will give value of 6-th element of a, i.e. a[5]. * Add user-defined functions fn1()...fn9() at formula evaluation, like "fn1(3)\x^_1" will produce "x^3". * Add mglODEs() (i.e. 'ode') for solving PDE/cascade/etc: ode res 'eqs' 'vars' 'bnd_kind' ini [dt tmax]. Here 'eqs' may contain relative pointer, like 'u(j+1)-2*u(j)+u(j-1)', and can be complex. Variables have 'j' for current index, 't' for current time. * Add 'lines' to draw a set of lines with arrows between points. * Add 'dcont' to draw a set of curves, which are intersection of two isosurfaces at given level. * Add 'first', 'last' to get array of first/last indexes of values larger specified one along given direction. * Add 'bernoulli', 'binomial', 'brownian', 'discrete', 'exponential', 'gaussian', 'shuffle', 'uniform', 'uniformint' for data filling by random numbers with different distributions. * Add 'readbin' to read data from binary files. * Add 'texparse' to enable/disable TeX-like command parsing at text output. * Update ODE: regularization is used if dt*tmax<0 (total time may differ, but number of steps still the same). * Add mgl_default_graph() -- the global (default) pointer to HMGL for keeping plot settings, simplifying external scripts and capture it in GUI. * Add style 'p' in command 'smooth' to use parabolic smoothing of arbitrary points. * Allow 'background' for scaling image, centering image and tessellate image as mosaic. * Allow filling 'background' by the specified color. * Allow masks for 'candle', 'area', 'region', 'bars', 'barh', 'chart', 'tape', 'face', 'polygon', 'ellipse', 'rhomb'. * Allow single value specification for contour level in 'cont', 'tricont', 'contd', 'contp', 'contv', 'tricontv', 'cont3', 'dcont'. * Add mgl_dual_save_hdf(), mgl_real_save_hdf(), mgl_int_save_hdf() for saving single number in HDF5 file. Correspondingly, commands 'save' and 'savehdf' can save single value now. * Add mgl_formula_calc(), mgl_formula_calc_c() for evaluating textual formulas of arbitrary set of data arrays. * Add mglDataList -- global mglDataA* collection for viewing/changing in GUI data from external languages (like, Python, ...). * Add Armadillo interface for mglData and mglDataC. * If nsub parameter of command 'hist' is negative (nsub<0) then the linear interpolation is used instead of spline one. * Add dark text colors for mgllab. 2.4.4 Released 8 July 2019 * mglData now have operator() which work as SubData() function. * Add 'minmax' for positions of local maximums and minimums. * Add ContGen() and ContFGen() to draw contour lines manually. Correspondingly 'cont' and 'contf' commands are extended. * Add 'conts' for getting coordinate of contour lines. * Extend 'put' for partial filling if data size(s) are smaller as destination. * Classes mglFormula and mglFormulaC now can read file with given sizes if string have the format ":fname:x1:x2:y1:y2:z1:z2". Here data is supposed in range [x1,x2]*[y1,y2]*[z1,z2] (by default [0,1]*[0,1]*[0,1]). Calc() in this case return the interpolated values. * Fix [xyz]range option for Area and Region. * Minor bugfixes. 2.4.3 Released 14 March 2019 * Add 'clabel' command -- draw labels for colorbar. Should be used *after* drawing colorbar! * Extend 'ctick' command * Add subpixel smoothing for masks * Boxes around text (style '@') now use actual height and position of the text. * Add mask to EPS export. Note, mask angles are reduced to 45*(0,1,...7) degrees for decreasing pattern size in the EPS. * Update default masks: '*' become dot, '^' become bricks, 'd' become plus, 'D' become tacks, ';' and 'j' change lengths. Note, you can use brush.ods to prepare user-defined masks. * Add styles '^' and '_' for command 'smooth' to find upper/lower bound of the data. * Improve FlowP() to draw both branches (in positive and negative time direction). * Improve CGI interface and update website. * Introduce struct mdual as interface for C and C++ complex numbers. It is implicitly converted to std::complex<> in C++. And need to call c2mdual() and mdual2c() in pure C. However mdual is binary compatible with C _Complex numbers. * Add flag in CMake to manually disable support of C99 complex numbers. * Bypass user-specified extension in base font family name. * Improve hints in mgllab and udav. * Add utility 'mgltask' for making output file with a set of copies of mask-file. It useful for making set of initial conditions with a few parameters varied in specified range. * Add example of OpenGL output. * Bugfix for approximate min and max position. * Bugfix for position of SVG output. * Compatibility fixes for new versions of CMake, compilers and libraries. INCOMPATIBLE: * Formally pure C interface handle complex numbers by new way due to strict following of C/C++ standards. However, the MathGL library is binary compatible with previous version(s). 2.4.2.1 Released 31 March 2018 * Bugfix for panel placement in mgllab. * Move colorbars close to axis by default. * Improve Spanish translation (thanks to Diego Sejas Viscarra). 2.4.2 Released 21 March 2018 * Add custom dialog for FLTK widgets. This can be constructed from C/C++ code, or from MGL script using special comments "##d##d $I kind|label|par1|par2|..." will create an entry in custom dialog for changing plot properties. Here "$I" is id ($0,$1...$9,$a,$b...$z), "label" is the label of element, "kind" is one following: 'e' for editor or input line (parameter is initial value) , 'v' for spinner or counter (parameters are "ini|min|max|step|big_step"), 's' for slider (parameters are "ini|min|max|step"), 'b' for check box (parameter is "ini"; also understand "on"=1), 'c' for choice (parameters are possible choices). * Add 'progress' for displaying the progress of execution (by '#' symbols in console, or by progress-bar widget). * Add 'contp' for contour lines on parametrically specified surface. * Add 'flow3' for flow threads of 3D vector field, which start from the plain. * Add variant of 'flow' for drawing a flow thread, starting from specified point. * Add 'scaletext' for disabling text size scaling in relative inplots (like columnplot, ...). * Add 'setup' for setting all low-level flags. * Add 'coil' for projecting periodical data. * Add modulo operation "%" (x%y=fmod(x,y)) to the list of known operations in real-valued formulas. * Add style '.' for 'cont' to draw contour lines from saddle points. * Add style '.' for 'flow' to draw flow thread from saddle points. * Add option 'value' in 'tube' for setting number of edges manually. * Crop output of 'ode' if NAN or INFINITY value occurs. * Remove style '~' for 'plot' and 'tens'. Now, all curves try to omit points. * Add setup flag MGL_FULL_CURV which disable omitting points of curve. * Shift axis labels closer to axis. * Change size of LaTeX-like commands \sup, \sub to be the same as \overset, \underset. * Change ticks drawing in colorbar. * Add new section "All samples" of documentation with large set of samples for most of MathGL features. * Samples in documentation are generated automatically now (from sample.cpp). INCOMPATIBLE: * Make obsolete MGL command 'setsizescl'. At this, the similar C/C++/Fortran/... functions still working. 2.4.1 Released 20 July 2017 * Add 'beltc' plot, which is 'belt' with manual coloring. * Add style '~' for 'plot' and 'tens' to omit some points at output. * Add style ':' for 'axis' to draw lines through point (0,0,0). * Bugfixes 2.4 Released 17 May 2017 * Add mgllab executable, which is FLTK based version of UDAV. Most things mgllab do faster. * Add string manipulation in MGL language: o 'str'[n] -- get string of only n-th symbol; o 'str'+v -- add value v to the last character of the string; o 'str',val || 'str',!val -- append numeric value to the string (as before). * Add time value to MGL language in format: "hh-mm-ss_DD.MM.YYYY" or "hh-mm-ss" or "DD.MM.YYYY". * Add 'iris' plot to show cross-dependencies of several data arrays. * Add 'flame2d' to draw flame fractals. * Add 'bbox' to set bounding box for 2D output. * Add 'section' to get part of data between specified values. * Add 'detect' to found curves along data maximums. * Add 'dilate' to extend the region of 1-th value. * Add 'erode' to narrow the region of 1-th value. * Add 'apde' to solve PDE equation in inhomogeneous nonlinear media with spatial dispersion. * Add 'symbol' to draw the glyphs defined by 'addsymbol'. * Add 'addsymbol' to declare user-defined symbol (or glyph), which can be used as markers for plot (with style '&') or drawn itself by 'symbol' command. * Add 'openhdf' to open all data arrays from HDF file. * Extend 'crop' to cut to optimal size for FFT (i.e. to closest of 2^n*3^m*5^l). * Add function mgl_data_max_first() and data suffixes .m[xyz][fl] to find first/last maximum along direction. * Add function mgl_datac_diff_par() to parametric derivative of complex data. * Add style 'F' for 'bars' and 'barh' to set fixed bar widths. * Add style 'a' for 'plot', 'tens', 'area' and 'region' to accurate drawing of data, which partially lie out of axis range. * Add style '#' for 'region' to draw wired plot. * Add possibility of manual shift in 'multiplot'. * Add parsing arguments of options for MGL commands. * MGL command 'correl' now can perform 2d and 3d correlations. * Option 'meshnum' now change the number of drawn markers for 'plot', 'tens', 'step, 'mark' and 'textmark'. * Function 'step' handle data with x.nx>y.nx similarly to 'bars'. * Extend 'tile' and 'tiles' by adding manual coloring and face orientation. * Add variant of MGL command 'copy' to copy data with "incorrect" names. * Improve tick labels drawing. * Improve time-ticks (add weeks) and add subticks to its. * Improve 'fplot' to handle several singularities. * Add LaTeX command \dfrac{}{}. This is full-sized version of \frac{}{}. Unfortunately, there is no support of nesting (i.e. \dfrac{\dfrac{}{}}{} not working). Contrary, \frac{}{} allow nesting. * Add mglODEc() -- ODE solver for complex variables. * Add cmplx(a,b)=a+i*b to the list of known functions in formula parsing * Update CMake find_package to find MathGL. * Increase line width for wired text. * Update documentation: add description of new commands, add hint @ref{Mixing bitmap and vector output}. * Add translation to Russian for most of labels and messages. * Name 'all' are reserved in MGL scripts now as synonym of -1. * INCOMPATIBLE: Replace libmgl-qt by libmgl-qt4 and libmgl-qt5 for resolving conflicts of simultaneously installed both Qt4 and Qt5. * Minor bugfixes. 2.3.5.1 Released 20 June 2016 * INCOMPATIBLE: library libmgl-qt is removed. You need to use libmgl-qt4 or libmgl-qt5 explicitly now. * Compatibility changes for latest MS VisualStudio. * Bugfixes. 2.3.5 Released 16 May 2016 * Greatly update mgltex (by Diego Sejas Viscarra) o \MGL@codes: Bugfix: category code for tabulators is changed too o \MGL@quality: 9 is accepted as quality value now o \MGL@scale: Now accepts any positive value o \MGL@test@switch: New command to verify and validate switching arguments o \mglTeX: Add a small negative space in the logo, between the "mgl" and "TEX" o \mglTeX: Declared now as robust command o \mglcomments: Now accepts arguments 0 (equivalent to off) and 1 (equivalent to on), besides the usual off and on o \mglgraphics: New command options: gray, mglscale, quality, variant o \mglname: Now writes the MGL code line setsize 600 400 to the main script o \mglplot: Added \bgroup and \egroup in order to keep changes private o New command options: gray, mglscale, quality, variant o \mglsettings: Added options gray and variant o Now calls the \mglswitch and \mglcomments commands for the switch and comments options, respectively o \mglswitch: Now accepts arguments 0 (equivalent to off) and 1 (equivalent to on), besides the usual off and on o mglTeX now depends on the ifpdf package o Change definition of \mglcommentname from MGL comment to mglTEX comment o Introduce the concept of global, local and private settings in the documentation o New commands: \mglgray (to activate/deactivate) gray-scale mode locally, and \mglvariant (to set variant of arguments in MGL scripts locally) o New package option 9q for setting quality to 9 (for testing purposes of the author) o New package options 0v, 1v, 2v to select variant of arguments in MGL scripts o New package options gray, color to activate/deactivate gray-scale mode for graphics o Remove the \MGL@setkeys command, since it isn’t needed as first thought o Rename \MGL@document@scripts to \MGL@doc@scripts o Rename \MGL@script@name to \MGL@script o Rename command \MGL@graph@ext to \MGL@imgext o Rename command \mglcommonscriptname to mglsetupscriptname o Rename environment mglcommon to mglsetupscript (mglcommon is still available, but deprecated) o Rename family MGL@keys as MGL@gr@keys for consistency o Reorganize and update documentation o Some minor bugfixes o The MGL code line "setsize 600 400" is now automatically written to the main script in order for the scaling options and commands to work o mgl: New environment options: gray, mglscale, quality, variant o mglcode: New environment options: gray, mglscale, quality, variant * Add MGL command 'variant' to select proper variant of arguments (like "var1?var2?var3?...") in MGL commands. * Remove limitation of maximal number (was 1000) of arguments for MGL commands. This is actual for 'list' command. * Add mglWnd::Widget() for accessing widget which is used for drawing. * Add Gray() for producing gray-scaled image. * Add MGL command 'setsizescl' for scaling all further 'setsize'. * Add Shear() for shearing plot. * Add ShearPlot() for placing plots side-by-side with some shearing. * Add mglData::Limit() for limit maximal absolute value of data. * Add mglTridMat() for tridiagonal matrix algorithm. * Add MGL command 'diffract' for single step diffraction calculation. * Add 'ifsfile' for reading IFS fractal parameters from *.ifs file. * Add style '*' for 2d versions of Pipe() and Flow() to draw threads from points inside axis range. * Add "norm()" to the list of known functions * Compatibility changes for MS VisualStudio, MacOS, Win64. * Bugfix for legend export into EPS and SVG. * Bugfix for importing data from std::vector. * Improve Surf3*() drawing. * Force NAN if divided by 0 in formulas. * Option "-S" of mglconv now perform scaling in any cases 2.3.4 Released 13 February 2016 * Add mglData::Pulse() for determining pulse parameters. * Add mglData::ScanFile() for getting formatted data from textual file. * Add mglData::SetList() for setting data from variable argument list of double values. * Add mglIFS2d() and mglIFS3d() for fractal generation using iterated function system (thanks to Diego Sejas Viscarra). * Add option to SetSize() for scaling only primitives but don't erase it. * Add Pmap() plot for Poincare map. * Add Lamerey() plot for Lamerey diagram. * Add Bifurcation() plot for Bifurcation diagram. * Add mglGraph::SetPenDelta() for changing size of semi-transparent area around lines, marks, glyphs, ... * Add MGL command 'echo' for printing the content of data. * Add MGL command 'print' -- like 'info' but print immediately in stdout. * Allow MGL command 'save' append textual strings to a file. * Add option to rewrite file in 'savehdf'. * Add callback functions to mglQt, mglFLTK, and extend mglDraw class for simpler drawing in parallel with calculation (see @ref{Draw and calculate}). * Force set focus for editor in UDAV. * Add line numbers to UDAV editor. Cyan number denote current line, red numbers denote lines with errors. * Disable mouse wheel for zooming in UDAV by default. * Update mgltex (thanks to Diego Sejas Viscarra). * INCOMPATIBLE: Scale internally d1,d2 arguments in Curve() to be exactly the same as Bezier curve (P0=p1, P1=d1+p1, P2=p2-d2, P3=p2). * Minor bugfixes and improvements. 2.3.3 Released 01 June 2015 * Add SurfCA() and Surf3CA() plots. * Add wavelet transforms. * Add AttachLight() for attaching light settings to inplots. * Add manual rotation angle for axis ticks (by "value" option). * Add mglDataS class which is similar to std::vector one. * Add missing mglDataC functions. * Add style '%' for color scheme along 2 coordinates (as in Map()). * If tick template start with '&' then long integer is passed instead of double. * Add style 'V' for drawing text centered vertically. * Add style "dN" in Smooth() for averaging over (2*N+1)-th points. * Add TeX symbols "\quote", "--" and Cyrillic ones. * Add complex numbers in MGL -- any expression started with '!' will have complex value(s). * Add 'rkstep' command for Runge-Kutta step in MGL script. * Add functions 'min()', 'max()' to MGL parser and formula evaluation. * MGL command 'join' now can join arbitrary number of data arrays. * Command 'stop' is not required to be placed before 'func'. * Add warning about writing to temporary arrays in MGL scripts. * Names 'rnd','nan','inf' are reserved in MGL scripts now. * Add annotation for plot styles and options into header files. * Greatly improve the speed of formula parsing for MGL scripts * Update JS interface * Add binary font files for speeding up initialization and font loading * Exclude "pure" attribute for function due to compatibility reasons * Add mgl_set_size_scl() for additional scaling width and height of the image * Add options -S, -q for mglconv * Rearrange toolbuttons in UDAV. * Bugfix for Flow() and Pipe() functions * Other minor improvements, bugfixes and compatibility changes 2.3.2 Released 2 February 2015 * Update mgltex (thanks to Diego Sejas Viscarra) * Add reading files with complex numbers by 'read' command. * Parallelize reading textual data files. * Add 'i','j','k' variables for data filling. * Add 2-color style for candle and ohlc plot. * Add saving images in QMathGL even if corresponding format support is disabled. * Add cmake option MGL_DEF_FONT to change default font name or use built-in one (if MGL_DEF_FONT is empty). * Compatibility changes and bugfixes. 2.3.1 Released 21 October 2014 * Add MGL command 'load' for loading MGL commands from external DLL (or .so) module. * Add Logo() function to draw bitmap (logo), which is stretched along whole axis range * Add MGL command 'reset' which restore default settings and clear image (i.e. call DefaultPlotParam()). * Change y coordinate at x-z projection. * Improve projection of 'unrotatable' objects (like legend, title, ...). * Add projection (Ternary&8) which is the same as usual (Ternary&4) but don't print text on projections * Improve orientation of axis ticks and labels. * Add mglWnd::SetDrawFunc(). * Add mgl_set_global_warn() and mgl_get_global_warn() for set/get messages of global scope. * Make copying private of mglGraph and derived. * Add virtual destructors. * Add some static functions for mglGraph. * Add option "-n" to mglconv to disable automatic saving of the image. * Add option "-s" to mglview and mglconv to run setup script before the main one. * Become compatible with giflib 5.1. * Add light scaling at MGLD import. * Add scaling of frames at Adjust(). * Possible bugfix for 32bit gcc. * Update docs. 2.3 Released 7 August 2014 * Add background image, which allow in particular semi-transparent background color. Correspondingly add function Rasterize() for saving current image as background, and function LoadBackground() for loading background image from PNG or JPEG file. * Add primitives to draw polygon and angle arc. * Allow arbitrary factor for axis ticks (like, gr->SetTicks('x',M_PI,0,NAN,"\\pi");). * Add function AddTick() for adding manual tick to existed ones. * Add new styles and symbols: - arrow style 'X'; - color gradient (color scheme) of glyphs in text; - manual dash style, like "{df090}"; - manual mask style, like "{s00ff00182424f800}"; - Add styles 'fFE0123456789+-' for printing numbers in functions Axis(), Colorbar(), Table() and Label(); - style '!' to disable ticks tuning in Axis() and Colorbar(); - special symbol '\b' which will be ignored at printing; - calligraphic TeX symbols, like \calB, \calE, \calF, \calH, \calI, \calL, \calM, \calR, \ell, \scrg, \scro. * Add ODE solving functions for textual formulas * Add function for global cubic spline interpolation, and function to refill using global spline. * Add functions "random(dat)" and "gamma_inc(a,x)" to the list of known functions for formula parsing * Add 'inf' variable to the MGL and formula parsing * Allow reading JPEG files for mglData::Import(). * Function mgl_data_subdata_ext() handle NULL argument(s). Add variants of SubData() with 1 and 2 arguments. * Warning messages and information are printed to stderr until call of mgl_suppress_warn(true) will disable it. * Add function mgl_check_version() and MGL command 'version' to check if MathGL version is valid. * Add move constructor(s) if compiler support C++11 rvalues. * Changes in algorithms: - Greatly increase speed of formula parsing (i.e. of functions mglData::Modify(), mglData::Fill() and similar), and speeding up many other places; - Improve algorithm for contours drawing and filling, taking special attention to quasi-random data. - Spline() now use 5-th order polynomials to keep continuity of 2nd derivative too. - Add function attributes 'pure' or 'const', which potentially can speed up drawing. - Use spline instead of linear interpolation in functions Flow() and Pipe(). - Adjust columnplot and gridplot positions for non-zero distance between the inplots. - Improve colorbar labels drawing at SetRotatedText(false) - Choose new scales for perspective. - Allow 'negative' angles for text rotation - Use new s-hull version for triangulation. * Make function mgl_get_curvs() to be exported. This function is used internally to connect line segments to a set of curves (in particular, for contour lines). * Add ViewAsRotate() function which handle arguments of View() by the same way as Rotate() function, i.e View(tetx,tetz,tety) <=> ViewAsRotate(-tetz,-tetx,-tety) * Function mglWindow::Adjust() for Quality&4==0 now show image in widgets even if draw function is absent (i.e. =NULL). * improvements in UDAV: - Rearrange tool buttons; - Add features for manual dashing and manual mask in Style dialog; - Add dialog for new dialog for new inplots (including subplot, multiplot, columnplot, stickplot, gridplot); - Add option to use dots plot at image refreshing (for faster rotation etc); - Add new primitives (arc,polygon,rotated text) as mouse handled ones; - Add close button to data tabs; - Add button to stop script drawing and stop() slot for QMathGL; - allow one to delete/hide/unhide selected plot; - allow one to move selected plot between inplots; - Improve NewCommand dialog -- now it replace the script command if user change arguments only; - MGL commands 'perspective' and 'fog' now work correctly in UDAV; - Update UDAV icons to use Oxygen ones. 2.2.2.1 Released 19 March 2014 * Compatibility changes for MS VisualStudio 2010 and early. * Function SetRange(v1,v2) ignore NAN values now. * Add enable-json-sample for building json-samples on demand only. * Update docs. 2.2.2 Released 10 March 2014 * Add mgl_region_3d() to draw region (or ribbon) between 2 curves. Correspondingly extend mglGraph::Region() function and MGL command 'region'. * Allow LGPL for MathGL widgets. * Improve export to TeX. * Add missing functions to Fortran interface. * Bugfix for legend with enabled lighting. * Minor bugfixes and memory leaks. 2.2.1 Released 22 January 2014 * Add Qt5 support. * Add Pascal interface. * Improve JavaScript interface. * Add function AddRange(char dir, mreal v1, mreal v2) and extend corresponding MGL commands '[xyzc]range'. * Add 'hypot' function for known functions in formula parsing. * Add style '~' to disable colorbar or axis labels. NOTE, axis style '_' is obsolete and should be replaced by '~'. * Change Aspect() if Ax=NAN. Now, Ay and Az set the ratio to optimal aspect (not exact value as previously). * Disable changes by View(),Zoom(),Perspective() for position of Title(), Legend(), Colorbar(). * Partial support of perspective in CalcXYZ(). * Speed up PDE solving. * Add complex versions of PDE, QO2d, QO3d. * Correct filled background for Box() in curved coordinates. * Allow nx=1 for Stem and Error. * Bugfix for drawing single axis. * Bugfix for missing options parsing for some of MGL commands. * Bugfix for .pmin suffix in MGL. Add mglData::MaximalNeg() and mglData::MinimalPos() functions. Add .nmin and .nmax suffixes. * Bugfix for colorbar labels. * Force using python 2.7 by default due to bug in Ubuntu. Debian sid works well with python 3.* too. * Minor bugfixes and memory leaks. 2.2 Released 11 November 2013 * Add OpenMP calls mostly everywhere (can work as replacement of pthreads - a bit faster since more loops is parallelized). * Greatly speed up consequent FFT and Hankel transforms. Add mgl_clear_fft() function for manual clearing of saved FFT/Hankel data. * Add OHLC() plot for drawing Open-High-Low-Close diagram * Add wxMathGL widget. * Add interface for Lua v.5.1. * Add mask for face drawing if one of symbols "-+=;oOsS~<>jdD*^" is specified in color scheme. This work only for export in bitmap images. * Add Quality=8 for dots drawing (extremely fast). * Add styles '4','6','8' for Cone() and Cones() to produce square, hex-, octo-prism. * Add style 't' for Cones() to produce tubes (cylinders). * Add style '^' for Legend() to left/right align legend if its coordinates are right/left from the center * Add style '<', '^', '>' for aligning/centering boxes in Bars(), Barh(), BoxPlot(), Cones(). Also this plots become centered by default if nx sizes are the same for all data. * Add Dots() function which set independently both color and alpha of dots * Improve automatic axis position. Add style '^' for inverse automatic axis position. * Improve tick labeling. Add style TuneTicks&4 for zero filling of tick labels. * Add mglData::Refill() for filling by interpolation of parametrically dependent data * Add transparency for Area() and Region() plots. * Add mgl_clf_chr() function and extend 'clf' command. * Fourier now perform true inverse Fourier transform (instead of backward one). * Improve/change lighting from local sources. Add SetDiffuse() function. * C functions now return NULL if HMDT data cannot be created for given input argument(s). * Enable line width for Mesh() and Fall() plots. * Replace +INF and -INF by NAN in textual formula output. * Add manual compression of JSON. * Define WORDS_BIGENDIAN and HAVE_MEMRCHR (thanks to Dinar Valeev). * Bugfix for cleaning unused points. * Fix 'setsize' command at UDAV starting. * Rewrite MGL parsing by using std::wstring for avoiding possible bugs of wcs*() functions. * Minor bugfixes. * Update docs. 2.1.3.1 Released 8 May 2013 * Compatibility changes for MS VS. * Bugfixes for cmake options enable-double=OFF, enable-zlib=OFF. * Enable mouse actions for Firefox in JS sample. 2.1.3 Released 2 May 2013 * Functions SinFFT, CosFFT, Hankel and so on, become multi-threaded * Use DFT instead of FFT if GSL support is disabled (much slow!). * Add Join() function for joining mglData arrays * Add Roots() function for root finding of nonlinear equation using provided guess(es) * Add mglExprC for parsing formula with complex numbers * Correctly read #QNAN values in data files * Speed up Dots() drawing * Add flag to disable tick labels at axis origin (see SetOriginTick()) * Add MGL commands 'origintick', 'tickshift' * WriteJSON now use zlib if filename end at 'z' (like "test.jsonz") * Make separate libmgl-mpi * Add SetAutoRanges() function (duplicate corresponding options) * Add JSON sample usage via QtWebKit (thanks to DATADVANCE) * Bugfixes and memory leaks 2.1.2 Released 28 January 2013 * Exclude "local" functions from resulting library. * String in MGL script now can be concatenated with another string or data/numbers (like 'max(u)=',u.max,' a.u.'). * Bugfix for colors in 3D PDF. * Bugfix for drawing in MPI mode. * If Aspect() function have NAN argument(s) then it try to select optimal aspect ratio. * Option 'size' in Legend() now change only text size (not mark size). * Option 'meshnum' now influence on Boxs() and Belt() functions * Adjust marks drawing (line width and dots). * Minor improvements and bugfixes. 2.1.1 Released 24 December 2012 * Bugfix for SetRange(val,val) function * Exclude export MGL to CPP * MGL parsing now produce errors for any wrong list of arguments * Add help message to mgl.cgi * Improve text rotation at View() * Make compatible with GIF library v.5.0. * Bugfix for making MPI interface. * Bugfix for running in Win32 mode. * Update docs and MGL samples 2.1 Released 13 December 2012 * Add class mglDataC for complex data arrays. * Add mglData::Solve() for finding x-value where dat(x)=val. * Add mglData::Clean() for removing rows with duplicate values for given column. * Add Vect3() plot for drawing vectors on slice of 3d vector field. * Add Table() function for drawing table with data values. * Add ZoomAxis() for zooming/shifting axis range as whole. * Add WriteJSON() function for exporting in JSON format suitable for later drawing by JavaScript * Add JavaScript code for visualizing JSON data. * Add mgl.cgi tool which return PNG image for CGI request in form of MGL script. * Add MGL commands 'errbox', 'face' * Color can be specified as its RGB[A] values, i.e. like "{xFFFFFF}" or "{xFFFFFFFF}". * Color in color scheme may have position in range [0,1]. Format is {CN,pos} or {xFFFFFF,pos}. * Now pen width for marks is proportional to pen width of line multiplied by size of marks. * Now you can use different font-faces in the plot simultaneously. * Now Legend() automatically use several columns if it contain too many legend entries. * Add style '-' for legend for drawing them horizontally. * Vectors is drawn now even if only starting or ending points are placed in bounding box. * Strongly rewrite the algorithm of vector field plotting. * Grid lines for NAN origin values are always located at far-away edges. * Try correctly place axis and tick labels even for axis with inverse range (i.e. for v2 * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_WINDOW_H_ #define _MGL_WINDOW_H_ #include "mgl2/qt.h" #include "mgl2/fltk.h" //#include "mgl2/wx.h" //----------------------------------------------------------------------------- /// Wrapper class for all windows displaying graphics class MGL_EXPORT mglWindow : public mglWnd { mglWindow(const mglWindow &t) {} // copying is not allowed const mglWindow &operator=(const mglWindow &t) { return t; } int wnd; ///< Type of window public: mglWindow(const char *title="MathGL") : mglWnd() { wnd=1; gr = mgl_create_graph_fltk(0,title,0,0); } mglWindow(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=NULL, int kind=0, void (*load)(void *p)=0) : mglWnd() { wnd=kind; if(wnd==1) gr = mgl_create_graph_qt(draw,title,par,load); else gr = mgl_create_graph_fltk(draw,title,par,load); } mglWindow(int (*draw)(mglGraph *gr), const char *title="MathGL", int kind=0) : mglWnd() { wnd=kind; if(wnd==1) gr = mgl_create_graph_qt(draw?mgl_draw_graph:0,title,(void*)draw,0); else gr = mgl_create_graph_fltk(draw?mgl_draw_graph:0,title,(void*)draw,0); } mglWindow(mglDraw *draw, const char *title="MathGL", int kind=0) : mglWnd() { wnd=kind; if(wnd==1) gr = mgl_create_graph_qt(draw?mgl_draw_class:0,title,draw,mgl_reload_class); else gr = mgl_create_graph_fltk(draw?mgl_draw_class:0,title,draw,mgl_reload_class); mgl_set_click_func(gr, mgl_click_class); } /// Run main loop for event handling int Run() { return wnd==0? mgl_fltk_run():mgl_qt_run(); } /// Run main loop for event handling in separate thread (for FLTK only) inline int RunThr() { return wnd==0 ? mgl_fltk_thr():0; } }; //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/qt.h0000664000175000017500000000655314167366472015674 0ustar balakinbalakin/*************************************************************************** * qt.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_QT_H_ #define _MGL_QT_H_ #include //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /// Creates Qt window for plotting HMGL MGL_EXPORT mgl_create_graph_qt(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)); uintptr_t MGL_EXPORT mgl_create_graph_qt_(const char *title, int); /// Run main Qt loop for event handling. int MGL_EXPORT mgl_qt_run(); int MGL_EXPORT mgl_qt_run_(); /// Return pointer to widget (QMathGL*) used for plotting MGL_EXPORT_PURE void *mgl_qt_widget(HMGL gr); #ifdef __cplusplus } //----------------------------------------------------------------------------- #include //----------------------------------------------------------------------------- /// Wrapper class for windows displaying graphics class MGL_EXPORT mglQT : public mglWnd { mglQT(const mglQT &) {} // copying is not allowed const mglQT &operator=(const mglQT &t) { return t; } public: mglQT(const char *title="MathGL") : mglWnd() { gr = mgl_create_graph_qt(0,title,0,0); } mglQT(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=NULL, void (*load)(void *p)=0) : mglWnd() { gr = mgl_create_graph_qt(draw,title,par,load); } mglQT(int (*draw)(mglGraph *gr), const char *title="MathGL") : mglWnd() { gr = mgl_create_graph_qt(draw?mgl_draw_graph:0,title,(void*)draw,0); } mglQT(mglDraw *draw, const char *title="MathGL") : mglWnd() { gr = mgl_create_graph_qt(draw?mgl_draw_class:0,title,draw,mgl_reload_class); mgl_set_click_func(gr, mgl_click_class); } virtual ~mglQT() {} int Run() { return mgl_qt_run(); } ///< Run main loop for event handling }; //----------------------------------------------------------------------------- void MGL_EXPORT mgl_ask_qt(const wchar_t *quest, wchar_t *res); //----------------------------------------------------------------------------- #endif #endif mathgl-8.0.1/include/mgl2/surf.h0000664000175000017500000003136314167366472016224 0ustar balakinbalakin/*************************************************************************** * surf.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_SURF_H_ #define _MGL_SURF_H_ #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /// Draw surface by formula with x,y in axis range /** Option "value" set initial number of points. */ void MGL_EXPORT mgl_fsurf(HMGL graph, const char *fz, const char *stl, const char *opt); void MGL_EXPORT mgl_fsurf_(uintptr_t *graph, const char *fz, const char *stl, const char *opt,int,int,int); /// Draw surface by formulas parametrically depended on u,v in range [0,1] /** Option "value" set initial number of points. */ void MGL_EXPORT mgl_fsurf_xyz(HMGL graph, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt); void MGL_EXPORT mgl_fsurf_xyz_(uintptr_t *graph, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt, int, int, int, int, int); /// Draw grid lines for density plot of 2d data specified parametrically void MGL_EXPORT mgl_grid_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *stl, const char *opt); void MGL_EXPORT mgl_grid_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *stl, const char *opt,int,int); /// Draw grid lines for density plot of 2d data void MGL_EXPORT mgl_grid(HMGL graph, HCDT a,const char *stl, const char *opt); void MGL_EXPORT mgl_grid_(uintptr_t *graph, uintptr_t *a,const char *stl, const char *opt,int,int); /// Draw mesh lines for 2d data specified parametrically void MGL_EXPORT mgl_mesh_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_mesh_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw mesh lines for 2d data void MGL_EXPORT mgl_mesh(HMGL graph, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_mesh_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw waterfall plot for 2d data specified parametrically /** Style 'x' draw lines in x-direction. */ void MGL_EXPORT mgl_fall_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_fall_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw waterfall plot for 2d data /** Style 'x' draw lines in x-direction. */ void MGL_EXPORT mgl_fall(HMGL graph, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_fall_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw belts for 2d data specified parametrically /** Style 'x' draw belts in x-direction. */ void MGL_EXPORT mgl_belt_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_belt_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw belts for 2d data /** Style 'x' draw belts in x-direction. */ void MGL_EXPORT mgl_belt(HMGL graph, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_belt_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw belts for 2d data specified parametrically with color proportional to c /** Style 'x' draw belts in x-direction. */ void MGL_EXPORT mgl_beltc_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_beltc_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw belts for 2d data with color proportional to c /** Style 'x' draw belts in x-direction. */ void MGL_EXPORT mgl_beltc(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_beltc_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw surface for 2d data specified parametrically with color proportional to z /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surf_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_surf_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw surface for 2d data with color proportional to z /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surf(HMGL graph, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_surf_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw density plot for 2d data specified parametrically /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_dens_xy(HMGL graph, HCDT x, HCDT y, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_dens_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw density plot for 2d data /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_dens(HMGL graph, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_dens_(uintptr_t *graph, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw vertical boxes for 2d data specified parametrically /** Style ‘#’ draw filled boxes. */ void MGL_EXPORT mgl_boxs_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_boxs_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw vertical boxes for 2d data /** Style ‘#’ draw filled boxes. */ void MGL_EXPORT mgl_boxs(HMGL graph, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_boxs_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw vertical tiles with manual colors c for 2d data specified parametrically void MGL_EXPORT mgl_tile_xyc(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_tile_xyc_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw vertical tiles for 2d data specified parametrically void MGL_EXPORT mgl_tile_xy(HMGL graph, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_tile_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw vertical tiles for 2d data void MGL_EXPORT mgl_tile(HMGL graph, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_tile_(uintptr_t *graph, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw vertical tiles with variable size r and manual colors c for 2d data specified parametrically void MGL_EXPORT mgl_tiles_xyc(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_tiles_xyc_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw vertical tiles with variable size r for 2d data specified parametrically void MGL_EXPORT mgl_tiles_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *sch, const char *opt); void MGL_EXPORT mgl_tiles_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, const char *sch, const char *opt,int,int); /// Draw vertical tiles with variable size r for 2d data void MGL_EXPORT mgl_tiles(HMGL graph, HCDT z, HCDT r, const char *sch, const char *opt); void MGL_EXPORT mgl_tiles_(uintptr_t *graph, uintptr_t *z, uintptr_t *r, const char *sch, const char *opt,int,int); /// Draw surface for 2d data specified parametrically with color proportional to c /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surfc_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_surfc_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw surface for 2d data with color proportional to c /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surfc(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_surfc_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw surface for 2d data specified parametrically with alpha proportional to c /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surfa_xy(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_surfa_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw surface for 2d data with alpha proportional to c /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surfa(HMGL graph, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_surfa_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw surface for 2d data specified parametrically with color proportional to c and alpha proportional to a /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surfca_xy(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_surfca_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw surface for 2d data with color proportional to c and alpha proportional to a /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surfca(HMGL gr, HCDT z, HCDT c, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_surfca_(uintptr_t *graph, uintptr_t *z, uintptr_t *c, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw density plot for spectra-gramm specified parametrically /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_stfa_xy(HMGL graph, HCDT x, HCDT y, HCDT re, HCDT im, int dn, const char *sch, const char *opt); void MGL_EXPORT mgl_stfa_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *re, uintptr_t *im, int *dn, const char *sch, const char *opt,int, int); /// Draw density plot for spectra-gramm /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_stfa(HMGL graph, HCDT re, HCDT im, int dn, const char *sch, const char *opt); void MGL_EXPORT mgl_stfa_(uintptr_t *graph, uintptr_t *re, uintptr_t *im, int *dn, const char *sch, const char *opt,int, int); /// Color map of matrix a to matrix b, both matrix can parametrically depend on coordinates /** Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_map_xy(HMGL graph, HCDT x, HCDT y, HCDT a, HCDT b, const char *sch, const char *opt); void MGL_EXPORT mgl_map_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *a, uintptr_t *b, const char *sch, const char *opt,int,int); /// Color map of matrix a to matrix b /** Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_map(HMGL graph, HCDT a, HCDT b, const char *sch, const char *opt); void MGL_EXPORT mgl_map_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *sch, const char *opt,int,int); #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/gsl.fs0000664000175000017500000014232414167366472016213 0ustar balakinbalakin\ GNU Scientific Library interface Mon Sep 12 14:40:15 MDT 2005 \ Copyright (C) 2007, Sergey Plis \ \ This program is free software; you can redistribute it and/or modify \ it under the terms of the GNU General Public License as published by \ the Free Software Foundation; either version 2 of the License, or \ (at your option) any later version. \ \ This program is distributed in the hope that it will be useful, \ but WITHOUT ANY WARRANTY; without even the implied warranty of \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \ GNU General Public License for more details. \needs float import float warning off \needs locals| include locals.fs warning on \needs atlas include atlas.fs \needs callback include callback.fs \needs vectors include vectors.fs \needs complex include complex.fb Module GSL \ stole the hash function from hash.fs of bigforth | &14 Value Hashbits | 1 Hashbits << Value Hashlen Label (hash ( SI:string -- AX:key ) :R DX push .b lods $1F # AX and AX CX mov DX DX xor CX 1 # shr b IF SI ) AH mov SI inc THEN CX dec 0>= IF BEGIN .w SI ) DX mov 2 # SI add CX dec DX AX *2 I) AX lea 0< UNTIL THEN & Hashbits A#) CX mov AX DX mov AX shr DX AX add & Hashlen A#) CX mov CX dec CX AX and DX pop ret | Code Hash ( string -- key ) R: SI push AX SI mov (hash rel) call SI pop Next end-code also dos also complex also float also atlas also vectors s" libptcblas.so" getlib 0<> [IF] library libblas libptcblas.so depends libatlas [ELSE] library libblas libcblas.so depends libatlas [THEN] library libgsl libgsl.so.0 depends libblas legacy off \ some functions libgsl gsl_log1p df (fp) gsl_log1p ( df -- df ) libgsl gsl_acosh df (fp) gsl_acosh ( df -- df ) \ error handling Wed Sep 21 23:04:06 MDT 2005 libgsl gsl_set_error_handler ptr (int) gsl_set_error_handler ( function -- function ) libgsl gsl_strerror int (ptr) gsl_strerror callback 4:0 (void) int int int int callback; : cstr-fstr ( addr -- addr len ) 0 begin 2dup + c@ 0 = not while 1+ repeat ; | : .bold-red ." " ; | : .red ." " ; | : .reset ." " ; | : cb-test cr \ .bold-red ." GSL ERROR: " cr \ .reset cr 10 spaces gsl_strerror cstr-fstr type cr drop \ ." at line: " . cr drop \ ." of file: " cstr-fstr type cr 10 spaces cstr-fstr type cr \ .red -1 abort" failed at" ; ' cb-test 4:0 c_plus \ 1 2 c_plus 2:1call . | variable old_handler c_plus gsl_set_error_handler old_handler ! 0 Constant GSL_SUCCESS \ random number generation Mon Sep 12 22:06:01 MDT 2005 libgsl gsl_rng_types_setup (ptr) gsl_rng_types_setup ( -- *gsl_rng_type) libgsl gsl_rng_env_setup (ptr) gsl_rng_env_setup ( -- *gsl_rng) libgsl gsl_rng_alloc int (int) gsl_rng_alloc ( *gsl_rng_type -- *gsl_rng ) libgsl gsl_rng_name int (int) gsl_rng_name ( *gsl_rng -- string ) libgsl gsl_rng_set int int (void) gsl_rng_set ( *gsl_rng int -- ) libgsl gsl_rng_uniform int (fp) gsl_rng_uniform ( *gsl_rng -- df ) libgsl gsl_rng_uniform_pos int (fp) gsl_rng_uniform_pos ( *gsl_rng -- df ) libgsl gsl_rng_uniform_int int int (int) gsl_rng_uniform_int ( *gsl_rng n --n ) libgsl gsl_rng_get int (int) gsl_rng_get ( *gsl_rng -- int ) libgsl gsl_rng_max int (int) gsl_rng_max ( *gsl_rng -- int ) libgsl gsl_rng_min int (int) gsl_rng_min ( *gsl_rng -- int ) libgsl gsl_rng_clone int (int) gsl_rng_clone ( *gsl_rng -- *gsl_rng ) libgsl gsl_rng_free int (int) gsl_rng_free ( *gsl_rng -- ) \ random number distributions Tue Sep 13 00:44:35 MDT 2005 \ Gaussian libgsl gsl_ran_gaussian df int (fp) gsl_ran_gaussian ( *gsl_rng df -- df ) libgsl gsl_ran_gaussian_ratio_method df int (fp) gsl_ran_gaussian_ratio_method ( *gsl_rng df -- df ) libgsl gsl_ran_gaussian_pdf df df (fp) gsl_ran_gaussian_pdf ( df df -- df ) \ sigma = 1 libgsl gsl_ran_ugaussian int (fp) gsl_ran_ugaussian ( *gsl_rng -- df ) libgsl gsl_ran_ugaussian_ratio_method int (fp) gsl_ran_ugaussian_ratio_method ( *gsl_rng -- df ) libgsl gsl_ran_ugaussian_pdf df (fp) gsl_ran_ugaussian_pdf ( df df -- df ) libgsl gsl_ran_discrete_preproc int int (int) gsl_ran_discrete_preproc ( int int -- int ) libgsl gsl_ran_discrete int int (int) gsl_ran_discrete libgsl gsl_ran_discrete_free int (void) gsl_ran_discrete_free libgsl gsl_ran_shuffle int int ptr ptr (void) gsl_ran_shuffle \ cdf P(x) = \int_{-\infty}^{x} p(x)dx Q(x) = \int_{x}^{\infty} p(x)dx libgsl gsl_cdf_gaussian_P df df (fp) gsl_cdf_gaussian_P ( df df -- df ) libgsl gsl_cdf_gaussian_Q df df (fp) gsl_cdf_gaussian_Q ( df df -- df ) libgsl gsl_cdf_gaussian_Pinv df df (fp) gsl_cdf_gaussian_Pinv ( df df -- df ) libgsl gsl_cdf_gaussian_Qinv df df (fp) gsl_cdf_gaussian_Qinv ( df df -- df ) \ sigma = 1 cdf libgsl gsl_cdf_ugaussian_P df (fp) gsl_cdf_ugaussian_P ( df -- df ) libgsl gsl_cdf_ugaussian_Q df (fp) gsl_cdf_ugaussian_Q ( df -- df ) libgsl gsl_cdf_ugaussian_Pinv df (fp) gsl_cdf_ugaussian_Pinv ( df -- df ) libgsl gsl_cdf_ugaussian_Qinv df (fp) gsl_cdf_ugaussian_Qinv ( df -- df ) \ statistics Tue Sep 13 01:17:35 MDT 2005 libgsl gsl_stats_mean int int int (fp) gsl_stats_mean ( array{ step size -- df ) libgsl gsl_stats_variance int int int (fp) gsl_stats_variance ( array{ step size -- df ) libgsl gsl_stats_variance_m df int int int (fp) gsl_stats_variance_m ( df array{ step size -- df ) libgsl gsl_stats_sd int int int (fp) gsl_stats_sd ( array{ step size -- df ) libgsl gsl_stats_sd_m df int int int (fp) gsl_stats_sd_m ( df array{ step size -- df ) libgsl gsl_stats_skew int int int (fp) gsl_stats_skew ( array{ step size -- df ) libgsl gsl_stats_kurtosis int int int (fp) gsl_stats_kurtosis ( array{ step size -- df ) libgsl gsl_stats_lag1_autocorrelation int int int (fp) gsl_stats_lag1_autocorrelation ( array{ step size -- df ) libgsl gsl_stats_max int int int (fp) gsl_stats_max ( array{ step size -- df ) libgsl gsl_stats_min int int int (fp) gsl_stats_min ( array{ step size -- df ) libgsl gsl_stats_max_index int int int (int) gsl_stats_max_index ( array{ step size -- n ) libgsl gsl_stats_min_index int int int (int) gsl_stats_min_index ( array{ step size -- n ) \ vectors and matrices Wed Sep 14 00:15:36 MDT 2005 \ Vectors libgsl gsl_block_alloc int (int) gsl_block_alloc ( n -- addr ) libgsl gsl_block_calloc int (int) gsl_block_calloc ( n -- addr ) libgsl gsl_block_free int (int) gsl_block_free ( n -- addr ) libgsl gsl_vector_alloc int (int) gsl_vector_alloc ( n -- addr ) libgsl gsl_vector_calloc int (int) gsl_vector_calloc ( n -- addr ) libgsl gsl_vector_alloc_from_vector int int int ptr (int) gsl_vector_alloc_from_vector libgsl gsl_vector_free int (void) gsl_vector_free ( addr -- ) libgsl gsl_vector_get int int (fp) gsl_vector_get ( addr i -- df ) libgsl gsl_vector_set df int int (void/fp) gsl_vector_set ( df addr i -- ) libgsl gsl_vector_set_all df int (void) gsl_vector_set_all ( df addr -- ) libgsl gsl_vector_set_zero int (void) gsl_vector_set_zero ( addr -- ) libgsl gsl_vector_memcpy int int (int) gsl_vector_memcpy ( dest_addr src_addr -- n ) libgsl gsl_vector_add int int (int) gsl_vector_add ( addr addr -- n ) libgsl gsl_vector_sub int int (int) gsl_vector_sub ( addr addr -- n ) libgsl gsl_vector_mul int int (int) gsl_vector_mul ( addr addr -- n ) libgsl gsl_vector_div int int (int) gsl_vector_div ( addr addr -- n ) libgsl gsl_vector_scale df int (int) gsl_vector_scale ( df addr -- n ) libgsl gsl_vector_add_constant df int (int) gsl_vector_add_constant ( df addr -- n ) libgsl gsl_vector_max int (fp) gsl_vector_max ( addr -- df ) libgsl gsl_vector_min int (fp) gsl_vector_min ( addr -- df ) libgsl gsl_vector_max_index int (fp) gsl_vector_max_index ( addr -- df ) libgsl gsl_vector_min_index int (fp) gsl_vector_min_index ( addr -- df ) libgsl gsl_vector_subvector int int int (int) gsl_vector_subvector \ Vector properties libgsl gsl_vector_isnull ptr (int) gsl_vector_isnull libgsl gsl_vector_ispos ptr (int) gsl_vector_ispos libgsl gsl_vector_isneg ptr (int) gsl_vector_isneg \ permutations libgsl gsl_permutation_alloc int (int) gsl_permutation_alloc ( n -- *gsl_prm) libgsl gsl_permutation_calloc int (int) gsl_permutation_calloc ( n -- *gsl_prm) libgsl gsl_permutation_init int (void) gsl_permutation_init ( *gsl_prm -- ) libgsl gsl_permutation_free int (void) gsl_permutation_free ( *gsl_prm -- ) libgsl gsl_permutation_get int int (int) gsl_permutation_get ( *gsl_prm i -- n) \ Matrices \ Allocation libgsl gsl_matrix_alloc int int (int) gsl_matrix_alloc libgsl gsl_matrix_calloc int int (int) gsl_matrix_calloc libgsl gsl_matrix_alloc_from_block [ 5 ] ints (int) gsl_matrix_alloc_from_block libgsl gsl_matrix_alloc_from_matrix [ 5 ] ints (int) gsl_matrix_alloc_from_matrix libgsl gsl_matrix_free ( *gsl_matrix -- ) int (void) gsl_matrix_free \ Accessing matrix elements libgsl gsl_matrix_get int int int (fp) gsl_matrix_get ( *m i j -- df ) libgsl gsl_matrix_set df int int int (void) gsl_matrix_set ( df *m i j -- ) libgsl gsl_matrix_ptr int int int (int) gsl_matrix_ptr ( *m i j -- *[i,j] ) \ Initializing matrix elements libgsl gsl_matrix_set_all df int (void) gsl_matrix_set_all ( *m df -- n ) libgsl gsl_matrix_set_zero df int (void) gsl_matrix_set_zero ( *m df -- n ) libgsl gsl_matrix_set_identity df int (void) gsl_matrix_set_identity ( *m df -- n ) \ Reading and writing matrices libgsl gsl_matrix_fwrite ptr ptr (int) gsl_matrix_fwrite libgsl gsl_matrix_fread ptr ptr (int) gsl_matrix_fread libgsl gsl_matrix_fprintf ptr ptr ptr (int) gsl_matrix_fprintf libgsl gsl_matrix_fscanf ptr ptr (int) gsl_matrix_fscanf \ Copying matrices libgsl gsl_matrix_memcpy int int (int) gsl_matrix_memcpy ( *m *m -- n ) libgsl gsl_matrix_swap int int (int) gsl_matrix_swap ( *m *m -- n ) \ Copying Rows and columns libgsl gsl_matrix_get_row int int int (int) gsl_matrix_get_row libgsl gsl_matrix_set_row int int int (int) gsl_matrix_set_row libgsl gsl_matrix_get_col int int int (int) gsl_matrix_get_col libgsl gsl_matrix_set_col int int int (int) gsl_matrix_set_col \ Exchanging rows and columns libgsl gsl_matrix_swap_rows int int ptr (int) gsl_matrix_swap_rows libgsl gsl_matrix_swap_columns int int ptr (int) gsl_matrix_swap_columns libgsl gsl_matrix_swap_rowcol int int ptr (int) gsl_matrix_swap_rowcol libgsl gsl_matrix_transpose_memcpy int int (int) gsl_matrix_transpose_memcpy libgsl gsl_matrix_transpose int (int) gsl_matrix_transpose \ Matrix operations libgsl gsl_matrix_add int int (int) gsl_matrix_add libgsl gsl_matrix_sub int int (int) gsl_matrix_sub libgsl gsl_matrix_mul_elements int int (int) gsl_matrix_mul_elements libgsl gsl_matrix_div_elements int int (int) gsl_matrix_div_elements libgsl gsl_matrix_scale df int (int) gsl_matrix_scale libgsl gsl_matrix_add_constant df int (int) gsl_matrix_add_constant \ Finding maximum and minimum elements of matrices libgsl gsl_matrix_max ptr (fp) gsl_matrix_max libgsl gsl_matrix_min ptr (fp) gsl_matrix_min libgsl gsl_matrix_minmax ptr ptr ptr (void) gsl_matrix_minmax libgsl gsl_matrix_min_index ptr ptr ptr (void) gsl_matrix_min_index libgsl gsl_matrix_max_index ptr ptr ptr (void) gsl_matrix_max_index libgsl gsl_matrix_minmax_index ptr ptr ptr ptr ptr (void) gsl_matrix_minmax_index \ Matrix properties libgsl gsl_matrix_isnull ptr (int) gsl_matrix_isnull libgsl gsl_matrix_ispos ptr (int) gsl_matrix_ispos libgsl gsl_matrix_isneg ptr (int) gsl_matrix_isneg \ libgsl gsl_matrix_isnonneg ptr (int) gsl_matrix_isnonneg libgsl gsl_matrix_submatrix int int int int int (int) gsl_matrix_submatrix ( *gsl_matrix k1 k2 n1 n2 -- n ) libgsl gsl_matrix_row int int (int) gsl_matrix_row ( *gsl_matrix idx -- *gsl_vector ) libgsl gsl_matrix_column int int (int) gsl_matrix_column ( *gsl_matrix idx -- *gsl_vector ) libgsl gsl_matrix_diagonal int (int) gsl_matrix_diagonal ( *gsl_matrix -- *gsl_vector ) \ BLAS Wed Sep 14 16:10:34 MDT 2005 \ libblas cblas_dgemm int int df int int int \ int df int int int int int int (void/fp) cblas_dgemm libblas cblas_dgemv int int int int df int int df int int int int (void/fp) cblas_dgemv libgsl gsl_blas_ddot int int int (int) gsl_blas_ddot ( *gsl_vector *gsl_vector df -- n ) libgsl gsl_blas_dgemm int df int int df int int (int/fp) gsl_blas_dgemm libgsl gsl_blas_dger int int int df (int/fp) gsl_blas_dger ( alpha *gsl_vector *gsl_vector *gsl_matrix -- n ) ( A=\alpha x y^T+A ) libgsl gsl_blas_dgemv int df int int df int (int/fp) gsl_blas_dgemv ( n alpha *gsl_matrix *gsl_vector beta *gsl_vector -- n ) \ Linear ALgebra Wed Sep 14 13:39:22 MDT 2005 libgsl gsl_linalg_LU_decomp int int int (int) gsl_linalg_LU_decomp ( *gsl_matrix *gsl_permutation *variable -- n ) libgsl gsl_linalg_LU_invert int int int (int) gsl_linalg_LU_invert ( *gsl_matrix *gsl_permutation *gsl_matrix -- n ) libgsl gsl_linalg_SV_decomp int int int int (int) gsl_linalg_SV_decomp ( *gsl_matrix *gsl_matrix *gsl_vector *gsl_vector -- n ) libgsl gsl_linalg_SV_decomp_mod int int int int int (int) gsl_linalg_SV_decomp_mod ( *gsl_matrix *gsl_matrix *gsl_matrix *gsl_vector *gsl_vector -- n ) \ ----------------------------------------------------------------------------- \ *** Ordinary Differential Equations *** \ --- ODE system struct{ cell func \ (* function) \ (double t, const double y[], double dydt[], void * params); cell jac \ (* jacobian) \ (double t, const double y[], double * dfdy, double dfdt[], \ void * params); cell dim \ dimension; cell params \ * params; } gsl_odeiv_system \ constants related to ODE 1 constant GSL_ODEIV_HADJ_INC 0 constant GSL_ODEIV_HADJ_NIL -1 constant GSL_ODEIV_HADJ_DEC callback gsl_odeiv_func4:1 (int) df int int int callback; callback gsl_odeiv_jac5:1 (int) df int int int int callback; \ --- Stepping Functions libgsl gsl_odeiv_step_alloc ptr int (ptr) gsl_odeiv_step_alloc ( *step_type int -- *step ) libgsl gsl_odeiv_step_reset ptr (int) gsl_odeiv_step_reset ( *step -- r ) libgsl gsl_odeiv_step_free ptr (void) gsl_odeiv_step_free ( *step -- ) libgsl gsl_odeiv_step_name ptr (ptr) gsl_odeiv_step_name ( *step -- *str0 ) libgsl gsl_odeiv_step_order ptr (int) gsl_odeiv_step_order ( *step -- order) libgsl gsl_odeiv_step_apply int int int int int df df int (int) gsl_odeiv_step_apply ( -- ) \ --- Available algorithms libgsl _gsl_odeiv_step_rk2 (int) gsl_odeiv_step_rk2 libgsl _gsl_odeiv_step_rk4 (int) gsl_odeiv_step_rk4 libgsl _gsl_odeiv_step_rkf45 (int) gsl_odeiv_step_rkf45 libgsl _gsl_odeiv_step_rkck (int) gsl_odeiv_step_rkck libgsl _gsl_odeiv_step_rk8pd (int) gsl_odeiv_step_rk8pd libgsl _gsl_odeiv_step_rk2imp (int) gsl_odeiv_step_rk2imp libgsl _gsl_odeiv_step_rk4imp (int) gsl_odeiv_step_rk4imp libgsl _gsl_odeiv_step_bsimp (int) gsl_odeiv_step_bsimp libgsl _gsl_odeiv_step_gear1 (int) gsl_odeiv_step_gear1 libgsl _gsl_odeiv_step_gear2 (int) gsl_odeiv_step_gear2 : gsl_odeiv_step_rk2 [func'] _gsl_odeiv_step_rk2 @ ; : gsl_odeiv_step_rk4 [func'] _gsl_odeiv_step_rk4 @ ; : gsl_odeiv_step_rkf45 [func'] _gsl_odeiv_step_rkf45 @ ; : gsl_odeiv_step_rkck [func'] _gsl_odeiv_step_rkck @ ; : gsl_odeiv_step_rk8pd [func'] _gsl_odeiv_step_rk8pd @ ; : gsl_odeiv_step_rk2imp [func'] _gsl_odeiv_step_rk2imp @ ; : gsl_odeiv_step_rk4imp [func'] _gsl_odeiv_step_rk4imp @ ; : gsl_odeiv_step_bsimp [func'] _gsl_odeiv_step_bsimp @ ; : gsl_odeiv_step_gear1 [func'] _gsl_odeiv_step_gear1 @ ; : gsl_odeiv_step_gear2 [func'] _gsl_odeiv_step_gear2 @ ; \ --- Adaptive Step-size Control libgsl gsl_odeiv_control_standard_new df df df df (ptr) gsl_odeiv_control_standard_new ( a_dydt a_y eps_rel eps_abs -- *control ) libgsl gsl_odeiv_control_y_new df df (int) gsl_odeiv_control_y_new ( eps_abs eps_rel -- *control ) libgsl gsl_odeiv_control_yp_new df df (ptr) gsl_odeiv_control_yp_new ( eps_abs eps_rel -- *control ) libgsl gsl_odeiv_control_free ptr (void) gsl_odeiv_control_free ( *control -- ) libgsl gsl_odeiv_control_name ptr (ptr) gsl_odeiv_control_name ( *c -- *str0 ) \ --- Evolution libgsl gsl_odeiv_evolve_alloc int (int) gsl_odeiv_evolve_alloc ( #dimensions -- evolution_func ) libgsl gsl_odeiv_evolve_apply int int df int int int int int (int) gsl_odeiv_evolve_apply ( -- ) libgsl gsl_odeiv_evolve_reset ptr (int) gsl_odeiv_evolve_reset ( *e -- r ) libgsl gsl_odeiv_evolve_free ptr (void) gsl_odeiv_evolve_free ( *e -- ) \ ----------------------------------------------------------------------------- \ *** Fast Fourier Transform *** \ -- real libgsl gsl_fft_real_wavetable_alloc int (ptr) gsl_fft_real_wavetable_alloc libgsl gsl_fft_real_wavetable_free ptr (void) gsl_fft_real_wavetable_free libgsl gsl_fft_real_workspace_alloc int (ptr) gsl_fft_real_workspace_alloc libgsl gsl_fft_real_workspace_free ptr (void) gsl_fft_real_workspace_free \ in-place libgsl gsl_fft_real_transform ptr int int ptr ptr (int) gsl_fft_real_transform libgsl gsl_fft_real_unpack ptr ptr int int (int) gsl_fft_real_unpack \ -- halfcomplex \ - mixed radix libgsl gsl_fft_hc_wtbl_alloc int (ptr) gsl_fft_halfcomplex_wavetable_alloc libgsl gsl_fft_hc_wtbl_free ptr (void) gsl_fft_halfcomplex_wavetable_free libgsl gsl_fft_hc_backward ptr int int ptr ptr (int) gsl_fft_halfcomplex_backward libgsl gsl_fft_hc_inverse ptr int int ptr ptr (int) gsl_fft_halfcomplex_inverse libgsl gsl_fft_hc_transform ptr int int ptr ptr (int) gsl_fft_halfcomplex_transform libgsl gsl_fft_hc_unpack ptr ptr int int (int) gsl_fft_halfcomplex_unpack \ - radix2 libgsl gsl_fft_hc_r2_unpack ptr ptr int int (int) gsl_fft_halfcomplex_radix2_unpack libgsl gsl_fft_hc_r2_backward ptr int int (int) gsl_fft_halfcomplex_radix2_backward libgsl gsl_fft_hc_r2_inverse ptr int int (int) gsl_fft_halfcomplex_radix2_inverse libgsl gsl_fft_hc_r2_transform ptr int int (int) gsl_fft_halfcomplex_radix2_transform | hashlen 32 vector fftpre( struct{ cell next cell size cell workspace cell r_wavetable cell hc_wavetable } gsl_fft_precomputes | create $buf 255 allot | : 2str dup >r abs s>d <# #s r> sign #> $buf 0place ; | : s>hash ( n -- key ) 2str $buf hash ; | : (cache-fft) ( n -- addr ) sizeof gsl_fft_precomputes allocate throw >r 0 r@ gsl_fft_precomputes next ! dup r@ gsl_fft_precomputes size ! dup gsl_fft_real_workspace_alloc r@ gsl_fft_precomputes workspace ! dup gsl_fft_real_wavetable_alloc r@ gsl_fft_precomputes r_wavetable ! gsl_fft_hc_wtbl_alloc r@ gsl_fft_precomputes hc_wavetable ! r> ; | : cache-fft ( size -- addr ) dup s>hash fftpre( over )@ 0= if swap (cache-fft) fftpre( rot dup >r )! fftpre( r> )@ else swap (cache-fft) swap fftpre( over )@ over gsl_fft_precomputes next ! fftpre( rot dup >r )! fftpre( r> )@ then ; \ in case not found addr is just the size | : find-fft-cache ( n -- addr 0/1 ) dup s>hash fftpre( swap )@ dup begin while 2dup gsl_fft_precomputes size @ = if nip true exit then gsl_fft_precomputes next @ dup repeat ; legacy on \ Structures struct{ cell name cell max cell min cell size cell set cell get cell get_double } gsl_rng_type struct{ cell type cell state } gsl_rng struct{ cell size cell data } gsl_block struct{ cell size cell stride cell data cell block cell owner } gsl_vector ' gsl_block alias gsl_permutation struct{ cell size1 cell size2 cell tda cell data cell block cell owner } gsl_matrix \ random number generation functions : 0-len dup 1- 0 begin 1+ 2dup + c@ 0= until nip ; : )gsl-rng ( addr i -- *gsl_rng_type ) cells + @ ; \ setting up all available random number generators gsl_rng_types_setup value gsl_rng_array( 0 value gsl_rng_default : gsl-free ( -- ) gsl_rng_default gsl_rng_free ; : borosh13 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 0 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : cmrg ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 1 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : coveyou ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 2 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : fishman18 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 3 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : fishman20 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 4 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : fishman2x ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 5 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : gfsr4 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 6 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : knuthran ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 7 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : knuthran2 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 8 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : lecuyer21 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 9 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : minstd ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 10 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : mrg ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 11 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : mt19937 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 12 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : mt19937_1999 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 13 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : mt19937_1998 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 14 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : r250 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 15 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ran0 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 16 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ran1 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 17 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ran2 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 18 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ran3 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 19 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : rand ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 20 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : rand48 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 21 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random128-bsd ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 22 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random128-glibc2 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 23 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random128-libc5 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 24 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random256-bsd ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 25 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random256-glibc2 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 26 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random256-libc5 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 27 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random32-bsd ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 28 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random32-glibc2 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 29 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random32-libc5 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 30 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random64-bsd ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 31 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random64-glibc2 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 32 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random64-libc5 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 33 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random8-bsd ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 34 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random8-glibc2 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 35 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random8-libc5 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 36 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random-bsd ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 37 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random-glibc2 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 38 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : random-libc5 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 39 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : randu ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 40 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ranf ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 41 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ranlux ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 42 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ranlux389 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 43 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ranlxd1 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 44 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ranlxd2 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 45 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ranlxs0 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 46 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ranlxs1 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 47 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ranlxs2 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 48 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : ranmar ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 49 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : slatec ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 50 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : taus ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 51 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : taus2 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 52 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : taus113 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 53 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : transputer ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 54 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : tt800 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 55 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : uni ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 56 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : uni32 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 57 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : vax ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 58 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : waterman14 ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 59 )gsl-rng gsl_rng_alloc to gsl_rng_default ; : zuf ( -- *gsl_rng ) gsl_rng_default 0<> if gsl-free then gsl_rng_array( 60 )gsl-rng gsl_rng_alloc to gsl_rng_default ; \ words for actual generation of random numbers : gsl-randomg ( -- n ) gsl_rng_default gsl_rng_get ; : gsl-randomu /* -- f \in [0,1) */ gsl_rng_default gsl_rng_uniform ; : gsl-randomu+ /* -- f \in (0,1) */ gsl_rng_default gsl_rng_uniform_pos ; : gsl-random-up ( n -- f \in [0,n] ) gsl_rng_default swap gsl_rng_uniform_int ; : gsl-set-seed ( n -- ) gsl_rng_default swap gsl_rng_set ; : gsl-clone ( -- *gsl_rng ) gsl_rng_default gsl_rng_clone ; : gsl-gaussian ( -- df ) gsl_rng_default !1 gsl_ran_gaussian ; : gsl-discrete ( *gsl_ran_discrete -- n ) gsl_rng_default swap gsl_ran_discrete ; \ vectors and matrices 0 constant GSL_VECTOR_TYPE 1 constant GSL_MATRIX_TYPE : gsltypeof ' >body cell + @ ; : fvector ( n -- | -- id addr ) create gsl_vector_calloc , GSL_VECTOR_TYPE , does> @ ; \ allocate a nameless vector : :] ( # -- addr ) gsl_vector_calloc ; \ allocate a nameless matrix : :]] ( # # -- addr ) gsl_matrix_calloc ; : ]@ ( addr i -- df ) gsl_vector_get ; : ]! ( df addr i -- ) gsl_vector_set ; : ]data ( addr -- *data ) gsl_vector data @ ; : ]stride ( addr -- *data ) gsl_vector stride @ ; : ]fill ( df addr -- ) gsl_vector_set_all ; : ]erase ( addr -- ) gsl_vector_set_zero ; : ]+ ( *gsl_vector *gsl_vector -- ) gsl_vector_add drop ; : ]- ( *gsl_vector *gsl_vector -- ) gsl_vector_sub drop ; : ]e*! ( *gsl_vector *gsl_vector -- ) gsl_vector_mul drop ; : ]size ( *gsl_vector -- n ) gsl_vector size @ ; : ]outer* ( *gsl_vector *gsl_vector -- *gsl_matrix ) over ]size over ]size gsl_matrix_calloc dup >r !1 gsl_blas_dger drop r> ; \ no control for divizion by zero (I get segfaults) : ]/ ( *gsl_vector *gsl_vector -- ) gsl_vector_div throw ; : ]clone ( *gsl_vector -- *gsl_vector ) dup gsl_vector size @ gsl_vector_alloc dup -rot swap gsl_vector_memcpy drop ; : ]add ( *gsl_vector *gsl_vector -- *gsl_vector ) ]clone dup -rot swap ]+ ; : ]sub ( *gsl_vector *gsl_vector -- *gsl_vector ) swap ]clone dup -rot swap ]- ; : ]mul ( *gsl_vector *gsl_vector -- *gsl_vector ) swap ]clone dup -rot swap ]e*! ; : ]div ( *gsl_vector *gsl_vector -- *gsl_vector ) swap ]clone dup -rot swap ]/ ; : ]*c ( df *gsl_vector -- ) gsl_vector_scale drop ; : ]+c ( df *gsl_vector -- ) gsl_vector_add_constant drop ; : ]max ( *gsl_vector -- ) gsl_vector_max ; : ]min ( *gsl_vector -- ) gsl_vector_min ; : ]imax ( *gsl_vector -- ) gsl_vector_max_index ; : ]imin ( *gsl_vector -- ) gsl_vector_min_index ; : ]copy] ( *gsl_vector_dest *gsl_vector_src -- ) gsl_vector_memcpy drop ; : ]negate !-1.0 ]*c ; : ]ones ( n -- *gsl_vector ) :] dup 1e ]fill ; : ]]slice ( *gsl_matrix x y n m -- *gsl_matrix ) gsl_matrix_alloc_from_matrix ; : ]slice ( *gsl_vector offset length stride -- *gsl_vector ) gsl_vector_alloc_from_vector ; : ]null? ( *gsl_vector -- 0/-1 ) gsl_vector_isnull negate ; : ]pos? ( *gsl_vector -- 0/-1 ) gsl_vector_ispos negate ; : ]neg? ( *gsl_vector -- 0/-1 ) gsl_vector_isneg negate ; \ FFT 19jan08sp : ]fft! ( *gsl_vector -- ) dup ]size >r dup ]stride >r ]data r> r> dup find-fft-cache if dup gsl_fft_precomputes r_wavetable @ swap gsl_fft_precomputes workspace @ else drop dup cache-fft dup gsl_fft_precomputes r_wavetable @ swap gsl_fft_precomputes workspace @ then gsl_fft_real_transform throw ; : ]fft ( *gsl_vector -- *gsl_vector ) ]clone dup ]fft! ; : ]ifft! ( *gsl_vector -- ) dup ]size >r dup ]stride >r ]data r> r> dup find-fft-cache if dup gsl_fft_precomputes hc_wavetable @ swap gsl_fft_precomputes workspace @ else drop dup cache-fft dup gsl_fft_precomputes hc_wavetable @ swap gsl_fft_precomputes workspace @ then gsl_fft_hc_inverse throw ; : ]ifft ( *gsl_vector -- *gsl_vector ) ]clone dup ]ifft! ; \ multiply two half complex vectors \ store result in the first : ]hc*! ( *gsl_vector *gsl_vector -- ) 2dup 0 ]@ 0 ]@ f* over 0 ]! dup ]size dup %1 and not + 1 do 2dup dup i ]@ i 1+ ]@ dup i ]@ i 1+ ]@ z* over dup i 1+ ]! i ]! 2 +loop dup ]size %1 and not if 2dup dup ]size 1- dup >r ]@ dup r@ ]@ f* r> ]! then 2drop ; \ pseudomatrices and vectors : pvector ( *data n -- *gsl_vector ) sizeof gsl_vector allocate throw dup >r dup 1 swap gsl_vector stride ! gsl_vector size ! r@ gsl_vector data ! r@ 0 swap gsl_vector owner ! r> ; : pmatrix! ( *data tda n m *pmatrix -- *gsl_matrix ) dup >r gsl_matrix size2 ! r@ gsl_matrix size1 ! r@ gsl_matrix tda ! r@ gsl_matrix data ! 0 r@ gsl_matrix owner ! r> ; : pmatrix ( *data tda n m -- *gsl_matrix ) sizeof gsl_matrix allocate throw dup 0 swap gsl_matrix owner ! pmatrix! ; \ permutations : fpermutation ( n -- | -- id addr ) create gsl_permutation_calloc , does> @ ; : }@ ( *gsl_permutation i -- n ) gsl_permutation_get ; : }data ( *gsl_permutation -- *data ) gsl_block data @ ; : }size ( *gsl_permutation -- *data ) gsl_block size @ ; : }free ( *gsl_permutation -- ) gsl_permutation_free ; : }sign ( *gsl_permutation -- 1/-1 ) 1 over dup }size 0 do dup i }@ i <> if swap negate swap then loop drop ; \ matrices : fmatrix ( n m -- | -- id addr ) create gsl_matrix_calloc , GSL_MATRIX_TYPE , does> @ ; : free_pseudomatrix ( pmatrix/pvector -- ) free throw ; create free_matrix ' free_pseudomatrix , ' gsl_matrix_free , create free_vector ' free_pseudomatrix , ' gsl_vector_free , : ]]free ( *gsl_matrix -- ) dup gsl_matrix owner @ cells free_matrix + @ execute ; : ]free ( addr -- ) dup gsl_vector owner @ cells free_vector + @ execute ; : ]]@ ( *gsl_matrix i j -- df ) gsl_matrix_get ; : ]]*@ ( *gsl_matrix i j -- *[i,j] ) gsl_matrix_ptr ; : ]]! ( *gsl_matrix i j df -- ) gsl_matrix_set ; : ]]fill ( addr df -- ) gsl_matrix_set_all ; : ]]size1 gsl_matrix size1 @ ; : ]]size2 gsl_matrix size2 @ ; : ]]dim ( *gsl_matrix -- m n ) dup ]]size1 swap ]]size2 ; : ]]dim. ( *gsl_matrix -- ) ]]dim swap . ." x" . cr ; : ]]data ( *gsl_matrix -- addr) gsl_matrix data @ ; : ]]tda gsl_matrix tda @ ; : ]]block gsl_matrix block @ ; : ]]owner gsl_matrix owner @ ; : ]]copy]] ( *gsl_matrix_dest *gsl_matrix_src -- ) gsl_matrix_memcpy drop ; : ]]'copy]] ( *gsl_matrix_dest *gsl_matrix_src -- ) gsl_matrix_transpose_memcpy drop ; \ : ]]row ( *gsl_matrix idx -- *gsl_vector ) gsl_matrix_row ; \ : ]]col ( *gsl_matrix idx -- *gsl_vector ) gsl_matrix_column ; : ]]>] ( *gsl_vector *gsl_matrix i -- ) gsl_matrix_get_col drop ; : ]]>]' ( *gsl_vector *gsl_matrix i -- ) gsl_matrix_get_row drop ; : ]>]] ( *gsl_matrix *gsl_vector i -- ) swap gsl_matrix_set_col drop ; : ]'>]] ( *gsl_matrix *gsl_vector i -- ) swap gsl_matrix_set_row drop ; : ]]max gsl_matrix_max ; : ]]min gsl_matrix_min ; : ]]add! ( *gsl_matrix *gsl_matrix -- ) gsl_matrix_add drop ; : ]]sub! ( *gsl_matrix *gsl_matrix -- ) gsl_matrix_sub drop ; : ]]e*! ( *gsl_matrix *gsl_matrix -- ) gsl_matrix_mul_elements drop ; : ]]*c ( *gsl_matrix df -- ) gsl_matrix_scale drop ; : ]]+c ( df *gsl_matrix -- ) gsl_matrix_add_constant drop ; : ]]clone ( *gsl_matrix -- *gsl_matrix ) dup dup gsl_matrix size1 @ swap gsl_matrix size2 @ gsl_matrix_alloc dup -rot swap gsl_matrix_memcpy drop ; : ]]negate !-1.0 ]]*c ; : ]]+ ( *gsl_matrix *gsl_matrix -- *gsl_matrix ) ]]clone dup -rot swap ]]add! ; : ]]- ( *gsl_matrix *gsl_matrix -- *gsl_matrix ) swap ]]clone dup -rot swap ]]sub! ; : ]]null? ( *gsl_matrix -- 0/-1 ) gsl_matrix_isnull negate ; : ]]pos? ( *gsl_matrix -- 0/-1 ) gsl_matrix_ispos negate ; : ]]neg? ( *gsl_matrix -- 0/-1 ) gsl_matrix_isneg negate ; \ blas \ constants 101 Constant CblasRowMajor 102 Constant CblasColMajor 111 Constant CblasNoTrans 112 Constant CblasTrans 113 Constant CblasConjTrans 121 Constant CblasUpper 122 Constant CblasLower 131 Constant CblasNonUnit 132 Constant CblasUnit 141 Constant CblasLeft 142 Constant CblasRight : action? ( *gsl_matrix *gsl_matrix n n n -- ) dup 0= if drop 2swap 2dup ]]size2 swap ]]size1 swap exit then dup 1 = if drop 2swap 2dup ]]size2 swap ]]size2 swap exit then 2 = if 2swap 2dup ]]size1 swap ]]size1 swap exit then 3 = if 2swap 2dup ]]size1 swap ]]size2 swap exit then ; create samemattable ' noop , ' ]]clone , : samemat ( *gsl_matrix *gsl_matrix -- 1/0 *gsl_matrix ) dup -rot = abs dup -rot cells samemattable + @ execute ; macro : ]]mul ( *gsl_matrix *gsl_matrix n n n -- *gsl_matrix ) !1 !0 action? gsl_matrix_alloc dup >r gsl_blas_dgemm drop r> ; : ]]* ( *gsl_matrix *gsl_matrix -- *gsl_matrix ) 2dup samemat dup rot 2>r nip CblasNoTrans CblasNoTrans 0 ]]mul 2r> if ]]free else drop then ; : ]]'* ( *gsl_matrix *gsl_matrix -- *gsl_matrix ) 2dup samemat dup rot 2>r nip CblasTrans CblasNoTrans 1 ]]mul 2r> if ]]free else drop then ; : ]]*' ( *gsl_matrix *gsl_matrix -- *gsl_matrix ) 2dup samemat dup rot 2>r nip CblasNoTrans CblasTrans 2 ]]mul 2r> if ]]free else drop then ; : ]]'*' ( *gsl_matrix *gsl_matrix -- *gsl_matrix ) 2dup samemat dup rot 2>r nip CblasTrans CblasTrans 3 ]]mul 2r> if ]]free else drop then ; : ]]mul! ( n n *gsl_matrix *gsl_matrix *gsl_matrix -- ) !1 !0 gsl_blas_dgemm drop ; : ]]*! ( *gsl_matrix *gsl_matrix *gsl_matrix -- ) >r CblasNoTrans CblasNoTrans 2swap r> ]]mul! ; : ]]'*! ( *gsl_matrix *gsl_matrix *gsl_matrix -- ) >r CblasTrans CblasNoTrans 2swap r> ]]mul! ; : ]]*'! ( *gsl_matrix *gsl_matrix *gsl_matrix -- ) >r CblasNoTrans CblasTrans 2swap r> ]]mul! ; : ]]*] ( *gsl_matrix *gsl_vector -- *gsl_vector ) over ]]size1 gsl_vector_alloc >r CblasNoTrans -rot r@ !1 !0 gsl_blas_dgemv drop r> ; : ]]'*] ( *gsl_matrix *gsl_vector -- *gsl_vector ) over ]]size1 gsl_vector_alloc >r CblasTrans -rot r@ !1 !0 gsl_blas_dgemv drop r> ; : ]]i ( *gsl_matrix -- ) dup dup ]]size1 swap ]]size2 <> if abort" ERROR: Not a square matrix!" then dup ]]size1 0 do dup i i !1 ]]! loop drop ; : identity ( n -- *gsl_matrix ) dup gsl_matrix_calloc dup ]]i ; : min-identity ( *gsl_matrix -- *gsl_matrix ) dup ]]size1 swap ]]size2 min identity ; : left/right' ( *gsl_matrix *gsl_matrix -- *gsl_matrix ) over ]]size1 over ]]size1 > if swap ]]*' exit else ]]'* exit then ; \ original matrix remains intact : ]]' ( *gsl_matrix -- *gsl_matrix ) dup min-identity dup >r left/right' r> ]]free ; : ]]T! ( *gsl_matrix -- ) gsl_matrix_transpose drop ; : ]]T ( *gsl_matrix -- *gsl_matrix ) dup ]]dim swap gsl_matrix_alloc dup rot gsl_matrix_transpose_memcpy drop ; : ]]2T ( *gsl_matr *gsl_matrix -- ) gsl_matrix_transpose_memcpy drop ; : ]]+! ( *gsl_matrix i j df -- ) >r 2dup r@ ]]@ f+ r> ]]! ; : ]]scale! ( *gsl_matrix i j df -- ) >r 2dup r@ ]]@ f* r> ]]! ; : ]]data_ij ( *gsl_matrix i j -- addr) rot >r swap r@ ]]tda dfloats * swap dfloats + r> ]]data + ; \ Cross product can be either calculated through determinant: : ]x ( *gsl_vector *gsl_vector -- *gsl_vector ) 3 gsl_vector_alloc { x1[ x2[ x3[ | x1[ 2 ]@ fnegate x2[ 1 ]@ f* x1[ 1 ]@ x2[ 2 ]@ f* f+ x3[ 0 ]! x1[ 2 ]@ x2[ 0 ]@ f* x1[ 0 ]@ fnegate x2[ 2 ]@ f* f+ x3[ 1 ]! x1[ 1 ]@ fnegate x2[ 0 ]@ f* x1[ 0 ]@ x2[ 1 ]@ f* f+ x3[ 2 ]! x3[ } ; \ or using algebraic form when first vector in the product is \ rewritten in a matrix form: \ a x b = [C_a] b \ [ 0 -a[2] a[1] ] \ [C_a] = [ a[2] 0 -a[0] ] \ [-a[1] a[0] 0 ] \ a function to convert a vector into such matrix: : ]>[x] ( ] -- ]] ) [IFDEF] debug dup ]size 3 <> abort" Not a 3D vector!" [THEN] 3 3 :]] dup >r swap 2dup 2 ]@ fdup dup fnegate 0 1 ]]! 1 0 ]]! 2dup 1 ]@ fdup dup fnegate 2 0 ]]! 0 2 ]]! 0 ]@ fdup dup fnegate 1 2 ]]! 2 1 ]]! r> ; : ]. ( *gsl_vector *gsl_vector -- f:dot_product ) { x1[ x2[ | 0 0 sp@ x1[ x2[ rot gsl_blas_ddot drop fd>f } ; : ]total ( *gsl_vector -- f:sum ) dup ]size gsl_vector_alloc dup !1 ]fill dup rot ]. ]free ; \ probability normalize - assures sum is unity : ]pnormalize ( *gsl_vector - ) dup ]total 1/f ]*c ; : |]| ( *gsl_vector -- f:norm ) dup ]. fsqrt ; \ assures vector norm is unity : ]normalize ( *gsl_vector - ) dup |]| 1/f ]*c ; : ]distance ( *gsl-vector *gsl-vector -- f ) ]sub dup |]| ]free ; : ]+! ( *gsl_vector i df -- ) 2dup ]@ f+ ]! ; : ]*! ( *gsl_vector i df -- ) 2dup ]@ f* ]! ; : ]]*]m ( *gsl_matrix *gsl_vector -- *gsl_vector ) over ]]size1 gsl_vector_calloc { m[[ x[ y[ | m[[ ]]size1 0 do m[[ ]]size2 0 do m[[ j i ]]@ x[ i ]@ f* y[ j ]+! loop loop y[ } ; : >#rows ( -- ) swap ]]size1 >= abort" number of rows is bigger than available!" ; : >#cols ( -- ) swap ]]size2 >= abort" number of columns is bigger than available!" ; : ]]row ( *gsl_matrix n -- *gsl_vector ) 2dup >#rows sizeof gsl_vector allocate throw dup 1 swap gsl_vector stride ! >r over ]]size2 r@ gsl_vector size ! 0 ]]data_ij r@ gsl_vector data ! 0 r@ gsl_vector owner ! r> ; \ assumes all dimensions are set correctly : ]]row! ( *gsl_vector *gsl_matrix n -- ) rot >r 2dup >#rows 0 ]]data_ij r> gsl_vector data ! ; : ]]col ( *gsl_matrix n -- *gsl_vector ) 2dup >#cols sizeof gsl_vector allocate throw >r over ]]tda r@ gsl_vector stride ! over ]]size1 r@ gsl_vector size ! over ]]block r@ gsl_vector block ! 0 swap ]]data_ij r@ gsl_vector data ! 0 r@ gsl_vector owner ! r> ; : ]]rfill ( f:n *gsl_matrix i -- ) ]]row dup ]fill ]free ; : ]]cfill ( f:n *gsl_matrix i -- ) ]]col dup ]fill ]free ; : ]]submat ( *gsl_matrix n1 n2 m1 m2 -- *gsl_matrix ) { m[[ n1 n2 m1 m2 | sizeof gsl_matrix allocate throw >r n2 n1 - 1+ r@ gsl_matrix size1 ! m2 m1 - 1+ r@ gsl_matrix size2 ! m[[ n1 m1 ]]data_ij r@ gsl_matrix data ! m[[ ]]tda r@ gsl_matrix tda ! 0 r@ gsl_matrix owner ! r> } ; : ?square ( *gsl_matrix -- ) dup ]]size1 swap ]]size2 <> abort" ERROR: Not a square matrix!" ; : ]]diag ( *gsl_matrix n1 n2 -- *gsl_vector ) rot dup ?square -rot sizeof gsl_vector allocate throw { d[ | over - d[ gsl_vector size ! 2dup dup ]]data_ij d[ gsl_vector data ! drop dup ]]tda d[ gsl_vector stride ! ]]block d[ gsl_vector block ! 0 d[ gsl_vector owner ! d[ } ; \ with input matrix replaced by the result : ]]gsl-svd ( *gsl_matrix -- *gsl_matrix *gsl_vector ) dup ]]size2 dup dup gsl_matrix_calloc swap dup gsl_vector_calloc swap gsl_vector_calloc { mV vS vW | mV vS vW gsl_linalg_SV_decomp drop vW ]free mV vS } ; \ seems to be 30% faster : ]]gsl-svdm ( *gsl_matrix -- *gsl_matrix *gsl_vector ) dup ]]size2 dup ( a n n -- ) dup dup gsl_matrix_calloc swap ( a n a n -- ) dup gsl_matrix_calloc rot dup ( a a a n n -- ) gsl_vector_calloc swap gsl_vector_calloc { mX mV vS vW | mX mV vS vW gsl_linalg_SV_decomp_mod drop vW ]free mX ]]free mV vS } ; : ]]alu ( *gsl_matrix -- *gsl_permutation ) ( matrix replaced with its lu ) { a[[ | CblasRowMajor a[[ ]]size1 a[[ ]]size2 a[[ ]]data a[[ ]]size1 dup gsl_permutation_alloc dup >r }data clapack_dgetrf throw r> } ; : ]]ainv ( *gsl_matrix *gsl_permutation -- ) \ LU of a matrix replaced with its inverse { a[[ t{ | CblasRowMajor a[[ ]]size2 a[[ ]]data a[[ ]]size1 t{ }data clapack_dgetri throw } ; : ]]ainvert ( *gsl_matrix -- *gsl_matrix ) [IFDEF] отладка dup ?square [THEN] ]]clone dup dup >r ]]alu dup >r ]]ainv r> }free r> ; : ]]det ( *gsl_matrix -- f:determinant ) [IFDEF] отладка dup ?square [THEN] ]]clone dup ]]alu >r 1e0 dup ]]size1 0 do dup i dup ]]@ f* loop ]]free \ compute permutation sign r> }sign s>f f* }free ; \ calculates the work needed for dgesvd_ ( see man dgesvd ) : lwork ( m n -- c ) 2dup max -rot min 3 * over + swap 5 * max ; \ this svd returns U MxM so eats a lot of memory : ]]asvda ( *gsl_matrix -- *gsl_matrix *gsl_matrix *gsl_vector ) ]]clone { A[[ | A[[ ]]size1 dup gsl_matrix_alloc A[[ ]]size2 dup gsl_matrix_alloc A[[ ]]size1 A[[ ]]size2 min gsl_vector_alloc 8 cells allocate throw { U[[ V[[ W[ p[ | ascii A p[ 0 cells + ! p[ 0 cells + ascii A p[ 1 cells + ! p[ 1 cells + A[[ ]]size1 p[ 2 cells + ! p[ 2 cells + A[[ ]]size2 p[ 3 cells + ! p[ 3 cells + A[[ ]]data p[ 2 cells + W[ ]data U[[ ]]data U[[ ]]size1 p[ 4 cells + ! p[ 4 cells + V[[ ]]data V[[ ]]size1 p[ 5 cells + ! p[ 5 cells + A[[ ]]size1 A[[ ]]size2 lwork dup gsl_vector_alloc dup >r ]data swap p[ 6 cells + ! p[ 6 cells + p[ 7 cells + dgesvd_ r> ]free p[ free throw A[[ ]]free U[[ V[[ W[ } } ; \ performs A=U*S*V^T \ A = MxN, where M>N, pass it A^T \ returns U^T (MxN), V(NxN) and vector of N eigenvalues : ]]asvdO ( *gsl_matrix -- *gsl_matrix *gsl_matrix *gsl_vector ) { A[[ | A[[ ]]size2 A[[ ]]size1 min dup gsl_matrix_alloc A[[ ]]size1 A[[ ]]size2 min gsl_vector_alloc 8 cells allocate throw { V[[ W[ p[ | ascii O p[ 0 cells + ! p[ 0 cells + ascii S p[ 1 cells + ! p[ 1 cells + A[[ ]]size2 p[ 2 cells + ! p[ 2 cells + A[[ ]]size1 p[ 3 cells + ! p[ 3 cells + A[[ ]]data p[ 2 cells + W[ ]data 0 p[ 2 cells + V[[ ]]data V[[ ]]size2 p[ 5 cells + ! p[ 5 cells + A[[ ]]size2 A[[ ]]size1 lwork dup gsl_vector_alloc dup >r ]data swap p[ 6 cells + ! p[ 6 cells + p[ 7 cells + dgesvd_ r> ]free p[ free throw A[[ V[[ W[ } } ; : ]diag[[ ( *gsl_vector -- *gsl_matrix ) dup ]size dup dup gsl_matrix_calloc swap 0 do 2dup swap i ]@ i i ]]! loop nip ; : ]print\ ( *gsl_vector -- ) dup ]size 0 do dup i ]@ fx. loop drop ; : ]print ( *gsl_vector -- ) ]print\ cr ; : ]]print ( *gsl_matrix -- ) cr precision swap 5 set-precision dup ]]size1 0 do \ i . ." : " dup ]]size2 0 do dup j i ]]@ fs. loop cr loop drop set-precision ; : ]]row-print ( *gsl_matrix i -- ) cr over gsl_matrix size2 @ 0 do 2dup i ]]@ f. loop cr 2drop ; : ]]col-print ( *gsl_matrix i -- ) cr over gsl_matrix size1 @ 0 do 2dup i swap ]]@ f. loop cr 2drop ; : ]]nthrow ( *gsl_matrix n -- addr ) over ]]tda * dfloats swap ]]data + ; : ]]randomize ( *gsl_matrix -- ) dup dup ]]size1 swap ]]size2 * 0 do dup gsl-randomu ]]data i dfloats + df! loop drop ; : ]randomize ( *gsl_vector -- ) dup ]size 0 do dup gsl-randomu i ]! loop drop ; : ]mean ( *gsl_vector -- f ) dup ]stride swap dup ]size swap ]data rot rot gsl_stats_mean ; : ]variance ( *gsl_vector -- f ) dup ]stride swap dup ]size swap ]data rot rot gsl_stats_variance ; : ]sd ( *gsl_vector -- f ) dup ]stride swap dup ]size swap ]data rot rot gsl_stats_sd ; : ]skew ( *gsl_vector -- f ) dup ]stride swap dup ]size swap ]data rot rot gsl_stats_skew ; : ]kurtosis ( *gsl_vector -- f ) dup ]stride swap dup ]size swap ]data rot rot gsl_stats_kurtosis ; : ]]gsl-lu ( *gsl_matrix -- *gsl_matrix *gsl_permutation ) 1 sp@ rot ]]clone dup >r dup ]]size1 gsl_permutation_calloc dup >r rot gsl_linalg_LU_decomp drop r> r> swap rot drop ; : ]]gsl-invert ( *gsl_matrix -- *gsl_matrix ) ]]clone dup dup ]]gsl-lu 2dup >r >r rot gsl_linalg_LU_invert drop r> ]]free r> }free ; ' ]]ainvert alias ]]invert ' ]]asvdO alias ]]svd : ]]save ( *gsl_matrix *gsl_matrix_cfa fid -- ) -rot { m[[ name[[ | >r name[[ >name count 1+ nip 0 m[[ ]]size2 m[[ ]]size1 0 sp@ 5 cells r@ write-file throw 2drop 2drop drop name[[ >name count 1+ r@ write-file throw m[[ ]]size1 m[[ ]]size2 * dfloats m[[ ]]T dup s>f ]]data swap r> write-file throw f>s ]]free } ; \ these words do not work with float matrices but are needed for \ scientific calculations, that's why they are in this module : _hmatrix ( n m size -- addr ) rot over * 2 pick * [ 2 cells ] literal + allocate throw dup [ 2 cells ] literal + >r rot over ! [ 1 cells ] literal + ! r> ; : hmatrix ( n m size -- ) create rot over * 2 pick * [ 2 cells ] literal + allocate throw dup , rot over ! [ 1 cells ] literal + ! does> @ [ 2 cells ] literal + ; : }}row-size ( hmatrix -- ) [ 2 cells ] literal - @ ; : freeHmatrix ( hmatrix -- ) [ 2 cells ] literal - free throw ; : }} ( addr i j -- addr[i][j] ) \ word to fetch 2-D array addresses >R >R \ indices to return stack temporarily DUP CELL- CELL- 2@ \ &a[0][0] size m R> * R> + * + ALIGNED ; : h->[[ ( hmatrix -- gsl_matrix ) dup }}row-size 3 swap gsl_matrix_alloc dup ]]size2 0 do 3 0 do 2dup swap i j }} w@ s>f i j ]]! loop loop nip ; \ some sequencing code : arange ( f:start f:end f:step -- x[ ) f-rot fswap fdup f>r f- fover f/ f>s :] fr> dup ]size 0 do dup fover i s>f f* fover f+ i ]! loop ; : product ( x[ -- f:P ) !1 dup ]size 0 do dup i ]@ f* loop drop ; \ initializing random number generator to some value in order to have \ it available upon loading of gsl mt19937 : )randperm ( *v( -- ) gsl_rng_default swap dup )size over )type 8 / gsl_ran_shuffle ; previous previous previous previous previous Module; mathgl-8.0.1/include/mgl2/mgl_pas.pas0000664000175000017500000036452014167366472017227 0ustar balakinbalakin//************************************************************************** // mgl_pas.pas is part of Math Graphic Library * // Copyright (C) 2008-2013 Mikhail Barg, Alexey Balakin * // * // This program is free software; you can redistribute it and/or modify * // it under the terms of the GNU Library General Public License as * // published by the Free Software Foundation; either version 2 of the * // License, or (at your option) any later version. * // * // This program is distributed in the hope that it will be useful, * // but WITHOUT ANY WARRANTY; without even the implied warranty of * // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * // GNU General Public License for more details. * // * // You should have received a copy of the GNU Library General Public * // License along with this program; if not, write to the * // Free Software Foundation, Inc., * // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * //************************************************************************** unit mgl_pas; {$IFDEF FPC} {$MODE DELPHI } {$PACKENUM 4} (* use 4-byte enums *) {$PACKRECORDS C} (* C/C++-compatible record packing *) {$ELSE} {$MINENUMSIZE 4} (* use 4-byte enums *) {$ENDIF} {$IFDEF DARWIN} {$linklib libmgl} {$ENDIF} interface uses {$IFDEF MSWINDOWS} Windows, Graphics, {$ENDIF} Math; const MGL_VER2 = 2.2; //* This define enables double precision in MathGL */ MGL_USE_DOUBLE = 1; const {$IFDEF MSWINDOWS} //win - .dll libmgl = 'libmgl.dll'; libmglglut = 'libmgl-glut.dll'; libmglfltk = 'libmgl-fltk.dll'; libmglqt = 'libmgl-qt.dll'; {$ELSE} {$IFDEF LINUX} //linux - .so libmgl = 'libmgl.so'; libmglglut = 'libmgl-glut.so'; libmglfltk = 'libmgl-fltk.so'; libmglqt = 'libmgl-qt.so'; {$ELSE} {$IFDEF DARWIN} //darwin - .dylib libmgl = 'libmgl.dylib'; libmglglut = 'libmgl-glut.dylib'; libmglfltk = 'libmgl-fltk.dylib'; libmglqt = 'libmgl-qt.dylib'; {$ELSE} // other platforms? {$ENDIF} {$ENDIF} {$ENDIF} {$IF (MGL_USE_DOUBLE = 0)} type mreal = double; {$ELSE} type mreal = real; {$IFEND} {$IFDEF FPC} {$ELSE} type QWord = Int64; {$ENDIF} Pmreal = ^mreal; type TNGLDraw = record end; type TMGLGraph = record end; type TMGLData = record end; type TMGLParse = record end; type TMGLFormula = record end; type TMGLFormulaC = record end; type TMGLDataC = record end; type HMDR = ^TNGLDraw; type HMGL = ^TMGLGraph; type HMDT = ^TMGLData; type HMPR = ^TMGLParse; type PPChar = ^PChar; type HMEX = ^TMGLFormula; type HAEX = ^TMGLFormulaC; type HADT = ^TMGLDataC; type Preal = ^single; type Pdouble = ^double; type Pint = ^integer; type dual = record re, im: mreal; end; type Pdual = ^dual; type TGSLVector = record end; type TGSLMatrix = record end; type PGSLVector = ^TGSLVector; type PGSLMatrix = ^TGSLMatrix; type TMglDrawFunction = function (gr: HMGL; p: pointer): integer; cdecl; function mgl_create_graph_gl(): HMGL; cdecl; external libmgl; function mgl_create_graph_glut(draw: TMglDrawFunction; const title: PChar; par: pointer): HMGL; cdecl; external libmglglut; function mgl_create_graph_fltk(draw: TMglDrawFunction; const title: PChar; par: pointer): HMGL; cdecl; external libmglfltk; procedure mgl_fltk_run(); cdecl; external libmglfltk; function mgl_create_graph_qt(draw: TMglDrawFunction; const title: PChar; par: pointer): HMGL; cdecl; external libmglqt; procedure mgl_qt_run(); cdecl; external libmglqt; {== ../../include/mgl2/abstract.h ==} //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- /// Set seed for random numbers procedure mgl_srnd(seed: integer); cdecl; external libmgl; /// Get random number function mgl_rnd(): double; cdecl; external libmgl; /// Set name for data variable (can be used in mgl_formula_calc() or in MGL scripts) procedure mgl_data_set_name(dat: HMDT;const name: PChar); cdecl; external libmgl; procedure mgl_data_set_name_w(dat: HMDT;const name: PWideChar); cdecl; external libmgl; /// Set callback function which is called at deleting variable /// Save whole data array (for ns=-1) or only ns-th slice to text file procedure mgl_data_save(const dat: HMDT;const fname: PChar;ns: integer); cdecl; external libmgl; /// Export data array (for ns=-1) or only ns-th slice to PNG file according color scheme procedure mgl_data_export(const dat: HMDT;const fname: PChar;const scheme: PChar;v1: mreal;v2: mreal;ns: integer); cdecl; external libmgl; /// Save data to HDF file procedure mgl_data_save_hdf(const d: HMDT;const fname: PChar;const data: PChar;rewrite: integer); cdecl; external libmgl; /// Get information about the data (sizes and momentum) to string function mgl_data_info(const dat: HMDT): PChar; cdecl; external libmgl; /// Put HDF data names into buf as '\t' separated. function mgl_datas_hdf(const fname: PChar;buf: PChar;size: integer): integer; cdecl; external libmgl; /// Get maximal value of the data function mgl_data_max(const dat: HMDT): mreal; cdecl; external libmgl; /// Get maximal value of the data which is less than 0 function mgl_data_neg_max(const dat: HMDT): mreal; cdecl; external libmgl; /// Get minimal value of the data function mgl_data_min(const dat: HMDT): mreal; cdecl; external libmgl; /// Get minimal value of the data which is larger than 0 function mgl_data_pos_min(const dat: HMDT): mreal; cdecl; external libmgl; /// Find position (after specified in i,j,k) of first nonzero value of formula function mgl_data_first(const dat: HMDT;const cond: PChar;i: Pint;j: Pint;k: Pint): mreal; cdecl; external libmgl; /// Find position (before specified in i,j,k) of last nonzero value of formula function mgl_data_last(const dat: HMDT;const cond: PChar;i: Pint;j: Pint;k: Pint): mreal; cdecl; external libmgl; /// Find position of first in direction 'dir' nonzero value of formula function mgl_data_find(const dat: HMDT;const cond: PChar;dir: char;i: integer;j: integer;k: integer): integer; cdecl; external libmgl; /// Find if any nonzero value of formula function mgl_data_find_any(const dat: HMDT;const cond: PChar): integer; cdecl; external libmgl; /// Get maximal value of the data and its position function mgl_data_max_int(const dat: HMDT;i: Pint;j: Pint;k: Pint): mreal; cdecl; external libmgl; /// Get maximal value of the data and its approximated position function mgl_data_max_real(const dat: HMDT;x: Pmreal;y: Pmreal;z: Pmreal): mreal; cdecl; external libmgl; /// Get minimal value of the data and its position function mgl_data_min_int(const dat: HMDT;i: Pint;j: Pint;k: Pint): mreal; cdecl; external libmgl; /// Get minimal value of the data and its approximated position function mgl_data_min_real(const dat: HMDT;x: Pmreal;y: Pmreal;z: Pmreal): mreal; cdecl; external libmgl; /// Get "energy and find 4 momenta of data: median, width, skewness, kurtosis function mgl_data_momentum_val(const d: HMDT;dir: char;m: Pmreal;w: Pmreal;s: Pmreal;k: Pmreal): mreal; cdecl; external libmgl; //----------------------------------------------------------------------------- /// Callback function for asking user a question. Result shouldn't exceed 1024. //----------------------------------------------------------------------------- /// Abstract class for data array // { return i>0 ? (i0 ? (j0 ? (k> ; macro | : f-op ( cell-size -- cfa ) type-idx cells fetch_operations + @ ; | : s-op ( cell-size -- cfa ) type-idx cells store_operations + @ ; : ^)! ( *vector -- addr ) [ 3 cells ] literal - @ ; : ^)@ ( *vector -- addr ) [ 4 cells ] literal - @ ; \ number of elements : )size ( *vector -- size ) [ 1 cells ] literal - @ ; \ set number of elements - useful for temporal size adjustments in \ datastructures such as heaps : )size! ( sz *vector -- ) [ 1 cells ] literal - ! ; \ size of an element in bytes : )type ( *vector -- size ) [ 2 cells ] literal - @ ; : )free ( *vector -- ) [ 4 cells ] literal - free throw ; \ header | fetch_cfa | store_cfa | el_size | #els | \ cell-size in bits \ unnamed vector : _vector ( n cell-size -- addr ) 2dup * [ 4 cells ] literal + allocate throw dup >r over f-op swap ! r@ cell+ over s-op swap ! r@ [ 2 cells ] literal + ! \ cell size store r@ [ 3 cells ] literal + ! \ #els store r> [ 4 cells ] literal + ; \ named vector : vector ( n cell-size -- ) create 2dup * [ 4 cells ] literal + allocate throw dup , dup >r over f-op swap ! r@ cell+ over s-op swap ! r@ [ 2 cells ] literal + ! \ cell size store r@ [ 3 cells ] literal + ! \ #els store r> dup \ erasing the content [ 2 cells ] literal + @ over [ 3 cells ] literal + @ * swap [ 4 cells ] literal + swap erase does> @ [ 4 cells ] literal + ; \ vector of pointers : vector* ( # -- *vector ) cell 8 * _vector ; | : ?idx-in-range ( *vector idx -- 1/0 ) dup rot )size < swap 0>= and ; | : check-range ( *vector idx -- *vector idx | fail ) 2dup ?idx-in-range not abort" Index is out of range! " ; \ addr of ith element of the vector : *) ( *vector i -- addr ) over )type 3 >> * + ; : )@ ( *vector index -- ) [IFDEF] отладка check-range [THEN] over dup ^)@ >r )type 3 >> * + r> execute ; : )! ( value *vector index -- ) [IFDEF] отладка check-range [THEN] over dup ^)! >r )type 3 >> * + r> execute ; \ : test! cell * + ! ; | create print-funcs ' . , ' . , ' . , 0 , ' d. , ' f. , : )print ( *v -- cfa ) )type type-idx cells print-funcs + @ execute ; : )map ( *v xt -- ) swap dup )size 0 do 2dup i )@ swap execute loop 2drop ; : map ( *v -- ) ( word-to-map ) ' swap dup )size 0 do 2dup i )@ swap execute loop 2drop ; : )initperm ( v( -- ) dup )size 0 do dup i swap over )! loop drop ; : ). ( *vector -- ) dup )size 0 do dup i )@ over )print loop drop ; \ does arbitrary vector contain this element ? : )in? ( *v value -- 1/0 ) swap dup )size 0 do 2dup i )@ = if 2drop True unloop exit then loop 2drop False ; : )find ( *v value -- i True/False ) swap dup )size 0 do 2dup i )@ = if 2drop i True unloop exit then loop 2drop False ; : vector->stack ( *v -- n1 n2 .. n# # ) dup )size 0 do dup i )@ swap loop )size ; \ initialized cell vector \ preserve order : ivector* ( n1 n2 .. n# # -- *vector ) dup vector* swap 1- 0 swap do swap over i )! -1 +loop ; \ reversed order : irvector* ( n1 n2 .. n# # -- *vector ) dup vector* swap 0 do swap over i )! loop ; \ does not take care of duplicate elements | : overlap ( v1( v2( -- n1 .. n2 # / 0 ) depth 2- >r dup )size 0 do 2dup i )@ )in? if dup i )@ -rot then loop 2drop depth r> - ; | : notoverlap ( v1( v2( -- n1 .. n2 # ) depth 2- >r dup )size 0 do 2dup i )@ )in? not if dup i )@ -rot then loop 2drop depth r> - ; : )union ( *v1( *v2( -- *v3( ) over >r notoverlap r> swap >r vector->stack r> + dup 0= abort" empty union!" ivector* ; : )intersection ( *v1( *v2( -- *v3(/0 ) overlap dup 0<> if ivector* then ; \ elementwise comparison of two vectors : )= ( *v1( *v2( -- 1/0 ) dup )size >r over )size r> <> if 2drop 0 exit then dup )size 0 do 2dup i )@ swap i )@ <> if 2drop unloop 0 exit then loop 2drop -1 ; : subset? ( *v( *s( -- 1/0 ) 2dup )intersection dup 0= if -rot 2drop exit then dup >r )= swap drop r> )free ; : )clone ( *v -- *cv ) vector->stack ivector* ; : )erase ( *v -- ) dup )size over )type 3 >> * erase ; : _last ( *v -- *v idx-of-last-element ) dup )size 1- ; clear previous Module;mathgl-8.0.1/include/mgl2/fit.h0000664000175000017500000001661014167366472016025 0ustar balakinbalakin/*************************************************************************** * fit.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_FIT_H_ #define _MGL_FIT_H_ #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif //----------------------------------------------------------------------------- extern int mglFitPnts; ///< Number of output points in fitting extern char mglFitRes[1024]; ///< Last fitted formula /// Fit data along x-direction for each data row. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_1(HMGL gr, HCDT y, const char *eq, const char *vars, HMDT ini, const char *opt); uintptr_t MGL_EXPORT mgl_fit_1_(uintptr_t* gr, uintptr_t* y, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); /// Fit data along x-, y-directions for each data slice. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_2(HMGL gr, HCDT z, const char *eq, const char *vars, HMDT ini, const char *opt); uintptr_t MGL_EXPORT mgl_fit_2_(uintptr_t* gr, uintptr_t* z, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); /// Fit data along along all directions. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_3(HMGL gr, HCDT a, const char *eq, const char *vars, HMDT ini, const char *opt); uintptr_t MGL_EXPORT mgl_fit_3_(uintptr_t* gr, uintptr_t* a, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); /// Fit data along x-direction for each data row. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_xy(HMGL gr, HCDT x, HCDT y, const char *eq, const char *vars, HMDT ini, const char *opt); uintptr_t MGL_EXPORT mgl_fit_xy_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); /// Fit data along x-, y-directions for each data slice. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *eq, const char *vars, HMDT ini, const char *opt); uintptr_t MGL_EXPORT mgl_fit_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); /// Fit data along along all directions. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_xyza(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *eq, const char *vars, HMDT ini, const char *opt); uintptr_t MGL_EXPORT mgl_fit_xyza_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); /// Fit data with dispersion s along x-direction for each data row. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_ys(HMGL gr, HCDT y, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt); uintptr_t MGL_EXPORT mgl_fit_ys_(uintptr_t* gr, uintptr_t* y, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); HMDT MGL_EXPORT mgl_fit_xys(HMGL gr, HCDT x, HCDT y, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt); uintptr_t MGL_EXPORT mgl_fit_xys_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); /// Fit data with dispersion s along x-, y-directions for each data slice. Return array with values for found formula. HMDT MGL_EXPORT mgl_fit_xyzs(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt); uintptr_t MGL_EXPORT mgl_fit_xyzs_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); HMDT MGL_EXPORT mgl_fit_xyzas(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, HCDT s, const char *eq, const char *vars, HMDT ini, const char *opt); uintptr_t MGL_EXPORT mgl_fit_xyzas_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, uintptr_t* ss, const char *eq, const char *vars, uintptr_t *ini, const char *opt,int, int l, int n); /// Get last fitted formula MGL_EXPORT_CONST const char *mgl_get_fit(HMGL gr); int MGL_EXPORT mgl_get_fit_(uintptr_t *gr, char *out, int len); /// Make histogram (distribution) of data. This function do not plot data. /** Option "value" sets the size of output array (default is mglFitPnts=100). */ HMDT MGL_EXPORT mgl_hist_x(HMGL gr, HCDT x, HCDT a, const char *opt); uintptr_t MGL_EXPORT mgl_hist_x_(uintptr_t* gr, uintptr_t* x, uintptr_t* a, const char *opt,int); /// Make histogram (distribution) of data. This function do not plot data. /** Option "value" sets the size of output array (default is mglFitPnts=100). */ HMDT MGL_EXPORT mgl_hist_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *opt); uintptr_t MGL_EXPORT mgl_hist_xy_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* a, const char *opt,int); /// Make histogram (distribution) of data. This function do not plot data. /** Option "value" sets the size of output array (default is mglFitPnts=100). */ HMDT MGL_EXPORT mgl_hist_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *opt); uintptr_t MGL_EXPORT mgl_hist_xyz_(uintptr_t* gr, uintptr_t* x, uintptr_t* y, uintptr_t* z, uintptr_t* a, const char *opt,int); /// Print fitted last formula (with coefficients) void MGL_EXPORT mgl_puts_fit(HMGL gr, double x, double y, double z, const char *prefix, const char *font, double size); void MGL_EXPORT mgl_puts_fit_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, const char *prefix, const char *font, mreal *size, int l, int n); /// Get chi for last fitted formula mreal MGL_EXPORT_PURE mgl_get_fit_chi(); mreal MGL_EXPORT_PURE mgl_get_fit_chi_(); /// Get covariance matrix for last fitted formula HCDT MGL_EXPORT_CONST mgl_get_fit_covar(); uintptr_t MGL_EXPORT_CONST mgl_get_fit_covar_(); //----------------------------------------------------------------------------- #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/evalc.h0000664000175000017500000000614514167366472016337 0ustar balakinbalakin/*************************************************************************** * evalc.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_EVALC_H_ #define _MGL_EVALC_H_ //----------------------------------------------------------------------------- #include "mgl2/eval.h" class mglDataC; //----------------------------------------------------------------------------- /// Class for evaluating formula specified by the string class MGL_EXPORT mglFormulaC // ������ ��� ����� � ���������� ������ { public: /// Evaluates the formula for 'x','r'=\a x, 'y','n'=\a y, 'z','t'=\a z, 'u'=\a u dual Calc(dual x,dual y=0,dual z=0,dual u=0) const MGL_FUNC_PURE; /// Evaluates the formula for 'x, y, z, u, v, w' dual Calc(dual x,dual y,dual z,dual u,dual v,dual w) const MGL_FUNC_PURE; /// Evaluates the formula for variables var dual Calc(const dual var[MGL_VS]) const MGL_FUNC_PURE; /// Return error code inline int GetError() const { return Error; } /// Parse the formula str and create formula-tree mglFormulaC(const char *str); /// Set data for the spline interpolation mglFormulaC(HCDT d, mreal x1=0, mreal x2=1, mreal y1=0, mreal y2=1, mreal z1=0, mreal z2=1) : dat(d),dx1(x1),dx2(x2),dy1(y1),dy2(y2),dz1(z1),dz2(z2),tmp(NULL) {}; /// Clean up formula-tree virtual ~mglFormulaC(); protected: dual CalcIn(const dual *a1) const MGL_FUNC_PURE; mglFormulaC *Left,*Right; // first and second argument of the function int Kod; // the function ID dual Res; // the number or the variable ID HCDT dat; // data file for the interpolation mreal dx1,dx2,dy1,dy2,dz1,dz2; // ranges of data files static int Error; private: mglDataC *tmp; }; //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/parser.h0000664000175000017500000002473314167366472016544 0ustar balakinbalakin/*************************************************************************** * parser.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_PARSER_H_ #define _MGL_PARSER_H_ #ifdef __cplusplus #include "mgl2/mgl.h" #if MGL_HAVE_LTDL #include #endif //----------------------------------------------------------------------------- /// Structure for the command argument. struct mglArg { int type; ///< Type of argument {0-data,1-string,2-number} mglDataA *d; ///< Pointer to data (used if type==0) mglString s; ///< String with parameters mreal v; ///< Numerical value (used if type==2) dual c; ///< Numerical complex value (used if type==2) mglArg():type(-1),d(0),v(0),c(0.) {} }; //----------------------------------------------------------------------------- /// Structure for MGL command struct mglCommand { const char *name; ///< Name of command const char *desc; ///< Short command description (can be NULL) const char *form; ///< Format of command arguments (can be NULL) /// Function for executing (plotting) int (*exec)(mglGraph *gr, long n, mglArg *a, const char *k, const char *opt); /// Type of command: 0 - special plot, 1 - other plot, /// 2 - setup, 3 - data handle, 4 - data create, 5 - subplot, 6 - program /// 7 - 1d plot, 8 - 2d plot, 9 - 3d plot, 10 - dd plot, 11 - vector plot /// 12 - axis, 13 - primitives, 14 - axis setup, 15 - text/legend, 16 - data transform int type; }; extern mglCommand mgls_prg_cmd[], mgls_dat_cmd[], mgls_grf_cmd[], mgls_set_cmd[], mgls_prm_cmd[], mgls_rnd_cmd[]; //----------------------------------------------------------------------------- /// Structure for function name and position. struct mglFunc { long pos; int narg; mglString func; mglFunc(long p, const wchar_t *f); mglFunc(const mglFunc &f):pos(f.pos),narg(f.narg),func(f.func) {} mglFunc():pos(-1),narg(-1) {} const mglFunc &operator=(const mglFunc &f) { pos=f.pos; narg=f.narg; func=f.func; return f; } }; //----------------------------------------------------------------------------- /// Structure for stack of functions and its arguments. struct mglFnStack { long pos; ///< position to return size_t stk; ///< stack at 'call' mglString par[10]; ///< input parameters mglFnStack():pos(0),stk(0) {} }; //----------------------------------------------------------------------------- /// Structure for stack of if|for|while. #define MGL_ST_TRUE 0 // condition true #define MGL_ST_FALSE 1 // condition false #define MGL_ST_DONE 2 // condition done #define MGL_ST_LOOP 4 // normal loop #define MGL_ST_BREAK 8 // loop break #define MGL_ST_STOP (MGL_ST_FALSE|MGL_ST_DONE|MGL_ST_BREAK) #define MGL_ST_SKIP (MGL_ST_FALSE|MGL_ST_DONE) struct mglPosStack { int pos; ///< position to return mglData v; ///< data to iterate long ind; ///< index in data array int par; ///< for-parameter unsigned state; ///< state of stack item mglPosStack(int st=MGL_ST_LOOP):pos(-1),ind(0),par(-1),state(st) {} }; //----------------------------------------------------------------------------- /// Function for asking question in console mode void MGL_EXPORT mgl_ask_gets(const wchar_t *quest, wchar_t *res); //----------------------------------------------------------------------------- /// Structure for the command argument (see mglGraph::Exec()). class mglParser { friend void mgl_export(wchar_t *out, const wchar_t *in, int type); public: #if MGL_HAVE_LTDL std::vector DllOpened; ///< Opened external DLL (keep ) #endif std::vector DataList; ///< List with data and its names std::vector NumList; ///< List with numbers and its names bool AllowDllCall; ///< Allow calls from external dynamic libraries bool AllowSetSize; ///< Allow using setsize command bool AllowFileIO; ///< Allow reading/saving files volatile bool Stop; ///< Stop command was. Flag prevent further execution mglCommand *Cmd; ///< Table of MGL commands (can be changed by user). It MUST be sorted by 'name'!!! long InUse; ///< Smart pointer (number of users) HMGL curGr; ///< Current grapher int StarObhID; ///< staring object id mglParser(bool setsize=false); virtual ~mglParser(); /// Find the command by the keyword name const mglCommand *FindCommand(const char *name) const MGL_FUNC_PURE; const mglCommand *FindCommand(const wchar_t *name) const MGL_FUNC_PURE; /// Parse and execute the string of MGL script inline int Parse(HMGL gr, const char *str, long pos=0) { mglGraph GR(gr); return Parse(&GR,str,pos); } int Parse(mglGraph *gr, const char *str, long pos=0); /// Parse and execute the unicode string of MGL script inline int Parse(HMGL gr, const wchar_t *str, long pos=0) { mglGraph GR(gr); return Parse(&GR,str,pos); } int Parse(mglGraph *gr, std::wstring str, long pos=0); /// Execute MGL script file fname inline void Execute(HMGL gr, FILE *fp, bool print=false) { mglGraph GR(gr); Execute(&GR,fp,print); } void Execute(mglGraph *gr, FILE *fp, bool print=false); /// Execute MGL script from array of lines inline void Execute(HMGL gr, int num, const wchar_t **text) { mglGraph GR(gr); Execute(&GR,num,text); } void Execute(mglGraph *gr, int num, const wchar_t **text); /// Execute MGL script text with '\n' separated lines inline void Execute(HMGL gr, const wchar_t *text) { mglGraph GR(gr); Execute(&GR,text); } void Execute(mglGraph *gr, const wchar_t *text); /// Execute MGL script text with '\n' separated lines inline void Execute(HMGL gr, const char *text) { mglGraph GR(gr); Execute(&GR,text); } void Execute(mglGraph *gr, const char *text); /// Scan for functions (use NULL for reset) void ScanFunc(const wchar_t *line); /// Check if name is function and return its address (or 0 if no) long IsFunc(const wchar_t *name, int *narg=0); /// Find variable or return 0 if absent mglDataA *FindVar(const char *name) MGL_FUNC_PURE; mglDataA *FindVar(const wchar_t *name) MGL_FUNC_PURE; /// Find variable or create it if absent mglDataA *AddVar(const char *name); mglDataA *AddVar(const wchar_t *name); /// Find number or return 0 if absent mglNum *FindNum(const char *name) MGL_FUNC_PURE; mglNum *FindNum(const wchar_t *name) MGL_FUNC_PURE; /// Find number or create it if absent mglNum *AddNum(const char *name); mglNum *AddNum(const wchar_t *name); /// Add string for parameter $1, ..., $9 void AddParam(int n, const char *str); void AddParam(int n, const wchar_t *str); /// Add new MGL command(s) (last command MUST HAVE name[0]=0 !!!) void AddCommand(const mglCommand *cmd); /// Restore Once flag inline void RestoreOnce() { Once = true; } /// Delete variable by its name void DeleteVar(const char *name); void DeleteVar(const wchar_t *name); /// Delete all data variables void DeleteAll(); /// Delete temporary data arrays inline void DeleteTemp() { for(size_t i=0;itemp) { mglDataA *u=DataList[i]; DataList[i]=0; delete u; } } /// Set variant of argument(s) separated by '?' to be used inline void SetVariant(int var=0) { Variant = var<=0?0:var; } protected: static mglCommand *BaseCmd; ///< Base table of MGL commands. It MUST be sorted by 'name'!!! static void FillBaseCmd(); ///< Fill BaseCmd at initialization stage ///< Test if condition is not-valid (n=1) or false (0) or true (1) int TestCond(long m, const mglArg &a0, mglArg &a1, bool &cond) { int n = 1; if(a0.type==2) { cond = a0.v!=0; n=0; } else if(a0.type==0) { n=0; cond = a0.d->FindAny((m>1 && a1.type==1) ? a1.s.s:"u"); } return n; } private: // long parlen; ///< Length of parameter strings mglString par[40]; ///< Parameter for substituting instead of $1, ..., $9 bool Once; ///< Flag for command which should be executed only once bool Skip; ///< Flag that commands should be skiped (inside 'once' block) std::vector stack; ///< Stack of if|for|while commands std::vector func; ///< function names and position std::vector fn_stack; ///< function calls stack unsigned Variant; ///< Select variant of argument(s) separated by '?' /// Parse command int Exec(mglGraph *gr, const wchar_t *com, long n, mglArg *a, const std::wstring &var, const wchar_t *opt); /// Fill arguments a from strings void FillArg(mglGraph *gr, int n, std::wstring *arg, mglArg *a); /// PreExecute stage -- parse some commands and create variables int PreExec(mglGraph *gr, long n, std::wstring *arg, mglArg *a); /// Execute program-flow control commands int FlowExec(mglGraph *gr, const std::wstring &com, long n, mglArg *a); /// Parse and execute the unicode string of MGL script int ParseDat(mglGraph *gr, std::wstring str, mglData &res); /// Define '$' parameters or start for loop int ParseDef(std::wstring &str); /// Parse $N arguments void PutArg(std::wstring &str, bool def); /// In skip mode bool inline ifskip() { return ( stack.size() && (stack.back().state & MGL_ST_SKIP) ); } bool inline skip() { return (Skip || (stack.size() && (stack.back().state & MGL_ST_STOP) )); } bool CheckForName(const std::wstring &s); // check if name is valid for new data }; //----------------------------------------------------------------------------- #endif #endif mathgl-8.0.1/include/mgl2/wnd.h0000664000175000017500000002045514167366472016035 0ustar balakinbalakin/*************************************************************************** * wnd.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_WND_H_ #define _MGL_WND_H_ #include "mgl2/mgl.h" #include "mgl2/wnd_cf.h" //----------------------------------------------------------------------------- MGL_EXPORT void *mgl_draw_calc(void *p); void MGL_EXPORT mgl_parse_comments(const char *text, double &a1, double &a2, double &da, std::vector &anim, std::string &dlg_ids, std::vector &dlg_par); void MGL_EXPORT mgl_parse_comments(const wchar_t *text, double &a1, double &a2, double &da, std::vector &anim, std::string &dlg_ids, std::vector &dlg_par); void MGL_EXPORT mgl_parse_animation(const char *text, std::vector &anim); void MGL_EXPORT mgl_parse_animation(const wchar_t *text, std::vector &anim); //----------------------------------------------------------------------------- /// Class for drawing in windows (like, mglCanvasFL, mglCanvasQT and so on) /// Make inherited class and redefine Draw() function if you don't want to use function pointers. class MGL_EXPORT mglDraw { public: virtual int Draw(mglGraph *)=0; ///< Function for drawing virtual void Reload(){} ///< Function for reloading data virtual void Param(char id, const char *val){} ///< Function for setting parameter virtual void Click() {} ///< Callback function on mouse click #if MGL_HAVE_PTHR_WIDGET mglDraw() { running=false; pthread_mutex_init(&mutex,NULL); thr=0; } virtual ~mglDraw() { pthread_mutex_destroy(&mutex); } virtual void Calc() {} ///< Function for calculations inline void Run() ///< Run/resume calculation in other thread { if(!running) { pthread_mutex_trylock(&mutex); pthread_mutex_unlock(&mutex); pthread_create(&thr,0,mgl_draw_calc,this); pthread_detach(thr); running = true; } } inline void Cancel() ///< Cancel thread with calculations { pthread_cancel(thr); running = false; } inline void Pause() ///< Pause calculation { pthread_mutex_lock(&mutex); } inline void Continue() ///< Continue calculation { pthread_mutex_trylock(&mutex); pthread_mutex_unlock(&mutex); } inline void Check() ///< Check if calculation can be continued (should be called inside Calc() ) { pthread_mutex_lock(&mutex); pthread_mutex_unlock(&mutex); } //protected: pthread_t thr; bool running; pthread_mutex_t mutex; #else mglDraw() {} virtual ~mglDraw() {} #endif }; //----------------------------------------------------------------------------- extern "C" { int MGL_EXPORT mgl_draw_graph(HMGL gr, void *p); // NOTE: MGL_EXPORT mgl_draw_class() and MGL_EXPORT mgl_draw_load() use mglWindow* only. Don't use it with inherited classes int MGL_EXPORT mgl_draw_class(HMGL gr, void *p); void MGL_EXPORT mgl_click_class(void *p); void MGL_EXPORT mgl_reload_class(void *p); void MGL_EXPORT mgl_prop_class(char id, const char *val, void *p); void MGL_EXPORT mgl_prop_func(char id, const char *val, void *p); extern MGL_EXPORT const char *mgl_hints[]; } //----------------------------------------------------------------------------- /// Abstract class for windows displaying graphics class MGL_EXPORT mglWnd : public mglGraph { mglWnd(const mglWnd &) {} // copying is not allowed const mglWnd &operator=(const mglWnd &t) { return t; } public: mglWnd() : mglGraph(-1) {} virtual ~mglWnd() { mgl_use_graph(gr,-255); } virtual int Run()=0; ///< Run main loop for event handling inline void *Window() ///< Return pointer to widget (Fl_Window* or QMainWindow*) used for plotting { return mgl_wnd_window(gr); } inline void *Widget() ///< Return pointer to widget (Fl_MGLView* or QMathGL*) used for plotting { return mgl_wnd_widget(gr); } inline void WndSize(int w, int h) ///< Resize window { mgl_wnd_size(gr,w,h); } inline void WndMove(int x, int y) ///< Move window { mgl_wnd_move(gr,x,y); } inline void ToggleAlpha() ///< Switch on/off transparency (do not overwrite user settings) { mgl_wnd_toggle_alpha(gr); } inline void ToggleLight() ///< Switch on/off lighting (do not overwrite user settings) { mgl_wnd_toggle_light(gr); } inline void ToggleZoom() ///< Switch on/off zooming by mouse { mgl_wnd_toggle_zoom(gr); } inline void ToggleRotate() ///< Switch on/off rotation by mouse { mgl_wnd_toggle_rotate(gr); } inline void ToggleNo() ///< Switch off all zooming and rotation { mgl_wnd_toggle_no(gr); } inline void Update() ///< Update picture by calling user drawing function { mgl_wnd_update(gr); } inline void ReLoad() ///< Reload user data and update picture { mgl_wnd_reload(gr); } inline void Adjust() ///< Adjust size of bitmap to window size { mgl_wnd_adjust(gr); } inline void NextFrame() ///< Show next frame (if one) { mgl_wnd_next_frame(gr); } inline void PrevFrame() ///< Show previous frame (if one) { mgl_wnd_prev_frame(gr); } inline void Animation() ///< Run slideshow (animation) of frames { mgl_wnd_animation(gr); } inline void SetClickFunc(void (*func)(void *p)) ///< Callback function for mouse click { mgl_set_click_func(gr,func); } /// Set callback function for properties setup void SetPropFunc(void (*prop)(char id, const char *val, void *p), void *par=NULL) { mgl_wnd_set_prop(gr,prop,par); } /// Make custom dialog for parameters ids of element properties defined by args inline void MakeDialog(const char *ids, char const * const *args, const char *title) { mgl_wnd_make_dialog(gr, ids, args, title); } inline void MakeDialog(const std::string &ids, const std::vector &args, const char *title="") { if(args.size()>0) { std::vector buf; buf.reserve(args.size()); for(size_t i=0;imutex)); #endif mgl_set_click_func(gr, mgl_click_class); } #if MGL_HAVE_PTHR_WIDGET /// Mutex for lock/unlock by widget inline void SetMutex(pthread_mutex_t *mutex) { mgl_wnd_set_mutex(gr, mutex); } #endif inline void SetDelay(double dt) ///< Set delay for animation in seconds { mgl_wnd_set_delay(gr, dt); } inline double GetDelay() ///< Get delay for animation in seconds { return mgl_wnd_get_delay(gr); } inline void Setup(bool clf_upd=true, bool showpos=false) { mgl_setup_window(gr, clf_upd, showpos); } inline mglPoint LastMousePos() ///< Last mouse position { mreal x,y,z; mgl_get_last_mouse_pos(gr,&x,&y,&z); return mglPoint(x,y,z); } }; //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/canvas_cf.h0000664000175000017500000012071114167366472017164 0ustar balakinbalakin/*************************************************************************** * canvas_cf.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MGL_CANVAS_CF_H #define MGL_CANVAS_CF_H #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /// Create HMGL object with specified sizes HMGL MGL_EXPORT mgl_create_graph(int width, int height); uintptr_t MGL_EXPORT mgl_create_graph_(int *width, int *height); /// Delete HMGL object void MGL_EXPORT mgl_delete_graph(HMGL gr); void MGL_EXPORT mgl_delete_graph_(uintptr_t *gr); /// Return pointer to built-in (default) HMGL object HMGL MGL_EXPORT mgl_default_graph(); uintptr_t MGL_EXPORT mgl_default_graph_(); /// Set size of frame in pixels. Normally this function is called internally. void MGL_EXPORT mgl_set_size(HMGL gr, int width, int height); void MGL_EXPORT mgl_set_size_(uintptr_t *gr, int *width, int *height); /// Set size of frame in pixels, but don't erase primitives void MGL_EXPORT mgl_scale_size(HMGL gr, int width, int height); void MGL_EXPORT mgl_scale_size_(uintptr_t *gr, int *width, int *height); /// Scaling for all further set size calls. void MGL_EXPORT mgl_set_size_scl(double scl); void MGL_EXPORT mgl_set_size_scl_(double *scl); /// Set default parameters for plotting void MGL_EXPORT mgl_set_def_param(HMGL gr); void MGL_EXPORT mgl_set_def_param_(uintptr_t *gr); /// Combine plots from 2 canvases. Result will be saved into gr void MGL_EXPORT mgl_combine_gr(HMGL gr, HMGL gr2); void MGL_EXPORT mgl_combine_gr_(uintptr_t *gr, uintptr_t *gr2); /// Force preparing the image. It can be useful for OpenGL mode mostly. void MGL_EXPORT mgl_finish(HMGL gr); void MGL_EXPORT mgl_finish_(uintptr_t *gr); /// Force preparing the image and save result into background one. void MGL_EXPORT mgl_rasterize(HMGL gr); void MGL_EXPORT mgl_rasterize_(uintptr_t *gr); /// Set boundary box for export graphics into 2D file formats. /** If x2<0 (y2<0) then full width (height) will be used. * If x1<0 or y1<0 or x1>=x2|Width or y1>=y2|Height then cropping will be disabled. */ void MGL_EXPORT mgl_set_bbox(HMGL gr, int x1, int y1, int x2, int y2); void MGL_EXPORT mgl_set_bbox_(uintptr_t *gr, int *x1, int *y1, int *x2, int *y2); /// Set the size of semi-transparent area around lines, marks, glyphs, ... Default is 1. void MGL_EXPORT mgl_pen_delta(HMGL gr, double d); void MGL_EXPORT mgl_pen_delta_(uintptr_t *gr, double *d); /// Set tick length void MGL_EXPORT mgl_set_tick_len(HMGL gr, double len, double stt); void MGL_EXPORT mgl_set_tick_len_(uintptr_t *gr, mreal *len, mreal *stt); /// Set axis and ticks style void MGL_EXPORT mgl_set_axis_stl(HMGL gr, const char *stl, const char *tck, const char *sub); void MGL_EXPORT mgl_set_axis_stl_(uintptr_t *gr, const char *stl, const char *tck, const char *sub, int,int,int); /// Auto adjust ticks void MGL_EXPORT mgl_adjust_ticks(HMGL gr, const char *dir); void MGL_EXPORT mgl_adjust_ticks_(uintptr_t *gr, const char *dir, int); /// Auto adjust ticks and set ticks format ("+E0123456789-fF") void MGL_EXPORT mgl_adjust_ticks_ext(HMGL gr, const char *dir, const char *stl); void MGL_EXPORT mgl_adjust_ticks_ext_(uintptr_t *gr, const char *dir, const char *stl, int, int); /// Set the ticks parameters void MGL_EXPORT mgl_set_ticks(HMGL gr, char dir, double d, int ns, double org); void MGL_EXPORT mgl_set_ticks_(uintptr_t *gr, char *dir, mreal *d, int *ns, mreal *org, int); /// Set the ticks parameters and specify ticks factor string void MGL_EXPORT mgl_set_ticks_fact(HMGL gr, char dir, double d, int ns, double org, const char *fact); void MGL_EXPORT mgl_set_ticks_factw(HMGL gr, char dir, double d, int ns, double org, const wchar_t *fact); void MGL_EXPORT mgl_set_ticks_fact_(uintptr_t *gr, char *dir, double *d, int *ns, double *org, const char *fact,int,int); /// Set manual ticks text (\n separated). Use "" to disable this feature. void MGL_EXPORT mgl_set_ticks_str(HMGL gr, char dir, const char *lbl, int add); void MGL_EXPORT mgl_set_ticks_str_(uintptr_t *gr, const char *dir, const char *lbl, int *add,int,int); void MGL_EXPORT mgl_set_ticks_wcs(HMGL gr, char dir, const wchar_t *lbl, int add); /// Set manual ticks position and text (\n separated). Use "" to disable this feature. void MGL_EXPORT mgl_set_ticks_val(HMGL gr, char dir, HCDT val, const char *lbl, int add); void MGL_EXPORT mgl_set_ticks_val_(uintptr_t *gr, const char *dir, uintptr_t *val, const char *lbl, int *add,int,int); void MGL_EXPORT mgl_set_ticks_valw(HMGL gr, char dir, HCDT val, const wchar_t *lbl, int add); /// Add manual tick at given position. Use "" to disable this feature. void MGL_EXPORT mgl_add_tick(HMGL gr, char dir, double val, const char *lbl); void MGL_EXPORT mgl_add_tick_(uintptr_t *gr, const char *dir, mreal *val, const char *lbl,int,int); void MGL_EXPORT mgl_add_tickw(HMGL gr, char dir, double val, const wchar_t *lbl); /// Tune ticks (tune|1 for common multiplier, tune|2 for common component) void MGL_EXPORT mgl_tune_ticks(HMGL gr, int tune, double fact_pos); void MGL_EXPORT mgl_tune_ticks_(uintptr_t *gr, int *tune, mreal *fact_pos); /// Set templates for ticks void MGL_EXPORT mgl_set_tick_templ(HMGL gr, char dir, const char *templ); void MGL_EXPORT mgl_set_tick_templ_(uintptr_t *gr, const char *dir, const char *templ,int,int); void MGL_EXPORT mgl_set_tick_templw(HMGL gr, char dir, const wchar_t *templ); /// Set time templates for ticks void MGL_EXPORT mgl_set_ticks_time(HMGL gr, char dir, double d, const char *t); void MGL_EXPORT mgl_set_ticks_time_(uintptr_t *gr, const char *dir, mreal *d, const char *t,int,int); /// Set additional shift of tick labels void MGL_EXPORT mgl_set_tick_shift(HMGL gr, double sx, double sy, double sz, double sc); void MGL_EXPORT mgl_set_tick_shift_(uintptr_t *gr, mreal *sx, mreal *sy, mreal *sz, mreal *sc); /// Draws bounding box outside the plotting volume void MGL_EXPORT mgl_box(HMGL gr); void MGL_EXPORT mgl_box_(uintptr_t *gr); /// Draws bounding box outside the plotting volume with color c /** Style ‘@’ produce filled back faces. */ void MGL_EXPORT mgl_box_str(HMGL gr, const char *col, int ticks); void MGL_EXPORT mgl_box_str_(uintptr_t *gr, const char *col, int *ticks, int); /// Draw axises with ticks in direction(s) dir. /** Parameter \a dir may contain: * ‘xyzt’for drawing axis in corresponding direction; * ‘XYZT’ for drawing axis in corresponding direction but with inverted positions of labels; * ‘~’, ‘_’ for disabling tick labels; * ‘U’ for disabling rotation of tick labels; * ‘^’ for inverting default axis origin; * ‘!’ for disabling ticks tuning; * ‘AKDTVISO’ for drawing arrow at the end of axis; * ‘a’ for forced adjusting of axis ticks; * ‘f’ for printing ticks labels in fixed format; * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; * ‘F’ for printing ticks labels in LaTeX format; * ‘+’ for printing ‘+’ for positive ticks; * ‘-’ for printing usual ‘-’ in ticks labels; * ‘0123456789’ for precision at printing ticks labels. * Option "value" set the manual rotation angle for the ticks.*/ void MGL_EXPORT mgl_axis(HMGL gr, const char *dir, const char *stl, const char *opt); void MGL_EXPORT mgl_axis_(uintptr_t *gr, const char *dir, const char *stl, const char *opt,int,int,int); /// Draw grid lines perpendicular to direction(s) dir. void MGL_EXPORT mgl_axis_grid(HMGL gr, const char *dir,const char *pen, const char *opt); void MGL_EXPORT mgl_axis_grid_(uintptr_t *gr, const char *dir,const char *pen, const char *opt,int,int,int); /// Print the label text for axis dir. /** Option "value" set additional shifting of the label. */ void MGL_EXPORT mgl_label(HMGL gr, char dir, const char *text, double pos, const char *opt); void MGL_EXPORT mgl_label_(uintptr_t *gr, const char *dir, const char *text, mreal *pos, const char *opt,int,int,int); /// Print the label text for axis dir. /** Option "value" set additional shifting of the label. */ void MGL_EXPORT mgl_labelw(HMGL gr, char dir, const wchar_t *text, double pos, const char *opt); /// Draw colorbar at edge of axis /** Parameter \a sch may contain: * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; * ‘I’ for positioning near bounding (by default, at edges of subplot); * ‘A’ for using absolute coordinates; * ‘~’ for disabling tick labels. * ‘!’ for disabling ticks tuning; * ‘f’ for printing ticks labels in fixed format; * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; * ‘F’ for printing ticks labels in LaTeX format; * ‘+’ for printing ‘+’ for positive ticks; * ‘-’ for printing usual ‘-’ in ticks labels; * ‘0123456789’ for precision at printing ticks labels.*/ void MGL_EXPORT mgl_colorbar(HMGL gr, const char *sch, const char *opt); void MGL_EXPORT mgl_colorbar_(uintptr_t *gr, const char *sch, const char *opt,int,int); /// Draw colorbar at manual position /** Parameter \a sch may contain: * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; * ‘I’ for positioning near bounding (by default, at edges of subplot); * ‘A’ for using absolute coordinates; * ‘~’ for disabling tick labels. * ‘!’ for disabling ticks tuning; * ‘f’ for printing ticks labels in fixed format; * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; * ‘F’ for printing ticks labels in LaTeX format; * ‘+’ for printing ‘+’ for positive ticks; * ‘-’ for printing usual ‘-’ in ticks labels; * ‘0123456789’ for precision at printing ticks labels.*/ void MGL_EXPORT mgl_colorbar_ext(HMGL gr, const char *sch, double x, double y, double w, double h, const char *opt); void MGL_EXPORT mgl_colorbar_ext_(uintptr_t *gr, const char *sch, mreal *x, mreal *y, mreal *w, mreal *h, const char *opt, int,int); /// Draw colorbar with manual colors at edge of axis /** Parameter \a sch may contain: * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; * ‘I’ for positioning near bounding (by default, at edges of subplot); * ‘A’ for using absolute coordinates; * ‘~’ for disabling tick labels. * ‘!’ for disabling ticks tuning; * ‘f’ for printing ticks labels in fixed format; * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; * ‘F’ for printing ticks labels in LaTeX format; * ‘+’ for printing ‘+’ for positive ticks; * ‘-’ for printing usual ‘-’ in ticks labels; * ‘0123456789’ for precision at printing ticks labels.*/ void MGL_EXPORT mgl_colorbar_val(HMGL gr, HCDT dat, const char *sch, const char *opt); void MGL_EXPORT mgl_colorbar_val_(uintptr_t *gr, uintptr_t *dat, const char *sch, const char *opt,int,int); /// Draw colorbar with manual colors at manual position /** Parameter \a sch may contain: * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; * ‘I’ for positioning near bounding (by default, at edges of subplot); * ‘A’ for using absolute coordinates; * ‘~’ for disabling tick labels. * ‘!’ for disabling ticks tuning; * ‘f’ for printing ticks labels in fixed format; * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; * ‘F’ for printing ticks labels in LaTeX format; * ‘+’ for printing ‘+’ for positive ticks; * ‘-’ for printing usual ‘-’ in ticks labels; * ‘0123456789’ for precision at printing ticks labels.*/ void MGL_EXPORT mgl_colorbar_val_ext(HMGL gr, HCDT dat, const char *sch,double x, double y, double w, double h, const char *opt); void MGL_EXPORT mgl_colorbar_val_ext_(uintptr_t *gr, uintptr_t *dat, const char *sch, mreal *x, mreal *y, mreal *w, mreal *h, const char *opt, int,int); /// Add string to legend void MGL_EXPORT mgl_add_legend(HMGL gr, const char *text,const char *style); void MGL_EXPORT mgl_add_legend_(uintptr_t *gr, const char *text,const char *style,int,int); void MGL_EXPORT mgl_add_legendw(HMGL gr, const wchar_t *text,const char *style); /// Clear saved legend string void MGL_EXPORT mgl_clear_legend(HMGL gr); void MGL_EXPORT mgl_clear_legend_(uintptr_t *gr); /// Draw legend of accumulated strings at position {x,y} /** Parameter fnt may contain: * font style for legend text; * colors for background (first one), border (second one) and text (last one); * ‘A’ for positioning in absolute coordinates; * ‘^’ for positioning outside of specified point; * ‘-’ for arranging entries horizontally; * ‘#’ for drawing box around legend. * Option value set the space between line samples and text (default is 0.1).*/ void MGL_EXPORT mgl_legend_pos(HMGL gr, double x, double y, const char *font, const char *opt); void MGL_EXPORT mgl_legend_pos_(uintptr_t *gr, mreal *x, mreal *y, const char *font, const char *opt,int,int); /// Draw legend of accumulated strings /** Parameter fnt may contain: * font style for legend text; * colors for background (first one), border (second one) and text (last one); * ‘A’ for positioning in absolute coordinates; * ‘^’ for positioning outside of specified point; * ‘-’ for arranging entries horizontally; * ‘#’ for drawing box around legend. * Option value set the space between line samples and text (default is 0.1). * Parameter \a where sets position: 0 at bottom-left, 1 at bottom-right, 2 at top-left, 3 at top-right (default).*/ void MGL_EXPORT mgl_legend(HMGL gr, int where, const char *font, const char *opt); void MGL_EXPORT mgl_legend_(uintptr_t *gr, int *where, const char *font, const char *opt,int,int); /// Set number of marks in legend sample void MGL_EXPORT mgl_set_legend_marks(HMGL gr, int num); void MGL_EXPORT mgl_set_legend_marks_(uintptr_t *gr, int *num); /// Show current image void MGL_EXPORT mgl_show_image(HMGL gr, const char *viewer, int keep); void MGL_EXPORT mgl_show_image_(uintptr_t *gr, const char *viewer, int *keep, int); /// Write the frame in file (depending extension, write current frame if fname is empty) void MGL_EXPORT mgl_write_frame(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_frame_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Write the frame in file using BMP format void MGL_EXPORT mgl_write_tga(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_tga_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Write the frame in file using BMP format void MGL_EXPORT mgl_write_bmp(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_bmp_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Write the frame in file using JPEG format void MGL_EXPORT mgl_write_jpg(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_jpg_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Write the frame in file using PNG format with transparency void MGL_EXPORT mgl_write_png(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_png_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Write the frame in file using PNG format without transparency void MGL_EXPORT mgl_write_png_solid(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_png_solid_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Write the frame in file using PostScript format as bitmap void MGL_EXPORT mgl_write_bps(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_bps_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Write the frame in file using PostScript format void MGL_EXPORT mgl_write_eps(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_eps_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Write the frame in file using SVG format void MGL_EXPORT mgl_write_svg(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_svg_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Write the frame in file using LaTeX format void MGL_EXPORT mgl_write_tex(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_tex_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Write the frame in file using OBJ format void MGL_EXPORT mgl_write_obj(HMGL gr, const char *fname,const char *descr, int use_png); void MGL_EXPORT mgl_write_obj_(uintptr_t *gr, const char *fname,const char *descr, int *use_png,int,int); /// Write the frame in file using OBJ format (old version) void MGL_EXPORT mgl_write_obj_old(HMGL gr, const char *fname,const char *descr, int use_png); void MGL_EXPORT mgl_write_obj_old_(uintptr_t *gr, const char *fname,const char *descr, int *use_png,int,int); /// Write the frame in file using STL format (faces only) void MGL_EXPORT mgl_write_stl(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_stl_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Write the frame in file using OFF format void MGL_EXPORT mgl_write_off(HMGL gr, const char *fname,const char *descr, int colored); void MGL_EXPORT mgl_write_off_(uintptr_t *gr, const char *fname,const char *descr,int *colored,int,int); /// Write the frame in file using XYZ format void MGL_EXPORT mgl_write_xyz(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_xyz_(uintptr_t *gr, const char *fname,const char *descr,int,int); /*void MGL_EXPORT mgl_write_x3d(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_x3d_(uintptr_t *gr, const char *fname,const char *descr,int,int); void MGL_EXPORT mgl_write_wgl(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_wgl_(uintptr_t *gr, const char *fname,const char *descr,int,int);*/ /// Write the frame in file using PRC format void MGL_EXPORT mgl_write_prc(HMGL gr, const char *fname,const char *descr, int make_pdf); void MGL_EXPORT mgl_write_prc_(uintptr_t *gr, const char *fname,const char *descr, int *make_pdf,int,int); /// Write the frame in file using GIF format (only for current frame!) void MGL_EXPORT mgl_write_gif(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_gif_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Start write frames to cinema using GIF format void MGL_EXPORT mgl_start_gif(HMGL gr, const char *fname,int ms); void MGL_EXPORT mgl_start_gif_(uintptr_t *gr, const char *fname,int *ms,int); /// Stop writing cinema using GIF format void MGL_EXPORT mgl_close_gif(HMGL gr); void MGL_EXPORT mgl_close_gif_(uintptr_t *gr); /// Export points and primitives in file using MGLD format void MGL_EXPORT mgl_export_mgld(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_export_mgld_(uintptr_t *gr, const char *fname,const char *descr,int,int); /// Import points and primitives from file using MGLD format void MGL_EXPORT mgl_import_mgld(HMGL gr, const char *fname, int add); void MGL_EXPORT mgl_import_mgld_(uintptr_t *gr, const char *fname, int *add, int); /// Export in JSON format suitable for later drawing by JavaScript void MGL_EXPORT mgl_write_json(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_json_(uintptr_t *gr, const char *fname,const char *descr,int,int); void MGL_EXPORT mgl_write_json_z(HMGL gr, const char *fname,const char *descr); void MGL_EXPORT mgl_write_json_z_(uintptr_t *gr, const char *fname,const char *descr,int,int); MGL_EXPORT const char *mgl_get_json(HMGL gr); /// Get RGB values of current bitmap /** Position of element {i,j} is [3*i + 3*Width*j]. */ MGL_EXPORT const unsigned char *mgl_get_rgb(HMGL gr); MGL_EXPORT const unsigned char *mgl_get_rgb_(uintptr_t *gr); /// Get RGBA values of current bitmap /** Position of element {i,j} is [4*i + 4*Width*j]. */ MGL_EXPORT const unsigned char *mgl_get_rgba(HMGL gr); MGL_EXPORT const unsigned char *mgl_get_rgba_(uintptr_t *gr); /// Get RGBA values of background image /** Position of element {i,j} is [4*i + 4*Width*j]. */ MGL_EXPORT_PURE const unsigned char *mgl_get_background(HMGL gr); MGL_EXPORT_PURE const unsigned char *mgl_get_background_(uintptr_t *gr); /// Set object/subplot id void MGL_EXPORT mgl_set_obj_id(HMGL gr, int id); void MGL_EXPORT mgl_set_obj_id_(uintptr_t *gr, int *id); /// Get object id int MGL_EXPORT_PURE mgl_get_obj_id(HMGL gr, int x, int y); int MGL_EXPORT_PURE mgl_get_obj_id_(uintptr_t *gr, int *x, int *y); /// Get subplot id int MGL_EXPORT_PURE mgl_get_spl_id(HMGL gr, int x, int y); int MGL_EXPORT_PURE mgl_get_spl_id_(uintptr_t *gr, int *x, int *y); /// Get width of the image int MGL_EXPORT mgl_get_width(HMGL gr); int MGL_EXPORT mgl_get_width_(uintptr_t *gr); /// Get height of the image int MGL_EXPORT mgl_get_height(HMGL gr); int MGL_EXPORT mgl_get_height_(uintptr_t *gr); /// Calculate 3D coordinate {x,y,z} for screen point {xs,ys} void MGL_EXPORT mgl_calc_xyz(HMGL gr, int xs, int ys, mreal *x, mreal *y, mreal *z); void MGL_EXPORT mgl_calc_xyz_(uintptr_t *gr, int *xs, int *ys, mreal *x, mreal *y, mreal *z); /// Calculate screen point {xs,ys} for 3D coordinate {x,y,z} void MGL_EXPORT mgl_calc_scr(HMGL gr, double x, double y, double z, int *xs, int *ys); void MGL_EXPORT mgl_calc_scr_(uintptr_t *gr, mreal *x, mreal *y, mreal *z, int *xs, int *ys); /// Check if {xs,ys} is close to active point with accuracy d, and return its position or -1 long MGL_EXPORT_PURE mgl_is_active(HMGL gr, int xs, int ys, int d); long MGL_EXPORT_PURE mgl_is_active_(uintptr_t *gr, int *xs, int *ys, int *d); /// Create new frame. int MGL_EXPORT mgl_new_frame(HMGL gr); int MGL_EXPORT mgl_new_frame_(uintptr_t *gr); /// Finish frame drawing void MGL_EXPORT mgl_end_frame(HMGL gr); void MGL_EXPORT mgl_end_frame_(uintptr_t *gr); /// Get the number of created frames int MGL_EXPORT_PURE mgl_get_num_frame(HMGL gr); int MGL_EXPORT_PURE mgl_get_num_frame_(uintptr_t *gr); /// Reset frames counter (start it from zero) void MGL_EXPORT mgl_reset_frames(HMGL gr); void MGL_EXPORT mgl_reset_frames_(uintptr_t *gr); /// Get drawing data for i-th frame (work if MGL_VECT_FRAME is set on) void MGL_EXPORT mgl_get_frame(HMGL gr, int i); void MGL_EXPORT mgl_get_frame_(uintptr_t *gr, int *i); /// Set drawing data for i-th frame (work if MGL_VECT_FRAME is set on) void MGL_EXPORT mgl_set_frame(HMGL gr, int i); void MGL_EXPORT mgl_set_frame_(uintptr_t *gr, int *i); /// Append drawing data from i-th frame (work if MGL_VECT_FRAME is set on) void MGL_EXPORT mgl_show_frame(HMGL gr, int i); void MGL_EXPORT mgl_show_frame_(uintptr_t *gr, int *i); /// Delete primitives for i-th frame (work if MGL_VECT_FRAME is set on) void MGL_EXPORT mgl_del_frame(HMGL gr, int i); void MGL_EXPORT mgl_del_frame_(uintptr_t *gr, int *i); /// Clear list of primitives for current drawing void MGL_EXPORT mgl_clear_frame(HMGL gr); void MGL_EXPORT mgl_clear_frame_(uintptr_t *gr); /// Set the transparency type (0 - usual, 1 - glass, 2 - lamp) void MGL_EXPORT mgl_set_transp_type(HMGL gr, int kind); void MGL_EXPORT mgl_set_transp_type_(uintptr_t *gr, int *kind); /// Set the transparency on/off. void MGL_EXPORT mgl_set_alpha(HMGL gr, int enable); void MGL_EXPORT mgl_set_alpha_(uintptr_t *gr, int *enable); /// Set the gray-scale mode on/off. void MGL_EXPORT mgl_set_gray(HMGL gr, int enable); void MGL_EXPORT mgl_set_gray_(uintptr_t *gr, int *enable); /// Set the fog distance or switch it off (if d=0). void MGL_EXPORT mgl_set_fog(HMGL gr, double d, double dz); void MGL_EXPORT mgl_set_fog_(uintptr_t *gr, mreal *dist, mreal *dz); /// Set the using of light on/off. void MGL_EXPORT mgl_set_light(HMGL gr, int enable); void MGL_EXPORT mgl_set_light_(uintptr_t *gr, int *enable); /// Switch on/off the specified light source. void MGL_EXPORT mgl_set_light_n(HMGL gr, int n, int enable); void MGL_EXPORT mgl_set_light_n_(uintptr_t *gr, int *n, int *enable); /// Set to attach light settings to inplot. void MGL_EXPORT mgl_set_attach_light(HMGL gr, int enable); void MGL_EXPORT mgl_set_attach_light_(uintptr_t *gr, int *enable); /// Add white light source at infinity. void MGL_EXPORT mgl_add_light(HMGL gr, int n, double x, double y, double z); void MGL_EXPORT mgl_add_light_(uintptr_t *gr, int *n, mreal *x, mreal *y, mreal *z); /// Add light source at infinity (more settings). void MGL_EXPORT mgl_add_light_ext(HMGL gr, int n, double x, double y, double z, char c, double br, double ap); void MGL_EXPORT mgl_add_light_ext_(uintptr_t *gr, int *n, mreal *x, mreal *y, mreal *z, char *c, mreal *br, mreal *ap, int); /// Add local light source. void MGL_EXPORT mgl_add_light_loc(HMGL gr, int n, double x, double y, double z, double dx, double dy, double dz, char c, double br, double ap); void MGL_EXPORT mgl_add_light_loc_(uintptr_t *gr, int *n, mreal *x, mreal *y, mreal *z, mreal *dx, mreal *dy, mreal *dz, char *c, mreal *br, mreal *ap, int); /// Pop transformation matrix from stack void MGL_EXPORT mgl_mat_pop(HMGL gr); void MGL_EXPORT mgl_mat_pop_(uintptr_t *gr); /// Push transformation matrix into stack void MGL_EXPORT mgl_mat_push(HMGL gr); void MGL_EXPORT mgl_mat_push_(uintptr_t *gr); /// Clear up the frame void MGL_EXPORT mgl_clf(HMGL gr); void MGL_EXPORT mgl_clf_(uintptr_t *gr); /// Clear up the frame but keep fog settings void MGL_EXPORT mgl_clf_nfog(HMGL gr); void MGL_EXPORT mgl_clf_nfog_(uintptr_t *gr); /// Clear up the frame and fill background by specified color void MGL_EXPORT mgl_clf_rgb(HMGL gr, double r, double g, double b); void MGL_EXPORT mgl_clf_rgba(HMGL gr, double r, double g, double b, double a); void MGL_EXPORT mgl_clf_rgb_(uintptr_t *gr, mreal *r, mreal *g, mreal *b); void MGL_EXPORT mgl_clf_rgba_(uintptr_t *gr, mreal *r, mreal *g, mreal *b, mreal *a); /// Clear up the frame and fill background by specified color void MGL_EXPORT mgl_clf_chr(HMGL gr, char col); void MGL_EXPORT mgl_clf_chr_(uintptr_t *gr, const char *col, int); /// Clear up the frame and fill background by specified color with manual transparency void MGL_EXPORT mgl_clf_str(HMGL gr, const char *col); void MGL_EXPORT mgl_clf_str_(uintptr_t *gr, const char *col, int); /// Load background image void MGL_EXPORT mgl_load_background(HMGL gr, const char *fname, double alpha); void MGL_EXPORT mgl_load_background_(uintptr_t *gr, const char *fname, mreal *alpha, int); /// Load background image /** Parameter 'how' can be: * 'a' for filling current subplot only; * 's' for scaling (resizing) image to whole area; * 'c' for centering image; * 'm' for tessellate image as mosaic. */ void MGL_EXPORT mgl_load_background_ext(HMGL gr, const char *fname, const char *how, double alpha); void MGL_EXPORT mgl_load_background_ext_(uintptr_t *gr, const char *fname, const char *how, mreal *alpha, int,int); /// Fill background by specified color. Colors r,g,b should be in range [0,1]. void MGL_EXPORT mgl_fill_background(HMGL gr, double r, double g, double b, double a); void MGL_EXPORT mgl_fill_background_(uintptr_t *gr, double *r, double *g, double *b, double *a); /// Put further plotting in m-th cell of nx*ny grid of the image. /** String \a style may contain: * '<' for reserving space at left * '>' for reserving space at right * '^' for reserving space at top * '_' for reserving space at bottom * '#' for using whole region. */ void MGL_EXPORT mgl_subplot(HMGL gr, int nx,int ny,int m,const char *style); void MGL_EXPORT mgl_subplot_(uintptr_t *gr, int *nx,int *ny,int *m, const char *s,int); /// Put further plotting in m-th cell of nx*ny grid of the image and shift it by distance {dx,dy}. /** String \a style may contain: * '<' for reserving space at left * '>' for reserving space at right * '^' for reserving space at top * '_' for reserving space at bottom * '#' for using whole region. */ void MGL_EXPORT mgl_subplot_d(HMGL gr, int nx,int ny,int m,const char *style, double dx, double dy); void MGL_EXPORT mgl_subplot_d_(uintptr_t *gr, int *nx,int *ny,int *m,const char *style, mreal *dx, mreal *dy,int l); /// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image. /** String \a style may contain: * '<' for reserving space at left * '>' for reserving space at right * '^' for reserving space at top * '_' for reserving space at bottom * '#' for using whole region. */ void MGL_EXPORT mgl_multiplot(HMGL gr, int nx,int ny,int m,int dx,int dy,const char *style); void MGL_EXPORT mgl_multiplot_(uintptr_t *gr, int *nx,int *ny,int *m,int *dx,int *dy, const char *s,int); /// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image and shift it by distance {sx,sy}.. /** String \a style may contain: * '<' for reserving space at left * '>' for reserving space at right * '^' for reserving space at top * '_' for reserving space at bottom * '#' for using whole region. */ void MGL_EXPORT mgl_multiplot_d(HMGL gr, int nx,int ny,int m,int dx,int dy,const char *style,double sx,double sy); void MGL_EXPORT mgl_multiplot_d_(uintptr_t *gr, int *nx,int *ny,int *m,int *dx,int *dy, const char *s, mreal *sx, mreal *sy,int); /// Put further plotting in a region [x1,x2]*[y1,y2] of the image (x1,x2,y1,y2 in range [0, 1]). void MGL_EXPORT mgl_inplot(HMGL gr, double x1,double x2,double y1,double y2); void MGL_EXPORT mgl_inplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2); /// Put further plotting in a region [x1,x2]*[y1,y2] of the subplot (x1,x2,y1,y2 in range [0, 1]). void MGL_EXPORT mgl_relplot(HMGL gr, double x1,double x2,double y1,double y2); void MGL_EXPORT mgl_relplot_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2); /// Put further plotting in column cell of previous subplot/inplot. void MGL_EXPORT mgl_columnplot(HMGL gr, int num, int ind, double d); void MGL_EXPORT mgl_columnplot_(uintptr_t *gr, int *num, int *i, mreal *d); /// Put further plotting in matrix cell of previous subplot/inplot. void MGL_EXPORT mgl_gridplot(HMGL gr, int nx, int ny, int m, double d); void MGL_EXPORT mgl_gridplot_(uintptr_t *gr, int *nx, int *ny, int *m, mreal *d); /// Put further plotting in cell of stick rotated on angles tet, phi. void MGL_EXPORT mgl_stickplot(HMGL gr, int num, int ind, double tet, double phi); void MGL_EXPORT mgl_stickplot_(uintptr_t *gr, int *num, int *i, mreal *tet, mreal *phi); /// Put further plotting in cell of stick sheared on sx, sy. void MGL_EXPORT mgl_shearplot(HMGL gr, int num, int ind, double sx, double sy, double xd, double yd); void MGL_EXPORT mgl_shearplot_(uintptr_t *gr, int *num, int *i, mreal *sy, mreal *sx, mreal *xd, mreal *yd); /// Add title for current subplot/inplot. /** Style '#' draw box around the title. */ void MGL_EXPORT mgl_title(HMGL gr, const char *title, const char *stl, double size); void MGL_EXPORT mgl_title_(uintptr_t *gr, const char *title, const char *stl, mreal *size, int,int); void MGL_EXPORT mgl_titlew(HMGL gr, const wchar_t *title, const char *stl, double size); /// Set factor of plot size void MGL_EXPORT mgl_set_plotfactor(HMGL gr, double val); void MGL_EXPORT mgl_set_plotfactor_(uintptr_t *gr, mreal *val); /// Set aspect ratio for further plotting. void MGL_EXPORT mgl_aspect(HMGL gr, double Ax,double Ay,double Az); void MGL_EXPORT mgl_aspect_(uintptr_t *gr, mreal *Ax, mreal *Ay, mreal *Az); /// Set aspect ratio for further plotting. void MGL_EXPORT mgl_shear(HMGL gr, double Sx,double Sz); void MGL_EXPORT mgl_shear_(uintptr_t *gr, mreal *Sx, mreal *Sy); /// Rotate a further plotting. void MGL_EXPORT mgl_rotate(HMGL gr, double TetX,double TetZ,double TetY); void MGL_EXPORT mgl_rotate_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY); /// Rotate a further plotting around vector {x,y,z}. void MGL_EXPORT mgl_rotate_vector(HMGL gr, double Tet,double x,double y,double z); void MGL_EXPORT mgl_rotate_vector_(uintptr_t *gr, mreal *Tet, mreal *x, mreal *y, mreal *z); /// Set perspective (in range [0,1)) for plot. Set to zero for switching off. void MGL_EXPORT mgl_perspective(HMGL gr, double val); void MGL_EXPORT mgl_perspective_(uintptr_t *gr, mreal *val); /// Ask to set perspective (in range [0,1)) for plot. Set to zero for switching off. void MGL_EXPORT mgl_ask_perspective(HMGL gr, double val); void MGL_EXPORT mgl_ask_perspective_(uintptr_t *gr, mreal *val); /// Set angle of view independently from Rotate(). void MGL_EXPORT mgl_view(HMGL gr, double TetX,double TetZ,double TetY); void MGL_EXPORT mgl_view_(uintptr_t *gr, mreal *TetX, mreal *TetZ, mreal *TetY); /// Zoom in/out a part of picture (use mgl_zoom(0, 0, 1, 1) for restore default) void MGL_EXPORT mgl_zoom(HMGL gr, double x1, double y1, double x2, double y2); void MGL_EXPORT mgl_zoom_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *x2, mreal *y2); //----------------------------------------------------------------------------- /// Create HMPR object for parsing MGL scripts HMPR MGL_EXPORT mgl_create_parser(); uintptr_t MGL_EXPORT mgl_create_parser_(); /// Change counter of HMPR uses (for advanced users only). Non-zero counter prevent automatic object removing. long MGL_EXPORT mgl_use_parser(HMPR p, int inc); long MGL_EXPORT mgl_use_parser_(uintptr_t* , int *inc); /// Delete HMPR object void MGL_EXPORT mgl_delete_parser(HMPR p); void MGL_EXPORT mgl_delete_parser_(uintptr_t* p); /// Set value for parameter $N void MGL_EXPORT mgl_parser_add_param(HMPR p, int id, const char *str); void MGL_EXPORT mgl_parser_add_param_(uintptr_t* p, int *id, const char *str, int); void MGL_EXPORT mgl_parser_add_paramw(HMPR p, int id, const wchar_t *str); /// Find variable with given name or add a new one /// NOTE !!! You must not delete obtained data arrays !!! MGL_EXPORT mglDataA *mgl_parser_add_var(HMPR p, const char *name); uintptr_t MGL_EXPORT mgl_parser_add_var_(uintptr_t* p, const char *name, int); MGL_EXPORT mglDataA *mgl_parser_add_varw(HMPR p, const wchar_t *name); /// Find variable with given name or return NULL if no one /// NOTE !!! You must not delete obtained data arrays !!! MGL_EXPORT_PURE mglDataA *mgl_parser_find_var(HMPR p, const char *name); uintptr_t MGL_EXPORT mgl_parser_find_var_(uintptr_t* p, const char *name, int); MGL_EXPORT_PURE mglDataA *mgl_parser_find_varw(HMPR p, const wchar_t *name); /// Get variable with given id /// NOTE !!! You must not delete obtained data arrays !!! MGL_EXPORT_PURE mglDataA *mgl_parser_get_var(HMPR p, unsigned long id); uintptr_t MGL_EXPORT_PURE mgl_parser_get_var_(uintptr_t* p, unsigned long *id); /// Get number of variables long MGL_EXPORT_PURE mgl_parser_num_var(HMPR p); long MGL_EXPORT_PURE mgl_parser_num_var_(uintptr_t* p); /// Get constant with given id /// NOTE !!! You must not delete obtained data arrays !!! MGL_EXPORT_PURE mglNum *mgl_parser_get_const(HMPR p, unsigned long id); uintptr_t MGL_EXPORT_PURE mgl_parser_get_const_(uintptr_t* p, unsigned long *id); /// Get number of constants long MGL_EXPORT_PURE mgl_parser_num_const(HMPR p); long MGL_EXPORT_PURE mgl_parser_num_const_(uintptr_t* p); /// Delete variable with name void MGL_EXPORT mgl_parser_del_var(HMPR p, const char *name); void MGL_EXPORT mgl_parser_del_var_(uintptr_t* p, const char *name, int); void MGL_EXPORT mgl_parser_del_varw(HMPR p, const wchar_t *name); /// Delete all data variables void MGL_EXPORT mgl_parser_del_all(HMPR p); void MGL_EXPORT mgl_parser_del_all_(uintptr_t *p); /// Load new commands from external dynamic Library (must have "const mglCommand *mgl_cmd_extra" variable) void MGL_EXPORT mgl_parser_load(HMPR pr, const char *dll_name); void MGL_EXPORT mgl_parser_load_(uintptr_t *pr, const char *dll_name,int); /// Apply one step for equation d vars[i]/dt = eqs[i] using Runge-Kutta method void MGL_EXPORT mgl_rk_step(HMPR pr, const char *eqs, const char *vars, mreal dt); void MGL_EXPORT mgl_rk_step_w(HMPR pr, const wchar_t *eqs, const wchar_t *vars, mreal dt); void MGL_EXPORT mgl_rk_step_(uintptr_t *p, const char *eqs, const char *vars, double *dt, int,int); // Open all data arrays from HDF file and assign it as variables of parser p void MGL_EXPORT mgl_parser_openhdf(HMPR p, const char *fname); void MGL_EXPORT mgl_parser_openhdf_(uintptr_t *p, const char *fname,int l); /// Parse and draw single line of the MGL script int MGL_EXPORT mgl_parse_line(HMGL gr, HMPR p, const char *str, int pos); int MGL_EXPORT mgl_parse_line_(uintptr_t* gr, uintptr_t* p, const char *str, int *pos, int); int MGL_EXPORT mgl_parse_linew(HMGL gr, HMPR p, const wchar_t *str, int pos); /// Execute and draw script from the file void MGL_EXPORT mgl_parse_file(HMGL gr, HMPR p, FILE *fp, int print); /// Execute MGL script text with '\n' separated lines void MGL_EXPORT mgl_parse_text(HMGL gr, HMPR p, const char *str); void MGL_EXPORT mgl_parse_text_(uintptr_t* gr, uintptr_t* p, const char *str, int); void MGL_EXPORT mgl_parse_textw(HMGL gr, HMPR p, const wchar_t *str); /// Restore once flag void MGL_EXPORT mgl_parser_restore_once(HMPR p); void MGL_EXPORT mgl_parser_restore_once_(uintptr_t* p); /// Allow changing size of the picture void MGL_EXPORT mgl_parser_allow_setsize(HMPR p, int a); void MGL_EXPORT mgl_parser_allow_setsize_(uintptr_t* p, int *a); /// Allow reading/saving files void MGL_EXPORT mgl_parser_allow_file_io(HMPR p, int a); void MGL_EXPORT mgl_parser_allow_file_io_(uintptr_t* p, int *a); /// Allow loading commands from external libraries void MGL_EXPORT mgl_parser_allow_dll_call(HMPR p, int a); void MGL_EXPORT mgl_parser_allow_dll_call_(uintptr_t* p, int *a); /// Set flag to stop script parsing void MGL_EXPORT mgl_parser_stop(HMPR p); void MGL_EXPORT mgl_parser_stop_(uintptr_t* p); /// Set variant of argument(s) separated by '?' to be used void MGL_EXPORT mgl_parser_variant(HMPR p, int var); void MGL_EXPORT mgl_parser_variant_(uintptr_t* p, int *var); /// Set starting object ID void MGL_EXPORT mgl_parser_start_id(HMPR p, int id); void MGL_EXPORT mgl_parser_start_id_(uintptr_t* p, int *id); /// Return type of command: 0 - not found, 1 - data plot, 2 - other plot, /// 3 - setup, 4 - data handle, 5 - data create, 6 - subplot, 7 - program /// 8 - 1d plot, 9 - 2d plot, 10 - 3d plot, 11 - dd plot, 12 - vector plot /// 13 - axis, 14 - primitives, 15 - axis setup, 16 - text/legend, 17 - data transform int MGL_EXPORT_PURE mgl_parser_cmd_type(HMPR pr, const char *name); int MGL_EXPORT_PURE mgl_parser_cmd_type_(uintptr_t* p, const char *name, int); /// Return description of MGL command MGL_EXPORT_PURE const char *mgl_parser_cmd_desc(HMPR pr, const char *name); /// Return string of command format (command name and its argument[s]) MGL_EXPORT_PURE const char *mgl_parser_cmd_frmt(HMPR pr, const char *name); /// Get name of command with number n MGL_EXPORT_PURE const char *mgl_parser_cmd_name(HMPR pr, long id); /// Get number of defined commands long MGL_EXPORT_PURE mgl_parser_cmd_num(HMPR pr); /// Return result of formula evaluation HMDT MGL_EXPORT mgl_parser_calc(HMPR pr, const char *formula); uintptr_t MGL_EXPORT mgl_parser_calc_(uintptr_t *pr, const char *formula,int); HMDT MGL_EXPORT mgl_parser_calcw(HMPR pr, const wchar_t *formula); /// Return result of formula evaluation as complex data HADT MGL_EXPORT mgl_parser_calc_complex(HMPR pr, const char *formula); uintptr_t MGL_EXPORT mgl_parser_calc_complex_(uintptr_t *pr, const char *formula,int); HADT MGL_EXPORT mgl_parser_calc_complexw(HMPR pr, const wchar_t *formula); #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/datac.h0000664000175000017500000010652314167366472016322 0ustar balakinbalakin/*************************************************************************** * datac.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_DATAC_H_ #define _MGL_DATAC_H_ #include "mgl2/data.h" #include "mgl2/datac_cf.h" #if MGL_HAVE_ARMA #include #endif //----------------------------------------------------------------------------- #include #include //----------------------------------------------------------------------------- #ifndef SWIG dual MGL_EXPORT mglLinearC(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z); dual MGL_EXPORT mglSpline3C(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,dual *dx=0, dual *dy=0, dual *dz=0); dual MGL_EXPORT mglSpline3Cs(const dual *a, long nx, long ny, long nz, mreal x, mreal y, mreal z); //----------------------------------------------------------------------------- /// Class for working with complex data array class MGL_EXPORT mglDataC : public mglDataA { public: using mglDataA::Momentum; using mglDataA::Last; long nx; ///< number of points in 1st dimensions ('x' dimension) long ny; ///< number of points in 2nd dimensions ('y' dimension) long nz; ///< number of points in 3d dimensions ('z' dimension) dual *a; ///< data array bool link; ///< use external data (i.e. don't free it) /// Initiate by other mglDataC variable mglDataC(const mglDataC &d) { a=0; mgl_datac_set(this,&d); } // NOTE: must be constructor for mglDataC& to exclude copy one mglDataC(const mglDataA &d) { a=0; mgl_datac_set(this,&d); } #if MGL_HAVE_RVAL mglDataC(mglDataC &&d):nx(d.nx),ny(d.ny),nz(d.nz),a(d.a),link(d.link) { s=d.s; temp=d.temp; func=d.func; o=d.o; id=d.id; d.a=0; d.func=0; } #endif mglDataC(const mglDataA &re, const mglDataA &im) { a=0; mgl_datac_set_ri(this,&re,&im); } mglDataC(HCDT d) { a=0; mgl_datac_set(this, d); } mglDataC(HCDT re, HCDT im) { a=0; mgl_datac_set_ri(this, re, im); } mglDataC(bool, mglDataC *d) // NOTE: Variable d will be deleted!!! { if(d) { nx=d->nx; ny=d->ny; nz=d->nz; a=d->a; d->a=0; temp=d->temp; func=d->func; o=d->o; s=d->s; id=d->id; link=d->link; delete d; } else { a=0; Create(1); } } /// Initiate by flat array mglDataC(int size, const dual *d) { a=0; Set(d,size); } mglDataC(int rows, int cols, const dual *d) { a=0; Set(d,cols,rows); } mglDataC(int size, const double *d) { a=0; Set(d,size); } mglDataC(int rows, int cols, const double *d) { a=0; Set(d,cols,rows); } mglDataC(int size, const float *d) { a=0; Set(d,size); } mglDataC(int rows, int cols, const float *d) { a=0; Set(d,cols,rows); } mglDataC(const dual *d, int size) { a=0; Set(d,size); } mglDataC(const dual *d, int rows, int cols) { a=0; Set(d,cols,rows); } mglDataC(const double *d, int size) { a=0; Set(d,size); } mglDataC(const double *d, int rows, int cols) { a=0; Set(d,cols,rows); } mglDataC(const float *d, int size) { a=0; Set(d,size); } mglDataC(const float *d, int rows, int cols) { a=0; Set(d,cols,rows); } /// Allocate memory and copy data from std::vector mglDataC(const std::vector &d) { a=0; Set(d); } mglDataC(const std::vector &d) { a=0; Set(d); } mglDataC(const std::vector &d) { a=0; Set(d); } mglDataC(const std::vector > &d) { a=0; Set(d); } mglDataC(const std::vector > &d) { a=0; Set(d); } /// Read data from file mglDataC(const char *fname) { a=0; Read(fname); } /// Allocate the memory for data array and initialize it zero mglDataC(long xx=1,long yy=1,long zz=1) { a=0; Create(xx,yy,zz); } /// Delete the array virtual ~mglDataC() { if(!link && a) delete []a; } /// Move all data from variable d, and delete this variable. inline void Move(mglDataC *d) // NOTE: Variable d will be deleted!!! { if(d && d->GetNN()>1) { bool l=link; dual *b=a; nx=d->nx; ny=d->ny; nz=d->nz; a=d->a; d->a=b; temp=d->temp; func=d->func; o=d->o; s=d->s; id=d->id; link=d->link; d->link=l; delete d; } else if(d) { *this = d->a[0]; delete d; } } inline dual GetVal(long i, long j=0, long k=0) const { return mgl_datac_get_value(this,i,j,k);} inline void SetVal(dual f, long i, long j=0, long k=0) { mgl_datac_set_value(this,f,i,j,k); } /// Get sizes long GetNx() const { return nx; } long GetNy() const { return ny; } long GetNz() const { return nz; } /// Link external data array (don't delete it at exit) inline void Link(dual *A, long NX, long NY=1, long NZ=1) { mgl_datac_link(this,reinterpret_cast(A),NX,NY,NZ); } inline void Link(mglDataC &d) { Link(d.a,d.nx,d.ny,d.nz); } /// Allocate memory and copy the data from the gsl_vector inline void Set(gsl_vector *m) { mgl_datac_set_vector(this,m); } /// Allocate memory and copy the data from the gsl_matrix inline void Set(gsl_matrix *m) { mgl_datac_set_matrix(this,m); } /// Allocate memory and copy the data from the (float *) array inline void Set(const float *A,long NX,long NY=1,long NZ=1) { mgl_datac_set_float(this,A,NX,NY,NZ); } /// Allocate memory and copy the data from the (double *) array inline void Set(const double *A,long NX,long NY=1,long NZ=1) { mgl_datac_set_double(this,A,NX,NY,NZ); } /// Allocate memory and copy the data from the (complex *) array inline void Set(const dual *A,long NX,long NY=1,long NZ=1) { mgl_datac_set_complex(this,reinterpret_cast(A),NX,NY,NZ); } /// Allocate memory and scanf the data from the string inline void Set(const char *str,long NX,long NY=1,long NZ=1) { mgl_datac_set_values(this,str,NX,NY,NZ); } /// Import data from abstract type inline void Set(HCDT dat) { mgl_datac_set(this, dat); } inline void Set(const mglDataA &dat) { mgl_datac_set(this, &dat); } inline void Set(const mglDataA &re, const mglDataA &im) { mgl_datac_set_ri(this, &re, &im); } inline void Set(HCDT re, HCDT im) { mgl_datac_set_ri(this, re, im); } inline void SetAmpl(const mglDataA &l, const mglDataA &phase) { mgl_datac_set_ap(this, &l, &phase); } /// Allocate memory and copy data from std::vector inline void Set(const std::vector &d) { if(d.size()>0) { Create(d.size()); for(long i=0;i &d) { if(d.size()>0) Set(&(a[0]),d.size()); else Create(1); } inline void Set(const std::vector &d) { if(d.size()>0) Set(&(a[0]),d.size()); else Create(1); } inline void Set(const std::vector > &d) { if(d.size()>0) { Create(d.size()); for(long i=0;i > &d) { if(d.size()>0) { Create(d.size()); for(long i=0;i1?nx-1:1; dif.y/=ny>1?ny-1:1; dif.z/=nz>1?nz-1:1; return val; } /// Return an approximated x-value (root) when dat(x) = val inline mreal Solve(mreal val, bool use_spline=true, long i0=0) const { return mgl_data_solve_1d(this, val, use_spline, i0); } /// Return an approximated value (root) when dat(x) = val inline mglData Solve(mreal val, char dir, bool norm=true) const { return mglData(true,mgl_data_solve(this, val, dir, 0, norm)); } inline mglData Solve(mreal val, char dir, const mglData &i0, bool norm=true) const { return mglData(true,mgl_data_solve(this, val, dir, &i0, norm)); } /// Copy data from other mglDataA variable inline const mglDataA &operator=(const mglDataA &d) { if(this!=&d) Set(&d); return d; } inline const mglDataC &operator=(const mglDataC &d) { if(this!=&d) Set(&d); return d; } inline dual operator=(dual val) { #pragma omp parallel for for(long i=0;i0? abs(i0? abs(j0? abs(k=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) inline mglDataC mglQO2dc(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mreal r=1, mreal k0=100) { return mglDataC(true, mgl_qo2d_solve_c(ham, &ini_re, &ini_im, &ray, r, k0, 0, 0)); } inline mglDataC mglQO2dc(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mglData &xx, mglData &yy, mreal r=1, mreal k0=100) { return mglDataC(true, mgl_qo2d_solve_c(ham, &ini_re, &ini_im, &ray, r, k0, &xx, &yy)); } /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) inline mglDataC mglQO3dc(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mreal r=1, mreal k0=100) { return mglDataC(true, mgl_qo3d_solve_c(ham, &ini_re, &ini_im, &ray, r, k0, 0, 0, 0)); } inline mglDataC mglQO3dc(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mglData &xx, mglData &yy, mglData &zz, mreal r=1, mreal k0=100) { return mglDataC(true, mgl_qo3d_solve_c(ham, &ini_re, &ini_im, &ray, r, k0, &xx, &yy, &zz)); } /// Saves result of ODE solving for var complex variables with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt inline mglDataC mglODEc(const char *func, const char *var, const mglDataA &ini, mreal dt=0.1, mreal tmax=10) { return mglDataC(true, mgl_ode_solve_str_c(func,var, &ini, dt, tmax)); } /// Saves result of ODE solving for var complex variables with right part func (separated by ';') and initial conditions x0 of size n*m over time interval [0,tmax] with time step dt inline mglDataC mglODEcs(const char *func, const char *var, char brd, const mglDataA &ini, mreal dt=0.1, mreal tmax=10) { return mglDataC(true, mgl_ode_solve_set_c(func,var, brd, &ini, dt, tmax)); } //----------------------------------------------------------------------------- /// Get array as solution of tridiagonal system of equations a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i] /** String \a how may contain: * 'x', 'y', 'z' for solving along x-,y-,z-directions, or * 'h' for solving along hexagonal direction at x-y plain (need nx=ny), * 'c' for using periodical boundary conditions, * 'd' for diffraction/diffuse calculation. */ inline mglDataC mglTridMatC(const mglDataA &A, const mglDataA &B, const mglDataA &C, const mglDataC &D, const char *how) { return mglDataC(true, mgl_datac_tridmat(&A, &B, &C, &D, how)); } //----------------------------------------------------------------------------- /// Get sub-array of the data with given fixed indexes inline mglDataC mglSubDataC(const mglDataA &dat, long xx, long yy=-1, long zz=-1) { return mglDataC(true,mgl_datac_subdata(&dat,xx,yy,zz)); } inline mglDataC mglSubDataC(const mglDataA &dat, const mglDataA &xx, const mglDataA &yy, const mglDataA &zz) { return mglDataC(true,mgl_datac_subdata_ext(&dat,&xx,&yy,&zz)); } inline mglDataC mglSubDataC(const mglDataA &dat, const mglDataA &xx, const mglDataA &yy) { return mglDataC(true,mgl_datac_subdata_ext(&dat,&xx,&yy,0)); } inline mglDataC mglSubDataC(const mglDataA &dat, const mglDataA &xx) { return mglDataC(true,mgl_datac_subdata_ext(&dat,&xx,0,0)); } //----------------------------------------------------------------------------- /// Prepare coefficients for global spline interpolation inline mglDataC mglGSplineCInit(const mglDataA &xdat, const mglDataA &ydat) { return mglDataC(true,mgl_gsplinec_init(&xdat, &ydat)); } /// Evaluate global spline (and its derivatives d1, d2 if not NULL) using prepared coefficients \a coef inline dual mglGSplineC(const mglDataA &coef, mreal dx, dual *d1=0, dual *d2=0) { return mgl_gsplinec(&coef, dx, reinterpret_cast(d1), reinterpret_cast(d2)); } //----------------------------------------------------------------------------- /// Evaluate formula 'str' for given list of variables 'vars'. /** NOTE: you need to delete returned data array!*/ HADT MGL_EXPORT mglFormulaCalcC(const char *str, const std::vector &vars); //----------------------------------------------------------------------------- #define _DN_(a) ((mglDataC *)*(a)) #define _DC_ ((mglDataC *)*d) //----------------------------------------------------------------------------- #ifndef SWIG /// Wrapper class for complex expression evaluating class MGL_EXPORT mglExprC { HAEX ex; mglExprC(const mglExprC &){ex=0;} // copying is not allowed const mglExprC &operator=(const mglExprC &t){ex=0; return t;} // copying is not allowed public: mglExprC(const char *expr) { ex = mgl_create_cexpr(expr); } ~mglExprC() { mgl_delete_cexpr(ex); } /// Return value of expression for given x,y,z variables inline dual Eval(dual x, dual y=0, dual z=0) { return mgl_cexpr_eval(ex,x,y,z); } /// Return value of expression for given x,y,z,u,v,w variables inline dual Eval(dual x, dual y, dual z, dual u, dual v, dual w) { mdual var[26]; var['x'-'a']=x; var['y'-'a']=y; var['z'-'a']=z; var['u'-'a']=u; var['v'-'a']=v; var['w'-'a']=w; return mgl_cexpr_eval_v(ex,var); } /// Return value of expression for given variables inline dual Eval(dual var[26]) { return mgl_cexpr_eval_v(ex,reinterpret_cast(var)); } }; #endif //----------------------------------------------------------------------------- #endif #endif mathgl-8.0.1/include/mgl2/qmathgl.h0000664000175000017500000003071214167366472016677 0ustar balakinbalakin/*************************************************************************** * qmathgl.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_QMATHGL_H_ #define _MGL_QMATHGL_H_ //----------------------------------------------------------------------------- #include #include #include //----------------------------------------------------------------------------- class QTextEdit; class QMenu; class QMainWindow; class QScrollArea; class QSpinBox; class QTimer; class mglCanvas; class mglTask; #if MGL_FORCE_QT4 #define angleDelta() delta() #define setPageOrientation(a) setOrientation(a) #define horizontalAdvance(a) width(a) #define asprintf(a) sprintf(a) #define setTabStopWidth(a) setTabStopDistance(a) #define QPageLayout QPrinter #endif //----------------------------------------------------------------------------- /// Class is Qt widget which display MathGL graphics class MGL_EXPORT QMathGL : public QWidget { Q_OBJECT public: QString appName; ///< Application name for message boxes bool autoResize; ///< Allow auto resizing (default is false) bool enableMouse; ///< Enable mouse handlers bool enableWheel; ///< Enable mouse wheel handlers QString primitives; ///< Manual primitives, defined by user QMathGL(QWidget *parent = 0, Qt::WindowFlags f = Qt::WindowFlags()); virtual ~QMathGL(); double getRatio(); void setPopup(QMenu *p) { popup = p; } ///< Set popup menu pointer void setSize(int w, int h); ///< Set window/picture sizes void setGraph(HMGL GR); ///< Set grapher object inline void setGraph(mglGraph *GR) { setGraph(GR->Self()); } inline HMGL getGraph() { return (HMGL)gr; } /// Nullify grapher object for disabling double free. NOTE: this is internal function. void noGraph() {gr=0;}; /// Set drawing functions and its parameter void setDraw(int (*func)(mglBase *gr, void *par), void *par); void setDraw(mglDraw *dr); inline void setDraw(int (*func)(mglGraph *gr)) { setDraw(func?mgl_draw_graph:0,(void*)func); } inline void zoomRegion(mreal xx1,mreal xx2,mreal yy1, mreal yy2) { x1=xx1; y1=yy1; x2=xx2; y2=yy2; } /// Get mglDraw pointer or NULL inline mglDraw *getClass() { mglDraw *d=0; if(draw_func==mgl_draw_class) d = (mglDraw*)draw_par; if(draw) d = draw; return d; } int getPer() const {return int(per);} ///< Get perspective value int getPhi() const {return int(phi);} ///< Get Phi-angle value int getTet() const {return int(tet);} ///< Get Theta-angle value bool getAlpha() const {return alpha;} ///< Get transparency state bool getLight() const {return light;} ///< Get lightning state bool getZoom() const {return zoom;} ///< Get mouse zooming state bool getRotate() const {return rotate;}///< Get mouse rotation state bool getViewYZ() const {return viewYZ;}///< Get mouse rotation axis bool getPause() const {return pause;} ///< Get calculation pause state bool isActive(int xs,int ys); ///< Check if active point is pressed public slots: void refresh(); ///< Redraw image with new zoom and view parameters void refreshHQ(); ///< Redraw image with HQ (can be slower than refresh()) void update(); ///< Update picture void copy(); ///< copy graphics to clipboard void copyClickCoor(); ///< copy click coordinates to clipboard void print(); ///< Print plot void stop(); ///< Stop execution void setPer(int p); ///< Set perspective value void setPhi(int p); ///< Set Phi-angle value void setTet(int t); ///< Set Theta-angle value void setAlpha(bool a); ///< Switch on/off transparency void setLight(bool l); ///< Switch on/off lightning void setGrid(bool r); ///< Switch on/off grid drawing void imgSize(int w, int h); ///< Set image size void setViewYZ(bool v); ///< Switch on/off rotation around Y and Z axis void setDotsPreview(bool d=true); ///< Set to use dots for image preview/rotation void setCustZoom(bool a); ///< Switch on/off using custom zoom void setCustDraw(bool a); ///< Switch on/off using custom draw void setZoom(bool z); ///< Switch on/off mouse zooming void setRotate(bool r); ///< Switch on/off mouse rotation void setPause(bool p); ///< Switch on/off calculation pause void zoomIn(); ///< Zoom in graphics void zoomOut(); ///< Zoom out graphics void restore(); ///< Restore zoom and rotation to default values void setZoomScl(double s=0.5); ///< Set factor for zooming (must be s>0) void setShiftScl(double s=0.25); ///< Set factor for shifting (must be s!=0) // void reload(); ///< Reload data and execute script void shiftLeft(); ///< Shift graphics to left direction void shiftRight(); ///< Shift graphics to right direction void shiftUp(); ///< Shift graphics to up direction void shiftDown(); ///< Shift graphics to down direction void exportPNG(QString fname=""); ///< export to PNG file void exportPNGs(QString fname=""); ///< export to PNG file (no transparency) void exportGIF(QString fname=""); ///< export to GIF file void exportJPG(QString fname=""); ///< export to JPEG file void exportBPS(QString fname=""); ///< export to bitmap EPS file void exportEPS(QString fname=""); ///< export to vector EPS file void exportSVG(QString fname=""); ///< export to SVG file void exportTEX(QString fname=""); ///< export to SVG file void exportTGA(QString fname=""); ///< export to TGA file void exportXYZ(QString fname=""); ///< export to XYZ file void exportOBJ(QString fname=""); ///< export to OBJ file void exportSTL(QString fname=""); ///< export to STL file void exportOFF(QString fname=""); ///< export to OFF file // void exportX3D(QString fname=""); ///< export to XYZ file void exportPRC(QString fname=""); ///< export to PRC file void exportMGLD(QString fname=""); ///< export to MGLD file void setMGLFont(QString path); ///< restore/load font for graphics void addMark(); ///< add marker into primitives void addLine(); ///< add line into primitives void addRect(); ///< add rectangle into primitives void addCurve(); ///< add curve into primitives void addRhomb(); ///< add rhombus into primitives void addEllipse(); ///< add ellipse into primitives void addArc(); ///< add arc into primitives void addPolygon(int n=-1); ///< add polygon into primitives void addText(QString txt=""); ///< add text into primitives void setStyle(int id, QString stl);///< set style for primitive with id void adjust(); ///< Adjust plot size to fill entire window void nextSlide(); ///< Show next slide void prevSlide(); ///< Show previous slide void animation(bool st=true); ///< Start animation void about(); ///< Show about information void aboutQt(); ///< Show information about Qt version signals: void gridChanged(int); ///< Grid drawing changed (by mouse or by toolbar) void phiChanged(int); ///< Phi angle changed (by mouse or by toolbar) void tetChanged(int); ///< Tet angle changed (by mouse or by toolbar) void perChanged(int); ///< Perspective changed (by mouse or by toolbar) void alphaChanged(bool); ///< Transparency changed (by toolbar) void lightChanged(bool); ///< Lighting changed (by toolbar) void zoomChanged(bool); ///< Zooming changed (by toolbar) void rotateChanged(bool); ///< Rotation changed (by toolbar) void pauseChanged(bool); ///< Pause changed (by toolbar) void usePrimChanged(bool); ///< Use primitive changed (i.e. have or not drawing function) void viewYZChanged(bool); ///< Rotation axis changed (by toolbar) void mouseClick(mreal,mreal,mreal); ///< Position of mouse click void frameChanged(int); ///< Need another frame to show void showWarn(QString); ///< Show warnings void posChanged(QString message); ///< user click to show mouse position void objChanged(int objId); ///< User click to select object/line void refreshData(); void doubleClick(int id); ///< Double mouse click by object with id void askStyle(int id); ///< Update style /// user can define its own zooming function void customZoom(double x1, double y1, double x2, double y2, double tet, double phi, double per); /// user can define its own drawing/setting function which will be called before main drawing void customDraw(double x1, double y1, double x2, double y2, bool draw); protected: void paintEvent(QPaintEvent *); void resizeEvent(QResizeEvent *); void mousePressEvent(QMouseEvent *); void mouseReleaseEvent(QMouseEvent *); void mouseMoveEvent(QMouseEvent *); void wheelEvent(QWheelEvent *); void mouseDoubleClickEvent(QMouseEvent *); mglCanvas *gr; ///< Built-in mglCanvas instance (mglCanvasQT is used by default) void *draw_par; ///< Parameters for drawing function mglCanvasWnd::DrawFunc. /// Drawing function for window procedure. It should return the number of frames. int (*draw_func)(mglBase *gr, void *par); mglDraw *draw; ///< Class for drawing -- need to call directly due to inheritance mechanism QString mousePos; ///< Last mouse position QPixmap pic; ///< Pixmap for drawing (changed by update) QImage img; ///< Last used HQ image double tet, phi; ///< Rotation angles double per; ///< Value of perspective ( must be in [0,1) ) bool alpha; ///< Transparency state bool light; ///< Lightning state bool pause; ///< Pause state bool custZoom; ///< Use custom zoom instead of built in bool custDraw; ///< Use custom draw before main drawing bool zoom; ///< Mouse zoom state bool grid; ///< Grid drawing state bool rotate; ///< Mouse rotation state bool viewYZ; ///< Set mouse rotation around Y and Z axis (instead of X and Z) bool dotsRefr; ///< Set dots for image preview/rotation mreal x1,x2,y1,y2; ///< Zoom in region mreal ax1,ax2,ay1,ay2; ///< Axis range zoom QMenu *popup; ///< Pointer to pop-up menu QTimer *timer; ///< Timer for animation QTimer *timerRefr; ///< Timer for redrawing private slots: void afterPlot(); ///< minor tuning after plot was done private: int x0, y0, xe, ye; ///< Temporary variables for mouse double sclZ; ///< Scale factor for zooming double sclS; ///< Scale factor for shifting uchar *grBuf; void drawPrim(); int prevQuality; // QThread *thread; // mglTask *task; }; //----------------------------------------------------------------------------- /// Class for drawing the MGL script class MGL_EXPORT mglDrawScript : public mglDraw { public: HMPR par; ///< Parser to be used QString text; ///< Script to be drawn long line; ///< Line which will be highlighted mglDrawScript(HMPR p):mglDraw() { par=p; line=-1; } virtual ~mglDrawScript() {} int Draw(mglGraph *gr) { wchar_t *wtext; wtext = new wchar_t[text.size()+1]; text.toWCharArray(wtext); wtext[text.size()] = 0; gr->Highlight(line + 1); mgl_parse_textw(gr->Self(), par, wtext); delete[] wtext; return 0; } }; //----------------------------------------------------------------------------- /// Convert bitmap from mglCanvasWnd to QPixmap void mglConvertFromGraph(QPixmap &pic, mglCanvas *gr, uchar **buf, QImage *out=NULL); /// Make menu, toolbars and return popup menu for MainWindow MGL_EXPORT QMenu *mglMakeMenu(QMainWindow* Wnd, QMathGL* QMGL, QSpinBox*& tet, QSpinBox*& phi); //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/define.h0000664000175000017500000004042014167366472016471 0ustar balakinbalakin/*************************************************************************** * define.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_DEFINE_H_ #define _MGL_DEFINE_H_ //----------------------------------------------------------------------------- // Disable warnings for MSVC: // 4190 - C-linkage of std::complex, // 4996 - deprecated abi functions // 4786 - disable warnings on 255 char debug symbols // 4231 - disable warnings on extern before template instantiation // 4800 - "int,uint32_t,etc" forcing value to bool 'true' or 'false' (performance warning) // 4244 - conversion from 'mreal,double' to 'float', possible loss of data // 4267 - conversion from 'size_t' to 'long,int,etc', possible loss of data // 4305 - truncation from 'double' to 'float' // 4251 - class 'type' needs to have dll-interface to be used by clients of class 'type2' #if defined(_MSC_VER) #pragma warning(disable: 4190 4996 4786 4800 4244 4267 4305 4251) #endif #if defined(_WIN32) && !defined(WIN32) #define WIN32 1 #endif #include "mgl2/config.h" #ifndef SWIG #if MGL_HAVE_PTHR_WIDGET|MGL_HAVE_PTHREAD #include #endif #include "mgl2/dllexport.h" #if defined(MGL_LIB_MSVC) #define MGL_EXTERN #else #define MGL_EXTERN extern #endif #if defined(_MSC_VER) #define MGL_OBSOLETE MGL_NO_EXPORT #else #define MGL_OBSOLETE MGL_EXPORT #endif #if MGL_HAVE_ATTRIBUTE #define MGL_FUNC_CONST __attribute__((const)) #define MGL_FUNC_PURE __attribute__((pure)) #define MGL_FUNC_INIT __attribute__((constructor)) #define MGL_FUNC_FINI __attribute__((destructor)) #else #define MGL_FUNC_CONST #define MGL_FUNC_PURE #define MGL_FUNC_INIT #define MGL_FUNC_FINI #endif #define MGL_EXPORT_CONST MGL_EXPORT MGL_FUNC_CONST #define MGL_EXPORT_PURE MGL_EXPORT MGL_FUNC_PURE #define MGL_LOCAL_CONST MGL_NO_EXPORT MGL_FUNC_CONST #define MGL_LOCAL_PURE MGL_NO_EXPORT MGL_FUNC_PURE #if MGL_HAVE_RVAL // C++11 don't support register keyword #endif #endif //----------------------------------------------------------------------------- #ifdef MGL_SRC #if MGL_USE_GETTEXT #include #define _(x) gettext(x) #else #define _(x) (x) #endif #if MGL_HAVE_ZLIB #include #ifndef Z_BEST_COMPRESSION #define Z_BEST_COMPRESSION 9 #endif #else #define gzFile FILE* #define gzread(fp,buf,size) fread(buf,1,size,fp) #define gzopen fopen #define gzclose fclose #define gzprintf fprintf #define gzgets(fp,str,size) fgets(str,size,fp) #define gzgetc fgetc #endif #endif #if (defined(_MSC_VER) && (_MSC_VER<1600)) || defined(__BORLANDC__) typedef signed char int8_t; typedef signed short int16_t; typedef signed long int32_t; typedef signed long long int64_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; typedef unsigned long long uint64_t; #else #include #endif #if defined(__BORLANDC__) typedef unsigned long uintptr_t; #endif #if ((defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(M_PI)) //_MSC_VER needs this before math.h #define _USE_MATH_DEFINES #endif #include #include #include #include #include #if defined(_MSC_VER) typedef long msize; #define collapse(a) // MSVS don't support OpenMP 3.* #if (_MSC_VER<=1800) #define strtoull _strtoui64 //#define hypot _hypot #define getcwd _getcwd #define chdir _chdir // BORLAND has chdir #endif #if (_MSC_VER<1500) #define snprintf _snprintf #endif #if (_MSC_VER<1600) // based on https://hg.python.org/cpython/rev/9aedb876c2d7 #define hypot _hypot #endif #else typedef size_t msize; #endif #if !MGL_SYS_NAN #include const unsigned long long mgl_nan[2] = {0x7fffffffffffffff, 0x7fffffff}; const unsigned long long mgl_inf[2] = {0x7ff0000000000000, 0x7f800000}; #define NANd (*(double*)mgl_nan) #define NANf (*(float*)(mgl_nan+1)) #define INFd (*(double*)mgl_inf) #define INFf (*(float*)(mgl_inf+1)) #if !defined(NAN) #if MGL_USE_DOUBLE #define NAN NANd #else #define NAN NANf #endif #endif #if !defined(INFINITY) #if MGL_USE_DOUBLE #define INFINITY INFd #else #define INFINITY INFf #endif #endif #endif // !MGL_SYS_NAN #ifndef M_PI #define M_PI 3.14159265358979323846 /* pi */ #endif //----------------------------------------------------------------------------- #ifdef WIN32 #define mglprintf _snwprintf #else #define mglprintf swprintf #endif //#define FLT_EPS 1.1920928955078125e-07 //----------------------------------------------------------------------------- #if MGL_USE_DOUBLE typedef double mreal; #define MGL_EPSILON (1.+1e-10) #define MGL_MIN_VAL 1e-307 #else typedef float mreal; #define MGL_EPSILON (1.+1e-5) #define MGL_MIN_VAL 1e-37 #endif #define MGL_FEPSILON (1.+1e-5) //----------------------------------------------------------------------------- #ifndef MGL_CMAP_COLOR #define MGL_CMAP_COLOR 32 #endif //----------------------------------------------------------------------------- #ifndef MGL_DEF_VIEWER #define MGL_DEF_VIEWER "evince" #endif //----------------------------------------------------------------------------- enum{ // types of predefined curvelinear coordinate systems mglCartesian = 0, // no transformation mglPolar, mglSpherical, mglParabolic, mglParaboloidal, mglOblate, mglProlate, mglElliptic, mglToroidal, mglBispherical, mglBipolar, mglLogLog, mglLogX, mglLogY }; //----------------------------------------------------------------------------- // types of drawing #define MGL_DRAW_WIRE 0 // fastest, no faces #define MGL_DRAW_FAST 1 // fast, no color interpolation #define MGL_DRAW_NORM 2 // high quality, slower #define MGL_DRAW_LMEM 4 // low memory usage (direct to pixel) #define MGL_DRAW_DOTS 8 // draw dots instead of primitives #define MGL_DRAW_NONE 9 // no ouput (for testing only) //----------------------------------------------------------------------------- enum{ // Codes for warnings/messages mglWarnNone = 0,// Everything OK mglWarnDim, // Data dimension(s) is incompatible mglWarnLow, // Data dimension(s) is too small mglWarnNeg, // Minimal data value is negative mglWarnFile, // No file or wrong data dimensions mglWarnMem, // Not enough memory mglWarnZero, // Data values are zero mglWarnLeg, // No legend entries mglWarnSlc, // Slice value is out of range mglWarnCnt, // Number of contours is zero or negative mglWarnOpen, // Couldn't open file mglWarnLId, // Light: ID is out of range mglWarnSize, // Setsize: size(s) is zero or negative mglWarnFmt, // Format is not supported for that build mglWarnTern, // Axis ranges are incompatible mglWarnNull, // Pointer is NULL mglWarnSpc, // Not enough space for plot mglScrArg, // Wrong argument(s) in MGL script mglScrCmd, // Wrong command in MGL script mglScrLong, // Too long line in MGL script mglScrStr, // Unbalanced ' in MGL script mglScrTemp, // Change temporary data in MGL script mglWarnEnd // Maximal number of warnings (must be last) }; //----------------------------------------------------------------------------- #define MGL_DEF_PAL "bgrcmyhlnqeupH" // default palette #define MGL_DEF_SCH "BbcyrR" // default palette #define MGL_COLORS "kwrgbcymhWRGBCYMHlenpquLENPQU" //----------------------------------------------------------------------------- /// Brushes for mask with symbol "-+=;oOsS~<>jdD*^" correspondingly extern MGL_EXPORT uint64_t mgl_mask_val[16]; #define MGL_MASK_ID "-+=;oOsS~<>jdD*^" #define MGL_SOLID_MASK 0xffffffffffffffff //----------------------------------------------------------------------------- #define MGL_TRANSP_NORM 0x00000000 #define MGL_TRANSP_GLASS 0x00000001 #define MGL_TRANSP_LAMP 0x00000002 #define MGL_ENABLE_CUT 0x00000004 ///< Flag which determines how points outside bounding box are drown. #define MGL_ENABLE_RTEXT 0x00000008 ///< Use text rotation along axis #define MGL_AUTO_FACTOR 0x00000010 ///< Enable autochange PlotFactor #define MGL_ENABLE_ALPHA 0x00000020 ///< Flag that Alpha is used #define MGL_ENABLE_LIGHT 0x00000040 ///< Flag of using lightning #define MGL_TICKS_ROTATE 0x00000080 ///< Allow ticks rotation #define MGL_TICKS_SKIP 0x00000100 ///< Allow ticks rotation // flags for internal use only #define MGL_DISABLE_SCALE 0x00000200 ///< Temporary flag for disable scaling (used for axis) #define MGL_FINISHED 0x00000400 ///< Flag that final picture (i.e. mglCanvas::G) is ready #define MGL_USE_GMTIME 0x00000800 ///< Use gmtime instead of localtime #define MGL_SHOW_POS 0x00001000 ///< Switch to show or not mouse click position #define MGL_CLF_ON_UPD 0x00002000 ///< Clear plot before Update() #define MGL_NOSUBTICKS 0x00004000 ///< Disable subticks drawing (for bounding box) #define MGL_LOCAL_LIGHT 0x00008000 ///< Keep light sources for each inplot #define MGL_VECT_FRAME 0x00010000 ///< Use DrwDat to remember all data of frames #define MGL_REDUCEACC 0x00020000 ///< Reduce accuracy of points (to reduce size of output files) #define MGL_PREFERVC 0x00040000 ///< Prefer vertex color instead of texture if output format supports #define MGL_ONESIDED 0x00080000 ///< Render only front side of surfaces if output format supports (for debugging) #define MGL_NO_ORIGIN 0x00100000 ///< Don't draw tick labels at axis origin #define MGL_GRAY_MODE 0x00200000 ///< Convert all colors to gray ones #define MGL_FULL_CURV 0x00400000 ///< Disable omitting points in straight-line part(s). #define MGL_NO_SCALE_REL 0x00800000 ///< Disable font scaling in relative inplots #define MGL_FAST_PRIM 0x01000000 ///< Disable accurate primitive cutting at axis borders //----------------------------------------------------------------------------- #ifdef __cplusplus #include #include #include typedef std::complex dual; typedef std::complex ddual; //----------------------------------------------------------------------------- inline bool mgl_isrange(double a, double b) { return fabs(a-b)>MGL_MIN_VAL && a-a==0. && b-b==0.; } inline bool mgl_isbad(double a) { return a-a!=0; } inline bool mgl_isbad(dual a) { return a-a!=mreal(0); } inline bool mgl_isfin(double a) { return a-a==0; } inline bool mgl_isfin(dual a) { return a-a==mreal(0); } inline bool mgl_isnum(double a) { return a==a; } inline bool mgl_isnum(dual a) { return a==a; } inline bool mgl_isnan(double a) { return a!=a; } inline bool mgl_isnan(dual a) { return a!=a; } inline int mgl_sign(double a) { return a<0?-1:1; } inline long mgl_int(double a) { return long(a+(a>=0?0.5:-0.5)); } inline double mgl_min(double a, double b) { return a>b?b:a; } inline double mgl_max(double a, double b) { return a>b?a:b; } inline long mgl_imin(long a, long b) { return a>b?b:a; } inline long mgl_imax(long a, long b) { return a>b?a:b; } inline void mgl_strncpy(char *a, const char *b, size_t s) { strncpy(a,b,s); a[s-1]=0; } //----------------------------------------------------------------------------- extern "C" { #endif //----------------------------------------------------------------------------- struct cmdual // complex number (bypass C/C++ incompatibility) { mreal re,im; // real and imaginary parts #ifdef __cplusplus operator dual() const { return dual(re,im); } mreal real() const { return re; } mreal imag() const { return im; } #endif }; #ifdef __cplusplus struct mdual : public cmdual { mdual(const cmdual &c) { re=c.re; im=c.im; } mdual(const std::complex &c) { re=c.real(); im=c.imag(); } mdual(const std::complex &c){ re=c.real(); im=c.imag(); } mdual(mreal r=0, mreal i=0) { re=r; im=i; } mdual &operator=(const cmdual &c) { re=c.re; im=c.im; return *this; } mdual &operator=(const std::complex &c) { re=c.real(); im=c.imag(); return *this; } mdual &operator=(const std::complex &c) { re=c.real(); im=c.imag(); return *this; } mdual &operator=(mreal r) { re=r; im=0; return *this; } }; #else typedef struct cmdual cmdual; typedef cmdual mdual; #if MGL_HAVE_C99_COMPLEX #include #if MGL_USE_DOUBLE typedef double _Complex dual; #else typedef float _Complex dual; #endif MGL_EXPORT dual mdual2c(cmdual c); MGL_EXPORT cmdual c2mdual(dual c); #endif #endif //----------------------------------------------------------------------------- extern float MGL_EXPORT mgl_cos[360]; ///< contain cosine with step 1 degree void MGL_EXPORT MGL_FUNC_INIT mgl_init(); ///< initialize MathGL structures void MGL_EXPORT MGL_FUNC_FINI mgl_fini(); ///< free MathGL structures //----------------------------------------------------------------------------- /// Calculate sqrt(x*x+y*y) double MGL_EXPORT_CONST mgl_hypot(double x, double y); /// Find length of wchar_t string (bypass standard wcslen bug) size_t MGL_EXPORT_PURE mgl_wcslen(const wchar_t *str); /// Get RGB values for given color id or fill by -1 if no one found void MGL_EXPORT mgl_chrrgb(char id, float rgb[3]); /// Get number of colors in the string size_t MGL_EXPORT_PURE mgl_get_num_color(const char *s, int smooth); /// Check if string contain color id and return its number long MGL_EXPORT_PURE mgl_have_color(const char *stl); /// Find symbol in string excluding {} and return its position or NULL MGL_EXPORT_PURE const char *mglchr(const char *str, char ch); /// Find any symbol from chr in string excluding {} and return its position or NULL MGL_EXPORT_PURE const char *mglchrs(const char *str, const char *chr); /// Set number of thread for plotting and data handling (for pthread version only) void MGL_EXPORT mgl_set_num_thr(int n); void MGL_EXPORT mgl_set_num_thr_(int *n); void MGL_EXPORT mgl_test_txt(const char *str, ...); void MGL_EXPORT mgl_set_test_mode(int enable); /// Remove spaces at begining and at the end of the string void MGL_EXPORT mgl_strtrim(char *str); void MGL_EXPORT mgl_wcstrim(wchar_t *str); /** Change register to lowercase (only for ANSI symbols) */ void MGL_EXPORT mgl_strlwr(char *str); void MGL_EXPORT mgl_wcslwr(wchar_t *str); /// Convert wchar_t* string into char* one void MGL_EXPORT mgl_wcstombs(char *dst, const wchar_t *src, int size); /// Clear internal data for speeding up FFT and Hankel transforms void MGL_EXPORT mgl_clear_fft(); /// Set global warning message void MGL_EXPORT mgl_set_global_warn(const char *text); void MGL_EXPORT mgl_set_global_warn_(const char *text,int); /// Get text of global warning message(s) MGL_EXPORT_PURE const char *mgl_get_global_warn(); int MGL_EXPORT mgl_get_global_warn_(char *out, int len); /// Clear global warning message void MGL_EXPORT mgl_clear_global_warn(); void MGL_EXPORT mgl_clear_global_warn_(); /// Setup gettext usage. NOTE: Russian translation MUST be installed. void MGL_EXPORT mgl_textdomain(const char *argv0, const char *locale); void MGL_EXPORT mgl_textdomain_(const char *locale, int); /// size of var array const int MGL_VS = 'z'-'a'+1; #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/include/mgl2/volume.h0000664000175000017500000002554214167366472016556 0ustar balakinbalakin/*************************************************************************** * volume.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_VOL_H_ #define _MGL_VOL_H_ #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif //----------------------------------------------------------------------------- /// Draw isosurface for 3d data specified parametrically /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surf3_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_surf3_val(HMGL graph, double Val, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data specified parametrically /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3(HMGL graph, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3_(uintptr_t *graph, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data specified parametrically with alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_surf3a_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3a_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data with alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_surf3a_val(HMGL graph, double Val, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3a_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data specified parametrically with alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3a_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3a_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data with alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3a(HMGL graph, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3a_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data specified parametrically with color proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_surf3c_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3c_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data with color proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_surf3c_val(HMGL graph, double Val, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3c_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data specified parametrically with color proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3c_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3c_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data with color proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3c(HMGL graph, HCDT a, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3c_(uintptr_t *graph, uintptr_t *a, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data specified parametrically with color proportional to c and alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_surf3ca_xyz_val(HMGL graph, double Val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3ca_xyz_val_(uintptr_t *graph, mreal *Val, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d data with color proportional to c and alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ void MGL_EXPORT mgl_surf3ca_val(HMGL graph, double Val, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3ca_val_(uintptr_t *graph, mreal *Val, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data specified parametrically with color proportional to c and alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3ca_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3ca_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw isosurfaces for 3d data with color proportional to c and alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_surf3ca(HMGL graph, HCDT a, HCDT c, HCDT b, const char *stl, const char *opt); void MGL_EXPORT mgl_surf3ca_(uintptr_t *graph, uintptr_t *a, uintptr_t *c, uintptr_t *b, const char *stl, const char *opt,int,int); /// Draw a semi-transparent cloud for 3d data specified parametrically /** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */ void MGL_EXPORT mgl_cloud_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_cloud_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw a semi-transparent cloud for 3d data /** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */ void MGL_EXPORT mgl_cloud(HMGL graph, HCDT a, const char *stl, const char *opt); void MGL_EXPORT mgl_cloud_(uintptr_t *graph, uintptr_t *a, const char *stl, const char *opt,int,int); /// Draw isosurface for 3d beam in curvilinear coordinates /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots. * Variable \a flag is bitwise: * ‘0x1’ - draw in accompanied (not laboratory) coordinates; * ‘0x2’ - draw projection to \rho-z plane; * ‘0x4’ - draw normalized in each slice field.*/ void MGL_EXPORT mgl_beam_val(HMGL graph, double Val, HCDT tr, HCDT g1, HCDT g2, HCDT a, double r, const char *stl, int norm); void MGL_EXPORT mgl_beam_val_(uintptr_t *gr, mreal *val, uintptr_t *tr, uintptr_t *g1, uintptr_t *g2, uintptr_t *a, mreal *r, const char *sch, int *norm,int l); /// Draw several isosurfaces for 3d beam in curvilinear coordinates /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). * Variable \a flag is bitwise: * ‘0x1’ - draw in accompanied (not laboratory) coordinates; * ‘0x2’ - draw projection to \rho-z plane; * ‘0x4’ - draw normalized in each slice field.*/ void MGL_EXPORT mgl_beam(HMGL graph, HCDT tr, HCDT g1, HCDT g2, HCDT a, double r, const char *stl, int norm, int num); void MGL_EXPORT mgl_beam_(uintptr_t *gr, uintptr_t *tr, uintptr_t *g1, uintptr_t *g2, uintptr_t *a, mreal *r, const char *sch, int *norm, int *num,int l); //----------------------------------------------------------------------------- #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/canvas_wnd.h0000664000175000017500000001233614167366472017367 0ustar balakinbalakin/*************************************************************************** * canvas_wnd.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_CANVAS_WND_H_ #define _MGL_CANVAS_WND_H_ #include "mgl2/canvas.h" #include "mgl2/wnd.h" //----------------------------------------------------------------------------- /// Base class for windows containing MathGL graphics class MGL_EXPORT mglCanvasWnd : public mglCanvas { public: mglPoint LastMousePos; ///< Last mouse position void (*ClickFunc)(void *par); ///< Callback function on click #if MGL_HAVE_PTHR_WIDGET pthread_mutex_t *mutex; #endif mglCanvasWnd(); virtual ~mglCanvasWnd(); void SetSize(int w,int h,bool clf=true); void EndFrame(); void SetFrame(long i); void DelFrame(long i); const unsigned char *GetBits(); inline int GetNumFig() const { return NumFig; } inline int GetCurFig() const { return CurFig; } void SetCurFig(int c); void ResetFrames(); inline mglPoint GetMousePos() const { return LastMousePos;} inline void SetMousePos(const mglPoint &p) { LastMousePos=p; } inline void Setup(bool clf_upd=true, bool showpos=false) { set(showpos,MGL_SHOW_POS); set(clf_upd,MGL_CLF_ON_UPD); if(!clf_upd) ResetFrames(); } virtual void ToggleAlpha()=0; ///< Switch on/off transparency (do not overwrite user settings) virtual void ToggleLight()=0; ///< Switch on/off lighting (do not overwrite user settings) virtual void ToggleZoom()=0; ///< Switch on/off zooming by mouse virtual void ToggleRotate()=0; ///< Switch on/off rotation by mouse virtual void ToggleNo()=0; ///< Switch off all zooming and rotation virtual void Update()=0; ///< Update picture by calling user drawing function virtual void Adjust()=0; ///< Adjust size of bitmap to window size virtual void GotoFrame(int d)=0;///< Show arbitrary frame (use relative step) virtual void NextFrame() {GotoFrame(+1);} ///< Show next frame (if one) virtual void PrevFrame() {GotoFrame(-1);} ///< Show previous frame (if one) virtual void Animation()=0; ///< Run slideshow (animation) of frames virtual void *Window()=0; ///< Return pointer to widget (Fl_Window* or QMainWindow*) used for plotting virtual void *Widget()=0; ///< Return pointer to widget (Fl_MGLView* or QMathGL*) used for plotting virtual void WndSize(int w, int h)=0; ///< Resize window virtual void WndMove(int x, int y)=0; ///< Move window void ReLoad(); ///< Reload user data and update picture /// Create a window for plotting based on callback function (can be NULL). virtual void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), const char *title, void *par=NULL, void (*reload)(void *p)=NULL, bool maximize=false)=0; void SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par=NULL, void (*reload)(void *p)=NULL); /// Set callback function for properties setup void SetPropFunc(void (*prop)(char id, const char *val, void *p), void *par=NULL) { PropFunc = prop; PropPar = par; } inline void SetParam(char id, const char *val) ///< Set parameter (usually from custom dialog) { if(PropFunc) { PropFunc(id,val,PropPar); Update(); } } ///< Make custom dialog virtual void MakeDialog(const char *ids, char const * const *args, const char *title="")=0; private: int CurFig; ///< Current figure in the list. unsigned char *GG; ///< images for all frames (may be too LARGE !!!) int NumFig; ///< Number of figures in the list. If 0 then no list and mglCanvas::DrawFunc will called for each drawing. void (*LoadFunc)(void *par); void *FuncPar; ///< Parameters for drawing function mglCanvas::DrawFunc. /// Drawing function for window procedure. It should return the number of frames. int (*DrawFunc)(mglBase *gr, void *par); void *PropPar; ///< Parameters for prop_func(). /// Function for setting properties. void (*PropFunc)(char id, const char *val, void *par); }; //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/base_cf.h0000664000175000017500000003232014167366472016621 0ustar balakinbalakin/*************************************************************************** * base_cf.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_BASE_CF_H_ #define _MGL_BASE_CF_H_ #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /// Check if MathGL version is valid (return 0) or not (return 1) int MGL_EXPORT mgl_check_version(const char *ver); int MGL_EXPORT mgl_check_version_(const char *ver, int); /// Suppress printing warnings to stderr void MGL_EXPORT mgl_suppress_warn(int on); void MGL_EXPORT mgl_suppress_warn_(int *on); /// Get last warning code int MGL_EXPORT_PURE mgl_get_warn(HMGL gr); int MGL_EXPORT_PURE mgl_get_warn_(uintptr_t *gr); /// Set warning code ant fill message void MGL_EXPORT mgl_set_warn(HMGL gr, int code, const char *text); void MGL_EXPORT mgl_set_warn_(uintptr_t *gr, int *code, const char *text,int); /// Get text of warning message(s) MGL_EXPORT_PURE const char *mgl_get_mess(HMGL gr); int MGL_EXPORT mgl_get_mess_(uintptr_t *gr, char *out, int len); /// Set name of plot for saving filename void MGL_EXPORT mgl_set_plotid(HMGL gr, const char *id); void MGL_EXPORT mgl_set_plotid_(uintptr_t *gr, const char *id,int); /// Get name of plot for saving filename MGL_EXPORT_PURE const char *mgl_get_plotid(HMGL gr); int MGL_EXPORT mgl_get_plotid_(uintptr_t *gr, char *out, int len); /// Ask to stop drawing void MGL_EXPORT mgl_ask_stop(HMGL gr, int stop); void MGL_EXPORT mgl_ask_stop_(uintptr_t *gr, int *stop); /// Check if plot termination is asked int MGL_EXPORT mgl_need_stop(HMGL gr); int MGL_EXPORT mgl_need_stop_(uintptr_t *gr); /// Set callback function for event processing void MGL_EXPORT mgl_set_event_func(HMGL gr, void (*func)(void *), void *par); /// Get plot quality int MGL_EXPORT_PURE mgl_get_quality(HMGL gr); int MGL_EXPORT_PURE mgl_get_quality_(uintptr_t *gr); /// Set plot quality /** qual=0 -- no face drawing (fastest), * qual=1 -- no color interpolation (fast), * qual=2 -- high quality (normal), * qual|4 -- direct bitmap drawing (low memory usage); * qual|8 for dots drawing instead of primitives (extremely fast). */ void MGL_EXPORT mgl_set_quality(HMGL gr, int qual); void MGL_EXPORT mgl_set_quality_(uintptr_t *gr, int *qual); /// Set drawing region for Quality&4 void MGL_EXPORT mgl_set_draw_reg(HMGL gr, long nx, long ny, long m); void MGL_EXPORT mgl_set_draw_reg_(uintptr_t *gr, int *nx, int *ny, int *m); /// Check if support of frames is enabled (i.e. MGL_VECT_FRAME is set and Quality&MGL_DRAW_LMEM==0) int MGL_EXPORT_PURE mgl_is_frames(HMGL gr); /// Get bit-value flag of HMGL state (for advanced users only) int MGL_EXPORT_PURE mgl_get_flag(HMGL gr, uint32_t flag); int MGL_EXPORT_PURE mgl_get_flag_(uintptr_t *gr, unsigned long *flag); /// Set bit-value flag of HMGL state (for advanced users only) void MGL_EXPORT mgl_set_flag(HMGL gr, int val, uint32_t flag); void MGL_EXPORT mgl_set_flag_(uintptr_t *gr, int *val, unsigned long *flag); /// Change counter of HMGL uses (for advanced users only). Non-zero counter prevent automatic object removing. long MGL_EXPORT mgl_use_graph(HMGL gr, int inc); long MGL_EXPORT mgl_use_graph_(uintptr_t *gr, int *inc); void MGL_EXPORT mgl_set_rdc_acc(HMGL gr, int reduce); void MGL_EXPORT mgl_set_rdc_acc_(uintptr_t *gr, int *reduce); /// Start group of objects void MGL_EXPORT mgl_start_group(HMGL gr, const char *name); void MGL_EXPORT mgl_start_group_(uintptr_t *gr, const char *name,int); /// End group of objects void MGL_EXPORT mgl_end_group(HMGL gr); void MGL_EXPORT mgl_end_group_(uintptr_t *gr); /// Highlight objects with given id void MGL_EXPORT mgl_highlight(HMGL gr, int id); void MGL_EXPORT mgl_highlight_(uintptr_t *gr, int *id); /// Set default palette void MGL_EXPORT mgl_set_palette(HMGL gr, const char *colors); void MGL_EXPORT mgl_set_palette_(uintptr_t *gr, const char *colors, int); void MGL_EXPORT mgl_set_pal_color_(uintptr_t *gr, int *n, mreal *r, mreal *g, mreal *b); void MGL_EXPORT mgl_set_pal_num_(uintptr_t *gr, int *num); /// Sets RGB values for color with given id void MGL_EXPORT mgl_set_color(char id, double r, double g, double b); void MGL_EXPORT mgl_set_color_(char *id, mreal *r, mreal *g, mreal *b, int); /// Set default color scheme void MGL_EXPORT mgl_set_def_sch(HMGL gr, const char *sch); void MGL_EXPORT mgl_set_def_sch_(uintptr_t *gr, const char *sch,int); /// Set mask for face coloring as array of type 'unsigned char[8]' void MGL_EXPORT mgl_set_mask(char id, const char *mask); void MGL_EXPORT mgl_set_mask_(const char *id, const char *mask,int,int); /// Set mask for face coloring as unsigned long number void MGL_EXPORT mgl_set_mask_val(char id, uint64_t mask); void MGL_EXPORT mgl_set_mask_val_(const char *id, uint64_t *mask,int); /// Set default mask rotation angle void MGL_EXPORT mgl_set_mask_angle(HMGL gr, int angle); void MGL_EXPORT mgl_set_mask_angle_(uintptr_t *gr, int *angle); /// Set default value of alpha-channel void MGL_EXPORT mgl_set_alpha_default(HMGL gr, double alpha); void MGL_EXPORT mgl_set_alpha_default_(uintptr_t *gr, mreal *alpha); /// Set relative width of rectangles in Bars, Barh, BoxPlot, Candle, OHLC (default is 0.7) void MGL_EXPORT mgl_set_bar_width(HMGL gr, double width); void MGL_EXPORT mgl_set_bar_width_(uintptr_t *gr, mreal *width); /// Set number of mesh lines (use 0 to draw all of them) void MGL_EXPORT mgl_set_meshnum(HMGL gr, int num); void MGL_EXPORT mgl_set_meshnum_(uintptr_t *gr, int *num); /// Set number of visible faces (use 0 to draw all of them) void MGL_EXPORT mgl_set_facenum(HMGL gr, int num); void MGL_EXPORT mgl_set_facenum_(uintptr_t *gr, int *num); /// Clear unused points and primitives. Useful only in combination with mgl_set_facenum(). void MGL_EXPORT mgl_clear_unused(HMGL gr); void MGL_EXPORT mgl_clear_unused_(uintptr_t *gr); /// Set TeX parsing at text drawing void MGL_EXPORT mgl_set_tex_parse(HMGL gr, int val); void MGL_EXPORT mgl_set_tex_parse_(uintptr_t *gr, int *val); /// Set ambient light brightness void MGL_EXPORT mgl_set_ambbr(HMGL gr, double i); void MGL_EXPORT mgl_set_ambbr_(uintptr_t *gr, mreal *i); /// Set diffusive light brightness void MGL_EXPORT mgl_set_difbr(HMGL gr, double i); void MGL_EXPORT mgl_set_difbr_(uintptr_t *gr, mreal *i); /// Use diffusive light (only for local light sources) -- OBSOLETE void MGL_EXPORT mgl_set_light_dif(HMGL gr, int enable); void MGL_EXPORT mgl_set_light_dif_(uintptr_t *gr, int *enable); /// Set cutting for points outside of bounding box void MGL_EXPORT mgl_set_cut(HMGL gr, int cut); void MGL_EXPORT mgl_set_cut_(uintptr_t *gr, int *cut); /// Set additional cutting box void MGL_EXPORT mgl_set_cut_box(HMGL gr, double x1,double y1,double z1,double x2,double y2,double z2); void MGL_EXPORT mgl_set_cut_box_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2); /// Set the cutting off condition (formula) void MGL_EXPORT mgl_set_cutoff(HMGL gr, const char *EqC); void MGL_EXPORT mgl_set_cutoff_(uintptr_t *gr, const char *EqC, int); /// Set values of axis range void MGL_EXPORT mgl_set_ranges(HMGL gr, double x1, double x2, double y1, double y2, double z1, double z2); void MGL_EXPORT mgl_set_ranges_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2, mreal *z1, mreal *z2); /// Set range in direction dir as [v1, v2] void MGL_EXPORT mgl_set_range_val(HMGL gr, char dir, double v1,double v2); void MGL_EXPORT mgl_set_range_val_(uintptr_t *gr, const char *dir, mreal *v1, mreal *v2,int); /// Add [v1, v2] to the current range in direction dir void MGL_EXPORT mgl_add_range_val(HMGL gr, char dir, double v1,double v2); void MGL_EXPORT mgl_add_range_val_(uintptr_t *gr, const char *dir, mreal *v1, mreal *v2,int); /// Set range in direction dir as minimal and maximal values of data a void MGL_EXPORT mgl_set_range_dat(HMGL gr, char dir, HCDT a, int add); void MGL_EXPORT mgl_set_range_dat_(uintptr_t *gr, const char *dir, uintptr_t *a, int *add,int); /// Set ranges for automatic variables void MGL_EXPORT mgl_set_auto_ranges(HMGL gr, double x1, double x2, double y1, double y2, double z1, double z2, double c1, double c2); void MGL_EXPORT mgl_set_auto_ranges_(uintptr_t *gr, mreal *x1, mreal *x2, mreal *y1, mreal *y2, mreal *z1, mreal *z2, mreal *c1, mreal *c2); /// Set axis range scaling -- simplified way to shift/zoom axis range -- need to redraw whole image! void MGL_EXPORT mgl_zoom_axis(HMGL gr, double x1,double y1,double z1,double c1,double x2,double y2,double z2,double c2); void MGL_EXPORT mgl_zoom_axis_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *c1, mreal *x2, mreal *y2, mreal *z2, mreal *c2); /// Set axis origin void MGL_EXPORT mgl_set_origin(HMGL gr, double x0, double y0, double z0); void MGL_EXPORT mgl_set_origin_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0); /// Set the transformation formulas for coordinate. Use "" or NULL for built-in ones void MGL_EXPORT mgl_set_func(HMGL gr, const char *EqX,const char *EqY,const char *EqZ,const char *EqA); void MGL_EXPORT mgl_set_func_(uintptr_t *gr, const char *EqX, const char *EqY, const char *EqZ, const char *EqA, int, int, int, int); /// Set one of predefined transformation rule void MGL_EXPORT mgl_set_coor(HMGL gr, int how); void MGL_EXPORT mgl_set_coor_(uintptr_t *gr, int *how); /// Set to draw Ternary axis (triangle like axis, grid and so on) /** val=1 for Ternary axis (a+b+c=1, z=z), * val=2 for Quaternary axis (a+b+c+d=1), * val|4 for projections. */ void MGL_EXPORT mgl_set_ternary(HMGL gr, int kind); void MGL_EXPORT mgl_set_ternary_(uintptr_t *gr, int *kind); /// Set to use or not tick labels rotation void MGL_EXPORT mgl_set_tick_rotate(HMGL gr, int enable); void MGL_EXPORT mgl_set_tick_rotate_(uintptr_t *gr, int *enable); /// Set to use or not tick labels skipping void MGL_EXPORT mgl_set_tick_skip(HMGL gr, int enable); void MGL_EXPORT mgl_set_tick_skip_(uintptr_t *gr, int *enable); /// Set default font for all new HMGL objects void MGL_EXPORT mgl_def_font(const char *name, const char *path); void MGL_EXPORT mgl_def_font_(const char *name, const char *path,int,int); /// Set default size of marks (locally you can use "size" option) void MGL_EXPORT mgl_set_mark_size(HMGL gr, double size); void MGL_EXPORT mgl_set_mark_size_(uintptr_t *gr, mreal *size); /// Set default size of arrows (locally you can use "size" option) void MGL_EXPORT mgl_set_arrow_size(HMGL gr, double size); void MGL_EXPORT mgl_set_arrow_size_(uintptr_t *gr, mreal *size); /// Set default font size void MGL_EXPORT mgl_set_font_size(HMGL gr, double size); void MGL_EXPORT mgl_set_font_size_(uintptr_t *gr, mreal *size); /// Set default font style and color void MGL_EXPORT mgl_set_font_def(HMGL gr, const char *fnt); void MGL_EXPORT mgl_set_font_def_(uintptr_t *gr, const char *fnt, int); /// Set to use or not text rotation void MGL_EXPORT mgl_set_rotated_text(HMGL gr, int enable); void MGL_EXPORT mgl_set_rotated_text_(uintptr_t *gr, int *enable); /// Set to scale text in relative subplots too void MGL_EXPORT mgl_set_scale_text(HMGL gr, int enable); void MGL_EXPORT mgl_set_scale_text_(uintptr_t *gr, int *enable); /// Load font from file void MGL_EXPORT mgl_load_font(HMGL gr, const char *name, const char *path); void MGL_EXPORT mgl_load_font_(uintptr_t *gr, char *name, char *path, int l, int n); /// Copy font from another mglGraph instance void MGL_EXPORT mgl_copy_font(HMGL gr, HMGL gr_from); void MGL_EXPORT mgl_copy_font_(uintptr_t *gr, uintptr_t *gr_from); /// Restore font (load default font for new HMGL objects) void MGL_EXPORT mgl_restore_font(HMGL gr); void MGL_EXPORT mgl_restore_font_(uintptr_t *gr); /// Add user-defined glyph for symbol and set its optional id void MGL_EXPORT mgl_define_symbol(HMGL gr, char id, HCDT x, HCDT y); void MGL_EXPORT mgl_define_symbol_(uintptr_t *gr, char *id, uintptr_t *x, uintptr_t *y,int); #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/Fl_MathGL.h0000664000175000017500000002547014167366472017004 0ustar balakinbalakin/*************************************************************************** * Fl_MathGL.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_FL_MATHGL_H_ #define _MGL_FL_MATHGL_H_ #ifdef __MWERKS__ # define FL_DLL #endif #include #include #include #include #include #include #include #include class mglCanvas; class Fl_Double_Window; //----------------------------------------------------------------------------- /// Class is FLTK widget which display MathGL graphics class MGL_EXPORT Fl_MathGL : public Fl_Widget { friend class Fl_MGLView; public: Fl_Valuator *tet_val; ///< pointer to external tet-angle validator Fl_Valuator *phi_val; ///< pointer to external phi-angle validator std::string prim; ///< manual primitives bool use_pthr; ///< use pthread for update plot Fl_MathGL(int x, int y, int w, int h, const char *label=0); virtual ~Fl_MathGL(); /// Set drawing functions and its parameter inline void set_draw(int (*func)(mglBase *gr, void *par), void *par) { if(draw_cl) delete draw_cl; draw_cl=0; draw_func=func; draw_par=par; } /// Set drawing functions pointed on mglGraph inline void set_draw(int (*dr)(mglGraph *gr)) { set_draw(dr?mgl_draw_graph:0,(void*)dr); } /// Set drawing based on instance of mglDraw class inline void set_draw(mglDraw *dr) { if(draw_cl) delete draw_cl; draw_cl=dr; draw_func=0; } /// Set function for parameters inline void set_prop(void (*func)(char id, const char *val, void *par), void *par) { prop_func=func; prop_par=par; } /// Set function for handling events. Note, use Fl::event_key() for getting pressed keybutton inline void set_handle(int (*func)(int val, void *par), void *par) { hndl_func=func; hndl_par=par; } /// Refresh image (without executing update) void refresh(); /// Update (redraw) plot virtual void update(); /// Set angles for additional plot rotation inline void set_angle(double t, double p){ tet = t; phi = p; } /// Set bitwise flags for general state (1-Alpha, 2-Light) inline void set_flag(int f) { flag = f; } /// Set flags for handling mouse void set_state(bool z, bool r, bool g=false) { zoom = z; rotate = r; grid = g; } /// Set zoom in/out region inline void set_zoom(double X1, double Y1, double X2, double Y2) { x1 = X1; x2 = X2; y1 = Y1; y2 = Y2; update(); } /// Get zoom region inline void get_zoom(double *X1, double *Y1, double *X2, double *Y2) { *X1 = x1; *X2 = x2; *Y1 = y1; *Y2 = y2; } /// Set popup menu pointer inline void set_popup(const Fl_Menu_Item *pmenu, Fl_Widget *wdg, void *v) { popup = pmenu; wpar = wdg; vpar = v; } /// Set grapher object instead of built-in one. /// NOTE: Fl_MathGL will automatically delete this object void set_graph(HMGL gr); /// Set grapher object instead of built-in one. inline void set_graph(mglGraph *Gr) { set_graph(Gr->Self()); } /// Get pointer to grapher inline HMGL get_graph() { return (HMGL)gr; } /// Nullify grapher object for disabling double free. NOTE: this is internal function. void no_graph() {gr=0;}; /// Get mglDraw pointer or NULL inline mglDraw *get_class() { mglDraw *d=0; if(draw_func==mgl_draw_class) d = (mglDraw*)draw_par; if(draw_cl) d = draw_cl; return d; } inline void set_param(char id, const char *val) { mglDraw *d=get_class(); if(d) d->Param(id,val); else prop_func(id,val,prop_par); } /// Show window with warnings after script parsing inline void set_show_warn(bool s) { show_warn=s; } /// Ask to stop of script parsing void stop(bool stop=true); /// Enable/disable key handling as in mglview (default is false) inline void set_handle_key(bool val) { handle_keys=val; } /// Get id of last clicked object inline int get_last_id() { return last_id; } void draw_plot(); ///< Single thread drawing itself /// Check if script is parsing now or not inline bool running() { return run; } protected: mglCanvas *gr; ///< Built-in mglCanvas instance (mglCanvasFL is used by default) void *draw_par; ///< Parameters for drawing function draw_func(). /// Drawing function for window procedure. It should return the number of frames. int (*draw_func)(mglBase *gr, void *par); void *prop_par; ///< Parameters for prop_func(). /// Function for setting properties. void (*prop_func)(char id, const char *val, void *par); void *hndl_par; ///< Parameters for hndl_func(). /// Function for handling events. int (*hndl_func)(int val, void *par); mglDraw *draw_cl; int last_id; ///< last selected object id const Fl_Menu_Item *popup; ///< pointer to popup menu items Fl_Widget *wpar; ///< widget for popup menu void *vpar; ///< parameter for popup menu double tet,phi; ///< rotation angles bool rotate; ///< flag for handle mouse bool zoom; ///< flag for zoom by mouse bool grid; ///< flag to draw grid and edit prim bool show_warn; ///< show window with warnings bool handle_keys; double x1,x2,y1,y2; ///< zoom region int flag; ///< bitwise flag for general state (1-Alpha, 2-Light) int x0,y0,xe,ye; ///< mouse position char mouse_pos[128]; bool run; ///< flag that drawing in progress const unsigned char *img; ///< image for drawing #if (MGL_HAVE_PTHREAD|MGL_HAVE_PTHR_WIDGET) pthread_t thr; ///< main thread for drawing #endif virtual void draw(); ///< quick drawing function int handle(int code); ///< handle mouse events void resize(int x, int y, int w, int h); ///< resize control }; //----------------------------------------------------------------------------- class MGL_EXPORT Fl_MGLView : public Fl_Window { public: Fl_MathGL *FMGL; ///< Control which draw graphics Fl_Scroll *scroll; Fl_Menu_Bar *menu; void *par; ///< Parameter for handling animation void (*next)(void*); ///< Callback function for next frame void (*prev)(void*); ///< Callback function for prev frame mreal (*delay)(void*); ///< Callback function for delay void (*reload)(void*); ///< Callback function for reloading /// Toggle transparency (alpha) button void toggle_alpha(); /// Toggle lighting button void toggle_light(); /// Toggle slideshow button void toggle_sshow(); /// Toggle grid drawing button void toggle_grid(); /// Toggle mouse zoom button void toggle_zoom() { toggle(zoom, zoom_bt); } /// Toggle mouse rotate button void toggle_rotate(){ toggle(rotate, rotate_bt); } /// Switch off zoom button void setoff_zoom() { setoff(zoom, zoom_bt); } /// Switch off rotate button void setoff_rotate(){ setoff(rotate, rotate_bt); } /// Check if slideshow running bool is_sshow() { return sshow; } /// Toggle pause calculation button void toggle_pause(); /// Adjust image sizes to the current widget sizes void adjust() { mgl_set_size(FMGL->get_graph(),scroll->w(),scroll->h()); FMGL->size(scroll->w(),scroll->h()); update(); } /// Get current grapher HMGL get_graph() { return FMGL->get_graph(); } /// Update picture by calling user drawing function void update(); /// Create and show custom dialog void dialog(const char *ids, char const * const *args, const char *title="") { if(!ids || *ids==0) return; dlg_window(title); for(int i=0;ids[i];i++) add_widget(ids[i], args[i]); dlg_finish(); dlg_wnd->show(); } void dialog(const std::string &ids, const std::vector &args, const char *title="") { std::vector buf; buf.reserve(args.size()); for(size_t i=0;ishow(); } void dlg_window(const char *title=""); ///< Create/label dialog window void add_widget(char id, const char *args); ///< Add widget to dialog void dlg_show(); ///< Show window void dlg_hide(); ///< Close window void get_values(); ///< Get all values from dialog window void set_progress(int value, int maximal); ///< Set progress Fl_MGLView(int x, int y, int w, int h, const char *label=0); virtual ~Fl_MGLView(); protected: Fl_Button *alpha_bt, *light_bt, *rotate_bt, *anim_bt, *zoom_bt, *grid_bt, *pause_bt; Fl_Progress *progress; int grid, alpha, light; ///< Current states of wire, alpha, light switches (toggle buttons) int sshow, rotate, zoom;///< Current states of slideshow, rotate, zoom switches (toggle buttons) int pauseC; ///< Current state of pause for calculations void toggle(int &val, Fl_Button *b, const char *txt=NULL); void setoff(int &val, Fl_Button *b, const char *txt=NULL); void exec_pause(); Fl_Double_Window *dlg_wnd; ///< Dialog window itself std::vector strs; ///< Strings for widget labels bool dlg_done; ///< Dialog is created int dlg_ind; ///< Current index of widget std::vector dlg_kind; ///< Kind of elements std::vector dlg_wdgt; ///< List of widgets std::vector dlg_ids; ///< Id of elements std::vector dlg_vals; ///< resulting strings void dlg_finish(); ///< Finish dialog window creation }; //----------------------------------------------------------------------------- void MGL_EXPORT mgl_makemenu_fltk(Fl_Menu_ *m, Fl_MGLView *w); MGL_EXPORT const char *mgl_file_chooser(const char *mess, const char *filter="", bool save=false); MGL_EXPORT const char *mgl_dir_chooser(const char *mess, const char *path); //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/font.h0000664000175000017500000001747114167366472016217 0ustar balakinbalakin/*************************************************************************** * font.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ //----------------------------------------------------------------------------- #ifndef _MGL_FONT_H_ #define _MGL_FONT_H_ #include "mgl2/define.h" //----------------------------------------------------------------------------- #define MGL_FONT_BOLD 0x01000000 // This value is used binary #define MGL_FONT_ITAL 0x02000000 // This value is used binary #define MGL_FONT_BOLD_ITAL 0x03000000 #define MGL_FONT_WIRE 0x04000000 #define MGL_FONT_OLINE 0x08000000 // This value is used binary #define MGL_FONT_ULINE 0x10000000 #define MGL_FONT_ZEROW 0x20000000 // internal codes #define MGL_FONT_UPPER 0x40000000 #define MGL_FONT_LOWER 0x80000000 #define MGL_FONT_ROMAN 0xfcffffff #define MGL_FONT_MASK 0x00ffffff #define MGL_COLOR_MASK 0xffffff00 #define MGL_FONT_STYLE 0x3f000000 //----------------------------------------------------------------------------- struct mglGlyphDescr { wchar_t id; ///< Unicode ID for glyph int tr[4]; ///< Shift of glyph description by triangles (for solid font) int ln[4]; ///< Shift of glyph description by lines (for wire font) short numt[4]; ///< Number of triangles in glyph description (for solid font) short numl[4]; ///< Number of lines in glyph description (for wire font) short width[4]; ///< Width of glyph for wire font short y1[4], y2[4]; ///< minimal and maximal y-coordinates mglGlyphDescr() { memset(this,0,sizeof(mglGlyphDescr)); } }; inline bool operator<(const mglGlyphDescr &a,const mglGlyphDescr &b) { return a.id(const mglGlyphDescr &a,const mglGlyphDescr &b) { return a.id>b.id; } #if defined(_MSC_VER) MGL_EXTERN template class MGL_EXPORT std::vector; #endif //----------------------------------------------------------------------------- extern const float mgl_fact; struct MGL_EXPORT mglTeXsymb { unsigned kod; const wchar_t *tex; }; const float mgl_fgen = 4*14; /// Get font color, style and align for internal parser bool MGL_EXPORT mglGetStyle(const char *how, int *font, int *align=0); long MGL_EXPORT mgl_internal_code(unsigned s, const std::vector &glyphs); class mglBase; //----------------------------------------------------------------------------- /// Class for font typeface and text plotting procedures class MGL_EXPORT mglFont { public: mglBase *gr; ///< mglBase class used for drawing characters mglFont(); mglFont(const char *name, const char *path=0); virtual ~mglFont(); bool parse; ///< Parse LaTeX symbols /// Load font data to memory. Normally used by constructor. bool Load(const char *base, const char *path=0); /// Load binary font data to memory. Normally used by constructor. bool LoadBin(const char *base, const char *path=0); /// Save binary font data size_t SaveBin(const char *fname); /// Free memory void Clear(); /// Copy data from other font void Copy(mglFont *); /// Restore default font void Restore(); /// Return true if font is loaded inline bool Ready() const { return GetNumGlyph()!=0; } /// Get height of text float Height(int font) const MGL_FUNC_PURE; /// Get height of text float Height(const char *how) const MGL_FUNC_PURE; /// Print text string for font specified by string float Puts(const char *str,const char *how,float c1,float c2) const; /// Get width of text string for font specified by string float Width(const char *str, const char *how, float *y1=0, float *y2=0) const; /// Print text string for font specified by string float Puts(const wchar_t *str,const char *how,float c1,float c2) const; /// Get width of text string for font specified by string float Width(const wchar_t *str,const char *how, float *y1=0, float *y2=0) const; /// Set height scaling factor inline void HeightScale(float s=1) { Hscale = s>0?s:1; } /// Get internal code for symbol inline long Internal(unsigned s) const { return mgl_internal_code(s,glyphs); } /// Return number of glyphs inline unsigned GetNumGlyph() const { return glyphs.size(); }; /// Return some of pointers inline const short *GetTr(int s, long j) const { return Buf+glyphs[j].tr[s]; } inline const short *GetLn(int s, long j) const { return Buf+glyphs[j].ln[s]; } inline int GetNt(int s, long j) const { return glyphs[j].numt[s]; } inline int GetNl(int s, long j) const { return glyphs[j].numl[s]; } inline short GetWidth(int s, long j) const { return glyphs[j].width[s]; } inline float GetFact(int s) const { return fact[s]; } inline wchar_t GetUnicode(long j) const { return j>=0?glyphs[j].id:0; } protected: std::vector glyphs; ///< information about know glyphs float fact[4]; ///< Divider for width of glyph short *Buf; ///< Buffer for glyph descriptions size_t numb; ///< Buffer size float Hscale; ///< Height scaling /// Print text string for font specified by integer constant float Puts(const wchar_t *str,int font,int align, float c1,float c2) const; /// Get height of text string for font specified by integer constant float Height(const wchar_t *str,int font) const; /// Get width of text string for font specified by integer constant float Width(const wchar_t *str,int font,int align, float &y1, float &y2) const; /// Replace TeX symbols by its UTF code and add font styles void Convert(const wchar_t *str, unsigned *res) const; /// Fill minimal and maximal y-coordinates void FillY12(); /// Draw string recursively /* x,y - position, f - factor, style: 0x1 - italic, 0x2 - bold, 0x4 - overline, 0x8 - underline, 0x10 - empty (not draw) */ float Puts(const unsigned *str, float x,float y,float f,int style,float c1,float c2, float &y1, float &y2) const; /// Parse LaTeX command unsigned Parse(const wchar_t *s) const; /// Get symbol for character ch with given font style unsigned Symbol(char ch) const MGL_FUNC_PURE; private: float get_ptr(long &i,unsigned *str, unsigned **b1, unsigned **b2,float &w1,float &w2, float f1, float f2, int st) const; bool read_data(const char *fname, int s, std::vector &buf, std::vector &extra); void main_copy(); bool read_main(const char *fname, std::vector &buf); inline void mem_alloc(long numg) { glyphs.resize(numg); } bool read_def(); void draw_ouline(int st, float x, float y, float f, float g, float ww, float ccol) const; }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/include/mgl2/mgl_cf.h0000664000175000017500000000502414167366472016467 0ustar balakinbalakin/*************************************************************************** * mgl_cf.cpp is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_CF_H_ #define _MGL_CF_H_ //----------------------------------------------------------------------------- #ifdef __cplusplus #include #include #endif //----------------------------------------------------------------------------- #include #include #include #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- #if MGL_HAVE_OPENGL #ifdef __cplusplus extern "C" { #endif //----------------------------------------------------------------------------- HMGL MGL_EXPORT mgl_create_graph_gl(); uintptr_t MGL_EXPORT mgl_create_graph_gl_(); //----------------------------------------------------------------------------- #ifdef __cplusplus } #endif #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/mathgl.fs0000664000175000017500000013613614167366472016706 0ustar balakinbalakinModule mathgl also dos library libmgl libmgl.so library libmgl-glut libmgl-glut.so library libmgl-fltk libmgl-fltk.so library libmgl-qt libmgl-qt.so library libmgl-wx libmgl-wx.so legacy off libmgl mgl_create_graph_gl (ptr) mgl_create_graph_gl libmgl mgl_create_graph_zb int int (ptr) mgl_create_graph_zb libmgl mgl_create_graph_ps int int (ptr) mgl_create_graph_ps libmgl mgl_fortran_func ptr ptr (int) mgl_fortran_func libmgl-glut mgl_create_graph_glut ptr ptr ptr (ptr) mgl_create_graph_glut libmgl-fltk mgl_create_graph_fltk ptr ptr ptr (ptr) mgl_create_graph_fltk libmgl-qt mgl_create_graph_qt ptr ptr ptr (ptr) mgl_create_graph_qt \ libmgl-glut mgl_create_graph_glut_dr ptr ptr (ptr) mgl_create_graph_glut_dr \ libmgl-fltk mgl_create_graph_fltk_dr ptr ptr (ptr) mgl_create_graph_fltk_dr \ libmgl-qt mgl_create_graph_qt_dr ptr ptr (ptr) mgl_create_graph_qt_dr libmgl mgl_create_graph_idtf (ptr) mgl_create_graph_idtf libmgl-fltk mgl_fltk_run (void) mgl_fltk_run libmgl-qt mgl_qt_run (void) mgl_qt_run libmgl mgl_set_show_mouse_pos int ptr (void) mgl_set_show_mouse_pos libmgl mgl_get_last_mouse_pos sf sf sf ptr (void) mgl_get_last_mouse_pos libmgl mgl_update ptr (void) mgl_update libmgl mgl_delete_graph ptr (void) mgl_delete_graph libmgl mgl_create_data (ptr) mgl_create_data libmgl mgl_create_data_size int int int (ptr) mgl_create_data_size libmgl mgl_create_data_file ptr (ptr) mgl_create_data_file libmgl mgl_delete_data ptr (void) mgl_delete_data libmgl mgl_create_parser (ptr) mgl_create_parser libmgl mgl_delete_parser ptr (void) mgl_delete_parser libmgl mgl_add_param ptr int ptr (void) mgl_add_param libmgl mgl_add_paramw ptr int ptr (void) mgl_add_paramw libmgl mgl_add_var ptr ptr (ptr) mgl_add_var libmgl mgl_find_var ptr ptr (ptr) mgl_find_var libmgl mgl_parse int ptr ptr ptr (int) mgl_parse libmgl mgl_parsew int ptr ptr ptr (int) mgl_parsew libmgl mgl_parse_text ptr ptr ptr (void) mgl_parse_text libmgl mgl_parsew_text ptr ptr ptr (void) mgl_parsew_text libmgl mgl_restore_once ptr (void) mgl_restore_once libmgl mgl_parser_allow_setsize int ptr (void) mgl_parser_allow_setsize libmgl mgl_set_def_param ptr (void) mgl_set_def_param libmgl mgl_set_palette ptr ptr (void) mgl_set_palette libmgl mgl_set_pal_color sf sf sf int ptr (void) mgl_set_pal_color libmgl mgl_set_pal_num int ptr (void) mgl_set_pal_num libmgl mgl_set_rotated_text int ptr (void) mgl_set_rotated_text libmgl mgl_set_cut int ptr (void) mgl_set_cut libmgl mgl_set_cut_box sf sf sf sf sf sf ptr (void) mgl_set_cut_box libmgl mgl_set_tick_len sf ptr (void) mgl_set_tick_len libmgl mgl_set_bar_width sf ptr (void) mgl_set_bar_width libmgl mgl_set_base_line_width sf ptr (void) mgl_set_base_line_width libmgl mgl_set_mark_size sf ptr (void) mgl_set_mark_size libmgl mgl_set_arrow_size sf ptr (void) mgl_set_arrow_size libmgl mgl_set_font_size sf ptr (void) mgl_set_font_size libmgl mgl_set_font_def ptr ptr (void) mgl_set_font_def libmgl mgl_set_alpha_default sf ptr (void) mgl_set_alpha_default libmgl mgl_set_size int int ptr (void) mgl_set_size libmgl mgl_set_axial_dir ptr ptr (void) mgl_set_axial_dir libmgl mgl_set_meshnum int ptr (void) mgl_set_meshnum libmgl mgl_set_zoom sf sf sf sf ptr (void) mgl_set_zoom libmgl mgl_set_plotfactor sf ptr (void) mgl_set_plotfactor libmgl mgl_set_draw_face int ptr (void) mgl_set_draw_face libmgl mgl_set_scheme ptr ptr (void) mgl_set_scheme libmgl mgl_load_font ptr ptr ptr (void) mgl_load_font libmgl mgl_copy_font ptr ptr (void) mgl_copy_font libmgl mgl_restore_font ptr (void) mgl_restore_font libmgl mgl_show_image int ptr ptr (void) mgl_show_image libmgl mgl_write_frame ptr ptr ptr (void) mgl_write_frame libmgl mgl_write_bmp ptr ptr ptr (void) mgl_write_bmp libmgl mgl_write_jpg ptr ptr ptr (void) mgl_write_jpg libmgl mgl_write_png ptr ptr ptr (void) mgl_write_png libmgl mgl_write_png_solid ptr ptr ptr (void) mgl_write_png_solid libmgl mgl_write_eps ptr ptr ptr (void) mgl_write_eps libmgl mgl_write_svg ptr ptr ptr (void) mgl_write_svg libmgl mgl_write_idtf ptr ptr ptr (void) mgl_write_idtf libmgl mgl_write_gif ptr ptr ptr (void) mgl_write_gif libmgl mgl_start_gif int ptr ptr (void) mgl_start_gif libmgl mgl_close_gif ptr (void) mgl_close_gif libmgl mgl_get_rgb ptr (ptr) mgl_get_rgb libmgl mgl_get_rgba ptr (ptr) mgl_get_rgba libmgl mgl_get_width ptr (int) mgl_get_width libmgl mgl_get_height ptr (int) mgl_get_height libmgl mgl_new_frame ptr (int) mgl_new_frame libmgl mgl_end_frame ptr (void) mgl_end_frame libmgl mgl_get_num_frame ptr (int) mgl_get_num_frame libmgl mgl_reset_frames ptr (void) mgl_reset_frames libmgl mgl_set_transp_type int ptr (void) mgl_set_transp_type libmgl mgl_set_transp int ptr (void) mgl_set_transp libmgl mgl_set_alpha int ptr (void) mgl_set_alpha libmgl mgl_set_fog sf sf ptr (void) mgl_set_fog libmgl mgl_set_light int ptr (void) mgl_set_light libmgl mgl_set_light_n int int ptr (void) mgl_set_light_n libmgl mgl_add_light ptr sf sf sf int ptr (void) mgl_add_light libmgl mgl_add_light_rgb sf sf sf sf int sf sf sf int ptr (void) mgl_add_light_rgb libmgl mgl_set_ambbr sf ptr (void) mgl_set_ambbr libmgl mgl_identity ptr (void) mgl_identity libmgl mgl_clf ptr (void) mgl_clf libmgl mgl_flush ptr (void) mgl_flush libmgl mgl_clf_rgb sf sf sf ptr (void) mgl_clf_rgb libmgl mgl_subplot int int int ptr (void) mgl_subplot libmgl mgl_subplot_d sf sf int int int ptr (void) mgl_subplot_d libmgl mgl_inplot sf sf sf sf ptr (void) mgl_inplot libmgl mgl_relplot sf sf sf sf ptr (void) mgl_relplot libmgl mgl_columnplot int int ptr (void) mgl_columnplot libmgl mgl_aspect sf sf sf ptr (void) mgl_aspect libmgl mgl_rotate sf sf sf ptr (void) mgl_rotate libmgl mgl_rotate_vector sf sf sf sf ptr (void) mgl_rotate_vector libmgl mgl_perspective sf ptr (void) mgl_perspective libmgl mgl_set_ticks sf sf sf ptr (void) mgl_set_ticks libmgl mgl_set_subticks int int int ptr (void) mgl_set_subticks libmgl mgl_set_ticks_dir sf int sf ptr ptr (void) mgl_set_ticks_dir \ libmgl mgl_set_ticks_val ... ptr double val int ptr ptr (void) mgl_set_ticks_val libmgl mgl_set_ticks_vals ptr sf int ptr ptr (void) mgl_set_ticks_vals libmgl mgl_set_caxis sf sf ptr (void) mgl_set_caxis libmgl mgl_set_axis sf sf sf sf sf sf sf sf sf ptr (void) mgl_set_axis libmgl mgl_set_axis_3d sf sf sf sf sf sf ptr (void) mgl_set_axis_3d libmgl mgl_set_axis_2d sf sf sf sf ptr (void) mgl_set_axis_2d libmgl mgl_set_origin sf sf sf ptr (void) mgl_set_origin libmgl mgl_set_tick_origin sf sf sf ptr (void) mgl_set_tick_origin libmgl mgl_set_crange int ptr ptr (void) mgl_set_crange libmgl mgl_set_xrange int ptr ptr (void) mgl_set_xrange libmgl mgl_set_yrange int ptr ptr (void) mgl_set_yrange libmgl mgl_set_zrange int ptr ptr (void) mgl_set_zrange libmgl mgl_set_auto sf sf sf sf sf sf ptr (void) mgl_set_auto libmgl mgl_set_func ptr ptr ptr ptr (void) mgl_set_func libmgl mgl_set_ternary int ptr (void) mgl_set_ternary libmgl mgl_set_cutoff ptr ptr (void) mgl_set_cutoff libmgl mgl_box int ptr (void) mgl_box libmgl mgl_box_str int ptr ptr (void) mgl_box_str libmgl mgl_box_rgb int sf sf sf ptr (void) mgl_box_rgb libmgl mgl_axis ptr ptr (void) mgl_axis libmgl mgl_axis_grid ptr ptr ptr (void) mgl_axis_grid libmgl mgl_label ptr ptr ptr (void) mgl_label libmgl mgl_label_ext sf sf int ptr ptr ptr (void) mgl_label_ext libmgl mgl_tune_ticks sf int ptr (void) mgl_tune_ticks libmgl mgl_set_xttw ptr ptr (void) mgl_set_xttw libmgl mgl_set_yttw ptr ptr (void) mgl_set_yttw libmgl mgl_set_zttw ptr ptr (void) mgl_set_zttw libmgl mgl_set_cttw ptr ptr (void) mgl_set_cttw libmgl mgl_set_xtt ptr ptr (void) mgl_set_xtt libmgl mgl_set_ytt ptr ptr (void) mgl_set_ytt libmgl mgl_set_ztt ptr ptr (void) mgl_set_ztt libmgl mgl_set_ctt ptr ptr (void) mgl_set_ctt libmgl mgl_ball sf sf sf ptr (void) mgl_ball libmgl mgl_ball_rgb sf sf sf sf sf sf sf ptr (void) mgl_ball_rgb libmgl mgl_ball_str ptr sf sf sf ptr (void) mgl_ball_str libmgl mgl_line int ptr sf sf sf sf sf sf ptr (void) mgl_line libmgl mgl_facex sf sf ptr sf sf sf sf sf ptr (void) mgl_facex libmgl mgl_facey sf sf ptr sf sf sf sf sf ptr (void) mgl_facey libmgl mgl_facez sf sf ptr sf sf sf sf sf ptr (void) mgl_facez libmgl mgl_curve int ptr sf sf sf sf sf sf sf sf sf sf sf sf ptr (void) mgl_curve libmgl mgl_puts ptr sf sf sf ptr (void) mgl_puts libmgl mgl_putsw ptr sf sf sf ptr (void) mgl_putsw libmgl mgl_puts_dir sf ptr sf sf sf sf sf sf ptr (void) mgl_puts_dir libmgl mgl_putsw_dir sf ptr sf sf sf sf sf sf ptr (void) mgl_putsw_dir libmgl mgl_text ptr sf sf sf ptr (void) mgl_text libmgl mgl_title sf ptr ptr ptr (void) mgl_title libmgl mgl_titlew sf ptr ptr ptr (void) mgl_titlew libmgl mgl_putsw_ext ptr sf ptr ptr sf sf sf ptr (void) mgl_putsw_ext libmgl mgl_puts_ext ptr sf ptr ptr sf sf sf ptr (void) mgl_puts_ext libmgl mgl_text_ext ptr sf ptr ptr sf sf sf ptr (void) mgl_text_ext libmgl mgl_colorbar int ptr ptr (void) mgl_colorbar libmgl mgl_colorbar_ext sf sf sf sf int ptr ptr (void) mgl_colorbar_ext libmgl mgl_simple_plot ptr int ptr ptr (void) mgl_simple_plot libmgl mgl_add_legend ptr ptr ptr (void) mgl_add_legend libmgl mgl_add_legendw ptr ptr ptr (void) mgl_add_legendw libmgl mgl_clear_legend ptr (void) mgl_clear_legend libmgl mgl_legend_xy sf sf ptr sf sf ptr (void) mgl_legend_xy libmgl mgl_legend sf sf ptr int ptr (void) mgl_legend libmgl mgl_set_legend_box int ptr (void) mgl_set_legend_box libmgl mgl_fplot int ptr ptr ptr (void) mgl_fplot libmgl mgl_fplot_xyz int ptr ptr ptr ptr ptr (void) mgl_fplot_xyz libmgl mgl_plot_xyz ptr ptr ptr ptr ptr (void) mgl_plot_xyz libmgl mgl_plot_xy ptr ptr ptr ptr (void) mgl_plot_xy libmgl mgl_plot ptr ptr ptr (void) mgl_plot libmgl mgl_plot_2 ptr ptr ptr (void) mgl_plot_2 libmgl mgl_plot_3 ptr ptr ptr (void) mgl_plot_3 libmgl mgl_tens_xyz ptr ptr ptr ptr ptr ptr (void) mgl_tens_xyz libmgl mgl_tens_xy ptr ptr ptr ptr ptr (void) mgl_tens_xy libmgl mgl_tens ptr ptr ptr ptr (void) mgl_tens libmgl mgl_area_xyz ptr ptr ptr ptr ptr (void) mgl_area_xyz libmgl mgl_area_xy ptr ptr ptr ptr (void) mgl_area_xy libmgl mgl_area_xys ptr ptr ptr ptr (void) mgl_area_xys libmgl mgl_area ptr ptr ptr (void) mgl_area libmgl mgl_area_2 ptr ptr ptr (void) mgl_area_2 libmgl mgl_area_3 ptr ptr ptr (void) mgl_area_3 libmgl mgl_region_xy int ptr ptr ptr ptr ptr (void) mgl_region_xy libmgl mgl_region int ptr ptr ptr ptr (void) mgl_region libmgl mgl_mark ptr sf sf sf ptr (void) mgl_mark libmgl mgl_stem_xyz ptr ptr ptr ptr ptr (void) mgl_stem_xyz libmgl mgl_stem_xy ptr ptr ptr ptr (void) mgl_stem_xy libmgl mgl_stem ptr ptr ptr (void) mgl_stem libmgl mgl_stem_2 ptr ptr ptr (void) mgl_stem_2 libmgl mgl_stem_3 ptr ptr ptr (void) mgl_stem_3 libmgl mgl_step_xyz ptr ptr ptr ptr ptr (void) mgl_step_xyz libmgl mgl_step_xy ptr ptr ptr ptr (void) mgl_step_xy libmgl mgl_step ptr ptr ptr (void) mgl_step libmgl mgl_step_2 ptr ptr ptr (void) mgl_step_2 libmgl mgl_step_3 ptr ptr ptr (void) mgl_step_3 libmgl mgl_bars_xyz ptr ptr ptr ptr ptr (void) mgl_bars_xyz libmgl mgl_bars_xy ptr ptr ptr ptr (void) mgl_bars_xy libmgl mgl_bars ptr ptr ptr (void) mgl_bars libmgl mgl_bars_2 ptr ptr ptr (void) mgl_bars_2 libmgl mgl_bars_3 ptr ptr ptr (void) mgl_bars_3 libmgl mgl_barh_yx ptr ptr ptr ptr (void) mgl_barh_yx libmgl mgl_barh ptr ptr ptr (void) mgl_barh libmgl mgl_torus ptr ptr ptr ptr (void) mgl_torus libmgl mgl_torus_2 ptr ptr ptr (void) mgl_torus_2 libmgl mgl_text_xyz sf ptr ptr ptr ptr ptr ptr (void) mgl_text_xyz libmgl mgl_text_xy sf ptr ptr ptr ptr ptr (void) mgl_text_xy libmgl mgl_text_y sf ptr ptr ptr ptr (void) mgl_text_y libmgl mgl_chart ptr ptr ptr (void) mgl_chart libmgl mgl_error ptr ptr ptr ptr (void) mgl_error libmgl mgl_error_xy ptr ptr ptr ptr ptr (void) mgl_error_xy libmgl mgl_error_exy ptr ptr ptr ptr ptr ptr (void) mgl_error_exy libmgl mgl_mark_xyz ptr ptr ptr ptr ptr ptr (void) mgl_mark_xyz libmgl mgl_mark_xy ptr ptr ptr ptr ptr (void) mgl_mark_xy libmgl mgl_mark_y ptr ptr ptr ptr (void) mgl_mark_y libmgl mgl_tube_xyzr ptr ptr ptr ptr ptr ptr (void) mgl_tube_xyzr libmgl mgl_tube_xyr ptr ptr ptr ptr ptr (void) mgl_tube_xyr libmgl mgl_tube_r ptr ptr ptr ptr (void) mgl_tube_r libmgl mgl_tube_xyz ptr sf ptr ptr ptr ptr (void) mgl_tube_xyz libmgl mgl_tube_xy ptr sf ptr ptr ptr (void) mgl_tube_xy libmgl mgl_tube ptr sf ptr ptr (void) mgl_tube libmgl mgl_textmark_xyzr ptr ptr ptr ptr ptr ptr ptr (void) mgl_textmark_xyzr libmgl mgl_textmark_xyr ptr ptr ptr ptr ptr ptr (void) mgl_textmark_xyr libmgl mgl_textmark_yr ptr ptr ptr ptr ptr (void) mgl_textmark_yr libmgl mgl_textmark ptr ptr ptr ptr (void) mgl_textmark libmgl mgl_textmarkw_xyzr ptr ptr ptr ptr ptr ptr ptr (void) mgl_textmarkw_xyzr libmgl mgl_textmarkw_xyr ptr ptr ptr ptr ptr ptr (void) mgl_textmarkw_xyr libmgl mgl_textmarkw_yr ptr ptr ptr ptr ptr (void) mgl_textmarkw_yr libmgl mgl_textmarkw ptr ptr ptr ptr (void) mgl_textmarkw libmgl mgl_fsurf int ptr ptr ptr (void) mgl_fsurf libmgl mgl_fsurf_xyz int ptr ptr ptr ptr ptr (void) mgl_fsurf_xyz libmgl mgl_grid_xy sf ptr ptr ptr ptr ptr (void) mgl_grid_xy libmgl mgl_grid sf ptr ptr ptr (void) mgl_grid libmgl mgl_mesh_xy ptr ptr ptr ptr ptr (void) mgl_mesh_xy libmgl mgl_mesh ptr ptr ptr (void) mgl_mesh libmgl mgl_fall_xy ptr ptr ptr ptr ptr (void) mgl_fall_xy libmgl mgl_fall ptr ptr ptr (void) mgl_fall libmgl mgl_belt_xy ptr ptr ptr ptr ptr (void) mgl_belt_xy libmgl mgl_belt ptr ptr ptr (void) mgl_belt libmgl mgl_surf_xy ptr ptr ptr ptr ptr (void) mgl_surf_xy libmgl mgl_surf ptr ptr ptr (void) mgl_surf libmgl mgl_dens_xy sf ptr ptr ptr ptr ptr (void) mgl_dens_xy libmgl mgl_dens sf ptr ptr ptr (void) mgl_dens libmgl mgl_boxs_xy sf ptr ptr ptr ptr ptr (void) mgl_boxs_xy libmgl mgl_boxs sf ptr ptr ptr (void) mgl_boxs libmgl mgl_tile_xy ptr ptr ptr ptr ptr (void) mgl_tile_xy libmgl mgl_tile ptr ptr ptr (void) mgl_tile libmgl mgl_tiles_xy ptr ptr ptr ptr ptr ptr (void) mgl_tiles_xy libmgl mgl_tiles ptr ptr ptr ptr (void) mgl_tiles libmgl mgl_cont_xy_val sf ptr ptr ptr ptr ptr ptr (void) mgl_cont_xy_val libmgl mgl_cont_val sf ptr ptr ptr ptr (void) mgl_cont_val libmgl mgl_cont_xy sf int ptr ptr ptr ptr ptr (void) mgl_cont_xy libmgl mgl_cont sf int ptr ptr ptr (void) mgl_cont libmgl mgl_contf_xy_val sf ptr ptr ptr ptr ptr ptr (void) mgl_contf_xy_val libmgl mgl_contf_val sf ptr ptr ptr ptr (void) mgl_contf_val libmgl mgl_contf_xy sf int ptr ptr ptr ptr ptr (void) mgl_contf_xy libmgl mgl_contf sf int ptr ptr ptr (void) mgl_contf libmgl mgl_axial_xy_val ptr ptr ptr ptr ptr ptr (void) mgl_axial_xy_val libmgl mgl_axial_val ptr ptr ptr ptr (void) mgl_axial_val libmgl mgl_axial_xy int ptr ptr ptr ptr ptr (void) mgl_axial_xy libmgl mgl_axial int ptr ptr ptr (void) mgl_axial libmgl mgl_surfc_xy ptr ptr ptr ptr ptr ptr (void) mgl_surfc_xy libmgl mgl_surfc ptr ptr ptr ptr (void) mgl_surfc libmgl mgl_surfa_xy ptr ptr ptr ptr ptr ptr (void) mgl_surfa_xy libmgl mgl_surfa ptr ptr ptr ptr (void) mgl_surfa libmgl mgl_stfa_xy sf ptr int ptr ptr ptr ptr ptr (void) mgl_stfa_xy libmgl mgl_stfa sf ptr int ptr ptr ptr (void) mgl_stfa libmgl mgl_vect_xy sf ptr ptr ptr ptr ptr ptr (void) mgl_vect_xy libmgl mgl_vect_2d sf ptr ptr ptr ptr (void) mgl_vect_2d libmgl mgl_vectl_xy sf ptr ptr ptr ptr ptr ptr (void) mgl_vectl_xy libmgl mgl_vectl_2d sf ptr ptr ptr ptr (void) mgl_vectl_2d libmgl mgl_vectc_xy sf ptr ptr ptr ptr ptr ptr (void) mgl_vectc_xy libmgl mgl_vectc_2d sf ptr ptr ptr ptr (void) mgl_vectc_2d libmgl mgl_vect_xyz ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_vect_xyz libmgl mgl_vect_3d ptr ptr ptr ptr ptr (void) mgl_vect_3d libmgl mgl_vectl_xyz ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_vectl_xyz libmgl mgl_vectl_3d ptr ptr ptr ptr ptr (void) mgl_vectl_3d libmgl mgl_vectc_xyz ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_vectc_xyz libmgl mgl_vectc_3d ptr ptr ptr ptr ptr (void) mgl_vectc_3d libmgl mgl_map_xy int int ptr ptr ptr ptr ptr ptr (void) mgl_map_xy libmgl mgl_map int int ptr ptr ptr ptr (void) mgl_map libmgl mgl_surf3a_xyz_val ptr ptr ptr ptr ptr ptr sf ptr (void) mgl_surf3a_xyz_val libmgl mgl_surf3a_val ptr ptr ptr sf ptr (void) mgl_surf3a_val libmgl mgl_surf3a_xyz int ptr ptr ptr ptr ptr ptr ptr (void) mgl_surf3a_xyz libmgl mgl_surf3a int ptr ptr ptr ptr (void) mgl_surf3a libmgl mgl_surf3c_xyz_val ptr ptr ptr ptr ptr ptr sf ptr (void) mgl_surf3c_xyz_val libmgl mgl_surf3c_val ptr ptr ptr sf ptr (void) mgl_surf3c_val libmgl mgl_surf3c_xyz (void) mgl_surf3c_xyz libmgl mgl_surf3c int ptr ptr ptr ptr (void) mgl_surf3c libmgl mgl_flow_xy sf int int ptr ptr ptr ptr ptr ptr (void) mgl_flow_xy libmgl mgl_flow_2d sf int int ptr ptr ptr ptr (void) mgl_flow_2d libmgl mgl_flow_xyz int int ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_flow_xyz libmgl mgl_flow_3d int int ptr ptr ptr ptr ptr (void) mgl_flow_3d libmgl mgl_pipe_xy sf int int sf ptr ptr ptr ptr ptr ptr (void) mgl_pipe_xy libmgl mgl_pipe_2d sf int int sf ptr ptr ptr ptr (void) mgl_pipe_2d libmgl mgl_pipe_xyz int int sf ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_pipe_xyz libmgl mgl_pipe_3d int int sf ptr ptr ptr ptr ptr (void) mgl_pipe_3d libmgl mgl_dew_xy sf ptr ptr ptr ptr ptr ptr (void) mgl_dew_xy libmgl mgl_dew_2d sf ptr ptr ptr ptr (void) mgl_dew_2d libmgl mgl_grid3_xyz ptr int ptr ptr ptr ptr ptr ptr (void) mgl_grid3_xyz libmgl mgl_grid3 ptr int ptr ptr ptr (void) mgl_grid3 libmgl mgl_grid3_all_xyz ptr ptr ptr ptr ptr ptr (void) mgl_grid3_all_xyz libmgl mgl_grid3_all ptr ptr ptr (void) mgl_grid3_all libmgl mgl_dens3_xyz ptr int ptr ptr ptr ptr ptr ptr (void) mgl_dens3_xyz libmgl mgl_dens3 ptr int ptr ptr ptr (void) mgl_dens3 libmgl mgl_dens3_all_xyz ptr ptr ptr ptr ptr ptr (void) mgl_dens3_all_xyz libmgl mgl_dens3_all ptr ptr ptr (void) mgl_dens3_all libmgl mgl_surf3_xyz_val ptr ptr ptr ptr ptr sf ptr (void) mgl_surf3_xyz_val libmgl mgl_surf3_val ptr ptr sf ptr (void) mgl_surf3_val libmgl mgl_surf3_xyz int ptr ptr ptr ptr ptr ptr (void) mgl_surf3_xyz libmgl mgl_surf3 int ptr ptr ptr (void) mgl_surf3 libmgl mgl_cont3_xyz_val ptr int ptr ptr ptr ptr ptr ptr ptr (void) mgl_cont3_xyz_val libmgl mgl_cont3_val ptr int ptr ptr ptr ptr (void) mgl_cont3_val libmgl mgl_cont3_xyz int ptr int ptr ptr ptr ptr ptr ptr (void) mgl_cont3_xyz libmgl mgl_cont3 int ptr int ptr ptr ptr (void) mgl_cont3 libmgl mgl_cont_all_xyz int ptr ptr ptr ptr ptr ptr (void) mgl_cont_all_xyz libmgl mgl_cont_all int ptr ptr ptr (void) mgl_cont_all libmgl mgl_cloudp_xyz sf ptr ptr ptr ptr ptr ptr (void) mgl_cloudp_xyz libmgl mgl_cloudp sf ptr ptr ptr (void) mgl_cloudp libmgl mgl_cloud_xyz sf ptr ptr ptr ptr ptr ptr (void) mgl_cloud_xyz libmgl mgl_cloud sf ptr ptr ptr (void) mgl_cloud libmgl mgl_contf3_xyz_val ptr int ptr ptr ptr ptr ptr ptr ptr (void) mgl_contf3_xyz_val libmgl mgl_contf3_val ptr int ptr ptr ptr ptr (void) mgl_contf3_val libmgl mgl_contf3_xyz int ptr int ptr ptr ptr ptr ptr ptr (void) mgl_contf3_xyz libmgl mgl_contf3 int ptr int ptr ptr ptr (void) mgl_contf3 libmgl mgl_contf_all_xyz int ptr ptr ptr ptr ptr ptr (void) mgl_contf_all_xyz libmgl mgl_contf_all int ptr ptr ptr (void) mgl_contf_all libmgl mgl_beam_val int ptr sf ptr ptr ptr ptr sf ptr (void) mgl_beam_val libmgl mgl_beam int int ptr sf ptr ptr ptr ptr ptr (void) mgl_beam libmgl mgl_triplot_xyzc ptr ptr ptr ptr ptr ptr ptr (void) mgl_triplot_xyzc libmgl mgl_triplot_xyz ptr ptr ptr ptr ptr ptr (void) mgl_triplot_xyz libmgl mgl_triplot_xy sf ptr ptr ptr ptr ptr (void) mgl_triplot_xy libmgl mgl_dots ptr ptr ptr ptr ptr (void) mgl_dots libmgl mgl_dots_tr ptr ptr ptr (void) mgl_dots_tr libmgl mgl_crust sf ptr ptr ptr ptr ptr (void) mgl_crust libmgl mgl_crust_tr sf ptr ptr ptr (void) mgl_crust_tr libmgl mgl_dens_x sf ptr ptr ptr (void) mgl_dens_x libmgl mgl_dens_y sf ptr ptr ptr (void) mgl_dens_y libmgl mgl_dens_z sf ptr ptr ptr (void) mgl_dens_z libmgl mgl_cont_x int sf ptr ptr ptr (void) mgl_cont_x libmgl mgl_cont_y int sf ptr ptr ptr (void) mgl_cont_y libmgl mgl_cont_z int sf ptr ptr ptr (void) mgl_cont_z libmgl mgl_cont_x_val sf ptr ptr ptr ptr (void) mgl_cont_x_val libmgl mgl_cont_y_val sf ptr ptr ptr ptr (void) mgl_cont_y_val libmgl mgl_cont_z_val sf ptr ptr ptr ptr (void) mgl_cont_z_val libmgl mgl_contf_x int sf ptr ptr ptr (void) mgl_contf_x libmgl mgl_contf_y int sf ptr ptr ptr (void) mgl_contf_y libmgl mgl_contf_z int sf ptr ptr ptr (void) mgl_contf_z libmgl mgl_contf_x_val sf ptr ptr ptr ptr (void) mgl_contf_x_val libmgl mgl_contf_y_val sf ptr ptr ptr ptr (void) mgl_contf_y_val libmgl mgl_contf_z_val sf ptr ptr ptr ptr (void) mgl_contf_z_val libmgl mgl_data_rearrange int int int ptr (void) mgl_data_rearrange libmgl mgl_data_set_float int int int sf ptr (void) mgl_data_set_float libmgl mgl_data_set_double int int int df ptr (void) mgl_data_set_double libmgl mgl_data_set_float2 int int sf ptr (void) mgl_data_set_float2 libmgl mgl_data_set_double2 int int df ptr (void) mgl_data_set_double2 libmgl mgl_data_set_float3 int int int sf ptr (void) mgl_data_set_float3 libmgl mgl_data_set_double3 int int int ptr ptr (void) mgl_data_set_double3 libmgl mgl_data_set ptr ptr (void) mgl_data_set libmgl mgl_data_set_vector ptr ptr (void) mgl_data_set_vector libmgl mgl_data_set_matrix ptr ptr (void) mgl_data_set_matrix libmgl mgl_data_get_value int int int ptr (fp) mgl_data_get_value libmgl mgl_data_get_nx ptr (int) mgl_data_get_nx libmgl mgl_data_get_ny ptr (int) mgl_data_get_ny libmgl mgl_data_get_nz ptr (int) mgl_data_get_nz libmgl mgl_data_set_value int int int sf ptr (void) mgl_data_set_value libmgl mgl_data_set_values int int int ptr ptr (void) mgl_data_set_values libmgl mgl_data_read ptr ptr (int) mgl_data_read libmgl mgl_data_read_mat int ptr ptr (int) mgl_data_read_mat libmgl mgl_data_read_dim int int int ptr ptr (int) mgl_data_read_dim libmgl mgl_data_save int ptr ptr (void) mgl_data_save libmgl mgl_data_export int sf sf ptr ptr ptr (void) mgl_data_export libmgl mgl_data_import sf sf ptr ptr ptr (void) mgl_data_import libmgl mgl_data_create int int int ptr (void) mgl_data_create libmgl mgl_data_transpose ptr ptr (void) mgl_data_transpose libmgl mgl_data_norm int int sf sf ptr (void) mgl_data_norm libmgl mgl_data_norm_slice int int ptr sf sf ptr (void) mgl_data_norm_slice libmgl mgl_data_subdata int int int ptr (ptr) mgl_data_subdata libmgl mgl_data_column ptr ptr (ptr) mgl_data_column libmgl mgl_data_set_id ptr ptr (void) mgl_data_set_id libmgl mgl_data_fill ptr sf sf ptr (void) mgl_data_fill libmgl mgl_data_fill_eq ptr ptr ptr ptr ptr (void) mgl_data_fill_eq libmgl mgl_data_put_val int int int sf ptr (void) mgl_data_put_val libmgl mgl_data_put_dat int int int ptr ptr (void) mgl_data_put_dat libmgl mgl_data_modify int ptr ptr (void) mgl_data_modify libmgl mgl_data_modify_vw ptr ptr ptr ptr (void) mgl_data_modify_vw libmgl mgl_data_squeeze int int int int ptr (void) mgl_data_squeeze libmgl mgl_data_max ptr (fp) mgl_data_max libmgl mgl_data_min ptr (fp) mgl_data_min libmgl mgl_data_value int int int ptr (fp) mgl_data_value libmgl mgl_data_combine ptr ptr (ptr) mgl_data_combine libmgl mgl_data_extend int int ptr (void) mgl_data_extend libmgl mgl_data_insert int int ptr ptr (void) mgl_data_insert libmgl mgl_data_delete int int ptr ptr (void) mgl_data_delete libmgl mgl_data_smooth ptr sf int ptr (void) mgl_data_smooth libmgl mgl_data_sum ptr ptr (ptr) mgl_data_sum libmgl mgl_data_max_dir ptr ptr (ptr) mgl_data_max_dir libmgl mgl_data_min_dir ptr ptr (ptr) mgl_data_min_dir libmgl mgl_data_cumsum ptr ptr (void) mgl_data_cumsum libmgl mgl_data_integral ptr ptr (void) mgl_data_integral libmgl mgl_data_diff ptr ptr (void) mgl_data_diff libmgl mgl_data_diff_par ptr ptr ptr ptr (void) mgl_data_diff_par libmgl mgl_data_diff2 ptr ptr (void) mgl_data_diff2 libmgl mgl_data_swap ptr ptr (void) mgl_data_swap libmgl mgl_data_mirror ptr ptr (void) mgl_data_mirror libmgl mgl_data_spline sf sf sf ptr (fp) mgl_data_spline libmgl mgl_data_spline1 sf sf sf ptr (fp) mgl_data_spline1 libmgl mgl_data_linear sf sf sf ptr (fp) mgl_data_linear libmgl mgl_data_linear1 sf sf sf ptr (fp) mgl_data_linear1 libmgl mgl_data_resize int int int ptr (ptr) mgl_data_resize libmgl mgl_data_resize_box (ptr) mgl_data_resize_box libmgl mgl_data_hist int sf sf int ptr (ptr) mgl_data_hist libmgl mgl_data_hist_w int sf sf int ptr ptr (ptr) mgl_data_hist_w libmgl mgl_data_momentum ptr ptr ptr (ptr) mgl_data_momentum libmgl mgl_data_evaluate_i int ptr ptr (ptr) mgl_data_evaluate_i libmgl mgl_data_evaluate_ij int ptr ptr ptr (ptr) mgl_data_evaluate_ij libmgl mgl_data_evaluate_ijk int ptr ptr ptr ptr (ptr) mgl_data_evaluate_ijk libmgl mgl_data_envelop ptr ptr (void) mgl_data_envelop libmgl mgl_data_sew sf ptr ptr (void) mgl_data_sew libmgl mgl_data_crop ptr int int ptr (void) mgl_data_crop libmgl mgl_data_mul_dat ptr ptr (void) mgl_data_mul_dat libmgl mgl_data_div_dat ptr ptr (void) mgl_data_div_dat libmgl mgl_data_add_dat ptr ptr (void) mgl_data_add_dat libmgl mgl_data_sub_dat ptr ptr (void) mgl_data_sub_dat libmgl mgl_data_mul_num sf ptr (void) mgl_data_mul_num libmgl mgl_data_div_num sf ptr (void) mgl_data_div_num libmgl mgl_data_add_num sf ptr (void) mgl_data_add_num libmgl mgl_data_sub_num sf ptr (void) mgl_data_sub_num libmgl mgl_fit_1 sf ptr ptr ptr ptr ptr (fp) mgl_fit_1 libmgl mgl_fit_2 sf ptr ptr ptr ptr ptr (fp) mgl_fit_2 libmgl mgl_fit_3 sf ptr ptr ptr ptr ptr (fp) mgl_fit_3 libmgl mgl_fit_xy sf ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xy libmgl mgl_fit_xyz sf ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xyz libmgl mgl_fit_xyza sf ptr ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xyza libmgl mgl_fit_ys sf ptr ptr ptr ptr ptr ptr (fp) mgl_fit_ys libmgl mgl_fit_xys sf ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xys libmgl mgl_fit_xyzs sf ptr ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xyzs libmgl mgl_fit_xyzas sf ptr ptr ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xyzas libmgl mgl_fit_1_d ptr ptr ptr ptr ptr ptr (fp) mgl_fit_1_d libmgl mgl_fit_2_d ptr ptr ptr ptr ptr ptr (fp) mgl_fit_2_d libmgl mgl_fit_3_d ptr ptr ptr ptr ptr ptr (fp) mgl_fit_3_d libmgl mgl_fit_xy_d ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xy_d libmgl mgl_fit_xyz_d ptr ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xyz_d libmgl mgl_fit_xyza_d ptr ptr ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xyza_d libmgl mgl_fit_ys_d ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_ys_d libmgl mgl_fit_xys_d ptr ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xys_d libmgl mgl_fit_xyzs_d ptr ptr ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xyzs_d libmgl mgl_fit_xyzas_d ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr (fp) mgl_fit_xyzas_d libmgl mgl_puts_fit sf ptr ptr sf sf sf ptr (void) mgl_puts_fit libmgl mgl_sphere ptr sf sf sf sf ptr (void) mgl_sphere libmgl mgl_drop sf sf ptr sf sf sf sf sf sf sf ptr (void) mgl_drop libmgl mgl_cone int ptr sf sf sf sf sf sf sf sf ptr (void) mgl_cone libmgl mgl_pde_solve sf sf ptr ptr ptr ptr (ptr) mgl_pde_solve libmgl mgl_qo2d_solve ptr ptr sf sf ptr ptr ptr ptr (ptr) mgl_qo2d_solve libmgl mgl_af2d_solve ptr ptr sf sf ptr ptr ptr ptr (ptr) mgl_af2d_solve libmgl mgl_ray_trace sf sf sf sf sf sf sf sf ptr (ptr) mgl_ray_trace libmgl mgl_jacobian_2d ptr ptr (ptr) mgl_jacobian_2d libmgl mgl_jacobian_3d ptr ptr ptr (ptr) mgl_jacobian_3d libmgl mgl_transform_a ptr ptr ptr (ptr) mgl_transform_a libmgl mgl_transform ptr ptr ptr (ptr) mgl_transform libmgl mgl_data_stfa ptr int ptr ptr (ptr) mgl_data_stfa legacy on previous Module; mathgl-8.0.1/include/mgl2/data.h0000664000175000017500000016151314167366472016157 0ustar balakinbalakin/*************************************************************************** * data.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_DATA_H_ #define _MGL_DATA_H_ #include "mgl2/data_cf.h" #include "mgl2/pde.h" #if MGL_HAVE_ARMA #include #endif //----------------------------------------------------------------------------- #include //----------------------------------------------------------------------------- mreal MGL_EXPORT_PURE mglLinear(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z); mreal MGL_EXPORT mglSpline3(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z,mreal *dx=0, mreal *dy=0, mreal *dz=0); mreal MGL_EXPORT_PURE mglSpline3s(const mreal *a, long nx, long ny, long nz, mreal x, mreal y, mreal z); //----------------------------------------------------------------------------- /// Class for working with data array class MGL_EXPORT mglData : public mglDataA { public: using mglDataA::Momentum; using mglDataA::Last; long nx; ///< number of points in 1st dimensions ('x' dimension) long ny; ///< number of points in 2nd dimensions ('y' dimension) long nz; ///< number of points in 3d dimensions ('z' dimension) mreal *a; ///< data array bool link; ///< use external data (i.e. don't free it) /// Initiate by other mglData variable mglData(const mglData &d) { a=0; mgl_data_set(this,&d); } // NOTE: must be constructor for mglData& to exclude copy one #if MGL_HAVE_RVAL mglData(mglData &&d):nx(d.nx),ny(d.ny),nz(d.nz),a(d.a),link(d.link) { s=d.s; temp=d.temp; func=d.func; o=d.o; id=d.id; d.a=0; d.func=0; } #endif mglData(const mglDataA *d) { a=0; if(d) mgl_data_set(this, d); else mgl_data_create(this,1,1,1); } mglData(bool, mglData *d) // NOTE: Variable d will be deleted!!! { if(d) { nx=d->nx; ny=d->ny; nz=d->nz; a=d->a; d->a=0; temp=d->temp; func=d->func; o=d->o; s=d->s; id=d->id; link=d->link; delete d; } else { a=0; Create(1); } } /// Initiate by flat array mglData(int size, const float *d) { a=0; Set(d,size); } mglData(int rows, int cols, const float *d) { a=0; Set(d,cols,rows); } mglData(int size, const double *d) { a=0; Set(d,size); } mglData(int rows, int cols, const double *d) { a=0; Set(d,cols,rows); } mglData(const double *d, int size) { a=0; Set(d,size); } mglData(const double *d, int rows, int cols) { a=0; Set(d,cols,rows); } mglData(const float *d, int size) { a=0; Set(d,size); } mglData(const float *d, int rows, int cols) { a=0; Set(d,cols,rows); } /// Allocate memory and copy data from std::vector mglData(const std::vector &d) { a=0; Set(d); } mglData(const std::vector &d) { a=0; Set(d); } mglData(const std::vector &d) { a=0; Set(d); } /// Read data from file mglData(const char *fname) { a=0; Read(fname); } /// Allocate the memory for data array and initialize it zero mglData(long xx=1,long yy=1,long zz=1) { a=0; Create(xx,yy,zz); } /// Delete the array virtual ~mglData() { if(!link && a) delete []a; } /// Move all data from variable d, and delete this variable. inline void Move(mglData *d) // NOTE: Variable d will be deleted!!! { if(d && d->GetNN()>1) { bool l=link; mreal *b=a; nx=d->nx; ny=d->ny; nz=d->nz; a=d->a; d->a=b; temp=d->temp; func=d->func; o=d->o; s=d->s; id=d->id; link=d->link; d->link=l; delete d; } else if(d) { *this = d->a[0]; delete d; } } inline mreal GetVal(long i, long j=0, long k=0) const { return mgl_data_get_value(this,i,j,k);} inline void SetVal(mreal f, long i, long j=0, long k=0) { mgl_data_set_value(this,f,i,j,k); } /// Get sizes long GetNx() const { return nx; } long GetNy() const { return ny; } long GetNz() const { return nz; } /// Link external data array (don't delete it at exit) inline void Link(mreal *A, long NX, long NY=1, long NZ=1) { mgl_data_link(this,A,NX,NY,NZ); } inline void Link(mglData &d) { Link(d.a,d.nx,d.ny,d.nz); } /// Allocate memory and copy the data from the gsl_vector inline void Set(gsl_vector *m) { mgl_data_set_vector(this,m); } /// Allocate memory and copy the data from the gsl_matrix inline void Set(gsl_matrix *m) { mgl_data_set_matrix(this,m); } /// Allocate memory and copy the data from the (float *) array inline void Set(const float *A,long NX,long NY=1,long NZ=1) { mgl_data_set_float(this,A,NX,NY,NZ); } /// Allocate memory and copy the data from the (double *) array inline void Set(const double *A,long NX,long NY=1,long NZ=1) { mgl_data_set_double(this,A,NX,NY,NZ); } /// Allocate memory and copy the data from the (float **) array inline void Set(float const * const *A,long N1,long N2) { mgl_data_set_float2(this,A,N1,N2); } /// Allocate memory and copy the data from the (double **) array inline void Set(double const * const *A,long N1,long N2) { mgl_data_set_double2(this,A,N1,N2); } /// Allocate memory and copy the data from the (float ***) array inline void Set(float const * const * const *A,long N1,long N2,long N3) { mgl_data_set_float3(this,A,N1,N2,N3); } /// Allocate memory and copy the data from the (double ***) array inline void Set(double const * const * const *A,long N1,long N2,long N3) { mgl_data_set_double3(this,A,N1,N2,N3); } /// Allocate memory and scanf the data from the string inline void Set(const char *str,long NX,long NY=1,long NZ=1) { mgl_data_set_values(this,str,NX,NY,NZ); } /// Import data from abstract type inline void Set(HCDT dat) { mgl_data_set(this, dat); } inline void Set(const mglDataA &dat) { mgl_data_set(this, &dat); } /// Allocate memory and copy data from std::vector inline void Set(const std::vector &d) { if(d.size()>0) { Create(d.size()); for(long i=0;i &d) { if(d.size()>0) Set(&(d[0]),d.size()); else Create(1); } inline void Set(const std::vector &d) { if(d.size()>0) Set(&(d[0]),d.size()); else Create(1); } /// Allocate memory and set data from variable argument list of double values inline void SetList(long n, ...) { if(n<1) return; mgl_data_create(this,n,1,1); va_list vl; va_start(vl,n); for(long i=0;i0? (i0? (j0? (k(const mglDataA &b, const mglDataA &d) { return b.Minimal()>d.Minimal(); } //----------------------------------------------------------------------------- /// Integral data transformation (like Fourier 'f' or 'i', Hankel 'h' or None 'n') for amplitude and phase inline mglData mglTransformA(const mglDataA &am, const mglDataA &ph, const char *tr) { return mglData(true,mgl_transform_a(&am,&ph,tr)); } /// Integral data transformation (like Fourier 'f' or 'i', Hankel 'h' or None 'n') for real and imaginary parts inline mglData mglTransform(const mglDataA &re, const mglDataA &im, const char *tr) { return mglData(true,mgl_transform(&re,&im,tr)); } /// Apply Fourier transform for the data and save result into it inline void mglFourier(mglData &re, mglData &im, const char *dir) { mgl_data_fourier(&re,&im,dir); } /// Short time Fourier analysis for real and imaginary parts. Output is amplitude of partial Fourier (result will have size {dn, floor(nx/dn), ny} for dir='x' inline mglData mglSTFA(const mglDataA &re, const mglDataA &im, long dn, char dir='x') { return mglData(true, mgl_data_stfa(&re,&im,dn,dir)); } //----------------------------------------------------------------------------- /// Saves result of PDE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini inline mglData mglPDE(HMGL gr, const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, mreal dz=0.1, mreal k0=100,const char *opt="") { return mglData(true, mgl_pde_solve(gr,ham, &ini_re, &ini_im, dz, k0,opt)); } /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) inline mglData mglQO2d(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mreal r=1, mreal k0=100) { return mglData(true, mgl_qo2d_solve(ham, &ini_re, &ini_im, &ray, r, k0, 0, 0)); } inline mglData mglQO2d(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mglData &xx, mglData &yy, mreal r=1, mreal k0=100) { return mglData(true, mgl_qo2d_solve(ham, &ini_re, &ini_im, &ray, r, k0, &xx, &yy)); } /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) inline mglData mglQO3d(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mreal r=1, mreal k0=100) { return mglData(true, mgl_qo3d_solve(ham, &ini_re, &ini_im, &ray, r, k0, 0, 0, 0)); } inline mglData mglQO3d(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, const mglDataA &ray, mglData &xx, mglData &yy, mglData &zz, mreal r=1, mreal k0=100) { return mglData(true, mgl_qo3d_solve(ham, &ini_re, &ini_im, &ray, r, k0, &xx, &yy, &zz)); } /// Finds ray with starting point r0, p0 (and prepares ray data for mglQO2d) inline mglData mglRay(const char *ham, mglPoint r0, mglPoint p0, mreal dt=0.1, mreal tmax=10) { return mglData(true, mgl_ray_trace(ham, r0.x, r0.y, r0.z, p0.x, p0.y, p0.z, dt, tmax)); } /// Saves result of ODE solving for var complex variables with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt inline mglData mglODE(const char *func, const char *var, const mglDataA &ini, mreal dt=0.1, mreal tmax=10) { return mglData(true, mgl_ode_solve_str(func,var, &ini, dt, tmax)); } /// Saves result of ODE solving for var complex variables with right part func (separated by ';') and initial conditions x0 of size n*m over time interval [0,tmax] with time step dt inline mglData mglODEs(const char *func, const char *var, char brd, const mglDataA &ini, mreal dt=0.1, mreal tmax=10) { return mglData(true, mgl_ode_solve_set(func,var, brd, &ini, dt, tmax)); } //----------------------------------------------------------------------------- /// Get array as solution of tridiagonal system of equations a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i] /** String \a how may contain: * 'x', 'y', 'z' for solving along x-,y-,z-directions, or * 'h' for solving along hexagonal direction at x-y plain (need nx=ny), * 'c' for using periodical boundary conditions, * 'd' for diffraction/diffuse calculation. */ inline mglData mglTridMat(const mglDataA &A, const mglDataA &B, const mglDataA &C, const mglDataA &D, const char *how) { return mglData(true, mgl_data_tridmat(&A, &B, &C, &D, how)); } //----------------------------------------------------------------------------- /// Calculate Jacobian determinant for D{x(u,v), y(u,v)} = dx/du*dy/dv-dx/dv*dy/du inline mglData mglJacobian(const mglDataA &x, const mglDataA &y) { return mglData(true, mgl_jacobian_2d(&x, &y)); } /// Calculate Jacobian determinant for D{x(u,v,w), y(u,v,w), z(u,v,w)} inline mglData mglJacobian(const mglDataA &x, const mglDataA &y, const mglDataA &z) { return mglData(true, mgl_jacobian_3d(&x, &y, &z)); } /// Do something like Delone triangulation inline mglData mglTriangulation(const mglDataA &x, const mglDataA &y, const mglDataA &z) { return mglData(true,mgl_triangulation_3d(&x,&y,&z)); } inline mglData mglTriangulation(const mglDataA &x, const mglDataA &y) { return mglData(true,mgl_triangulation_2d(&x,&y)); } /// Get curves, separated by NAN, for maximal values of array d as function of x coordinate. /** Noises below lvl amplitude are ignored. * Parameter dy \in [0,ny] set the "attraction" distance of points to curve. */ inline mglData mglDetect(const mglDataA &d, mreal lvl, mreal dj, mreal di=0, mreal min_len=0) { return mglData(true,mgl_data_detect(&d, lvl, dj, di, min_len)); } //----------------------------------------------------------------------------- /// Get array which is n-th pairs {x[i],y[i]} for iterated function system (fractal) generated by A inline mglData mglIFS2d(const mglDataA &A, long n, long skip=20) { return mglData(true,mgl_data_ifs_2d(&A,n,skip)); } /// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) generated by A inline mglData mglIFS3d(const mglDataA &A, long n, long skip=20) { return mglData(true,mgl_data_ifs_3d(&A,n,skip)); } /// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) defined in *.ifs file 'fname' and named as 'name' inline mglData mglIFSfile(const char *fname, const char *name, long n, long skip=20) { return mglData(true,mgl_data_ifs_file(fname,name,n,skip)); } /// Get array which is n-th pairs {x[i],y[i]} for Flame fractal generated by A with functions F /** NOTE: A.nx must be >= 7 and F.nx >= 2 and F.nz=A.ny. * F[0,i,j] denote function id. F[1,i,j] give function weight, F(2:5,i,j) provide function parameters. * Resulting point is {xnew,ynew} = sum_i F[1,i,j]*F[0,i,j]{IFS2d(A[j]){x,y}}. */ inline mglData mglFlame2d(const mglDataA &A, const mglDataA &F, long n, long skip=20) { return mglData(true,mgl_data_flame_2d(&A,&F,n,skip)); } //----------------------------------------------------------------------------- /// Get sub-array of the data with given fixed indexes inline mglData mglSubData(const mglDataA &dat, long xx, long yy=-1, long zz=-1) { return mglData(true,mgl_data_subdata(&dat,xx,yy,zz)); } inline mglData mglSubData(const mglDataA &dat, const mglDataA &xx, const mglDataA &yy, const mglDataA &zz) { return mglData(true,mgl_data_subdata_ext(&dat,&xx,&yy,&zz)); } inline mglData mglSubData(const mglDataA &dat, const mglDataA &xx, const mglDataA &yy) { return mglData(true,mgl_data_subdata_ext(&dat,&xx,&yy,0)); } inline mglData mglSubData(const mglDataA &dat, const mglDataA &xx) { return mglData(true,mgl_data_subdata_ext(&dat,&xx,0,0)); } //----------------------------------------------------------------------------- /// Prepare coefficients for global spline interpolation inline mglData mglGSplineInit(const mglDataA &xdat, const mglDataA &ydat) { return mglData(true,mgl_gspline_init(&xdat, &ydat)); } /// Evaluate global spline (and its derivatives d1, d2 if not NULL) using prepared coefficients \a coef inline mreal mglGSpline(const mglDataA &coef, mreal dx, mreal *d1=0, mreal *d2=0) { return mgl_gspline(&coef, dx, d1,d2); } //----------------------------------------------------------------------------- /// Evaluate formula 'str' for given list of variables 'vars'. /** NOTE: you need to delete returned data array!*/ HMDT MGL_EXPORT mglFormulaCalc(const char *str, const std::vector &vars); //----------------------------------------------------------------------------- /// Wrapper class for expression evaluating class MGL_EXPORT mglExpr { HMEX ex; mglExpr(const mglExpr &){ex=0;} // copying is not allowed const mglExpr &operator=(const mglExpr &t){ex=0; return t;} // copying is not allowed public: mglExpr(const char *expr) { ex = mgl_create_expr(expr); } #if MGL_HAVE_RVAL mglExpr(mglExpr &&d):ex(d.ex) { d.ex=0; } #endif ~mglExpr() { mgl_delete_expr(ex); } /// Return value of expression for given x,y,z variables inline double Eval(double x, double y=0, double z=0) { return mgl_expr_eval(ex,x,y,z); } /// Return value of expression differentiation over variable dir for given x,y,z variables inline double Diff(char dir, double x, double y=0, double z=0) { return mgl_expr_diff(ex,dir, x,y,z); } #ifndef SWIG /// Return value of expression for given variables inline double Eval(mreal var[26]) { return mgl_expr_eval_v(ex,var); } /// Return value of expression differentiation over variable dir for given variables inline double Diff(char dir, mreal var[26]) { return mgl_expr_diff_v(ex,dir, var); } #endif }; //----------------------------------------------------------------------------- /// Class which present equidistantly distributed data class MGL_EXPORT mglDataV : public mglDataA { long nx; ///< number of points in 1st dimensions ('x' dimension) long ny; ///< number of points in 2nd dimensions ('y' dimension) long nz; ///< number of points in 3d dimensions ('z' dimension) mreal di, dj, dk, a0; public: mglDataV(long xx=1,long yy=1,long zz=1,mreal x1=0,mreal x2=mglNaN,char dir='x'):nx(xx),ny(yy),nz(zz) { Fill(x1,x2,dir); } mglDataV(const mglDataV &d):nx(d.nx),ny(d.ny),nz(d.nz),di(d.di),dj(d.dj),dk(d.dk),a0(d.a0) {} #if MGL_HAVE_RVAL mglDataV(mglDataV &&d):nx(d.nx),ny(d.ny),nz(d.nz),di(d.di),dj(d.dj),dk(d.dk),a0(d.a0) { s=d.s; temp=d.temp; func=d.func; o=d.o; d.func=0; } #endif virtual ~mglDataV() {} /// Get sizes long GetNx() const { return nx; } long GetNy() const { return ny; } long GetNz() const { return nz; } /// Create or recreate the array with specified size and fill it by zero inline void Create(long mx,long my=1,long mz=1) { di=mx>1?di*(nx-1)/(mx-1):0; dj=my>1?dj*(ny-1)/(my-1):0; dk=mz>1?dk*(nz-1)/(mz-1):0; nx=mx; ny=my; nz=mz; } /// For going throw all elements inline void All() { di=dj=dk=1; a0=0; } /// Equidistantly fill the data to range [x1,x2] in direction dir inline void Fill(mreal x1,mreal x2=mglNaN,char dir='x') { di=dj=dk=0; a0=x1; if(mgl_isnum(x2)) { if(dir=='x' && nx>1) di=(x2-x1)/(nx-1); if(dir=='y' && ny>1) dj=(x2-x1)/(ny-1); if(dir=='z' && nz>1) dk=(x2-x1)/(nz-1); } } mreal Maximal() const { return a0+mgl_max(mgl_max(di*(nx-1),dj*(ny-1)),mgl_max(dk*(nz-1),0)); } mreal Minimal() const { return a0+mgl_min(mgl_min(di*(nx-1),dj*(ny-1)),mgl_min(dk*(nz-1),0)); } /// Copy data from other mglDataV variable inline const mglDataV &operator=(const mglDataV &d) { nx=d.nx; ny=d.ny; nz=d.nz; a0=d.a0; di=d.di; dj=d.dj; dk=d.dk; return d; } inline mreal operator=(mreal val) { di=dj=dk=0; a0=val; return val; } /// Get the interpolated value and its derivatives in given data cell without border checking mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const { if(dx) *dx=di; if(dy) *dy=dj; if(dz) *dz=dk; return a0+di*x+dj*y+dk*z; } /// Get the interpolated value in given data cell without border checking mreal value(mreal x,mreal y=0,mreal z=0) const { return a0+di*x+dj*y+dk*z; } mreal v(long i,long j=0,long k=0) const { return a0+di*i+dj*j+dk*k; } mreal vthr(long ii) const { long i=ii%nx, j=(ii/nx)%ny, k=ii/(nx*ny); return a0+di*i+dj*j+dk*k; } // add for speeding up !!! mreal dvx(long ,long =0,long =0) const { return di; } mreal dvy(long ,long =0,long =0) const { return dj; } mreal dvz(long ,long =0,long =0) const { return dk; } }; //----------------------------------------------------------------------------- /// Class which present FFT frequency as data array class MGL_EXPORT mglDataW : public mglDataA { long nx; ///< number of points in 1st dimensions ('x' dimension) long ny; ///< number of points in 2nd dimensions ('y' dimension) long nz; ///< number of points in 3d dimensions ('z' dimension) mreal di, dj, dk; public: mglDataW(long xx=1,long yy=1,long zz=1,mreal dp=0,char dir='x'):nx(xx),ny(yy),nz(zz) { Freq(dp,dir); } mglDataW(const mglDataW &d):nx(d.nx),ny(d.ny),nz(d.nz),di(d.di),dj(d.dj),dk(d.dk) {} #if MGL_HAVE_RVAL mglDataW(mglDataW &&d):nx(d.nx),ny(d.ny),nz(d.nz),di(d.di),dj(d.dj),dk(d.dk) { s=d.s; temp=d.temp; func=d.func; o=d.o; d.func=0; } #endif virtual ~mglDataW() {} /// Get sizes long GetNx() const { return nx; } long GetNy() const { return ny; } long GetNz() const { return nz; } /// Create or recreate the array with specified size and fill it by zero inline void Create(long mx,long my=1,long mz=1) { nx=mx; ny=my; nz=mz; } /// For going throw all elements inline void All() { di=dj=dk=1; } /// Equidistantly fill the data to range [x1,x2] in direction dir inline void Freq(mreal dp,char dir='x') { di=dj=dk=0; if(dir=='x') di=dp; if(dir=='y') dj=dp; if(dir=='z') dk=dp; } mreal Maximal() const { return mgl_max(mgl_max(di*(nx-1),dj*(ny-1)),mgl_max(dk*(nz-1),0)); } mreal Minimal() const { return mgl_min(mgl_min(di*(nx-1),dj*(ny-1)),mgl_min(dk*(nz-1),0)); } /// Copy data from other mglDataV variable inline const mglDataW &operator=(const mglDataW &d) { nx=d.nx; ny=d.ny; nz=d.nz; di=d.di; dj=d.dj; dk=d.dk; return d; } /// Get the interpolated value and its derivatives in given data cell without border checking mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const { if(dx) *dx=di; if(dy) *dy=dj; if(dz) *dz=dk; return di*(x1?(v2.x-v1.x)/(nx-1):0; dy = ny>1?(v2.y-v1.y)/(ny-1):0; dz = nz>1?(v2.z-v1.z)/(nz-1):0; } mreal (*dfunc)(mreal i, mreal j, mreal k, void *par); void *par; public: mglDataF(long xx=1,long yy=1,long zz=1):nx(xx),ny(yy),nz(zz), dfunc(0),par(0) { ex=0; v2.Set(1,1,1); setD(); } mglDataF(const mglDataF &d) : nx(d.nx), ny(d.ny), nz(d.nz), str(d.str), v1(d.v1), v2(d.v2), dx(d.dx),dy(d.dy),dz(d.dz), dfunc(d.dfunc),par(d.par) { ex = mgl_create_expr(str.c_str()); } #if MGL_HAVE_RVAL mglDataF(mglDataF &&d):nx(d.nx),ny(d.ny),nz(d.nz), str(d.str), v1(d.v1),v2(d.v2), ex(d.ex), dx(d.dx),dy(d.dy),dz(d.dz), dfunc(d.dfunc),par(d.par) { s=d.s; temp=d.temp; func=d.func; o=d.o; d.ex=0; d.func=0; } #endif virtual ~mglDataF() { mgl_delete_expr(ex); } /// Get sizes long GetNx() const { return nx; } long GetNy() const { return ny; } long GetNz() const { return nz; } /// Create or recreate the array with specified size and fill it by zero inline void Create(long mx,long my=1,long mz=1) { nx=mx; ny=my; nz=mz; setD(); } inline void SetRanges(const mglPoint &p1, const mglPoint &p2) { v1=p1; v2=p2; setD(); } /// Set formula to be used as dfunction inline void SetFormula(const char *eq) { mgl_delete_expr(ex); dfunc=0; par=0; if(eq && *eq) { ex = mgl_create_expr(eq); str=eq; } else { ex=0; str=""; } } /// Set function and coordinates range [r1,r2] inline void SetFunc(mreal (*f)(mreal,mreal,mreal,void*), void *p=NULL) { mgl_delete_expr(ex); ex=0; dfunc=f; par=p; } /// Get the interpolated value and its derivatives in given data cell without border checking mreal valueD(mreal i,mreal j=0,mreal k=0, mreal *di=0,mreal *dj=0,mreal *dk=0) const { mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k; if(di) *di = 0; if(dj) *dj = 0; if(dk) *dk = 0; if(dfunc) { res = dfunc(x,y,z, par); if(di) *di = dfunc(x+dx,y,z, par)-res; if(dj) *dj = dfunc(x,y+dy,z, par)-res; if(dk) *dk = dfunc(x,y,z+dz, par)-res; } else if(ex) { if(di) *di = mgl_expr_diff(ex,'x',x,y,z)*dx; if(dj) *dj = mgl_expr_diff(ex,'y',x,y,z)*dy; if(dk) *dk = mgl_expr_diff(ex,'z',x,y,z)*dz; res = mgl_expr_eval(ex,x,y,z); } return res; } /// Get the interpolated value in given data cell without border checking mreal value(mreal i,mreal j=0,mreal k=0) const { mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k; if(dfunc) res = dfunc(x,y,z, par); else if(ex) res = mgl_expr_eval(ex,x,y,z); return res; } /// Copy data from other mglDataV variable inline const mglDataF &operator=(const mglDataF &d) { nx=d.nx; ny=d.ny; nz=d.nz; v1=d.v1; v2=d.v2; setD(); mgl_delete_expr(ex); str=d.str; ex = mgl_create_expr(str.c_str()); dfunc=d.dfunc; par=d.par; return d; } /// Get the value in given cell of the data without border checking mreal v(long i,long j=0,long k=0) const { mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k; if(dfunc) res = dfunc(x,y,z, par); else if(ex) res = mgl_expr_eval(ex,x,y,z); return res; } mreal vthr(long i) const { mreal res=0, x=v1.x+dx*(i%nx), y=v1.y+dy*((i/nx)%ny), z=v1.z+dz*(i/(nx*ny)); if(dfunc) res = dfunc(x,y,z, par); else if(ex) res = mgl_expr_eval(ex,x,y,z); return res; } // add for speeding up !!! mreal dvx(long i,long j=0,long k=0) const { mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k; if(dfunc) res = dfunc(x+dx,y,z, par)-dfunc(x,y,z, par); else if(ex) res = mgl_expr_eval(ex,x+dx,y,z)-mgl_expr_eval(ex,x,y,z); return res; } mreal dvy(long i,long j=0,long k=0) const { mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k; if(dfunc) res = dfunc(x,y+dy,z, par)-dfunc(x,y,z, par); else if(ex) res = mgl_expr_eval(ex,x,y+dy,z)-mgl_expr_eval(ex,x,y,z); return res; } mreal dvz(long i,long j=0,long k=0) const { mreal res=0, x=v1.x+dx*i, y=v1.y+dy*j, z=v1.z+dz*k; if(dfunc) res = dfunc(x,y,z+dz, par)-dfunc(x,y,z, par); else if(ex) res = mgl_expr_eval(ex,x,y,z+dz)-mgl_expr_eval(ex,x,y,z); return res; } }; //----------------------------------------------------------------------------- /// Class which present column of another data as data array class MGL_EXPORT mglDataT : public mglDataA { const mglDataA &dat; long ind; const mglDataT &operator=(const mglDataT &d) { ind=0; return d; } public: mglDataT(const mglDataT &d) : dat(d.dat), ind(d.ind) { s = d.s; } mglDataT(const mglDataA &d, long col=0) : dat(d), ind(col) {} mglDataT(HCDT d, long col=0) : dat(*d), ind(col) {} #if MGL_HAVE_RVAL mglDataT(mglDataT &&d):dat(d.dat),ind(d.ind) { s=d.s; temp=d.temp; func=d.func; o=d.o; d.func=0; } #endif virtual ~mglDataT() {} /// Get sizes long GetNx() const { return dat.GetNy(); } long GetNy() const { return dat.GetNz(); } long GetNz() const { return 1; } mreal Maximal() const { return mglSubData(dat,ind).Maximal(); } mreal Minimal() const { return mglSubData(dat,ind).Minimal(); } inline void SetInd(long i, const wchar_t *name) { ind = i; s = name; } inline void SetInd(long i, wchar_t name) { ind = i; s = name; } /// Get the interpolated value and its derivatives in given data cell without border checking mreal valueD(mreal x,mreal y=0,mreal =0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const { if(dz) *dz=0; return dat.valueD(ind,x,y,0,dx,dy); } /// Get the interpolated value in given data cell without border checking mreal value(mreal x,mreal y=0,mreal =0) const { return dat.value(ind,x,y); } /// Get the value in given cell of the data without border checking mreal v(long i,long j=0,long =0) const { return dat.v(ind,i,j); } mreal vthr(long i) const { return dat.vthr(ind+dat.GetNx()*i); } // add for speeding up !!! mreal dvx(long i,long j=0,long =0) const { return dat.dvy(ind,i,j); } mreal dvy(long i,long j=0,long =0) const { return dat.dvz(ind,i,j); } mreal dvz(long ,long =0,long =0) const { return 0; } }; //----------------------------------------------------------------------------- /// Class which present row of another data as data array class MGL_EXPORT mglDataR : public mglDataA { const mglDataA &dat; long ind; const mglDataR &operator=(const mglDataR &d) { ind=0; return d; } public: mglDataR(const mglDataR &d) : dat(d.dat), ind(d.ind) { s = d.s; } mglDataR(const mglDataA &d, long row=0) : dat(d), ind(row) {} mglDataR(HCDT d, long row=0) : dat(*d), ind(row) {} #if MGL_HAVE_RVAL mglDataR(mglDataR &&d):dat(d.dat),ind(d.ind) { s=d.s; temp=d.temp; func=d.func; o=d.o; d.func=0; } #endif virtual ~mglDataR() {} /// Get sizes long GetNx() const { return dat.GetNx(); } long GetNy() const { return 1; } long GetNz() const { return 1; } mreal Maximal() const { return mglSubData(dat,-1,ind).Maximal(); } mreal Minimal() const { return mglSubData(dat,-1,ind).Minimal(); } inline void SetInd(long i, const wchar_t *name) { ind = i; s = name; } inline void SetInd(long i, wchar_t name) { ind = i; s = name; } /// Get the interpolated value and its derivatives in given data cell without border checking mreal valueD(mreal x,mreal =0,mreal =0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const { if(dy) *dy=0; if(dz) *dz=0; return dat.valueD(x,ind,0,dx); } /// Get the interpolated value in given data cell without border checking mreal value(mreal x,mreal =0,mreal =0) const { return dat.value(x,ind,0); } /// Get the value in given cell of the data without border checking mreal v(long i,long =0,long =0) const { return dat.v(i,ind,0); } mreal vthr(long i) const { return dat.vthr(i+dat.GetNx()*ind); } // add for speeding up !!! mreal dvx(long i,long =0,long =0) const { return dat.dvx(i,ind,0); } mreal dvy(long ,long =0,long =0) const { return 0; } mreal dvz(long ,long =0,long =0) const { return 0; } }; //----------------------------------------------------------------------------- /// Class which present std::vector as data array class MGL_EXPORT mglDataS : public mglDataA { public: std::vector dat; mglDataS(const mglDataS &st) : dat(st.dat) {} mglDataS(const std::vector &d) : dat(d) {} mglDataS(size_t s=1) { dat.resize(s); } ~mglDataS() {} inline void reserve(size_t num) { dat.reserve(num); } inline void clear() { dat.clear(); } inline double operator[](size_t i) { return dat[i]; } inline void push_back(double t) { dat.push_back(t); } inline size_t size() const { return dat.size(); } const mglDataS &operator=(const mglDataS &st) { dat = st.dat; return st; } const std::vector &operator=(const std::vector &st) { dat = st; return st; } /// Get the interpolated value and its derivatives in given data cell without border checking mreal valueD(mreal x,mreal =0,mreal =0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const { return mglSpline3(dat.data(),dat.size(),1,1,x,0,0,dx,dy,dz); } /// Get the interpolated value in given data cell without border checking mreal value(mreal x,mreal =0,mreal =0) const { return mglSpline3s(dat.data(),dat.size(),1,1,x,0,0); } mreal v(long i,long =0,long =0) const { return dat[i]; } mreal vthr(long i) const { return dat[i]; } long GetNx() const { return dat.size(); } long GetNy() const { return 1; } long GetNz() const { return 1; } mreal dvx(long i,long =0,long =0) const { return i>0? (i * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_PRIM_H_ #define _MGL_PRIM_H_ #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /// Draws the mark at position {x,y,z} void MGL_EXPORT mgl_mark(HMGL gr, double x,double y,double z,const char *mark); void MGL_EXPORT mgl_mark_(uintptr_t *gr, mreal *x, mreal *y, mreal *z,const char *mark,int); /// Draws red point (ball) at position {x,y,z} void MGL_EXPORT mgl_ball(HMGL gr, double x,double y,double z); void MGL_EXPORT mgl_ball_(uintptr_t *gr, mreal *x, mreal *y, mreal *z); /// Draws the line between 2 points by specified pen /** Large \a n (for example, n=100) should be used for geodesic line in curvilinear coordinates */ void MGL_EXPORT mgl_line(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, const char *pen,int n); void MGL_EXPORT mgl_line_(uintptr_t *gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, const char *pen,int *n,int); /// Draws the spline curve between 2 points by specified pen void MGL_EXPORT mgl_curve(HMGL gr, double x1, double y1, double z1, double dx1, double dy1, double dz1, double x2, double y2, double z2, double dx2, double dy2, double dz2, const char *pen,int n); void MGL_EXPORT mgl_curve_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *dx1, mreal *dy1, mreal *dz1, mreal *x2, mreal *y2, mreal *z2, mreal *dx2, mreal *dy2, mreal *dz2, const char *pen,int *n, int l); /// Draws the 3d error box {ex,ey,ez} for point {x,y,z} void MGL_EXPORT mgl_error_box(HMGL gr, double x, double y, double z, double ex, double ey, double ez, const char *pen); void MGL_EXPORT mgl_error_box_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, mreal *ex, mreal *ey, mreal *ez, const char *pen, int); /// Draws the face between points with color stl (include interpolation up to 4 colors). void MGL_EXPORT mgl_face(HMGL gr, double x0, double y0, double z0, double x1, double y1, double z1, double x2, double y2, double z2, double x3, double y3, double z3, const char *stl); void MGL_EXPORT mgl_face_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *x3, mreal *y3, mreal *z3, const char *stl, int); /// Draws the face in y-z plane at point p with color stl (include interpolation up to 4 colors). void MGL_EXPORT mgl_facex(HMGL gr, double x0, double y0, double z0, double wy, double wz, const char *stl, double dx, double dy); void MGL_EXPORT mgl_facex_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *wy, mreal *wz, const char *stl, mreal *dx, mreal *dy, int l); /// Draws the face in x-z plane at point p with color stl (include interpolation up to 4 colors). void MGL_EXPORT mgl_facey(HMGL gr, double x0, double y0, double z0, double wx, double wz, const char *stl, double dx, double dy); void MGL_EXPORT mgl_facey_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *wx, mreal *wz, const char *stl, mreal *dx, mreal *dy, int l); /// Draws the face in x-y plane at point p with color stl (include interpolation up to 4 colors). void MGL_EXPORT mgl_facez(HMGL gr, double x0, double y0, double z0, double wx, double wy, const char *stl, double dx, double dy); void MGL_EXPORT mgl_facez_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *wx, mreal *wy, const char *stl, mreal *dx, mreal *dy, int l); /// Draws the sphere at point {x,y,z} with color stl and radius r void MGL_EXPORT mgl_sphere(HMGL gr, double x, double y, double z, double r, const char *stl); void MGL_EXPORT mgl_sphere_(uintptr_t* gr, mreal *x, mreal *y, mreal *z, mreal *r, const char *stl, int); /// Draws the drop at point {x,y,z} in direction {dx,dy,dz} with color stl and radius r /** Parameter \a shift set the degree of drop oblongness: ‘0’ is sphere, ‘1’ is maximally oblongness drop. Parameter \a ap set relative width of the drop (this is analogue of “ellipticity” for the sphere).*/ void MGL_EXPORT mgl_drop(HMGL gr, double x, double y, double z, double dx, double dy, double dz, double r, const char *stl, double shift, double ap); void MGL_EXPORT mgl_drop_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, mreal *shift, mreal *ap, int); /// Draws the cone between points p1,p2 with radius r1,r2 and with style stl /** Parameter \a stl can contain: * ‘@’ for drawing edges; * ‘#’ for wired cones; * ‘t’ for drawing tubes/cylinder instead of cones/prisms; * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones.*/ void MGL_EXPORT mgl_cone(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r1, double r2, const char *stl); void MGL_EXPORT mgl_cone_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r1, mreal *r2, const char *stl, int); /// Draws the ellipse between points p1,p2 with color stl and width r /** Parameter \a stl can contain: * ‘#’ for wired figure (boundary only); * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ void MGL_EXPORT mgl_ellipse(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl); void MGL_EXPORT mgl_ellipse_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, int); /// Draws the rhomb between points p1,p2 with color stl and width r /** Parameter \a stl can contain: * ‘#’ for wired figure (boundary only); * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ void MGL_EXPORT mgl_rhomb(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, double r, const char *stl); void MGL_EXPORT mgl_rhomb_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, mreal *r, const char *stl, int); /// Draws the polygon based on points p1,p2 with color stl /** Parameter \a stl can contain: * ‘#’ for wired figure (boundary only); * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ void MGL_EXPORT mgl_polygon(HMGL gr, double x1, double y1, double z1, double x2, double y2, double z2, int n, const char *stl); void MGL_EXPORT mgl_polygon_(uintptr_t* gr, mreal *x1, mreal *y1, mreal *z1, mreal *x2, mreal *y2, mreal *z2, int *n, const char *stl, int); /// Draws the arc around axis pr with center at p0 and starting from p1, by color stl and angle a (in degrees) void MGL_EXPORT mgl_arc_ext(HMGL gr, double x0, double y0, double z0, double xr, double yr, double zr, double x1, double y1, double z1, double a, const char *stl); void MGL_EXPORT mgl_arc_ext_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *z0, mreal *xr, mreal *yr, mreal *zr, mreal *x1, mreal *y1, mreal *z1, mreal *a, const char *stl, int); /// Draws the arc around axis 'z' with center at p0 and starting from p1, by color stl and angle a (in degrees) void MGL_EXPORT mgl_arc(HMGL gr, double x0, double y0, double x1, double y1, double a, const char *stl); void MGL_EXPORT mgl_arc_(uintptr_t* gr, mreal *x0, mreal *y0, mreal *x1, mreal *y1, mreal *a, const char *stl,int l); /// Draw cones from points {x,y,z} to axis plane /** String \a pen may contain: * ‘@’ for drawing edges; * ‘#’ for wired cones; * ‘t’ for drawing tubes/cylinders instead of cones/prisms; * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_cones_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_cones_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw cones from points {x,z} to axis plane /** String \a pen may contain: * ‘@’ for drawing edges; * ‘#’ for wired cones; * ‘t’ for drawing tubes/cylinders instead of cones/prisms; * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_cones_xz(HMGL graph, HCDT x, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_cones_xz_(uintptr_t *graph, uintptr_t *x, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw cones from points {x,z} with x in x-axis range to axis plane /** String \a pen may contain: * ‘@’ for drawing edges; * ‘#’ for wired cones; * ‘t’ for drawing tubes/cylinders instead of cones/prisms; * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_cones(HMGL graph, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_cones_(uintptr_t *graph, uintptr_t *z, const char *pen, const char *opt,int,int); /// Plot dew drops for vector field {ax,ay} parametrically depended on coordinate {x,y} void MGL_EXPORT mgl_dew_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_dew_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); /// Plot dew drops for vector field {ax,ay} void MGL_EXPORT mgl_dew_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *optl); void MGL_EXPORT mgl_dew_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int l); /// Print text in position {x,y,z} with specified font /* NOTE: Function don't have options because it can be part of group.*/ void MGL_EXPORT mgl_puts(HMGL graph, double x, double y, double z,const char *text, const char *font, double size); void MGL_EXPORT mgl_puts_(uintptr_t *graph, mreal *x, mreal *y, mreal *z,const char *text, const char *font, mreal *size, int, int); void MGL_EXPORT mgl_putsw(HMGL graph, double x, double y, double z,const wchar_t *text, const char *font, double size); /// Print text in position {x,y,z} along direction {dx,dy,dz} with specified font /* NOTE: Function don't have options because it can be part of group.*/ void MGL_EXPORT mgl_puts_dir(HMGL graph, double x, double y, double z, double dx, double dy, double dz, const char *text, const char *font, double size); void MGL_EXPORT mgl_puts_dir_(uintptr_t *graph, mreal *x, mreal *y, mreal *z, mreal *dx, mreal *dy, mreal *dz, const char *text, const char *font, mreal *size, int, int); void MGL_EXPORT mgl_putsw_dir(HMGL graph, double x, double y, double z, double dx, double dy, double dz, const wchar_t *text, const char *font, double size); /// Draw user-defined symbol in position p void MGL_EXPORT mgl_symbol(HMGL gr, double x, double y, double z, char id, const char *how, double size); void MGL_EXPORT mgl_symbol_(uintptr_t *gr, double *x, double *y, double *z, char *id, const char *how, double *size,int,int); /// Draw user-defined symbol in position p along direction d void MGL_EXPORT mgl_symbol_dir(HMGL gr, double x, double y, double z, double dx, double dy, double dz, char id, const char *how, double size); void MGL_EXPORT mgl_symbol_dir_(uintptr_t *gr, double *x, double *y, double *z, double *dx, double *dy, double *dz, char *id, const char *how, double *size,int,int); /// Draw textual marks with size r at points {x,y,z} void MGL_EXPORT mgl_textmark_xyzr(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_textmark_xyzr_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, const char *text, const char *fnt, const char *opt,int,int,int); void MGL_EXPORT mgl_textmarkw_xyzr(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const wchar_t *text, const char *fnt, const char *opt); /// Draw textual marks with size r at points {x,y} void MGL_EXPORT mgl_textmark_xyr(HMGL graph, HCDT x, HCDT y, HCDT r, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_textmark_xyr_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *r, const char *text, const char *fnt, const char *opt,int,int,int); void MGL_EXPORT mgl_textmarkw_xyr(HMGL graph, HCDT x, HCDT y, HCDT r, const wchar_t *text, const char *fnt, const char *opt); /// Draw textual marks with size r at points {x,y} with x in x-axis range void MGL_EXPORT mgl_textmark_yr(HMGL graph, HCDT y, HCDT r, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_textmark_yr_(uintptr_t *graph, uintptr_t *y, uintptr_t *r, const char *text, const char *fnt, const char *opt,int,int,int); void MGL_EXPORT mgl_textmarkw_yr(HMGL graph, HCDT y, HCDT r, const wchar_t *text, const char *fnt, const char *opt); /// Draw textual marks with size r=1 at points {x,y} with x in x-axis range void MGL_EXPORT mgl_textmark(HMGL graph, HCDT y, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_textmarkw(HMGL graph, HCDT y, const wchar_t *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_textmark_(uintptr_t *graph, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int); /// Draw labels for points coordinate(s) at points {x,y,z} /** String \a fnt may contain: * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers.*/ void MGL_EXPORT mgl_label_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_label_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *text, const char *fnt, const char *opt,int,int,int); void MGL_EXPORT mgl_labelw_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const wchar_t *text, const char *fnt, const char *opt); /// Draw labels for points coordinate(s) at points {x,y} /** String \a fnt may contain: * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers.*/ void MGL_EXPORT mgl_label_xy(HMGL graph, HCDT x, HCDT y, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_label_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int); void MGL_EXPORT mgl_labelw_xy(HMGL graph, HCDT x, HCDT y, const wchar_t *text, const char *fnt, const char *opt); /// Draw labels for points coordinate(s) at points {x,y} with x in x-axis range /** String \a fnt may contain: * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers.*/ void MGL_EXPORT mgl_label_y(HMGL graph, HCDT y, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_labelw_y(HMGL graph, HCDT y, const wchar_t *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_label_y_(uintptr_t *graph, uintptr_t *y, const char *text, const char *fnt, const char *opt,int,int,int); /// Draw table for values val along given direction with row labels text at position {x,y} /** String \a fnt may contain: * ‘#’ for drawing cell borders; * ‘|’ for limiting table width by subplot one (equal to option ‘value 1’); * ‘=’ for equal width of all cells; * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers. * Option value set the width of the table (default is 1).*/ void MGL_EXPORT mgl_table(HMGL gr, double x, double y, HCDT val, const char *text, const char *fnt, const char *opt); void MGL_EXPORT mgl_table_(uintptr_t *gr, mreal *x, mreal *y, uintptr_t *val, const char *text, const char *fnt, const char *opt,int,int,int); void MGL_EXPORT mgl_tablew(HMGL gr, double x, double y, HCDT val, const wchar_t *text, const char *fnt, const char *opt); /// Draws bitmap (logo) which is stretched along whole axis range void MGL_EXPORT mgl_logo(HMGL gr, long w, long h, const unsigned char *rgba, int smooth, const char *opt); void MGL_EXPORT mgl_logo_file(HMGL gr, const char *fname, int smooth, const char *opt); void MGL_EXPORT mgl_logo_file_(uintptr_t *gr, const char *fname, int *smooth, const char *opt,int l,int n); /// Draws Lamerey diagram for mapping x_new = f(x_old) /** String \a stl may contain: ‘v’ for drawing arrows; ‘~’ for disable 1st segment. * Option value set the number of segments (default is 20).*/ void MGL_EXPORT mgl_lamerey(HMGL gr, double x0, double (*f)(double,void *), void *par, const char *stl, const char *opt); void MGL_EXPORT mgl_lamerey_dat(HMGL gr, double x0, HCDT f, const char *stl, const char *opt); void MGL_EXPORT mgl_lamerey_str(HMGL gr, double x0, const char *f, const char *stl, const char *opt); void MGL_EXPORT mgl_lamerey_dat_(uintptr_t *gr, double *x0, uintptr_t *f, const char *stl, const char *opt, int,int); void MGL_EXPORT mgl_lamerey_str_(uintptr_t *gr, double *x0, const char *f, const char *stl, const char *opt, int,int,int); /// Draws Bifurcation diagram for mapping x_new = f(x_old) in x-axis range /** Option value set the number of stationary points (default is 1024).*/ void MGL_EXPORT mgl_bifurcation(HMGL gr, double dx, double (*f)(double,double,void *), void *par, const char *stl, const char *opt); void MGL_EXPORT mgl_bifurcation_dat(HMGL gr, double dx, HCDT f, const char *stl, const char *opt); void MGL_EXPORT mgl_bifurcation_str(HMGL gr, double dx, const char *f, const char *stl, const char *opt); void MGL_EXPORT mgl_bifurcation_dat_(uintptr_t *gr, double *dx, uintptr_t *f, const char *stl, const char *opt, int,int); void MGL_EXPORT mgl_bifurcation_str_(uintptr_t *gr, double *dx, const char *f, const char *stl, const char *opt, int,int,int); /// Draws Iris plots for determining cross-dependences of data arrays /** NOTE: using the same ranges and empty ids will not draw axis. This will add data to existing Iris plot. * Option value set the size of data labels ids, separated by ';'.*/ void MGL_EXPORT mgl_iris(HMGL gr, HCDT dats, HCDT ranges, const char *ids, const char *stl, const char *opt); void MGL_EXPORT mgl_iris_1(HMGL gr, HCDT dats, const char *ids, const char *stl, const char *opt); void MGL_EXPORT mgl_irisw(HMGL gr, HCDT dats, HCDT ranges, const wchar_t *ids, const char *stl, const char *opt); void MGL_EXPORT mgl_irisw_1(HMGL gr, HCDT dats, const wchar_t *ids, const char *stl, const char *opt); void MGL_EXPORT mgl_iris_(uintptr_t *gr, uintptr_t *dats, uintptr_t *ranges, const char *ids, const char *stl, const char *opt,int l,int m,int n); void MGL_EXPORT mgl_iris_1_(uintptr_t *gr, uintptr_t *dats, const char *ids, const char *stl, const char *opt,int,int,int); #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/eval.h0000664000175000017500000000716214167366472016174 0ustar balakinbalakin/*************************************************************************** * eval.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_EVAL_H_ #define _MGL_EVAL_H_ //----------------------------------------------------------------------------- #include "mgl2/abstract.h" /// types of errors #define MGL_ERR_LOG 1 #define MGL_ERR_ARC 2 #define MGL_ERR_SQRT 3 class mglData; //----------------------------------------------------------------------------- /// Class for evaluating formula specified by the string class MGL_EXPORT mglFormula { public: /// Evaluates the formula for 'x','r'=\a x, 'y','n'=\a y, 'z','t'=\a z, 'u'=\a u mreal Calc(mreal x,mreal y=0,mreal z=0,mreal u=0) const MGL_FUNC_PURE; /// Evaluates the formula for 'x, y, z, u, v, w' mreal Calc(mreal x,mreal y,mreal z,mreal u,mreal v,mreal w) const MGL_FUNC_PURE; /// Evaluates the formula for variables var mreal Calc(const mreal var[MGL_VS]) const MGL_FUNC_PURE; /// Evaluates the formula for 'x','r'=\a x, 'y','n'=\a y, 'z','t'=\a z, 'u'=\a u mreal CalcD(char diff, mreal x,mreal y=0,mreal z=0,mreal u=0) const MGL_FUNC_PURE; /// Evaluates the formula for 'x, y, z, u, v, w' mreal CalcD(char diff, mreal x,mreal y,mreal z,mreal u,mreal v,mreal w) const MGL_FUNC_PURE; /// Evaluates the derivates of the formula for variables var respect to variable diff mreal CalcD(const mreal var[MGL_VS], char diff) const MGL_FUNC_PURE; /// Return error code inline int GetError() const { return Error; } /// Parse the formula str and create formula-tree mglFormula(const char *str); /// Set data for the spline interpolation mglFormula(HCDT d, mreal x1=0, mreal x2=1, mreal y1=0, mreal y2=1, mreal z1=0, mreal z2=1) : dat(d),dx1(x1),dx2(x2),dy1(y1),dy2(y2),dz1(z1),dz2(z2),tmp(NULL) {}; /// Clean up formula-tree ~mglFormula(); protected: mreal CalcIn(const mreal *a1) const MGL_FUNC_PURE; mreal CalcDIn(int id, const mreal *a1) const MGL_FUNC_PURE; mglFormula *Left,*Right; // first and second argument of the function int Kod; // the function ID mreal Res; // the number or the variable ID HCDT dat; // data file for the interpolation mreal dx1,dx2,dy1,dy2,dz1,dz2; // ranges of data files static int Error; private: mglData *tmp; }; //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/vect.h0000664000175000017500000004703514167366472016211 0ustar balakinbalakin/*************************************************************************** * vect.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_VECT_H_ #define _MGL_VECT_H_ #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif //----------------------------------------------------------------------------- /// Plot vectors at position {x,y} along {ax,ay} with length/color proportional to |a| /** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */ void MGL_EXPORT mgl_traj_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_traj_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); /// Plot vectors at position {x,y,z} along {ax,ay,az} with length/color proportional to |a| /** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */ void MGL_EXPORT mgl_traj_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void MGL_EXPORT mgl_traj_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot vector field {ax,ay} parametrically depended on coordinate {x,y} with length/color proportional to |a| /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows. */ void MGL_EXPORT mgl_vect_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_vect_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); /// Plot vector field {ax,ay} with length/color proportional to |a| /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows. */ void MGL_EXPORT mgl_vect_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_vect_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); /// Plot vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with length/color proportional to |a| /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows. */ void MGL_EXPORT mgl_vect_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void MGL_EXPORT mgl_vect_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot vector field {ax,ay,az} with length/color proportional to |a| /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows. */ void MGL_EXPORT mgl_vect_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void MGL_EXPORT mgl_vect_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot flows for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘.’ for threads from vicinity of saddle point; * ‘v’ for drawing arrows on the threads. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_flow_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_flow_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); /// Plot flows for vector field {ax,ay} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘.’ for threads from vicinity of saddle point; * ‘v’ for drawing arrows on the threads. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_flow_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_flow_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int,int); /// Plot flows for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_flow_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void MGL_EXPORT mgl_flow_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot flows for vector field {ax,ay,az} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_flow_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void MGL_EXPORT mgl_flow_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot flows from given plain for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘v’ for drawing arrows on the threads; * 't' for drawing tapes of normals in x-y and y-z planes. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_flow3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_flow3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, double *sVal, const char *opt,int,int); /// Plot flows from given plain for vector field {ax,ay,az} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘v’ for drawing arrows on the threads; * 't' for drawing tapes of normals in x-y and y-z planes. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_flow3(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_flow3_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, double *sVal, const char *opt,int,int); /// Plot flow from point p for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘>’ for drawing in forward direction only; * ‘<’ for drawing in backward direction only; * ‘v’ for drawing arrows on the threads. */ void MGL_EXPORT mgl_flowp_xy(HMGL gr, double x0, double y0, double z0, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_flowp_xy_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int, int); /// Plot flow from point p for vector field {ax,ay} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘>’ for drawing in forward direction only; * ‘<’ for drawing in backward direction only; * ‘v’ for drawing arrows on the threads. */ void MGL_EXPORT mgl_flowp_2d(HMGL gr, double x0, double y0, double z0, HCDT ax, HCDT ay, const char *sch, const char *opt); void MGL_EXPORT mgl_flowp_2d_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *ax, uintptr_t *ay, const char *sch, const char *opt,int, int); /// Plot flow from point p for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘>’ for drawing in forward direction only; * ‘<’ for drawing in backward direction only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */ void MGL_EXPORT mgl_flowp_xyz(HMGL gr, double x0, double y0, double z0, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void MGL_EXPORT mgl_flowp_xyz_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int, int); /// Plot flow from point p for vector field {ax,ay,az} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘>’ for drawing in forward direction only; * ‘<’ for drawing in backward direction only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */ void MGL_EXPORT mgl_flowp_3d(HMGL gr, double x0, double y0, double z0, HCDT ax, HCDT ay, HCDT az, const char *sch, const char *opt); void MGL_EXPORT mgl_flowp_3d_(uintptr_t *gr, mreal *x0, mreal *y0, mreal *z0, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, const char *opt,int,int); /// Plot flow pipes for vector field {ax,ay} parametrically depended on coordinate {x,y} with color and radius proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘i’ for pipe radius to be inverse proportional to amplitude. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_pipe_xy(HMGL gr, HCDT x, HCDT y, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt); void MGL_EXPORT mgl_pipe_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ax, uintptr_t *ay, const char *sch, mreal *r0, const char *opt,int,int); /// Plot flow pipes for vector field {ax,ay} with color and radius proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘i’ for pipe radius to be inverse proportional to amplitude. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_pipe_2d(HMGL gr, HCDT ax, HCDT ay, const char *sch, double r0, const char *opt); void MGL_EXPORT mgl_pipe_2d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, const char *sch, mreal *r0, const char *opt,int,int); /// Plot flow pipes for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color and radius proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘i’ for pipe radius to be inverse proportional to amplitude; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_pipe_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double r0, const char *opt); void MGL_EXPORT mgl_pipe_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *r0, const char *opt,int,int); /// Plot flow pipes for vector field {ax,ay,az} with color and radius proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘i’ for pipe radius to be inverse proportional to amplitude; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_pipe_3d(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double r0, const char *opt); void MGL_EXPORT mgl_pipe_3d_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *r0, const char *opt,int,int); /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y,z} /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_grad_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ph, const char *sch, const char *opt); void MGL_EXPORT mgl_grad_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ph, const char *sch, const char *opt,int, int); /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y} /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_grad_xy(HMGL gr, HCDT x, HCDT y, HCDT ph, const char *sch, const char *opt); void MGL_EXPORT mgl_grad_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *ph, const char *sch, const char *opt,int,int); /// Plot flows for gradient of scalar field phi /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ void MGL_EXPORT mgl_grad(HMGL gr, HCDT ph, const char *sch, const char *opt); void MGL_EXPORT mgl_grad_(uintptr_t *gr, uintptr_t *ph, const char *sch, const char *opt,int,int); /// Draw vector plot along slice for 3d data specified parametrically /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows, * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */ void MGL_EXPORT mgl_vect3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_vect3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw vector plot along slice for 3d data /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows, * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */ void MGL_EXPORT mgl_vect3(HMGL gr, HCDT ax, HCDT ay, HCDT az, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_vect3_(uintptr_t *gr, uintptr_t *ax, uintptr_t *ay, uintptr_t *az, const char *sch, mreal *sVal, const char *opt,int,int); //----------------------------------------------------------------------------- #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/fltk.h0000664000175000017500000000740614167366472016206 0ustar balakinbalakin/*************************************************************************** * fltk.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_FLTK_H_ #define _MGL_FLTK_H_ #include //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /// Creates FLTK window for plotting HMGL MGL_EXPORT mgl_create_graph_fltk(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)); uintptr_t MGL_EXPORT mgl_create_graph_fltk_(const char *title, int); /// Run main FLTK loop for event handling. int MGL_EXPORT mgl_fltk_run(); int MGL_EXPORT mgl_fltk_run_(); /// Run main FLTK loop for event handling in separate thread. int MGL_EXPORT mgl_fltk_thr(); /// FLTK function for asking user. void MGL_EXPORT mgl_ask_fltk(const wchar_t *quest, wchar_t *res); /// FLTK function for displaying progress of something. void MGL_EXPORT mgl_progress_fltk(int value, int maximal, HMGL gr); /// Return pointer to widget (Fl_MGLView*) used for plotting MGL_EXPORT_PURE void *mgl_fltk_widget(HMGL gr); #ifdef __cplusplus } //----------------------------------------------------------------------------- #include //----------------------------------------------------------------------------- /// Wrapper class for windows displaying graphics class MGL_EXPORT mglFLTK : public mglWnd { mglFLTK(const mglFLTK &) {} // copying is not allowed const mglFLTK &operator=(const mglFLTK &t) { return t; } public: mglFLTK(const char *title="MathGL") : mglWnd() { gr = mgl_create_graph_fltk(0,title,0,0); } mglFLTK(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=NULL, void (*load)(void *p)=0) : mglWnd() { gr = mgl_create_graph_fltk(draw,title,par,load); } mglFLTK(int (*draw)(mglGraph *gr), const char *title="MathGL") : mglWnd() { gr = mgl_create_graph_fltk(draw?mgl_draw_graph:0,title,(void*)draw,0); } mglFLTK(mglDraw *draw, const char *title="MathGL") : mglWnd() { gr = mgl_create_graph_fltk(draw?mgl_draw_class:0,title,draw,mgl_reload_class); #if MGL_HAVE_PTHR_WIDGET mgl_wnd_set_mutex(gr, &(draw->mutex)); #endif mgl_set_click_func(gr, mgl_click_class); } virtual ~mglFLTK() {} int Run() { return mgl_fltk_run(); } ///< Run main loop for event handling int RunThr() { return mgl_fltk_thr(); } ///< Run main loop for event handling in separate thread }; //----------------------------------------------------------------------------- #endif #endif mathgl-8.0.1/include/mgl2/data_cf.h0000664000175000017500000011774514167366472016637 0ustar balakinbalakin/*************************************************************************** * data_cf.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_DATA_CF_H_ #define _MGL_DATA_CF_H_ //----------------------------------------------------------------------------- #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #if MGL_HAVE_GSL #include #include #else #ifdef __cplusplus struct gsl_vector; struct gsl_matrix; #else typedef void gsl_vector; typedef void gsl_matrix; #endif #endif //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /// Get integer power of x double MGL_EXPORT_CONST mgl_ipow(double x,int n); double MGL_EXPORT_PURE mgl_ipow_(mreal *x,int *n); /// Get number of seconds since 1970 for given string double MGL_EXPORT mgl_get_time(const char *time, const char *fmt); double MGL_EXPORT mgl_get_time_(const char *time, const char *fmt,int,int); /// Create HMDT object HMDT MGL_EXPORT mgl_create_data(); uintptr_t MGL_EXPORT mgl_create_data_(); /// Create HMDT object with specified sizes HMDT MGL_EXPORT mgl_create_data_size(long nx, long ny, long nz); uintptr_t MGL_EXPORT mgl_create_data_size_(int *nx, int *ny, int *nz); /// Create HMDT object with data from file HMDT MGL_EXPORT mgl_create_data_file(const char *fname); uintptr_t MGL_EXPORT mgl_create_data_file_(const char *fname, int len); /// Delete HMDT object void MGL_EXPORT mgl_delete_data(HMDT dat); void MGL_EXPORT mgl_delete_data_(uintptr_t *dat); /// Rearange data dimensions void MGL_EXPORT mgl_data_rearrange(HMDT dat, long mx,long my,long mz); void MGL_EXPORT mgl_data_rearrange_(uintptr_t *dat, int *mx, int *my, int *mz); /// Link external data array (don't delete it at exit) void MGL_EXPORT mgl_data_link(HMDT dat, mreal *A,long mx,long my,long mz); void MGL_EXPORT mgl_data_link_(uintptr_t *d, mreal *A, int *nx,int *ny,int *nz); /// Allocate memory and copy the data from the (float *) array void MGL_EXPORT mgl_data_set_float(HMDT dat, const float *A,long mx,long my,long mz); void MGL_EXPORT mgl_data_set_float_(uintptr_t *dat, const float *A,int *NX,int *NY,int *NZ); void MGL_EXPORT mgl_data_set_float1_(uintptr_t *d, const float *A,int *N1); /// Allocate memory and copy the data from the (double *) array void MGL_EXPORT mgl_data_set_double(HMDT dat, const double *A,long mx,long my,long mz); void MGL_EXPORT mgl_data_set_double_(uintptr_t *dat, const double *A,int *NX,int *NY,int *NZ); void MGL_EXPORT mgl_data_set_double1_(uintptr_t *d, const double *A,int *N1); /// Allocate memory and copy the data from the (float **) array void MGL_EXPORT mgl_data_set_float2(HMDT d, float const * const *A,long N1,long N2); void MGL_EXPORT mgl_data_set_float2_(uintptr_t *d, const float *A,int *N1,int *N2); /// Allocate memory and copy the data from the (double **) array void MGL_EXPORT mgl_data_set_double2(HMDT d, double const * const *A,long N1,long N2); void MGL_EXPORT mgl_data_set_double2_(uintptr_t *d, const double *A,int *N1,int *N2); /// Allocate memory and copy the data from the (float ***) array void MGL_EXPORT mgl_data_set_float3(HMDT d, float const * const * const *A,long N1,long N2,long N3); void MGL_EXPORT mgl_data_set_float3_(uintptr_t *d, const float *A,int *N1,int *N2,int *N3); /// Allocate memory and copy the data from the (double ***) array void MGL_EXPORT mgl_data_set_double3(HMDT d, double const * const * const *A,long N1,long N2,long N3); void MGL_EXPORT mgl_data_set_double3_(uintptr_t *d, const double *A,int *N1,int *N2,int *N3); /// Import data from abstract type void MGL_EXPORT mgl_data_set(HMDT dat, HCDT a); void MGL_EXPORT mgl_data_set_(uintptr_t *dat, uintptr_t *a); /// Allocate memory and copy the data from the gsl_vector void MGL_EXPORT mgl_data_set_vector(HMDT dat, gsl_vector *v); /// Allocate memory and copy the data from the gsl_matrix void MGL_EXPORT mgl_data_set_matrix(HMDT dat, gsl_matrix *m); /// Set value of data element [i,j,k] void MGL_EXPORT mgl_data_set_value(HMDT dat, mreal v, long i, long j, long k); void MGL_EXPORT mgl_data_set_value_(uintptr_t *d, mreal *v, int *i, int *j, int *k); /// Get value of data element [i,j,k] mreal MGL_EXPORT mgl_data_get_value(HCDT dat, long i, long j, long k); mreal MGL_EXPORT mgl_data_get_value_(uintptr_t *d, int *i, int *j, int *k); /// Allocate memory and scanf the data from the string void MGL_EXPORT mgl_data_set_values(HMDT dat, const char *val, long nx, long ny, long nz); void MGL_EXPORT mgl_data_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l); /// Read data array from HDF file (parse HDF4 and HDF5 files) int MGL_EXPORT mgl_data_read_hdf(HMDT d,const char *fname,const char *data); int MGL_EXPORT mgl_data_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n); /// Read data from tab-separated text file with auto determining size int MGL_EXPORT mgl_data_read(HMDT dat, const char *fname); int MGL_EXPORT mgl_data_read_(uintptr_t *d, const char *fname,int l); /// Read data from text file with size specified at beginning of the file int MGL_EXPORT mgl_data_read_mat(HMDT dat, const char *fname, long dim); int MGL_EXPORT mgl_data_read_mat_(uintptr_t *dat, const char *fname, int *dim, int); /// Read data from text file with specifeid size int MGL_EXPORT mgl_data_read_dim(HMDT dat, const char *fname,long mx,long my,long mz); int MGL_EXPORT mgl_data_read_dim_(uintptr_t *dat, const char *fname,int *mx,int *my,int *mz,int); /// Read data from tab-separated text files with auto determining size which filenames are result of sprintf(fname,templ,t) where t=from:step:to int MGL_EXPORT mgl_data_read_range(HMDT d, const char *templ, double n1, double n2, double step, int as_slice); int MGL_EXPORT mgl_data_read_range_(uintptr_t *d, const char *fname, mreal *n1, mreal *n2, mreal *step, int *as_slice,int l); /// Read data from tab-separated text files with auto determining size which filenames are satisfied to template (like "t_*.dat") int MGL_EXPORT mgl_data_read_all(HMDT dat, const char *templ, int as_slice); int MGL_EXPORT mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l); /// Read data from binary file of type: 0 - double, 1 - float, 2 - long double, 3 - long int, 4 - int, 5 - short int, 6 - char. /** NOTE: this function may not correctly read binary files written in different CPU kind! */ int MGL_EXPORT mgl_data_read_bin(HMDT dat, const char *fname, int type); int MGL_EXPORT mgl_data_read_bin_(uintptr_t *d, const char *fname,int *type,int l); /// Import data array from PNG file according color scheme void MGL_EXPORT mgl_data_import(HMDT dat, const char *fname, const char *scheme,mreal v1,mreal v2); void MGL_EXPORT mgl_data_import_(uintptr_t *dat, const char *fname, const char *scheme,mreal *v1,mreal *v2,int,int); /// Scan textual file for template and fill data array int MGL_EXPORT mgl_data_scan_file(HMDT dat,const char *fname, const char *templ); int MGL_EXPORT mgl_data_scan_file_(uintptr_t *dat,const char *fname, const char *templ,int,int); /// Read data array from Tektronix WFM file /** Parse Tektronix TDS5000/B, TDS6000/B/C, TDS/CSA7000/B, MSO70000/C, DSA70000/B/C DPO70000/B/C DPO7000/ MSO/DPO5000. */ int MGL_EXPORT mgl_data_read_wfm(HMDT d,const char *fname, long num, long step, long start); int MGL_EXPORT mgl_data_read_wfm_(uintptr_t *d, const char *fname, long *num, long *step, long *start,int l); /// Read data array from Matlab MAT file (parse versions 4 and 5) int MGL_EXPORT mgl_data_read_matlab(HMDT d,const char *fname,const char *data); int MGL_EXPORT mgl_data_read_matlab_(uintptr_t *d, const char *fname, const char *data,int l,int n); /// Create or recreate the array with specified size and fill it by zero void MGL_EXPORT mgl_data_create(HMDT dat, long nx,long ny,long nz); void MGL_EXPORT mgl_data_create_(uintptr_t *dat, int *nx,int *ny,int *nz); /// Transpose dimensions of the data (generalization of Transpose) void MGL_EXPORT mgl_data_transpose(HMDT dat, const char *dim); void MGL_EXPORT mgl_data_transpose_(uintptr_t *dat, const char *dim,int); /// Normalize the data to range [v1,v2] void MGL_EXPORT mgl_data_norm(HMDT dat, mreal v1,mreal v2,int sym,long dim); void MGL_EXPORT mgl_data_norm_(uintptr_t *dat, mreal *v1,mreal *v2,int *sym,int *dim); /// Normalize the data to range [v1,v2] slice by slice void MGL_EXPORT mgl_data_norm_slice(HMDT dat, mreal v1,mreal v2,char dir,long keep_en,long sym); void MGL_EXPORT mgl_data_norm_slice_(uintptr_t *dat, mreal *v1,mreal *v2,char *dir,int *keep_en,int *sym,int l); /// Limit the data to be inside [-v,v], keeping the original sign void MGL_EXPORT mgl_data_limit(HMDT dat, mreal v); void MGL_EXPORT mgl_data_limit_(uintptr_t *dat, mreal *v); /// Project the periodical data to range [v1,v2] (like mod() function). Separate branches by NAN if sep=true. void MGL_EXPORT mgl_data_coil(HMDT dat, mreal v1, mreal v2, int sep); void MGL_EXPORT mgl_data_coil_(uintptr_t *dat, mreal *v1, mreal *v2, int *sep); /// Keep the data sign/value along line i and j in given direction. /** Parameter "how" may contain: 'x','y' or 'z' for direction (default is 'y'); 'a' for keeping amplitude instead of sign.*/ void MGL_EXPORT mgl_data_keep(HMDT dat, const char *how, long i, long j); void MGL_EXPORT mgl_data_keep_(uintptr_t *d, const char *how, long *i, long *j, int); /// Get sub-array of the data with given fixed indexes HMDT MGL_EXPORT mgl_data_subdata(HCDT dat, long xx,long yy,long zz); uintptr_t MGL_EXPORT mgl_data_subdata_(uintptr_t *dat, int *xx,int *yy,int *zz); /// Get sub-array of the data with given fixed indexes (like indirect access) HMDT MGL_EXPORT mgl_data_subdata_ext(HCDT dat, HCDT xx, HCDT yy, HCDT zz); uintptr_t MGL_EXPORT mgl_data_subdata_ext_(uintptr_t *dat, uintptr_t *xx,uintptr_t *yy,uintptr_t *zz); /// Get column (or slice) of the data filled by formulas of named columns HMDT MGL_EXPORT mgl_data_column(HCDT dat, const char *eq); uintptr_t MGL_EXPORT mgl_data_column_(uintptr_t *dat, const char *eq,int l); /// Get data from sections ids, separated by value val along specified direction. /** If section id is negative then reverse order is used (i.e. -1 give last section). */ HMDT MGL_EXPORT mgl_data_section(HCDT dat, HCDT ids, char dir, mreal val); uintptr_t MGL_EXPORT mgl_data_section_(uintptr_t *d, uintptr_t *ids, const char *dir, mreal *val,int); /// Get data from section id, separated by value val along specified direction. /** If section id is negative then reverse order is used (i.e. -1 give last section). */ HMDT MGL_EXPORT mgl_data_section_val(HCDT dat, long id, char dir, mreal val); uintptr_t MGL_EXPORT mgl_data_section_val_(uintptr_t *d, int *id, const char *dir, mreal *val,int); /// Get contour lines for dat[i,j]=val. NAN values separate the the curves HMDT MGL_EXPORT mgl_data_conts(mreal val, HCDT dat); /// Evaluate formula 'str' for given list of variables. HMDT MGL_EXPORT mgl_formula_calc(const char *str, long n, ...); /// Equidistantly fill the data to range [x1,x2] in direction dir void MGL_EXPORT mgl_data_fill(HMDT dat, mreal x1,mreal x2,char dir); void MGL_EXPORT mgl_data_fill_(uintptr_t *dat, mreal *x1,mreal *x2,const char *dir,int); /// Modify the data by specified formula assuming x,y,z in range [r1,r2] void MGL_EXPORT mgl_data_fill_eq(HMGL gr, HMDT dat, const char *eq, HCDT vdat, HCDT wdat,const char *opt); void MGL_EXPORT mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,const char *opt, int, int); /// Fill dat by interpolated values of vdat parametrically depended on xdat for x in range [x1,x2] using global spline void MGL_EXPORT mgl_data_refill_gs(HMDT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl); void MGL_EXPORT mgl_data_refill_gs_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl); /// Fill dat by interpolated values of vdat parametrically depended on xdat for x in range [x1,x2] void MGL_EXPORT mgl_data_refill_x(HMDT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl); void MGL_EXPORT mgl_data_refill_x_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl); /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat for x,y in range [x1,x2]*[y1,y2] void MGL_EXPORT mgl_data_refill_xy(HMDT dat, HCDT xdat, HCDT ydat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, long sl); void MGL_EXPORT mgl_data_refill_xy_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, long *sl); /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in range [x1,x2]*[y1,y2]*[z1,z2] void MGL_EXPORT mgl_data_refill_xyz(HMDT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, mreal z1, mreal z2); void MGL_EXPORT mgl_data_refill_xyz_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, mreal *z1, mreal *z2); /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range void MGL_EXPORT mgl_data_refill_gr(HMGL gr, HMDT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, long sl, const char *opt); void MGL_EXPORT mgl_data_refill_gr_(uintptr_t *gr, uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, uintptr_t *vdat, long *sl, const char *opt,int); /// Set the data by triangulated surface values assuming x,y,z in range [r1,r2] void MGL_EXPORT mgl_data_grid(HMGL gr, HMDT d, HCDT xdat, HCDT ydat, HCDT zdat,const char *opt); void MGL_EXPORT mgl_data_grid_(uintptr_t *gr, uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, const char *opt,int); /// Set the data by triangulated surface values assuming x,y,z in range [x1,x2]*[y1,y2] void MGL_EXPORT mgl_data_grid_xy(HMDT d, HCDT xdat, HCDT ydat, HCDT zdat, mreal x1, mreal x2, mreal y1, mreal y2); void MGL_EXPORT mgl_data_grid_xy_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2); /// Put value to data element(s) void MGL_EXPORT mgl_data_put_val(HMDT dat, mreal val, long i, long j, long k); void MGL_EXPORT mgl_data_put_val_(uintptr_t *dat, mreal *val, int *i, int *j, int *k); /// Put array to data element(s) void MGL_EXPORT mgl_data_put_dat(HMDT dat, HCDT val, long i, long j, long k); void MGL_EXPORT mgl_data_put_dat_(uintptr_t *dat, uintptr_t *val, int *i, int *j, int *k); /// Modify the data by specified formula void MGL_EXPORT mgl_data_modify(HMDT dat, const char *eq,long dim); void MGL_EXPORT mgl_data_modify_(uintptr_t *dat, const char *eq,int *dim,int); /// Modify the data by specified formula void MGL_EXPORT mgl_data_modify_vw(HMDT dat, const char *eq,HCDT vdat,HCDT wdat); void MGL_EXPORT mgl_data_modify_vw_(uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,int); /// Reduce size of the data void MGL_EXPORT mgl_data_squeeze(HMDT dat, long rx,long ry,long rz,long smooth); void MGL_EXPORT mgl_data_squeeze_(uintptr_t *dat, int *rx,int *ry,int *rz,int *smooth); /// Get array which is n-th pairs {x[i],y[i]} for iterated function system (fractal) generated by A /** NOTE: A.nx must be >= 7. */ HMDT MGL_EXPORT mgl_data_ifs_2d(HCDT A, long n, long skip); uintptr_t MGL_EXPORT mgl_data_ifs_2d_(uintptr_t *A, long *n, long *skip); /// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) generated by A /** NOTE: A.nx must be >= 13. */ HMDT MGL_EXPORT mgl_data_ifs_3d(HCDT A, long n, long skip); uintptr_t MGL_EXPORT mgl_data_ifs_3d_(uintptr_t *A, long *n, long *skip); /// Get array which is n-th points {x[i],y[i],z[i]} for iterated function system (fractal) defined in *.ifs file 'fname' and named as 'name' HMDT MGL_EXPORT mgl_data_ifs_file(const char *fname, const char *name, long n, long skip); uintptr_t mgl_data_ifs_file_(const char *fname, const char *name, long *n, long *skip,int l,int m); /// Codes for flame fractal functions enum { mglFlame2d_linear=0, mglFlame2d_sinusoidal, mglFlame2d_spherical, mglFlame2d_swirl, mglFlame2d_horseshoe, mglFlame2d_polar, mglFlame2d_handkerchief,mglFlame2d_heart, mglFlame2d_disc, mglFlame2d_spiral, mglFlame2d_hyperbolic, mglFlame2d_diamond, mglFlame2d_ex, mglFlame2d_julia, mglFlame2d_bent, mglFlame2d_waves, mglFlame2d_fisheye, mglFlame2d_popcorn, mglFlame2d_exponential, mglFlame2d_power, mglFlame2d_cosine, mglFlame2d_rings, mglFlame2d_fan, mglFlame2d_blob, mglFlame2d_pdj, mglFlame2d_fan2, mglFlame2d_rings2, mglFlame2d_eyefish, mglFlame2d_bubble, mglFlame2d_cylinder, mglFlame2d_perspective, mglFlame2d_noise, mglFlame2d_juliaN, mglFlame2d_juliaScope, mglFlame2d_blur, mglFlame2d_gaussian, mglFlame2d_radialBlur, mglFlame2d_pie, mglFlame2d_ngon, mglFlame2d_curl, mglFlame2d_rectangles, mglFlame2d_arch, mglFlame2d_tangent, mglFlame2d_square, mglFlame2d_blade, mglFlame2d_secant, mglFlame2d_rays, mglFlame2d_twintrian, mglFlame2d_cross, mglFlame2d_disc2, mglFlame2d_supershape, mglFlame2d_flower, mglFlame2d_conic, mglFlame2d_parabola, mglFlame2d_bent2, mglFlame2d_bipolar, mglFlame2d_boarders, mglFlame2d_butterfly, mglFlame2d_cell, mglFlame2d_cpow, mglFlame2d_curve, mglFlame2d_edisc, mglFlame2d_elliptic, mglFlame2d_escher, mglFlame2d_foci, mglFlame2d_lazySusan, mglFlame2d_loonie, mglFlame2d_preBlur, mglFlame2d_modulus, mglFlame2d_oscope, mglFlame2d_polar2, mglFlame2d_popcorn2, mglFlame2d_scry, mglFlame2d_separation, mglFlame2d_split, mglFlame2d_splits, mglFlame2d_stripes, mglFlame2d_wedge, mglFlame2d_wedgeJulia, mglFlame2d_wedgeSph, mglFlame2d_whorl, mglFlame2d_waves2, mglFlame2d_exp, mglFlame2d_log, mglFlame2d_sin, mglFlame2d_cos, mglFlame2d_tan, mglFlame2d_sec, mglFlame2d_csc, mglFlame2d_cot, mglFlame2d_sinh, mglFlame2d_cosh, mglFlame2d_tanh, mglFlame2d_sech, mglFlame2d_csch, mglFlame2d_coth, mglFlame2d_auger, mglFlame2d_flux, mglFlame2dLAST }; /// Get array which is n-th pairs {x[i],y[i]} for Flame fractal generated by A with functions F /** NOTE: A.nx must be >= 7 and F.nx >= 2 and F.nz=A.ny. * F[0,i,j] denote function id. F[1,i,j] give function weight. F(2:5,i,j) provide function parameters. * Resulting point is {xnew,ynew} = sum_i F[1,i,j]*F[0,i,j]{IFS2d(A[j]){x,y}}. */ HMDT MGL_EXPORT mgl_data_flame_2d(HCDT A, HCDT F, long n, long skip); uintptr_t MGL_EXPORT mgl_data_flame_2d_(uintptr_t *A, uintptr_t *F, long *n, long *skip); /// Get curves, separated by NAN, for maximal values of array d as function of x coordinate. /** Noises below lvl amplitude are ignored. * Parameter dy \in [0,ny] set the "attraction" distance of points to curve. */ HMDT MGL_EXPORT mgl_data_detect(HCDT d, mreal lvl, mreal dj, mreal di, mreal min_len); uintptr_t MGL_EXPORT mgl_data_detect_(uintptr_t *d, mreal *lvl, mreal *dj, mreal *di, mreal *min_len); /// Get array as solution of tridiagonal matrix solution a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i] /** String \a how may contain: * 'x', 'y', 'z' for solving along x-,y-,z-directions, or * 'h' for solving along hexagonal direction at x-y plain (need nx=ny), * 'c' for using periodical boundary conditions, * 'd' for diffraction/diffuse calculation. * NOTE: It work for flat data model only (i.e. for a[i,j]==a[i+nx*j]) */ HMDT MGL_EXPORT mgl_data_tridmat(HCDT A, HCDT B, HCDT C, HCDT D, const char *how); uintptr_t MGL_EXPORT mgl_data_tridmat_(uintptr_t *A, uintptr_t *B, uintptr_t *C, uintptr_t *D, const char *how, int); /// Returns pointer to data element [i,j,k] MGL_EXPORT mreal *mgl_data_value(HMDT dat, long i,long j,long k); /// Returns pointer to internal data array MGL_EXPORT_PURE mreal *mgl_data_data(HMDT dat); /// Gets the x-size of the data. long MGL_EXPORT mgl_data_get_nx(HCDT d); long MGL_EXPORT mgl_data_get_nx_(uintptr_t *d); /// Gets the y-size of the data. long MGL_EXPORT mgl_data_get_ny(HCDT d); long MGL_EXPORT mgl_data_get_ny_(uintptr_t *d); /// Gets the z-size of the data. long MGL_EXPORT mgl_data_get_nz(HCDT d); long MGL_EXPORT mgl_data_get_nz_(uintptr_t *d); /// Get the data which is direct multiplication (like, d[i,j] = this[i]*a[j] and so on) HMDT MGL_EXPORT mgl_data_combine(HCDT dat1, HCDT dat2); uintptr_t MGL_EXPORT mgl_data_combine_(uintptr_t *dat1, uintptr_t *dat2); /// Extend data dimensions void MGL_EXPORT mgl_data_extend(HMDT dat, long n1, long n2); void MGL_EXPORT mgl_data_extend_(uintptr_t *dat, int *n1, int *n2); /// Insert data rows/columns/slices void MGL_EXPORT mgl_data_insert(HMDT dat, char dir, long at, long num); void MGL_EXPORT mgl_data_insert_(uintptr_t *dat, const char *dir, int *at, int *num, int); /// Delete data rows/columns/slices void MGL_EXPORT mgl_data_delete(HMDT dat, char dir, long at, long num); void MGL_EXPORT mgl_data_delete_(uintptr_t *dat, const char *dir, int *at, int *num, int); /// Joind another data array void MGL_EXPORT mgl_data_join(HMDT dat, HCDT d); void MGL_EXPORT mgl_data_join_(uintptr_t *dat, uintptr_t *d); /// Smooth the data on specified direction or directions /** String \a dir may contain: * ‘x’, ‘y’, ‘z’ for 1st, 2nd or 3d dimension; * ‘dN’ for linear averaging over N points; * ‘3’ for linear averaging over 3 points; * ‘5’ for linear averaging over 5 points. * By default quadratic averaging over 5 points is used. */ void MGL_EXPORT mgl_data_smooth(HMDT d, const char *dirs, mreal delta); void MGL_EXPORT mgl_data_smooth_(uintptr_t *dat, const char *dirs, mreal *delta,int); /// Get array which is result of summation in given direction or directions HMDT MGL_EXPORT mgl_data_sum(HCDT dat, const char *dir); uintptr_t MGL_EXPORT mgl_data_sum_(uintptr_t *dat, const char *dir,int); /// Get array of positions of first value large val HMDT MGL_EXPORT mgl_data_first_dir(HCDT dat, const char *dir, double val); uintptr_t MGL_EXPORT mgl_data_first_dir_(uintptr_t *d, const char *dir, double *val,int l); /// Get array of positions of last value large val HMDT MGL_EXPORT mgl_data_last_dir(HCDT dat, const char *dir, double val); uintptr_t MGL_EXPORT mgl_data_last_dir_(uintptr_t *d, const char *dir, double *val,int l); /// Get array which is result of maximal values in given direction or directions HMDT MGL_EXPORT mgl_data_max_dir(HCDT dat, const char *dir); uintptr_t MGL_EXPORT mgl_data_max_dir_(uintptr_t *dat, const char *dir,int); /// Get array which is result of minimal values in given direction or directions HMDT MGL_EXPORT mgl_data_min_dir(HCDT dat, const char *dir); uintptr_t MGL_EXPORT mgl_data_min_dir_(uintptr_t *dat, const char *dir,int); /// Get positions of local maximums and minimums HMDT MGL_EXPORT mgl_data_minmax(HCDT dat); uintptr_t MGL_EXPORT mgl_data_minmax_(uintptr_t *dat); /// Get indexes of a set of connected surfaces for set of values {a_ijk,b_ijk} as dependent on j,k /** NOTE: not optimized for general case!!! */ HMDT MGL_EXPORT mgl_data_connect(HCDT a, HCDT b); uintptr_t MGL_EXPORT mgl_data_connect_(uintptr_t *a, uintptr_t *b); /// Resort data values according found connected surfaces for set of values {a_ijk,b_ijk} as dependent on j,k /** NOTE: not optimized for general case!!! */ void MGL_EXPORT mgl_data_connect_r(HMDT a, HMDT b); void MGL_EXPORT mgl_data_connect_r_(uintptr_t *a, uintptr_t *b); /// Cumulative summation the data in given direction or directions void MGL_EXPORT mgl_data_cumsum(HMDT dat, const char *dir); void MGL_EXPORT mgl_data_cumsum_(uintptr_t *dat, const char *dir,int); /// Integrate (cumulative summation) the data in given direction or directions void MGL_EXPORT mgl_data_integral(HMDT dat, const char *dir); void MGL_EXPORT mgl_data_integral_(uintptr_t *dat, const char *dir,int); /// Differentiate the data in given direction or directions void MGL_EXPORT mgl_data_diff(HMDT dat, const char *dir); void MGL_EXPORT mgl_data_diff_(uintptr_t *dat, const char *dir,int); /// Differentiate the parametrically specified data along direction v1 with v2,v3=const (v3 can be NULL) void MGL_EXPORT mgl_data_diff_par(HMDT dat, HCDT v1, HCDT v2, HCDT v3); void MGL_EXPORT mgl_data_diff_par_(uintptr_t *dat, uintptr_t *v1, uintptr_t *v2, uintptr_t *v3); /// Double-differentiate (like Laplace operator) the data in given direction void MGL_EXPORT mgl_data_diff2(HMDT dat, const char *dir); void MGL_EXPORT mgl_data_diff2_(uintptr_t *dat, const char *dir,int); /// Swap left and right part of the data in given direction (useful for Fourier spectrum) void MGL_EXPORT mgl_data_swap(HMDT dat, const char *dir); void MGL_EXPORT mgl_data_swap_(uintptr_t *dat, const char *dir,int); /// Roll data along direction dir by num slices void MGL_EXPORT mgl_data_roll(HMDT dat, char dir, long num); void MGL_EXPORT mgl_data_roll_(uintptr_t *dat, const char *dir, int *num, int); /// Mirror the data in given direction (useful for Fourier spectrum) void MGL_EXPORT mgl_data_mirror(HMDT dat, const char *dir); void MGL_EXPORT mgl_data_mirror_(uintptr_t *dat, const char *dir,int); /// Sort rows (or slices) by values of specified column void MGL_EXPORT mgl_data_sort(HMDT dat, long idx, long idy); void MGL_EXPORT mgl_data_sort_(uintptr_t *dat, int *idx, int *idy); /// Return dilated array of 0 or 1 for data values larger val void MGL_EXPORT mgl_data_dilate(HMDT dat, mreal val, long step); void MGL_EXPORT mgl_data_dilate_(uintptr_t *dat, mreal *val, int *step); /// Return eroded array of 0 or 1 for data values larger val void MGL_EXPORT mgl_data_erode(HMDT dat, mreal val, long step); void MGL_EXPORT mgl_data_erode_(uintptr_t *dat, mreal *val, int *step); /// Apply Hankel transform void MGL_EXPORT mgl_data_hankel(HMDT dat, const char *dir); void MGL_EXPORT mgl_data_hankel_(uintptr_t *dat, const char *dir,int); /// Apply Sin-Fourier transform void MGL_EXPORT mgl_data_sinfft(HMDT dat, const char *dir); void MGL_EXPORT mgl_data_sinfft_(uintptr_t *dat, const char *dir,int); /// Apply Cos-Fourier transform void MGL_EXPORT mgl_data_cosfft(HMDT dat, const char *dir); void MGL_EXPORT mgl_data_cosfft_(uintptr_t *dat, const char *dir,int); /// Fill data by coordinates/momenta samples for Hankel ('h') or Fourier ('f') transform /** Parameter \a how may contain: * ‘x‘,‘y‘,‘z‘ for direction (only one will be used), * ‘k‘ for momenta samples, * ‘h‘ for Hankel samples, * ‘f‘ for Cartesian/Fourier samples (default). */ void MGL_EXPORT mgl_data_fill_sample(HMDT dat, const char *how); void MGL_EXPORT mgl_data_fill_sample_(uintptr_t *dat, const char *how,int); /// Find correlation between 2 data arrays HMDT MGL_EXPORT mgl_data_correl(HCDT dat1, HCDT dat2, const char *dir); uintptr_t MGL_EXPORT mgl_data_correl_(uintptr_t *dat1, uintptr_t *dat2, const char *dir,int); /// Apply wavelet transform /** Parameter \a dir may contain: * ‘x‘,‘y‘,‘z‘ for directions, * ‘d‘ for daubechies, ‘D‘ for centered daubechies, * ‘h‘ for haar, ‘H‘ for centered haar, * ‘b‘ for bspline, ‘B‘ for centered bspline, * ‘i‘ for applying inverse transform. */ void MGL_EXPORT mgl_data_wavelet(HMDT dat, const char *how, int k); void MGL_EXPORT mgl_data_wavelet_(uintptr_t *d, const char *dir, int *k,int); /// Allocate and prepare data for Fourier transform by nthr threads MGL_EXPORT void *mgl_fft_alloc(long n, void **space, long nthr); MGL_EXPORT void *mgl_fft_alloc_thr(long n); /// Free data for Fourier transform void MGL_EXPORT mgl_fft_free(void *wt, void **ws, long nthr); void MGL_EXPORT mgl_fft_free_thr(void *wt); /// Make Fourier transform of data x of size n and step s between points void MGL_EXPORT mgl_fft(double *x, long s, long n, const void *wt, void *ws, int inv); /// Clear internal data for speeding up FFT and Hankel transforms void MGL_EXPORT mgl_clear_fft(); /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] mreal MGL_EXPORT mgl_data_spline(HCDT dat, mreal x,mreal y,mreal z); mreal MGL_EXPORT mgl_data_spline_(uintptr_t *dat, mreal *x,mreal *y,mreal *z); /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] mreal MGL_EXPORT mgl_data_spline_ext(HCDT dat, mreal x,mreal y,mreal z, mreal *dx,mreal *dy,mreal *dz); mreal MGL_EXPORT mgl_data_spline_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mreal *dx,mreal *dy,mreal *dz); /// Prepare coefficients for global spline interpolation HMDT MGL_EXPORT mgl_gspline_init(HCDT x, HCDT v); uintptr_t MGL_EXPORT mgl_gspline_init_(uintptr_t *x, uintptr_t *v); /// Evaluate global spline (and its derivatives d1, d2 if not NULL) using prepared coefficients \a coef mreal MGL_EXPORT mgl_gspline(HCDT coef, mreal dx, mreal *d1, mreal *d2); mreal MGL_EXPORT mgl_gspline_(uintptr_t *c, mreal *dx, mreal *d1, mreal *d2); /// Return an approximated x-value (root) when dat(x) = val mreal MGL_EXPORT mgl_data_solve_1d(HCDT dat, mreal val, int spl, long i0); mreal MGL_EXPORT mgl_data_solve_1d_(uintptr_t *dat, mreal *val, int *spl, int *i0); /// Return an approximated value (root) when dat(x) = val HMDT MGL_EXPORT mgl_data_solve(HCDT dat, mreal val, char dir, HCDT i0, int norm); uintptr_t MGL_EXPORT mgl_data_solve_(uintptr_t *dat, mreal *val, const char *dir, uintptr_t *i0, int *norm,int); /// Get trace of the data array HMDT MGL_EXPORT mgl_data_trace(HCDT d); uintptr_t MGL_EXPORT mgl_data_trace_(uintptr_t *d); /// Resize the data to new sizes HMDT MGL_EXPORT mgl_data_resize(HCDT dat, long mx,long my,long mz); uintptr_t MGL_EXPORT mgl_data_resize_(uintptr_t *dat, int *mx,int *my,int *mz); /// Resize the data to new sizes of box [x1,x2]*[y1,y2]*[z1,z2] HMDT MGL_EXPORT mgl_data_resize_box(HCDT dat, long mx,long my,long mz,mreal x1,mreal x2,mreal y1,mreal y2,mreal z1,mreal z2); uintptr_t MGL_EXPORT mgl_data_resize_box_(uintptr_t *dat, int *mx,int *my,int *mz,mreal *x1,mreal *x2,mreal *y1,mreal *y2,mreal *z1,mreal *z2); /// Create n-th points distribution of this data values in range [v1, v2] HMDT MGL_EXPORT mgl_data_hist(HCDT dat, long n, mreal v1, mreal v2, long nsub); uintptr_t MGL_EXPORT mgl_data_hist_(uintptr_t *dat, int *n, mreal *v1, mreal *v2, int *nsub); /// Create n-th points distribution of this data values in range [v1, v2] with weight w HMDT MGL_EXPORT mgl_data_hist_w(HCDT dat, HCDT weight, long n, mreal v1, mreal v2, long nsub); uintptr_t MGL_EXPORT mgl_data_hist_w_(uintptr_t *dat, uintptr_t *weight, int *n, mreal *v1, mreal *v2, int *nsub); /// Get momentum (1D-array) of data along direction 'dir'. String looks like "x1" for median in x-direction, "x2" for width in x-dir and so on. HMDT MGL_EXPORT mgl_data_momentum(HCDT dat, char dir, const char *how); uintptr_t MGL_EXPORT mgl_data_momentum_(uintptr_t *dat, char *dir, const char *how, int,int); /// Get pulse properties: pulse maximum and its position, pulse duration near maximum and by half height. HMDT MGL_EXPORT mgl_data_pulse(HCDT dat, char dir); uintptr_t MGL_EXPORT mgl_data_pulse_(uintptr_t *dat, char *dir,int); /// Get array which values is result of interpolation this for coordinates from other arrays HMDT MGL_EXPORT mgl_data_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm); uintptr_t MGL_EXPORT mgl_data_evaluate_(uintptr_t *dat, uintptr_t *idat, uintptr_t *jdat, uintptr_t *kdat, int *norm); /// Set as the data envelop void MGL_EXPORT mgl_data_envelop(HMDT dat, char dir); void MGL_EXPORT mgl_data_envelop_(uintptr_t *dat, const char *dir, int); /// Remove phase jump void MGL_EXPORT mgl_data_sew(HMDT dat, const char *dirs, mreal da); void MGL_EXPORT mgl_data_sew_(uintptr_t *dat, const char *dirs, mreal *da, int); /// Crop the data void MGL_EXPORT mgl_data_crop(HMDT dat, long n1, long n2, char dir); void MGL_EXPORT mgl_data_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int); /// Crop the data to be most optimal for FFT (i.e. to closest value of 2^n*3^m*5^l) void MGL_EXPORT mgl_data_crop_opt(HMDT dat, const char *how); void MGL_EXPORT mgl_data_crop_opt_(uintptr_t *dat, const char *how,int); /// Remove rows with duplicate values in column id void MGL_EXPORT mgl_data_clean(HMDT dat, long id); void MGL_EXPORT mgl_data_clean_(uintptr_t *dat, int *id); /// Multiply the data by other one for each element void MGL_EXPORT mgl_data_mul_dat(HMDT dat, HCDT d); void MGL_EXPORT mgl_data_mul_dat_(uintptr_t *dat, uintptr_t *d); /// Divide the data by other one for each element void MGL_EXPORT mgl_data_div_dat(HMDT dat, HCDT d); void MGL_EXPORT mgl_data_div_dat_(uintptr_t *dat, uintptr_t *d); /// Add the other data void MGL_EXPORT mgl_data_add_dat(HMDT dat, HCDT d); void MGL_EXPORT mgl_data_add_dat_(uintptr_t *dat, uintptr_t *d); /// Subtract the other data void MGL_EXPORT mgl_data_sub_dat(HMDT dat, HCDT d); void MGL_EXPORT mgl_data_sub_dat_(uintptr_t *dat, uintptr_t *d); /// Multiply each element by the number void MGL_EXPORT mgl_data_mul_num(HMDT dat, mreal d); void MGL_EXPORT mgl_data_mul_num_(uintptr_t *dat, mreal *d); /// Divide each element by the number void MGL_EXPORT mgl_data_div_num(HMDT dat, mreal d); void MGL_EXPORT mgl_data_div_num_(uintptr_t *dat, mreal *d); /// Add the number void MGL_EXPORT mgl_data_add_num(HMDT dat, mreal d); void MGL_EXPORT mgl_data_add_num_(uintptr_t *dat, mreal *d); /// Subtract the number void MGL_EXPORT mgl_data_sub_num(HMDT dat, mreal d); void MGL_EXPORT mgl_data_sub_num_(uintptr_t *dat, mreal *d); /// Integral data transformation (like Fourier 'f' or 'i', Hankel 'h' or None 'n') for amplitude and phase HMDT MGL_EXPORT mgl_transform_a(HCDT am, HCDT ph, const char *tr); uintptr_t MGL_EXPORT mgl_transform_a_(uintptr_t *am, uintptr_t *ph, const char *tr, int); /// Integral data transformation (like Fourier 'f' or 'i', Hankel 'h' or None 'n') for real and imaginary parts HMDT MGL_EXPORT mgl_transform(HCDT re, HCDT im, const char *tr); uintptr_t MGL_EXPORT mgl_transform_(uintptr_t *re, uintptr_t *im, const char *tr, int); /// Apply Fourier transform for the data and save result into it void MGL_EXPORT mgl_data_fourier(HMDT re, HMDT im, const char *dir); void MGL_EXPORT mgl_data_fourier_(uintptr_t *re, uintptr_t *im, const char *dir, int l); /// Short time Fourier analysis for real and imaginary parts. Output is amplitude of partial Fourier (result will have size {dn, floor(nx/dn), ny} for dir='x' HMDT MGL_EXPORT mgl_data_stfa(HCDT re, HCDT im, long dn, char dir); uintptr_t MGL_EXPORT mgl_data_stfa_(uintptr_t *re, uintptr_t *im, int *dn, char *dir, int); /// Do something like Delone triangulation for 3d points HMDT MGL_EXPORT mgl_triangulation_3d(HCDT x, HCDT y, HCDT z); uintptr_t MGL_EXPORT mgl_triangulation_3d_(uintptr_t *x, uintptr_t *y, uintptr_t *z); /// Do Delone triangulation for 2d points HMDT MGL_EXPORT mgl_triangulation_2d(HCDT x, HCDT y); uintptr_t MGL_EXPORT mgl_triangulation_2d_(uintptr_t *x, uintptr_t *y); /// Find root for nonlinear equation mreal MGL_EXPORT mgl_find_root(mreal (*func)(mreal val, void *par), mreal ini, void *par); /// Find root for nonlinear equation defined by textual formula mreal MGL_EXPORT mgl_find_root_txt(const char *func, mreal ini, char var_id); mreal MGL_EXPORT mgl_find_root_txt_(const char *func, mreal *ini, const char *var_id,int,int); /// Find roots for nonlinear equation defined by textual formula HMDT MGL_EXPORT mgl_data_roots(const char *func, HCDT ini, char var_id); uintptr_t MGL_EXPORT mgl_data_roots_(const char *func, uintptr_t *ini, const char *var_id,int,int); /// Find roots for set of nonlinear equations defined by textual formulas HMDT MGL_EXPORT mgl_find_roots_txt(const char *func, const char *vars, HCDT ini); uintptr_t MGL_EXPORT mgl_find_roots_txt_(const char *func, const char *vars, uintptr_t *ini,int,int); /// Find roots for set of nonlinear equations defined by function int MGL_EXPORT mgl_find_roots(size_t n, void (*func)(const mreal *x, mreal *f, void *par), mreal *x0, void *par); /// Gets integer random numbers of uniform distribution in range [lo,hi] mreal MGL_EXPORT mgl_rnd_integer(long lo, long hi); double MGL_EXPORT mgl_rnd_integer_(int *lo, int *hi); /// Gets random numbers of uniform distribution in range [lo,hi] mreal MGL_EXPORT mgl_rnd_uniform(mreal lo, mreal hi); double MGL_EXPORT mgl_rnd_uniform_(double *lo, double *hi); /// Gets random numbers of Bernoulli distribution mreal MGL_EXPORT mgl_rnd_bernoulli(mreal p); double MGL_EXPORT mgl_rnd_bernoulli_(double *p); /// Gets random numbers of binomial distribution long MGL_EXPORT mgl_rnd_binomial(long trials, mreal p); int MGL_EXPORT mgl_rnd_binomial_(int *trials, double *p); /// Gets random numbers of gaussian distribution mreal MGL_EXPORT mgl_rnd_gaussian(mreal mu, mreal sigma); double MGL_EXPORT mgl_rnd_gaussian_(double *mu, double *sigma); /// Gets random numbers of exponential distribution mreal MGL_EXPORT mgl_rnd_exponential(mreal lambda); double MGL_EXPORT mgl_rnd_exponential_(double *lambda); /// Gets random numbers of discrete distribution according A. It assumes A to be 1d. long MGL_EXPORT mgl_rnd_discrete(HCDT A); double MGL_EXPORT mgl_rnd_discrete_(uintptr_t *d); /// Fills data by integer random numbers of uniform distribution in range [lo,hi] void MGL_EXPORT mgl_data_rnd_integer(HMDT d, long lo, long hi); void MGL_EXPORT mgl_data_rnd_integer_(uintptr_t *d, int *lo, int *hi); /// Fills data by random numbers of uniform distribution in range [lo,hi] void MGL_EXPORT mgl_data_rnd_uniform(HMDT d, mreal lo, mreal hi); void MGL_EXPORT mgl_data_rnd_uniform_(uintptr_t *d, double *lo, double *hi); /// Fills data by random numbers of bernoulli distribution void MGL_EXPORT mgl_data_rnd_bernoulli(HMDT d, mreal p); void MGL_EXPORT mgl_data_rnd_bernoulli_(uintptr_t *d, double *p); /// Fills data by random numbers of binomial distribution void MGL_EXPORT mgl_data_rnd_binomial(HMDT d, long trials, mreal p); void MGL_EXPORT mgl_data_rnd_binomial_(uintptr_t *d, double *p); /// Fills data by random numbers of gaussian distribution void MGL_EXPORT mgl_data_rnd_gaussian(HMDT d, mreal mu, mreal sigma); void MGL_EXPORT mgl_data_rnd_gaussian_(uintptr_t *d, double *mu, double *s); /// Fills data by random numbers of exponential distribution void MGL_EXPORT mgl_data_rnd_exponential(HMDT d, mreal lambda); void MGL_EXPORT mgl_data_rnd_exponential_(uintptr_t *d, double *l); /// Fills data by random numbers of discrete distribution according A void MGL_EXPORT mgl_data_rnd_discrete(HMDT d, HCDT A); void MGL_EXPORT mgl_data_rnd_discrete_(uintptr_t *d, uintptr_t *A); /// Shuffles elements or slices of data array void MGL_EXPORT mgl_shuffle(HMDT d, char dir); void MGL_EXPORT mgl_shuffle_(uintptr_t *d, char *dir, int); /// Fills data by fractional brownian motions along x-direction void MGL_EXPORT mgl_data_brownian(HMDT d, mreal y1, mreal y2, mreal sigma, mreal alpha); void MGL_EXPORT mgl_data_brownian_(uintptr_t *d, double *y1, double *y2, double *sigma, double *alpha); //----------------------------------------------------------------------------- #ifdef __cplusplus } #endif #endif //----------------------------------------------------------------------------- mathgl-8.0.1/include/mgl2/type.h0000664000175000017500000003226114167366472016224 0ustar balakinbalakin/*************************************************************************** * type.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_TYPE_H_ #define _MGL_TYPE_H_ #include "mgl2/define.h" //----------------------------------------------------------------------------- const mreal mglPi = M_PI; const mreal mglNaN = NAN; const mreal mglInf = INFINITY; const mreal mgl_min_a = 1./256; //----------------------------------------------------------------------------- #define MGL_SET_XYZ(p,xx,yy,zz) {p.x=(xx);p.y=(yy);p.z=(zz);} #define MGL_SET_XY(p,xx,yy) {p.x=(xx);p.y=(yy);p.z=0;} #define MGL_SET_RGBA(p,rr,gg,bb,aa) {p.r=(rr);p.g=(gg);p.b=(bb);p.a=(aa);} #define MGL_SET_RGB(p,rr,gg,bb) {p.r=(rr);p.g=(gg);p.b=(bb);} //----------------------------------------------------------------------------- /// Class for point in 3D space struct MGL_EXPORT mglPoint { mreal x,y,z,c; mglPoint(mreal X=0,mreal Y=0,mreal Z=0,mreal C=0):x(X),y(Y),z(Z),c(C) {} mglPoint(const mglPoint &d):x(d.x),y(d.y),z(d.z),c(d.c) {} #if MGL_HAVE_RVAL mglPoint(mglPoint &&d):x(d.x),y(d.y),z(d.z),c(d.c) {} #endif inline void Set(mreal X=0,mreal Y=0,mreal Z=0,mreal C=0) {x=X;y=Y;z=Z;c=C;} inline bool IsNAN() const { return (x!=x || y!=y || z!=z || c!=c); } inline mreal val(int i) const { mreal dat[4]={x,y,z,c}; return dat[i]; } inline mreal norm() const { return sqrt(x*x+y*y+z*z); } inline void Normalize() { mreal v=norm(); x/=v; y/=v; z/=v; } inline bool same(const mglPoint &a) const // NOTE: exact comparison is used here { return (a.x-x)*(a.x-x)+(a.y-y)*(a.y-y)==0; } inline const mglPoint &operator=(const mglPoint &p) { x=p.x; y=p.y; z=p.z; c=p.c; return p; } inline void operator+=(const mglPoint &a) { x+=a.x; y+=a.y; z+=a.z; c+=a.c; } inline void operator-=(const mglPoint &a) { x-=a.x; y-=a.y; z-=a.z; c-=a.c; } inline void operator+=(mreal a) { x+=a; y+=a; z+=a; } inline void operator-=(mreal a) { x-=a; y-=a; z-=a; } inline void operator*=(mreal a) { x*=a; y*=a; z*=a; } inline void operator/=(mreal a) { x/=a; y/=a; z/=a; } }; #ifndef SWIG inline mglPoint operator+(const mglPoint &a, const mglPoint &b) { return mglPoint(a.x+b.x, a.y+b.y, a.z+b.z, a.c+b.c); } inline mglPoint operator-(const mglPoint &a, const mglPoint &b) { return mglPoint(a.x-b.x, a.y-b.y, a.z-b.z, a.c-b.c); } inline mglPoint operator-(const mglPoint &a) { return mglPoint(-a.x, -a.y, -a.z, -a.c); } inline mglPoint operator*(mreal b, const mglPoint &a) { return mglPoint(a.x*b, a.y*b, a.z*b, a.c*b); } inline mglPoint operator*(const mglPoint &a, mreal b) { return mglPoint(a.x*b, a.y*b, a.z*b, a.c*b); } inline mglPoint operator/(const mglPoint &a, mreal b) { return mglPoint(a.x/b, a.y/b, a.z/b); } inline mreal operator*(const mglPoint &a, const mglPoint &b) { return a.x*b.x+a.y*b.y+a.z*b.z; } inline mglPoint operator/(const mglPoint &a, const mglPoint &b) { return mglPoint(a.x*b.x, a.y*b.y, a.z*b.z); } inline mglPoint operator&(const mglPoint &a, const mglPoint &b) { return a - b*((a*b)/(b*b)); } inline mglPoint operator|(const mglPoint &a, const mglPoint &b) { return b*((a*b)/(b*b)); } inline mglPoint operator^(const mglPoint &a, const mglPoint &b) { return mglPoint(a.y*b.z-a.z*b.y, a.z*b.x-a.x*b.z, a.x*b.y-a.y*b.x); } inline mglPoint operator!(const mglPoint &a) { mreal f=mgl_hypot(a.x,a.y); return f==0?mglPoint(0.,1.,0.):mglPoint(-a.y/f, a.x/f, 0); } inline bool operator==(const mglPoint &a, const mglPoint &b) // NOTE: exact comparison is used here { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)+(a.c-b.c)*(a.c-b.c)==0; } //{ return !memcmp(&a, &b, sizeof(mglPoint)); } inline bool operator!=(const mglPoint &a, const mglPoint &b) // NOTE: exact comparison is used here { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)+(a.c-b.c)*(a.c-b.c)!=0; } //{ return memcmp(&a, &b, sizeof(mglPoint)); } inline bool operator<(const mglPoint &a, const mglPoint &b) { return a.x<=b.x && a.y<=b.y && a.z<=b.z; } inline bool operator>(const mglPoint &a, const mglPoint &b) { return a.x>=b.x && a.y>=b.y && a.z>=b.z; } inline mreal mgl_norm(const mglPoint &p) { return sqrt(p.x*p.x+p.y*p.y+p.z*p.z); } inline mreal mgl_anorm(const mglPoint &p) { return fabs(p.x)+fabs(p.y)+fabs(p.z); } #endif //----------------------------------------------------------------------------- /// Class for RGBA color struct MGL_EXPORT mglColor { float r; ///< Red component of color float g; ///< Green component of color float b; ///< Blue component of color float a; ///< Alpha component of color /// Constructor for RGB components manually mglColor(float R,float G,float B, float A=1):r(R),g(G),b(B),a(A) {} /// Constructor for RGB components manually mglColor(const unsigned char *c, float A=1):r(c[0]/255.f),g(c[1]/255.f),b(c[2]/255.f),a(A) {} /// Constructor set default color mglColor():r(0),g(0),b(0),a(1) {} /// Constructor set color from character id mglColor(char c, float bright=1) { Set(c,bright); } /// Copy constructor mglColor(const mglColor &d):r(d.r),g(d.g),b(d.b),a(d.a) {} #if MGL_HAVE_RVAL mglColor(mglColor &&d):r(d.r),g(d.g),b(d.b),a(d.a) {} #endif /// Set color as Red, Green, Blue values void Set(float R,float G,float B,float A=1) { r=R; g=G; b=B; a=A; } /// Set color as Red, Green, Blue values void Set(mglColor c, float bright=1) { if(bright<0) bright=0; if(bright>2.f) bright=2.f; if(bright<=1) { r=c.r*bright; g=c.g*bright; b=c.b*bright; a = 1; } else { r=1-(1-c.r)*(2-bright); g=1-(1-c.g)*(2-bright); b=1-(1-c.b)*(2-bright); a=1; } } /// Check if color is valid inline bool Valid() const { return ((r>=0) & (r<=1) & (g>=0) & (g<=1) & (b>=0) & (b<=1) & (a>=0) & (a<=1)); } /// Get maximal spectral component inline float Norm() const { return r>g ? r : (g>b ? g : b); } inline float NormS() const { return r*r+g*g+b*b; } /// Set color from symbolic id inline void Set(char p, float bright=1) { float rgb[3]; mgl_chrrgb(p,rgb); Set(mglColor(rgb[0],rgb[1],rgb[2]),bright); } inline const mglColor &operator=(const mglColor &p) { r=p.r; g=p.g; b=p.b; a=p.a; return p; } /// Copy color from other one inline bool operator==(const mglColor &c) const // NOTE: exact comparison is used here { return (r-c.r)*(r-c.r)+(g-c.g)*(g-c.g)+(b-c.b)*(b-c.b)+(a-c.a)*(a-c.a)==0; } // { return !memcmp(this, &c, sizeof(mglColor)); } inline bool operator!=(const mglColor &c) const // NOTE: exact comparison is used here { return (r-c.r)*(r-c.r)+(g-c.g)*(g-c.g)+(b-c.b)*(b-c.b)+(a-c.a)*(a-c.a)!=0; } // { return memcmp(this, &c, sizeof(mglColor)); } inline bool operator<(const mglColor &c) const { return memcmp(this, &c, sizeof(mglColor))<0; } // transparency still the same inline void operator*=(float v) { r*=v; g*=v; b*=v; a*=v; } inline void operator+=(const mglColor &c) { r+=c.r; g+=c.g; b+=c.b; a+=c.a; } inline void operator-=(const mglColor &c) { r-=c.r; g-=c.g; b-=c.b; a-=c.a; } }; #ifndef SWIG inline mglColor operator+(const mglColor &a, const mglColor &b) { return mglColor(a.r+b.r, a.g+b.g, a.b+b.b, a.a+b.a); } inline mglColor operator-(const mglColor &a, const mglColor &b) { return mglColor(a.r-b.r, a.g-b.g, a.b-b.b, a.a-b.a); } inline mglColor operator*(const mglColor &a, float b) { return mglColor(a.r*b, a.g*b, a.b*b, a.a*b); } inline mglColor operator*(float b, const mglColor &a) { return mglColor(a.r*b, a.g*b, a.b*b, a.a*b); } inline float operator*(const mglColor &b, const mglColor &a) { return a.r*b.r+a.g*b.g+a.b*b.b; } inline mglColor operator/(const mglColor &a, float b) { return mglColor(a.r/b, a.g/b, a.b/b, a.a/b); } inline mglColor operator!(const mglColor &a) { return mglColor(1-a.r, 1-a.g, 1-a.b, a.a); } #endif //----------------------------------------------------------------------------- #ifndef SWIG /// Class for Unicode string. /** NOTE: mglString accept multi-byte char* string for converting to wchar_t*. But it keep only single-byte char*!!! */ struct MGL_EXPORT mglString { char *s; wchar_t *w; mglString() { s=new char[1]; w=new wchar_t[1]; *s=*w=0; } mglString(const mglString &str) { size_t ls = wcslen(str.w)+1; s = new char[ls]; memcpy(s,str.s,ls); w = new wchar_t[ls]; memcpy(w,str.w,ls*sizeof(wchar_t)); } #if MGL_HAVE_RVAL mglString(mglString &&d):s(d.s),w(d.w) { d.s=NULL; d.w=NULL; } #endif mglString(wchar_t ch) { s=new char[2]; w=new wchar_t[2]; s[0] = char(ch&0xff); w[0] = ch; s[1] = w[1] = 0; } mglString(const char *str) { if(str) { size_t ls=mbstowcs(0,str,0); w = new wchar_t[ls+1]; mbstowcs(w,str,ls); w[ls]=0; s = new char[ls+1]; for(size_t i=0;i<=ls;i++) s[i]=w[i]; } else { s=new char[1]; w=new wchar_t[1]; *s=*w=0; } } mglString(const wchar_t *str) { if(str) { size_t len=wcslen(str); w = new wchar_t[len+1]; s = new char[len+1]; for(size_t i=0;i<=len;i++) s[i]=w[i]=str[i]; } else { s=new char[1]; w=new wchar_t[1]; *s=*w=0; } } mglString(const std::string &str) { size_t ls=mbstowcs(0,str.c_str(),0); w = new wchar_t[ls+1]; mbstowcs(w,str.c_str(),ls); w[ls]=0; s = new char[ls+1]; for(size_t i=0;i<=ls;i++) s[i]=w[i]; } mglString(const std::wstring &str) { size_t len=str.length(); w = new wchar_t[len+1]; s = new char[len+1]; for(size_t i=0;i<=len;i++) s[i]=w[i]=str[i]; } ~mglString() { if(w) { delete []s; delete []w; } } /// String length size_t length() const { return wcslen(w); } /// Crop string (like std::string::substr()) void crop(size_t pos, size_t len=size_t(-1)) { if(pos) for(size_t i=0;i * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_THREAD_H_ #define _MGL_THREAD_H_ #include "mgl2/define.h" //----------------------------------------------------------------------------- #if MGL_HAVE_PTHREAD #include #endif //----------------------------------------------------------------------------- struct mglThreadD { mreal *a; // float* array with parameters or results const mreal *b,*c,*d,*e; // float* arrays with parameters const long *p; // long* array with parameters const void *v; // pointer to data/grapher int id; // thread id long n; // total number of iteration const char *s; }; struct mglThreadC { dual *a; // dual* array with parameters or results const dual *b,*c,*d,*e; // dual* arrays with parameters const long *p; // long* array with parameters const void *v; // pointer to data/grapher int id; // thread id long n; // total number of iteration const char *s; }; struct mglThreadV { mreal *a; // float* array with parameters or results dual *aa; // dual* array with parameters or results const void *b,*c; // float* arrays with parameters const mreal *d; // float* arrays with parameters const long *p; // long* array with parameters const void *v; // pointer to data/grapher int id; // thread id long n; // total number of iteration }; struct mglThreadT { void *a; // dual* or mreal* array with input or results double *b; // dual* array with input or results const long *p; // long* array with parameters const void *v; // pointer to table/parameter void **w; // pointer to workspace int id; // thread id long n; // total number of iteration const void *re,*im; }; /// Start several thread for the task void MGL_EXPORT mglStartThread(void *(*func)(void *), void (*post)(mglThreadD *,mreal *), long n, mreal *a=0, const mreal *b=0, const mreal *c=0, const long *p=0, const void *v=0, const mreal *d=0, const mreal *e=0, const char *s=0); void MGL_EXPORT mglStartThreadV(void *(*func)(void *), long n, mreal *a, const void *b=0, const void *c=0, const long *p=0, const void *v=0, const mreal *d=0); void MGL_EXPORT mglStartThreadV(void *(*func)(void *), long n, dual *a, const void *b=0, const void *c=0, const long *p=0, const void *v=0, const mreal *d=0); void MGL_EXPORT mglStartThreadC(void *(*func)(void *), void (*post)(mglThreadC *,dual *), long n, dual *a=0, const dual *b=0, const dual *c=0, const long *p=0, const void *v=0, const dual *d=0, const dual *e=0, const char *s=0); void MGL_EXPORT mglStartThreadT(void *(*func)(void *), long n, void *a, double *b, const void *v=0, void **w=0, const long *p=0, const void *re=0, const void *im=0); MGL_EXPORT extern int mglNumThr; ///< Number of thread for plotting and data handling //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/include/mgl2/wx.h0000664000175000017500000001474314167366472015706 0ustar balakinbalakin/*************************************************************************** * wx.h.cpp is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MGL_WX_H #define MGL_WX_H //----------------------------------------------------------------------------- #include #include #include #include #include class mglCanvas; //----------------------------------------------------------------------------- /// Convert MathGL image to wxBitmap wxBitmap MGL_EXPORT ConvertFromGraph(HMGL gr); //----------------------------------------------------------------------------- /// Class is Wx widget which display MathGL graphics class MGL_EXPORT wxMathGL : public wxWindow { public: wxString appName; ///< Application name for message boxes bool AutoResize; ///< Allow auto resizing (default is false) wxMathGL(wxWindow *parent, wxWindowID id=-1, const wxPoint& pos=wxDefaultPosition, const wxSize& size=wxDefaultSize, long style=0, const wxString& name=wxPanelNameStr); virtual ~wxMathGL(); double GetRatio(); void SetPopup(wxMenu *p) { popup = p; }; ///< Set popup menu pointer void SetSize(int w, int h); ///< Set window/picture sizes void SetGraph(HMGL gr); ///< Set grapher object inline void SetGraph(mglGraph *GR) { SetGraph(GR->Self()); } inline HMGL GetGraph() { return (HMGL)gr; } /// Set drawing functions and its parameter inline void SetDraw(int (*func)(mglBase *gr, void *par), void *par=0) { draw_func = func; draw_par = par; } inline void SetDraw(mglDraw *dr) { draw_cl = dr; } inline void SetDraw(int (*draw)(mglGraph *gr)) { SetDraw(draw?mgl_draw_graph:0,(void*)draw); } inline void ZoomRegion(mreal xx1,mreal xx2,mreal yy1, mreal yy2) { x1=xx1; y1=yy1; x2=xx2; y2=yy2; } int GetPer() {return per;}; ///< Get perspective value int GetPhi() {return phi;}; ///< Get Phi-angle value int GetTet() {return tet;}; ///< Get Theta-angle value bool GetAlpha() {return alpha;}; ///< Get transparency state bool GetLight() {return light;}; ///< Get lightning state bool GetZoom() {return zoom;}; ///< Get mouse zooming state bool GetRotate() {return rotate;}; ///< Get mouse rotation state void Repaint(); void Update(); ///< Update picture void Copy(); ///< copy graphics to clipboard void Print(); ///< Print plot // void Stop(); ///< Stop execution void SetPer(int p); ///< Set perspective value void SetPhi(int p); ///< Set Phi-angle value void SetTet(int t); ///< Set Theta-angle value void SetAlpha(bool a); ///< Switch on/off transparency void SetLight(bool l); ///< Switch on/off lightning void SetZoom(bool z); ///< Switch on/off mouse zooming void SetRotate(bool r); ///< Switch on/off mouse rotation void ZoomIn(); ///< Zoom in graphics void ZoomOut(); ///< Zoom out graphics void Restore(); ///< Restore zoom and rotation to default values // void Reload(); ///< Reload data and execute script void ShiftLeft(); ///< Shift graphics to left direction void ShiftRight(); ///< Shift graphics to right direction void ShiftUp(); ///< Shift graphics to up direction void ShiftDown(); ///< Shift graphics to down direction void ExportPNG(wxString fname=L""); ///< export to PNG file void ExportPNGs(wxString fname=L""); ///< export to PNG file (no transparency) void ExportJPG(wxString fname=L""); ///< export to JPEG file void ExportBPS(wxString fname=L""); ///< export to bitmap EPS file void ExportEPS(wxString fname=L""); ///< export to vector EPS file void ExportSVG(wxString fname=L""); ///< export to SVG file void Adjust(); ///< Adjust plot size to fill entire window void NextSlide(); ///< Show next slide void PrevSlide(); ///< Show previous slide void Animation(bool st=true); ///< Start animation void About(); ///< Show about information protected: void OnPaint(wxPaintEvent& event); void OnSize(wxSizeEvent& event); void OnNextSlide(wxTimerEvent& evt); ///< Show next slide void OnMouseLeftDown(wxMouseEvent &ev); void OnMouseDown(wxMouseEvent &ev); void OnMouseLeftUp(wxMouseEvent &ev); void OnMouseRightUp(wxMouseEvent &ev); void OnMouseMove(wxMouseEvent &ev); // void MousePressEvent(QMouseEvent *); // void MouseReleaseEvent(QMouseEvent *); // void MouseMoveEvent(QMouseEvent *); mglCanvas *gr; ///< pointer to grapher void *draw_par; ///< Parameters for drawing function mglCanvasWnd::DrawFunc. /// Drawing function for window procedure. It should return the number of frames. int (*draw_func)(mglBase *gr, void *par); mglDraw *draw_cl; wxString MousePos; ///< Last mouse position wxBitmap pic; ///< Pixmap for drawing (changed by update) double tet, phi; ///< Rotation angles double per; ///< Value of perspective ( must be in [0,1) ) bool alpha; ///< Transparency state bool light; ///< Lightning state bool zoom; ///< Mouse zoom state bool rotate; ///< Mouse rotation state mreal x1,x2,y1,y2; ///< Zoom in region wxMenu *popup; ///< Pointer to pop-up menu wxTimer *timer; ///< Timer for animation DECLARE_EVENT_TABLE() private: int x0, y0, xe, ye; ///< Temporary variables for mouse }; //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/opengl.h0000664000175000017500000000645314167366472016533 0ustar balakinbalakin/*************************************************************************** * opengl.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MGL_CANVAS_GL_H #define MGL_CANVAS_GL_H //----------------------------------------------------------------------------- #include "mgl2/canvas.h" //----------------------------------------------------------------------------- class MGL_EXPORT mglCanvasGL : public mglCanvas { public: mglCanvasGL(); virtual ~mglCanvasGL(); void SetQuality(int =0) { Quality=2; } void Finish(); void SetSize(int ,int ,bool clf=true) { if(clf) Clf(); } void View(mreal tetX,mreal tetY,mreal tetZ); void Zoom(mreal x1, mreal y1, mreal x2, mreal y2); /* int NewFrame(); void EndFrame(); void DelFrame(long ){}*/ bool Alpha(bool enable); void Fog(mreal d, mreal dz=0.25); bool Light(bool enable); void Light(int n, bool enable); void AddLight(int n,mglPoint r,mglPoint d, char c='w', mreal bright=0.5, mreal ap=0); void Clf(mglColor Back=NC); void Clf(const char *col); protected: // provide fastest variant for usual points (not glyphs or marks) void line_draw(long n1, long n2); void trig_draw(long n1, long n2, long n3); void quad_draw(long n1, long n2, long n3, long n4); // variant for glyphs or marks void line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *d); void trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool anorm, const mglDrawReg *d); void quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, const mglDrawReg *d); void pnt_draw(const mglPnt &p, const mglDrawReg *d); void mark_draw(const mglPnt &q, char type, mreal size, mglDrawReg *d); void glyph_fill(mreal phi, const mglPnt &p, mreal f, const mglGlyph &g, const mglDrawReg *d); unsigned char **GetRGBLines(long &w, long &h, unsigned char *&f, bool solid=true); void LightScale(const mglMatrix *M); void gl_clf(mglColor Back=WC); }; //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/other.h0000664000175000017500000003521714167366472016370 0ustar balakinbalakin/*************************************************************************** * other.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_OTHER_H_ #define _MGL_OTHER_H_ #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /// Draw triangle mesh for points in arrays {x,y,z} with specified color c. /** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the triangle colors, else vertex colors. */ void MGL_EXPORT mgl_triplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_triplot_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw triangle mesh for points in arrays {x,y,z} with color proportional to z. /** Style ‘#’ produce wire plot. */ void MGL_EXPORT mgl_triplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_triplot_xyz_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw triangle mesh for points in arrays {x,y} /** Style ‘#’ produce wire plot. */ void MGL_EXPORT mgl_triplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt); void MGL_EXPORT mgl_triplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, const char *sch, const char *opt,int,int); /// Draw quad mesh for points in arrays {x,y,z} with specified color c. /** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ void MGL_EXPORT mgl_quadplot_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_quadplot_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw quad mesh for points in arrays {x,y,z} with color proportional to z. /** Style ‘#’ produce wire plot. */ void MGL_EXPORT mgl_quadplot_xyz(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_quadplot_xyz_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw quad mesh for points in arrays {x,y}. /** Style ‘#’ produce wire plot. */ void MGL_EXPORT mgl_quadplot_xy(HMGL gr, HCDT nums, HCDT x, HCDT y, const char *sch, const char *opt); void MGL_EXPORT mgl_quadplot_xy_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, const char *sch, const char *opt,int,int); /// Draw manual contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ void MGL_EXPORT mgl_tricont_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_tricont_xyzcv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw manual contour lines for triangle mesh for points in arrays {x,y,z}. /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ void MGL_EXPORT mgl_tricont_xycv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_tricont_xycv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_tricont_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_tricont_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int, int); /// Draw contour lines for triangle mesh for points in arrays {x,y,z}. /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_tricont_xyc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_tricont_xyc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int, int); /// Draw manual contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c. /** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ void MGL_EXPORT mgl_tricontv_xyzcv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_tricontv_xyzcv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int,int); /// Draw manual contour tubes for triangle mesh for points in arrays {x,y,z}. /** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ void MGL_EXPORT mgl_tricontv_xycv(HMGL gr, HCDT v, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_tricontv_xycv_(uintptr_t *gr, uintptr_t *v, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c. /** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_tricontv_xyzc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT c, const char *sch, const char *opt); void MGL_EXPORT mgl_tricontv_xyzc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *sch, const char *opt,int, int); /// Draw contour tubes for triangle mesh for points in arrays {x,y,z}. /** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_tricontv_xyc(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_tricontv_xyc_(uintptr_t *gr, uintptr_t *nums, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int, int); /// Draw dots in points {x,y,z}. void MGL_EXPORT mgl_dots(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_dots_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw semitransparent dots in points {x,y,z} with specified alpha a. void MGL_EXPORT mgl_dots_a(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_dots_a_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw semitransparent dots in points {x,y,z} with specified color c and alpha a. void MGL_EXPORT mgl_dots_ca(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT c, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_dots_ca_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw surface reconstructed for points in arrays {x,y,z}. /** Style ‘#’ produce wired plot. */ void MGL_EXPORT mgl_crust(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_crust_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw density plot for data at x = sVal /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_dens_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_dens_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw density plot for data at y = sVal /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_dens_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_dens_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw density plot for data at z = sVal /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_dens_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_dens_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw contour lines for data at x = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw contour lines for data at y = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw contour lines for data at z = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw manual contour lines for data at x = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont_x_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_x_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw manual contour lines for data at y = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont_y_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_y_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw manual contour lines for data at z = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont_z_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_cont_z_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw solid contours for data at x = sVal /** Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf_x(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_contf_x_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw solid contours for data at y = sVal /** Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf_y(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_contf_y_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw solid contours for data at z = sVal /** Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf_z(HMGL graph, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_contf_z_(uintptr_t *graph, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw manual solid contours for data at x = sVal void MGL_EXPORT mgl_contf_x_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_contf_x_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw manual solid contours for data at y = sVal void MGL_EXPORT mgl_contf_y_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_contf_y_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); /// Draw manual solid contours for data at z = sVal void MGL_EXPORT mgl_contf_z_val(HMGL graph, HCDT v, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_contf_z_val_(uintptr_t *graph, uintptr_t *v, uintptr_t *a, const char *stl, mreal *sVal, const char *opt,int,int); #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/cont.h0000664000175000017500000004751714167366472016220 0ustar balakinbalakin/*************************************************************************** * cont.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_CONT_H_ #define _MGL_CONT_H_ #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /// Print text along the curve in parametric form {x,y,z} void MGL_EXPORT mgl_text_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const char *text, const char *font, const char *opt); void MGL_EXPORT mgl_text_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z,const char *text,const char *font, const char *opt,int,int l,int n); void MGL_EXPORT mgl_textw_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, const wchar_t *text, const char *font, const char *opt); /// Print text along the curve in parametric form {x,y} void MGL_EXPORT mgl_text_xy(HMGL gr, HCDT x, HCDT y, const char *text, const char *font, const char *opt); void MGL_EXPORT mgl_text_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, const char *text, const char *font, const char *opt,int, int l,int n); void MGL_EXPORT mgl_textw_xy(HMGL gr, HCDT x, HCDT y, const wchar_t *text, const char *font, const char *opt); /// Print text along the curve void MGL_EXPORT mgl_text_y(HMGL gr, HCDT y, const char *text, const char *font, const char *opt); void MGL_EXPORT mgl_text_y_(uintptr_t *gr, uintptr_t *y, const char *text, const char *font, const char *opt,int, int l,int n); void MGL_EXPORT mgl_textw_y(HMGL gr, HCDT y, const wchar_t *text, const char *font, const char *opt); void MGL_EXPORT mgl_dcont_gen(HMGL gr, double val, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *sch, const char *opt); void MGL_EXPORT mgl_cont_gen(HMGL gr, double val, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl, const char *opt); void MGL_EXPORT mgl_contf_gen(HMGL gr, double v1, double v2, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl, const char *opt); //void MGL_EXPORT mgl_contv_gen(HMGL gr, double v1, double v2, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl); //void MGL_EXPORT mgl_axial_gen(HMGL gr, double v1, double v2, HCDT a, HCDT x, HCDT y, HCDT z, const char *stl); /// Draw curves of cross-section of isosurfaces a and b at manual levels for 3d data specified parametrically /** Style ‘t’/‘T’ draw contour labels below/above contours. * If v==NULL then curve levels is selected equidistantly in color range. */ void MGL_EXPORT mgl_dcont_xyz(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *sch, const char *opt); void MGL_EXPORT mgl_dcont_xyz_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, uintptr_t *b, const char *sch, const char *opt,int,int); /// Draw curves of cross-section of isosurfaces a and b at manual levels for 3d data /** Style ‘t’/‘T’ draw contour labels below/above contours. * If v==NULL then curve levels is selected equidistantly in color range. */ void MGL_EXPORT mgl_dcont(HMGL gr, HCDT v, HCDT a, HCDT b, const char *sch, const char *opt); void MGL_EXPORT mgl_dcont_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, uintptr_t *b, const char *sch, const char *opt,int,int); /// Draw contour lines at manual levels for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_cont_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour lines at manual levels for 2d data /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_cont_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour lines for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_cont_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour lines for 2d data /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont(HMGL gr, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_cont_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw solid contours at manual levels for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contf_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contf_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw solid contours at manual levels for 2d data /** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contf_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contf_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw solid contours for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contf_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw solid contours for 2d data /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf(HMGL gr, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contf_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw solid contours at manual levels for 2d data specified parametrically with specified colors /** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contd_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contd_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw solid contours at manual levels for 2d data with specified colors /** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contd_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contd_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw solid contours for 2d data specified parametrically with specified colors /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contd_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contd_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw solid contours for 2d data with specified colors /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contd(HMGL gr, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contd_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour tubes between manual levels for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contv_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contv_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour tubes between manual levels for 2d data /** Style ‘_’ to draw contours at bottom of axis box. */ void MGL_EXPORT mgl_contv_val(HMGL gr, HCDT v, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contv_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour tubes for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contv_xy(HMGL gr, HCDT x, HCDT y, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contv_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour tubes for 2d data /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contv(HMGL gr, HCDT z, const char *sch, const char *opt); void MGL_EXPORT mgl_contv_(uintptr_t *gr, uintptr_t *z, const char *sch, const char *opt,int,int); /// Draw contour lines on parametric surface at manual levels for 2d data specified parametrically /** Style ‘f’ to draw solid contours. * Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_contp_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_contp_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw contour lines on parametric surface for 2d data specified parametrically /** Style ‘f’ to draw solid contours. * Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contp(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_contp_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw axial-symmetric isosurfaces at manual levels for 2d data specified parametrically /** String \a sch may contain: * ‘#’ for wired plot; * ‘.’ for plot by dots; * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */ void MGL_EXPORT mgl_axial_xy_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_axial_xy_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw axial-symmetric isosurfaces at manual levels for 2d data /** String \a sch may contain: * ‘#’ for wired plot; * ‘.’ for plot by dots; * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */ void MGL_EXPORT mgl_axial_val(HMGL gr, HCDT v, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_axial_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw axial-symmetric isosurfaces for 2d data specified parametrically /** String \a sch may contain: * ‘#’ for wired plot; * ‘.’ for plot by dots; * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_axial_xy(HMGL gr, HCDT x, HCDT y, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_axial_xy_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw axial-symmetric isosurfaces for 2d data /** String \a sch may contain: * ‘#’ for wired plot; * ‘.’ for plot by dots; * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). * Option "value" set the number of isosurfaces (default is 3). */ void MGL_EXPORT mgl_axial(HMGL gr, HCDT a, const char *sch, const char *opt); void MGL_EXPORT mgl_axial_(uintptr_t *gr, uintptr_t *a, const char *sch, const char *opt,int,int); /// Draw surface of curve {r,z} rotation around axis /** Style ‘#’ produce wire plot. Style ‘.’ produce plot by dots.*/ void MGL_EXPORT mgl_torus(HMGL gr, HCDT r, HCDT z, const char *col, const char *opt); void MGL_EXPORT mgl_torus_(uintptr_t *gr, uintptr_t *r, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw grid lines for density plot at slice for 3d data specified parametrically /** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ void MGL_EXPORT mgl_grid3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_grid3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw grid lines for density plot at slice for 3d data /** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ void MGL_EXPORT mgl_grid3(HMGL gr, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_grid3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw density plot at slice for 3d data specified parametrically /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ void MGL_EXPORT mgl_dens3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_dens3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw density plot at slice for 3d data /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ void MGL_EXPORT mgl_dens3(HMGL gr, HCDT a, const char *stl, double sVal, const char *opt); void MGL_EXPORT mgl_dens3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw contour lines at manual levels along slice for 3d data specified parametrically /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_cont3_xyz_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw contour lines at manual levels along slice for 3d data /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Style ‘t’/‘T’ draw contour labels below/above contours. */ void MGL_EXPORT mgl_cont3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_cont3_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw contour lines along slice for 3d data specified parametrically /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_cont3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw contour lines along slice for 3d data /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_cont3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_cont3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw solid contours at manual levels along slice for 3d data specified parametrically /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */ void MGL_EXPORT mgl_contf3_xyz_val(HMGL gr, HCDT v, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_contf3_xyz_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw solid contours at manual levels along slice for 3d data /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */ void MGL_EXPORT mgl_contf3_val(HMGL gr, HCDT v, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_contf3_val_(uintptr_t *gr, uintptr_t *v, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw solid contours along slice for 3d data specified parametrically /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf3_xyz(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_contf3_xyz_(uintptr_t *gr, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); /// Draw solid contours along slice for 3d data /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Option "value" set the number of contour levels (default is 7). */ void MGL_EXPORT mgl_contf3(HMGL gr, HCDT a, const char *sch, double sVal, const char *opt); void MGL_EXPORT mgl_contf3_(uintptr_t *gr, uintptr_t *a, const char *sch, mreal *sVal, const char *opt,int,int); //----------------------------------------------------------------------------- #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/wnd_cf.h0000664000175000017500000001241114167366472016476 0ustar balakinbalakin/*************************************************************************** * wnd_cf.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MGL_WND_CF_H #define MGL_WND_CF_H #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif //----------------------------------------------------------------------------- /// Callback function for mouse click void MGL_EXPORT mgl_set_click_func(HMGL gr, void (*func)(void *p)); #if MGL_HAVE_PTHR_WIDGET /// Mutex for lock/unlock by widget void MGL_EXPORT mgl_wnd_set_mutex(HMGL gr, pthread_mutex_t *mutex); #endif /// Make custom dialog for parameters ids of element properties defined by args void MGL_EXPORT mgl_wnd_make_dialog(HMGL gr, const char *ids, char const * const *args, const char *title); /// Set callback functions for drawing and data reloading void MGL_EXPORT mgl_wnd_set_func(HMGL gr, int (*draw)(HMGL gr, void *p), void *par, void (*reload)(void *p)); /// Set callback functions for setting properties void MGL_EXPORT mgl_wnd_set_prop(HMGL gr, void (*prop)(char id, const char *val, void *p), void *par); /// Set delay for animation in seconds void MGL_EXPORT mgl_wnd_set_delay(HMGL gr, double dt); void MGL_EXPORT mgl_wnd_set_delay_(uintptr_t *gr, mreal *dt); /// Get delay for animation in seconds double MGL_EXPORT_PURE mgl_wnd_get_delay(HMGL gr); double MGL_EXPORT_PURE mgl_wnd_get_delay_(uintptr_t *gr); /// Set window properties void MGL_EXPORT mgl_setup_window(HMGL gr, int clf_upd, int showpos); void MGL_EXPORT mgl_setup_window_(uintptr_t *gr, int *clf_upd, int *showpos); /// Switch on/off transparency (do not overwrite user settings) void MGL_EXPORT mgl_wnd_toggle_alpha(HMGL gr); void MGL_EXPORT mgl_wnd_toggle_alpha_(uintptr_t *gr); /// Switch on/off lighting (do not overwrite user settings) void MGL_EXPORT mgl_wnd_toggle_light(HMGL gr); void MGL_EXPORT mgl_wnd_toggle_light_(uintptr_t *gr); /// Switch on/off zooming by mouse void MGL_EXPORT mgl_wnd_toggle_zoom(HMGL gr); void MGL_EXPORT mgl_wnd_toggle_zoom_(uintptr_t *gr); /// Switch on/off rotation by mouse void MGL_EXPORT mgl_wnd_toggle_rotate(HMGL gr); void MGL_EXPORT mgl_wnd_toggle_rotate_(uintptr_t *gr); /// Switch off all zooming and rotation void MGL_EXPORT mgl_wnd_toggle_no(HMGL gr); void MGL_EXPORT mgl_wnd_toggle_no_(uintptr_t *gr); /// Update picture by calling user drawing function void MGL_EXPORT mgl_wnd_update(HMGL gr); void MGL_EXPORT mgl_wnd_update_(uintptr_t *gr); /// Reload user data and update picture void MGL_EXPORT mgl_wnd_reload(HMGL gr); void MGL_EXPORT mgl_wnd_reload_(uintptr_t *gr); /// Adjust size of bitmap to window size void MGL_EXPORT mgl_wnd_adjust(HMGL gr); void MGL_EXPORT mgl_wnd_adjust_(uintptr_t *gr); /// Show next frame (if one) void MGL_EXPORT mgl_wnd_next_frame(HMGL gr); void MGL_EXPORT mgl_wnd_next_frame_(uintptr_t *gr); /// Show previous frame (if one) void MGL_EXPORT mgl_wnd_prev_frame(HMGL gr); void MGL_EXPORT mgl_wnd_prev_frame_(uintptr_t *gr); /// Run slideshow (animation) of frames void MGL_EXPORT mgl_wnd_animation(HMGL gr); void MGL_EXPORT mgl_wnd_animation_(uintptr_t *gr); /// Get last mouse position void MGL_EXPORT mgl_get_last_mouse_pos(HMGL gr, mreal *x, mreal *y, mreal *z); void MGL_EXPORT mgl_get_last_mouse_pos_(uintptr_t *gr, mreal *x, mreal *y, mreal *z); /// Return pointer to widget (Fl_Window* or QMainWindow*) used for plotting MGL_EXPORT void *mgl_wnd_window(HMGL gr); /// Return pointer to widget (Fl_MGLView* or QMathGL*) used for plotting MGL_EXPORT void *mgl_wnd_widget(HMGL gr); /// Move window to given position void MGL_EXPORT mgl_wnd_move(HMGL gr, int x, int y); void MGL_EXPORT mgl_wnd_move_(uintptr_t *gr, int *x, int *y); /// Change window sizes void MGL_EXPORT mgl_wnd_size(HMGL gr, int w, int h); void MGL_EXPORT mgl_wnd_size_(uintptr_t *gr, int *w, int *h); #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/mpi.h0000664000175000017500000000526114167366472016030 0ustar balakinbalakin/*************************************************************************** * mpi.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_MPI_H_ #define _MGL_MPI_H_ #include "mgl2/mgl_cf.h" #ifdef __cplusplus extern "C" { #endif /// Send graphical information to node id using MPI void MGL_EXPORT mgl_mpi_send(HMGL gr, int id); void MGL_EXPORT mgl_mpi_send_(uintptr_t *gr, int *id); /// Receive graphical information from node id using MPI void MGL_EXPORT mgl_mpi_recv(HMGL gr, int id); void MGL_EXPORT mgl_mpi_recv_(uintptr_t *gr, int *id); #ifdef __cplusplus } #include "mgl2/mgl.h" //----------------------------------------------------------------------------- /// Wrapper class for all graphics class MGL_EXPORT mglGraphMPI:public mglGraph { mglGraphMPI(const mglGraphMPI &t) {} // copying is not allowed const mglGraphMPI &operator=(const mglGraphMPI &t) { return t; } public: inline mglGraphMPI(int kind=0, int width=600, int height=400):mglGraph(kind,width,height){} inline mglGraphMPI(HMGL graph):mglGraph(graph){} virtual ~mglGraphMPI(){} /// Send graphical information to node id using MPI inline void MPI_Send(int id) { mgl_mpi_send(gr,id); } /// Receive graphical information from node id using MPI inline void MPI_Recv(int id) { mgl_mpi_recv(gr,id); } }; #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/canvas.h0000664000175000017500000006735514167366472016532 0ustar balakinbalakin/*************************************************************************** * canvas.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MGL_CANVAS_H #define MGL_CANVAS_H #include "mgl2/base.h" //----------------------------------------------------------------------------- struct GifFileType; //----------------------------------------------------------------------------- /// Structure for drawing axis and ticks struct MGL_EXPORT mglAxis { mglAxis() : dv(0),ds(0),d(0),ns(0), v0(0),v1(0),v2(0),o(NAN), f(0), ch(0), pos('t'),sh(0),inv(false),angl(NAN) {} mglAxis(const mglAxis &aa) : dv(aa.dv),ds(aa.ds),d(aa.d),ns(aa.ns), t(aa.t),fact(aa.fact),stl(aa.stl), dir(aa.dir),a(aa.a),b(aa.b),org(aa.org), v0(aa.v0),v1(aa.v1),v2(aa.v2),o(aa.o), f(aa.f),txt(aa.txt), ch(aa.ch), pos(aa.pos),sh(aa.sh),inv(aa.inv),angl(aa.angl) {} #if MGL_HAVE_RVAL mglAxis(mglAxis &&aa) : dv(aa.dv),ds(aa.ds),d(aa.d),ns(aa.ns), t(aa.t),fact(aa.fact),stl(aa.stl), dir(aa.dir),a(aa.a),b(aa.b),org(aa.org), v0(aa.v0),v1(aa.v1),v2(aa.v2),o(aa.o), f(aa.f),txt(aa.txt), ch(aa.ch), pos(aa.pos),sh(aa.sh),inv(aa.inv),angl(aa.angl) {} #endif const mglAxis &operator=(const mglAxis &aa) { dv=aa.dv; ds=aa.ds; d=aa.d; ns=aa.ns; t=aa.t; fact=aa.fact; stl=aa.stl; dir=aa.dir; a=aa.a; b=aa.b; org=aa.org; v0=aa.v0; v1=aa.v1; v2=aa.v2; o=aa.o; f=aa.f; txt=aa.txt; ch=aa.ch; pos=aa.pos; sh=aa.sh; inv=aa.inv; return aa; } inline void AddLabel(const std::wstring &lbl, mreal v) { if(mgl_isfin(v)) txt.push_back(mglText(L' '+lbl+L' ',v)); } inline void Clear() { dv=ds=d=v0=v1=v2=sh=0; o=NAN; ns=f=0; pos = 't'; inv=false; fact.clear(); stl.clear(); t.clear(); txt.clear(); } mreal dv,ds; ///< Actual step for ticks and subticks. mreal d; ///< Step for axis ticks (if positive) or its number (if negative). int ns; ///< Number of axis subticks. std::wstring t; ///< Tick template (set "" to use default one ("%.2g" in simplest case)) std::wstring fact; ///< Factor which should be placed after number (like L"\pi") std::string stl; ///< Tick styles (default is ""=>"3m") mglPoint dir; ///< Axis direction mglPoint a,b; ///< Directions of over axis mglPoint org; mreal v0; ///< Center of axis cross section mreal v1; ///< Minimal axis range. mreal v2; ///< Maximal axis range. mreal o; ///< Point of starting ticks numbering (if NAN then Org is used). int f; ///< Flag 0x1 - time, 0x2 - manual, 0x4 - fixed dv std::vector txt; ///< Axis labels char ch; ///< Character of axis (like 'x','y','z','c') char pos; ///< Text position ('t' by default, or 'T' for opposite) mreal sh; ///< Extra shift of ticks and axis labels bool inv; ///< Inverse automatic origin position mreal angl; ///< Manual for ticks rotation (if not NAN) }; //----------------------------------------------------------------------------- class mglCanvas; /// Structure for drawing region struct MGL_EXPORT mglDrawReg { mglDrawReg() : PDef(0),angle(0),ObjId(0),PenWidth(0),pPos(0) ,x1(0),x2(0),y1(0),y2(0) {} mglDrawReg(const mglDrawReg &aa) : PDef(aa.PDef),angle(aa.angle),ObjId(aa.ObjId),PenWidth(aa.PenWidth),pPos(aa.pPos) ,x1(aa.x1),x2(aa.x2),y1(aa.y1),y2(aa.y2) {} #if MGL_HAVE_RVAL mglDrawReg(mglDrawReg &&aa) : PDef(aa.PDef),angle(aa.angle),ObjId(aa.ObjId),PenWidth(aa.PenWidth),pPos(aa.pPos) ,x1(aa.x1),x2(aa.x2),y1(aa.y1),y2(aa.y2) {} #endif inline void copy(const mglPrim &p) { PDef = p.n3; pPos = p.s; ObjId = p.id; PenWidth=p.w; angle = p.angl; if(p.type==2 || p.type==3) PDef = p.m; } inline const mglDrawReg &operator=(const mglDrawReg &aa) { PDef=aa.PDef; angle=aa.angle; ObjId=aa.ObjId; PenWidth=aa.PenWidth; pPos=aa.pPos; x1=aa.x1; x2=aa.x2; y1=aa.y1; y2=aa.y2; return aa; } union { uint64_t PDef; unsigned char m[8]; }; int angle; ///< mask rotation values in degrees int ObjId; mreal PenWidth, pPos; int x1,x2,y1,y2; void set(mglCanvas *gr, int nx, int ny, int m); }; //----------------------------------------------------------------------------- /// Structure contains everything for drawing struct MGL_EXPORT mglDrawDat { mglDrawDat() {} mglDrawDat(const mglDrawDat &aa) : Pnt(aa.Pnt),Prm(aa.Prm),Sub(aa.Sub),Ptx(aa.Ptx),Glf(aa.Glf),Txt(aa.Txt) {} #if MGL_HAVE_RVAL mglDrawDat(mglDrawDat &&aa) : Pnt(aa.Pnt),Prm(aa.Prm),Sub(aa.Sub),Ptx(aa.Ptx),Glf(aa.Glf),Txt(aa.Txt) {} #endif inline const mglDrawDat&operator=(const mglDrawDat &aa) { Pnt=aa.Pnt; Prm=aa.Prm; Ptx=aa.Ptx; Glf=aa.Glf; Txt=aa.Txt; Sub=aa.Sub; return aa; } mglStack Pnt; ///< Internal points mglStack Prm; ///< Primitives (lines, triangles and so on) -- need for export std::vector Sub; ///< InPlot regions std::vector Ptx; ///< Text labels for mglPrim std::vector Glf; ///< Glyphs data std::vector Txt; ///< Pointer to textures }; #if defined(_MSC_VER) MGL_EXTERN template class MGL_EXPORT std::vector; #endif //----------------------------------------------------------------------------- union mglRGBA { uint32_t c; unsigned char r[4]; }; //----------------------------------------------------------------------------- /// Class contains all functionality for creating different mathematical plots class MGL_EXPORT mglCanvas : public mglBase { friend struct mglPrim; friend struct mglDrawReg; public: using mglBase::Light; mglCanvas(int w=800, int h=600); virtual ~mglCanvas(); /// Set default parameter for plotting void DefaultPlotParam(); /// Set angle of view indepently from mglCanvas::Rotate() virtual void View(mreal tetx,mreal tetz,mreal tety=0); /// Zoom in or zoom out (if Zoom(0, 0, 1, 1)) a part of picture virtual void Zoom(mreal x1, mreal y1, mreal x2, mreal y2); /// Restore image after View() and Zoom() inline void Restore() { Zoom(0,0,1,1); } /// Clear transformation matrix. inline void Identity(bool rel=false) { InPlot(0,1,0,1,rel); } inline void Identity(mglMatrix &M, bool rel=false) { InPlot(M,0,1,0,1,rel); } /// Push transformation matrix into stack void Push(); /// Set PlotFactor inline void SetPlotFactor(mreal val) { if(val<=0) {B.pf=1.55; set(MGL_AUTO_FACTOR);} else {B.pf=val; clr(MGL_AUTO_FACTOR);} } /// Get PlotFactor inline mreal GetPlotFactor() { return B.pf; } /// Pop transformation matrix from stack void Pop(); /// Clear up the frame virtual void Clf(mglColor back=NC); virtual void Clf(const char *col); /// Put further plotting in cell of stick rotated on angles tet, phi void StickPlot(int num, int i, mreal tet, mreal phi); /// Put further plotting in cell of stick sheared on sx, sy void ShearPlot(int num, int i, mreal sx, mreal sy, mreal xd, mreal yd); /// Put further plotting in some region of whole frame surface. inline void InPlot(mreal x1,mreal x2,mreal y1,mreal y2,bool rel=true) { InPlot(B,x1,x2,y1,y2,rel); } void InPlot(mreal x1,mreal x2,mreal y1,mreal y2, const char *style); void InPlot(mglMatrix &M,mreal x1,mreal x2,mreal y1,mreal y2,bool rel=true); /// Add title for current subplot/inplot void Title(const char *title,const char *stl="#",mreal size=-2); void Title(const wchar_t *title,const char *stl="#",mreal size=-2); /// Set aspect ratio for further plotting. void Aspect(mreal Ax,mreal Ay,mreal Az); /// Shear a further plotting. void Shear(mreal Sx,mreal Sy); /// Rotate a further plotting. void Rotate(mreal TetX,mreal TetZ,mreal TetY=0); /// Rotate a further plotting around vector {x,y,z}. void RotateN(mreal Tet,mreal x,mreal y,mreal z); /// Set perspective (in range [0,1)) for plot. Set to zero for switching off. Return the current perspective. void Perspective(mreal a, bool req=true) { if(req) persp = Bp.pf = a; else Bp.pf = persp?persp:fabs(a); } /// Save parameters of current inplot inline void SaveInPlot() { sB=B; sW=inW, sH=inH, sZ=ZMin, sX=inX, sY=inY, sFF=font_factor; } /// Use saved parameters as current inplot inline void LoadInPlot() { B=sB; inW=sW, inH=sH, ZMin=sZ, inX=sX, inY=sY, font_factor=sFF; } /// Set size of frame in pixels. Normally this function is called internaly. virtual void SetSize(int w,int h,bool clf=true); /// Get ratio (mreal width)/(mreal height). mreal GetRatio() const MGL_FUNC_PURE; /// Get bitmap data prepared for saving to file virtual unsigned char **GetRGBLines(long &w, long &h, unsigned char *&f, bool alpha=false); /// Get RGB bitmap of current state image. virtual const unsigned char *GetBits(); /// Get RGBA bitmap of background image. const unsigned char *GetBackground() { return GB; }; /// Get RGBA bitmap of current state image. const unsigned char *GetRGBA() { Finish(); return G4; } /// Get width of the image int GetWidth() const { return Width; } /// Get height of the image int GetHeight() const { return Height; } /// Combine plots from 2 canvases. Result will be saved into this. void Combine(const mglCanvas *gr); /// Set boundary box for export graphics into 2D file formats void SetBBox(int x1=0, int y1=0, int x2=-1, int y2=-1) { BBoxX1=x1; BBoxY1=y1; BBoxX2=x2; BBoxY2=y2; } /// Rasterize current plot and set it as background image void Rasterize(); /// Load image for background from file (basic variant) void LoadBackground(const char *fname, double alpha=1); /// Load image for background from file. /** Parameter 'how' can be: * 'a' for filling current subplot only; * 's' for spline-based resizing; * 'f' for fixing aspect ratio at resizing; * 'c' for centering image; * 't' for tessellate image. */ void LoadBackground(const char *fname, const char *how, double alpha=1); /// Fill background image by specified color void FillBackground(const mglColor &cc); inline mreal GetDelay() const { return Delay; } inline void SetDelay(mreal d) { Delay=d; } /// Calculate 3D coordinate {x,y,z} for screen point {xs,ys} mglPoint CalcXYZ(int xs, int ys, bool real=false) const MGL_FUNC_PURE; /// Calculate screen point {xs,ys} for 3D coordinate {x,y,z} void CalcScr(mglPoint p, int *xs, int *ys) const; mglPoint CalcScr(const mglPoint &p) const; /// Set object/subplot id inline void SetObjId(long id) { ObjId = id; } /// Get object id inline int GetObjId(long xs,long ys) const { long i=xs+Width*ys; return (i>=0 && i &leg, int where=3, const char *font="#", const char *opt="") { Legend(leg,(where&1)?1:0,(where&2)?1:0,font,opt); } /// Draw legend strings text at position (x, y) by font with size void Legend(const std::vector &leg, mreal x, mreal y, const char *font="#", const char *opt=""); /// Number of marks in legend sample inline void SetLegendMarks(int num=1) { LegendMarks = num>0?num:1; } /// Draw table for values val along given direction with row labels text at given position void Table(mreal x, mreal y, HCDT val, const wchar_t *text, const char *fnt, const char *opt); void StartAutoGroup (const char *); void EndGroup(); /// Set extra shift for tick and axis labels inline void SetTickShift(mglPoint p) { ax.sh = p.x; ay.sh = p.y; az.sh = p.z; ac.sh = p.c; } /// Get rotation angle for glyph float GetGlyphPhi(const mglPnt &q, float phi); // Following arrays are open for advanced users only. It is not recommended to change them directly float *Z; ///< Height for given level in Z-direction (size 3*width*height) unsigned char *C; ///< Picture for given level in Z-direction (size 3*4*width*height) int *OI; ///< ObjId arrays (size width*height) /// Plot point p with color c void pnt_plot(long x,long y,mreal z,const unsigned char c[4], int obj_id); void pnt_fast(long x,long y,mreal z,const unsigned char c[4], int obj_id); /// preparing primitives for 2d export or bitmap drawing (0 default, 1 for 2d vector, 2 for 3d vector) void PreparePrim(int fast); inline uint32_t GetPntCol(long i) const { return pnt_col[i]; } inline uint32_t GetPrmCol(long i, bool sort=true) const { return GetColor(GetPrm(i, sort)); } /// Set the size of semi-transparent area around lines, marks, ... inline void SetPenDelta(float d) { pen_delta = 1.5*fabs(d); } protected: mreal Delay; ///< Delay for animation in seconds // NOTE: Z should be float for reducing space and for compatibility reasons unsigned char *G4; ///< Final picture in RGBA format. Prepared in Finish(). unsigned char *G; ///< Final picture in RGB format. Prepared in Finish(). unsigned char *GB; ///< Background picture in RGBA format. std::vector DrwDat; ///< Set of ALL drawing data for each frames int LegendMarks; ///< Number of marks in the Legend unsigned char BDef[4]; ///< Background color mglAxis ax,ay,az,ac;///< Axis parameters int TuneTicks; ///< Draw tuned ticks with extracted common component mreal FactorPos; ///< Position of axis ticks factor (0 at Min, 1 at Max, 1.1 is default) mreal TickLen; ///< Length of tiks (subticks length is sqrt(1+st_t)=1.41... times smaller) char AxisStl[32]; ///< Axis line style. Default is "k" char TickStl[32]; ///< Tick line style. Default is "k" char SubTStl[32]; ///< Subtick line style. Default is "k" mreal st_t; ///< Subtick-to-tick ratio (ls=lt/sqrt(1+st_t)). Default is 1. int CurFrameId; ///< Number of automaticle created frames int Width; ///< Width of the image int Height; ///< Height of the image int Depth; ///< Depth of the image mreal inW, inH; ///< Width and height of last InPlot mreal inX, inY; ///< Coordinates of last InPlot mglLight light[10]; ///< Light sources mreal FogDist; ///< Inverse fog distance (fog ~ exp(-FogDist*Z)) mreal FogDz; ///< Relative shift of fog inline mglAxis &GetAxis(unsigned ch) { mglAxis *aa[3]={&ax,&ay,&az}; ch-='x'; return ch<3?*(aa[ch]):ac; } inline HMEX GetFormula(unsigned ch) { HMEX aa[3]={fx,fy,fz}; ch-='x'; return ch<3?aa[ch]:fa; } /// Auto adjust ticks void AdjustTicks(mglAxis &aa, bool ff); /// Prepare labels for ticks void LabelTicks(mglAxis &aa); /// Draw axis void DrawAxis(mglAxis &aa, int text=1, char arr=0,const char *stl="",mreal angl=NAN); /// Draw axis grid lines void DrawGrid(mglAxis &aa, bool at_tick=false); /// Update axis ranges inline void UpdateAxis() { ax.v0=Org.x; ay.v0=Org.y; az.v0=Org.z; ac.v0=Org.c; ax.v1=Min.x; ay.v1=Min.y; az.v1=Min.z; ac.v1=Min.c; ax.v2=Max.x; ay.v2=Max.y; az.v2=Max.z; ac.v2=Max.c; } /// Clear ZBuffer only void ClfZB(bool force=false); /// Scale coordinates and cut off some points bool ScalePoint(const mglMatrix *M, mglPoint &p, mglPoint &n, bool use_nan=true) const; void LightScale(const mglMatrix *M); ///< Additionally scale positions of light sources void LightScale(const mglMatrix *M, mglLight &l); ///< Additionally scale positions of light /// Add crossing point at the boundary and straight line between q1, q2. At this q1 should be inside. long AddPairBnd(const mglPnt &q1, const mglPnt &q2); /// Push drawing data (for frames only). NOTE: can be VERY large long PushDrwDat(); /// Retur color for primitive depending lighting uint32_t GetColor(const mglPrim &p) const MGL_FUNC_PURE; mreal GetOrgX(char dir, bool inv=false) const MGL_FUNC_PURE; ///< Get Org.x (parse NAN value) mreal GetOrgY(char dir, bool inv=false) const MGL_FUNC_PURE; ///< Get Org.y (parse NAN value) mreal GetOrgZ(char dir, bool inv=false) const MGL_FUNC_PURE; ///< Get Org.z (parse NAN value) void mark_plot(long p, char type, mreal size=1); void arrow_plot(long p1, long p2, char st); void line_plot(long p1, long p2); void trig_plot(long p1, long p2, long p3); void quad_plot(long p1, long p2, long p3, long p4); void Glyph(mreal x, mreal y, mreal f, int style, long icode, mreal col); void smbl_plot(long p1, char id, double size); mreal text_plot(long p,const wchar_t *text,const char *fnt,mreal size=-1,mreal sh=0,mreal col=-('k'), bool rot=true); void add_prim(mglPrim &a); ///< add primitive to list void arrow_draw(const mglPnt &p1, const mglPnt &p2, char st, mreal size, const mglDrawReg *d); virtual void mark_draw(const mglPnt &p, char type, mreal size, mglDrawReg *d); virtual void line_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *d); virtual void trig_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool anorm, const mglDrawReg *d); virtual void quad_draw(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, const mglDrawReg *d); virtual void pnt_draw(const mglPnt &p, const mglDrawReg *d); void arrow_draw(long n1, long n2, char st, float ll); void arrow_plot_3d(long n1, long n2, char st, float ll); void glyph_draw(const mglPrim &P, mglDrawReg *d); void glyph_draw_new(const mglPrim &P, mglDrawReg *d); bool IsSame(const mglPrim &pr,mreal wp,mglColor cp,int st); // check if visible bool trig_vis(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3) const; bool quad_vis(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4) const; // functions for glyph drawing virtual void glyph_fill(mreal phi, const mglPnt &p, mreal f, const mglGlyph &g, const mglDrawReg *d); void glyph_wire(mreal phi, const mglPnt &p, mreal f, const mglGlyph &g, const mglDrawReg *d); void glyph_line(mreal phi, const mglPnt &p, mreal f, bool solid, const mglDrawReg *d); // restore normalized coordinates from screen ones mglPoint RestorePnt(mglPoint ps, bool norm=false) const MGL_FUNC_PURE; // functions for multi-threading void pxl_pntcol(long id, long n, const void *); void pxl_combine(long id, long n, const void *); void pxl_memcpy(long id, long n, const void *); void pxl_backgr(long id, long n, const void *); void pxl_primdr(long id, long n, const void *); void pxl_dotsdr(long id, long n, const void *); void pxl_primpx(long id, long n, const void *); void pxl_transform(long id, long n, const void *); void pxl_setz(long id, long n, const void *); void pxl_setz_adv(long id, long n, const void *); void pxl_other(long id, long n, const void *p); /// Put drawing from other mglCanvas (for multithreading, like subplots) void PutDrawReg(mglDrawReg *d, const mglCanvas *gr); private: mglCanvas(const mglCanvas &){} // copying is not allowed const mglCanvas &operator=(const mglCanvas &t){return t;} // copying is not allowed mglMatrix sB; // parameters of saved inplot mreal sW, sH, sZ, sX, sY, sFF; uint32_t *pnt_col; // mreal _tetx,_tety,_tetz; // extra angles std::vector stack; ///< stack for transformation matrices GifFileType *gif; mreal fscl,ftet; ///< last scale and rotation for glyphs long forg; ///< original point (for directions) size_t grp_counter; ///< Counter for StartGroup(); EndGroup(); mglMatrix Bt; ///< temporary matrix for text float pen_delta; ///< delta pen width (dpw) -- the size of semi-transparent region for lines, marks, ... /// Draw generic colorbar void colorbar(HCDT v, const mreal *s, int where, mreal x, mreal y, mreal w, mreal h, bool text, const char *opt=0); /// Draw labels for ticks void DrawLabels(mglAxis &aa, bool inv=false, const mglMatrix *M=0); /// Get label style char GetLabelPos(mreal c, long kk, mglAxis &aa); /// Draw tick void tick_draw(mglPoint o, mglPoint d1, mglPoint d2, int f); mreal FindOptOrg(char dir, int ind) const MGL_FUNC_PURE; /// Transform mreal color and alpha to bits format void col2int(const mglPnt &p, unsigned char *r, int obj_id) const; /// Combine colors in 2 plane. void combine(unsigned char *c1, const unsigned char *c2) const; /// Fast drawing of line between 2 points void fast_draw(const mglPnt &p1, const mglPnt &p2, const mglDrawReg *d); /// Additionally scale points p for positioning in image void PostScale(const mglMatrix *M, mglPoint &p) const; /// Scale points p for projection to the face number nface in image long ProjScale(int nface, long p, bool text=false); /// Set coordinate and add the point, return its id long setPp(mglPnt &q, const mglPoint &p); // fill pixel for given primitive void mark_pix(long i,long j,const mglPnt &p, char type, mreal size, mglDrawReg *d); void arrow_pix(long i,long j,const mglPnt &p1, const mglPnt &p2, char st, mreal size, const mglDrawReg *d); void line_pix(long i,long j,const mglPnt &p1, const mglPnt &p2, const mglDrawReg *d); void trig_pix(long i,long j,const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, bool anorm, const mglDrawReg *d); void quad_pix(long i,long j,const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4, const mglDrawReg *d); void glyph_pix(long i,long j,const mglPrim &P, mglDrawReg *d); void pnt_pix(long i,long j,const mglPnt &p, const mglDrawReg *d); void glyph_fpix(long i,long j,const mglMatrix *M, const mglPnt &p, mreal f, const mglGlyph &g, const mglDrawReg *d); void glyph_wpix(long i,long j,const mglMatrix *M, const mglPnt &p, mreal f, const mglGlyph &g, const mglDrawReg *d); void glyph_lpix(long i,long j,const mglMatrix *M, const mglPnt &p, mreal f, bool solid, const mglDrawReg *d); }; //----------------------------------------------------------------------------- struct mglThreadG { mglCanvas *gr; // grapher void (mglCanvas::*f)(long i, long n, const void *); unsigned id; // thread id long n; // total number of iteration const void *p; // external parameter }; /// Start several thread for the task void mglStartThread(void (mglCanvas::*func)(long i, long n), mglCanvas *gr, long n); //----------------------------------------------------------------------------- inline mreal get_persp(float pf, float z, float Depth) //{ return (1-pf)/(1-pf*z/Depth); } { return (1-pf/1.37)/(1-pf*z/Depth); } inline mreal get_pfact(float pf, float Depth) //{ return pf/(1-pf)/Depth; } { return pf/(1-pf/1.37)/Depth; } //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/addon.h0000664000175000017500000000704114167366472016326 0ustar balakinbalakin/*************************************************************************** * addon.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_ADDON_H_ #define _MGL_ADDON_H_ //----------------------------------------------------------------------------- #include "mgl2/define.h" #ifdef __cplusplus //----------------------------------------------------------------------------- /// Explicit scheme for 1 step of axial diffraction void MGL_EXPORT mgl_difr_axial(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk, double di); void MGL_EXPORT mgl_difr_axial_old(dual *a,int n,int step,dual q,int Border,dual *tmp1,dual *tmp2,int kk, double di); // restore for backward compatibility /// Explicit scheme for 1 step of plane diffraction void MGL_EXPORT mgl_difr_grid(dual *a,int n,int step,dual q,int Border,dual *tmp,int kk); void MGL_EXPORT mgl_difr_grid_old(dual *a,int n,int step,dual q,int Border,dual *tmp1,dual *tmp2,int kk); // restore for backward compatibility //----------------------------------------------------------------------------- extern "C" { #endif /// Get random number with Gaussian distribution double MGL_EXPORT mgl_gauss_rnd(); /// Fill frequencies for FFT void MGL_EXPORT mgl_fft_freq(double *freq,long nn); /// Remove double spaces from the string void MGL_EXPORT mgl_strcls(char *str); /// Get position of substring or return -1 if not found long MGL_EXPORT_PURE mgl_strpos(const char *str,char *fnd); /// Get position of symbol or return -1 if not found long MGL_EXPORT_PURE mgl_chrpos(const char *str,char fnd); /// Get uncommented string from file (NOTE: it is not thread safe!!!) MGL_EXPORT char *mgl_fgetstr(FILE *fp); /// Get parameters from uncommented strings of file (NOTE: it is not thread safe!!!) void MGL_EXPORT mgl_fgetpar(FILE *fp, const char *str, ...); /// Check if symbol denote true int MGL_EXPORT_CONST mgl_istrue(char ch); /// Print test message void MGL_EXPORT mgl_test(const char *str, ...); /// Print info message void MGL_EXPORT mgl_info(const char *str, ...); /// Locate next data block (block started by -----) MGL_EXPORT FILE *mgl_next_data(const char *fname,long p); /// Enable executing MGL script if mgl_fgetstr() meet '#MGL fname.mgl [args]. Default value is 0 (false). void MGL_EXPORT mgl_fgetstr_mgl(int enable); #ifdef __cplusplus } #endif #endif mathgl-8.0.1/include/mgl2/mglplot.fs0000664000175000017500000003773414167366472017114 0ustar balakinbalakin\ Mathgl library wrapper Thu Feb 21 12:33:02 MST 2008 \ Copyright (C) 2008, Sergey Plis \ \ This program is free software; you can redistribute it and/or modify \ it under the terms of the GNU General Public License as published by \ the Free Software Foundation; either version 2 of the License, or \ (at your option) any later version. \ \ This program is distributed in the hope that it will be useful, \ but WITHOUT ANY WARRANTY; without even the implied warranty of \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \ GNU General Public License for more details. \needs gsl include gsl.fs \needs mathgl include mathgl.fs \needs vectors include vectors.fs \needs $! include string.fs Module mglplot also minos also vectors also gsl also mathgl also float \ ------------------------------------------------------------------------ \ structures \ ------------------------------------------------------------------------ struct{ cell transp? cell transp_type cell alpha? cell light cell box cell grid double ambient cell axis? cell axis_str cell rotation[ cell aspect[ cell colorbar double linewidth double fontsize cell labelx$ cell labely$ cell labelz$ cell textrotate } mgl-params struct{ cell next \ next plot in the list of current figure cell prev cell xrange \ cell yrange \ cell zrange \ cell hmdtlist \ vector of all data objects used in the plot cell params \ vector of parameters to the plotting function cell ops \ vector of xt's of operations to place params \ list on the stack so the plotting function can \ be executed cell plotfunc \ the plotting function } a_plot struct{ cell next \ next figure in the figure structure cell # cell active? \ True/False cell figure \ plot object } a_figure : dispose-hmdtlist ( v( -- ) dup )size 0 do dup i )@ mgl_delete_data loop drop ; : dispose-a-plot ( *a_plot -- ) dup a_plot hmdtlist @ dispose-hmdtlist dup a_plot params @ )free dup a_plot ops @ )free dup a_plot xrange @ ]free dup a_plot yrange @ ]free dup a_plot zrange @ ]free free throw ; : dispose-all-plots ( *a_plot -- ) dup begin while dup a_plot next @ swap dispose-a-plot dup repeat drop ; \ simple aux words | : ]@s ( x[ -- f: x[0] .. x[n] ) dup ]size 0 do dup i ]@ loop drop ; | : ]!s ( x[ f: x[0] .. x[n] -- ) dup ]size 0 do dup i ]! loop drop ; | create axis-param 0 c, 0 c, 0 c, 0 c, 0 c, | create mglstrbuff $FF allot : default-rotation ( -- r[ ) 3 :] dup 0e 0e 0e ]!s ; : clear-axis-param axis-param dup 'x swap c! 1+ dup 'y swap c! 1+ 'z swap c! ; : NAN ( -- f: NAN) $7FC00000 sp@ sf@ drop ; \ ------------------------------------------------------------------------ \ GUI \ ------------------------------------------------------------------------ component class mathplot private: method fill-pixmap method mgl_settings_reset cell var mhold public: early open early dialog early open-app method generate-plot method addplot method clear-pixmap method #plots method clf method mgl-rotation! method mgl-colorbar method mgl-hold method mgl-holdoff method mgl-holdon method hold@ method hold! method mgl-grid method fontsize method mgl-xlabel method mgl-ylabel method mgl-zlabel canvas ptr mCanvas ( [varstart] ) \ memory-pixmap ptr pxmap \ the pixmap on the canvas cell var pxmap cell var graph \ the graph to display cell var plotlist \ list of plots to display cell var parameters \ parameter structure ( [varend] ) how: : params DF[ 0 ]DF s" figure" ; : hold@ mhold @ ; : hold! mhold ! ; : mgl-hold mhold @ not mhold ! ; : mgl-holdoff mhold off ; : mgl-holdon mhold on ; : open self DF[ 0 ]DF s" bigforth Plot" open-component ; : dialog new DF[ 0 ]DF s" bigforth Plot" open-dialog ; : open-app new DF[ 0 ]DF s" bigforth Plot" open-application ; : clear-pixmap pxmap @ if pxmap @ >o dispose o> 0 pxmap ! then ; : #plots ( -- ) 0 plotlist @ begin dup while swap 1+ swap a_plot next @ repeat drop ; : assign &600 &400 mgl_create_graph_zb graph ! sizeof mgl-params allocate throw parameters ! parameters @ sizeof mgl-params erase mgl_settings_reset \ 0 0 parameters @ mgl-params labelx$ dup @ if $off else drop then \ 0 0 parameters @ mgl-params labely$ dup @ if $off else drop then \ 0 0 parameters @ mgl-params labelz$ dup @ if $off else drop then 0 pxmap ! 0 plotlist ! mhold off ; : fontsize ( f: size -- ) parameters @ mgl-params fontsize sf! ; : mgl-set-params ( -- ) graph @ dup parameters @ mgl-params rotation[ @ ]@s mgl_rotate dup parameters @ mgl-params ambient sf@ mgl_set_ambbr dup parameters @ mgl-params fontsize sf@ mgl_set_font_size dup parameters @ mgl-params linewidth sf@ mgl_set_base_line_width dup parameters @ mgl-params aspect[ @ ]@s mgl_aspect dup parameters @ mgl-params transp? @ mgl_set_transp dup parameters @ mgl-params transp_type @ mgl_set_transp_type dup parameters @ mgl-params alpha? @ mgl_set_alpha dup parameters @ mgl-params light @ mgl_set_light dup parameters @ mgl-params textrotate @ mgl_set_rotated_text dup parameters @ mgl-params box @ mgl_box parameters @ mgl-params grid @ if dup 0" xyz" 0 mgl_axis_grid then drop ; : mgl-post-params ( -- ) graph @ 1 mgl_set_rotated_text parameters @ mgl-params labelx$ @ if parameters @ mgl-params labelx$ $@ mglstrbuff 0place parameters @ mgl-params fontsize sf@ 0e0 graph @ 'x mglstrbuff 0 mgl_label_ext then parameters @ mgl-params labely$ @ if parameters @ mgl-params labely$ $@ mglstrbuff 0place parameters @ mgl-params fontsize sf@ 0e0 graph @ 'y mglstrbuff 0 mgl_label_ext then parameters @ mgl-params labelz$ @ drop 0 if parameters @ mgl-params labelz$ $@ mglstrbuff 0place parameters @ mgl-params fontsize sf@ 0e0 graph @ 'z mglstrbuff 0 mgl_label_ext then parameters @ mgl-params colorbar @ drop 0 if dup 0 0 mgl_colorbar then ; : mgl_settings_reset 1 parameters @ mgl-params transp? ! 1 parameters @ mgl-params transp_type ! 0 parameters @ mgl-params alpha? ! 0 parameters @ mgl-params box ! 0 parameters @ mgl-params colorbar ! 0 parameters @ mgl-params light ! 1 parameters @ mgl-params axis? ! axis-param parameters @ mgl-params axis_str ! clear-axis-param parameters @ mgl-params labelx$ dup @ if $off else drop then parameters @ mgl-params labely$ dup @ if $off else drop then parameters @ mgl-params labelz$ dup @ if $off else drop then \ parameters @ mgl-params textrotate off !0.9 parameters @ mgl-params ambient sf! !2.5 parameters @ mgl-params fontsize sf! !1.2 parameters @ mgl-params linewidth sf! parameters @ mgl-params rotation[ @ dup if ]free else drop then default-rotation parameters @ mgl-params rotation[ ! parameters @ mgl-params aspect[ @ dup if ]free else drop then 3 :] parameters @ mgl-params aspect[ ! ; : mgl_settings_free parameters @ mgl-params labelx$ dup @ if $off else drop then parameters @ mgl-params labely$ dup @ if $off else drop then parameters @ mgl-params labelz$ dup @ if $off else drop then parameters @ mgl-params rotation[ @ dup if ]free else drop then parameters @ mgl-params aspect[ @ dup if ]free else drop then ; : addplot ( *a_plot -- ) mhold @ if >r plotlist @ r@ a_plot next ! r> plotlist @ if dup plotlist @ a_plot prev ! then else plotlist @ dispose-all-plots then plotlist ! generate-plot mcanvas draw ; : display_a_plot ( *a_plot -- ) >r graph @ r@ a_plot ops @ r@ a_plot params @ dup )size 0 do i -rot 2>r 2r@ rot dup >r *) swap r> )@ F execute 2r> loop 2drop r> a_plot plotfunc @ F execute ; : xmin ( -- f: xmin ) 1e20 plotlist @ begin dup while dup a_plot xrange @ ]min fmin a_plot next @ repeat drop ; : xmax ( -- f: xmax ) -1e20 plotlist @ begin dup while dup a_plot xrange @ ]max fmax a_plot next @ repeat drop ; : ymin ( -- f: ymin ) 1e20 plotlist @ begin dup while dup a_plot yrange @ ]min fmin a_plot next @ repeat drop ; : ymax ( -- f: ymax ) -1e20 plotlist @ begin dup while dup a_plot yrange @ ]max fmax a_plot next @ repeat drop ; : zmin ( -- f: zmin ) 1e20 plotlist @ begin dup while dup a_plot zrange @ ]min fmin a_plot next @ repeat drop ; : zmax ( -- f: ymax ) -1e20 plotlist @ begin dup while dup a_plot zrange @ ]max fmax a_plot next @ repeat drop ; : display_plots ( -- ) 0 plotlist @ begin dup while nip dup a_plot next @ repeat drop begin dup while dup display_a_plot a_plot prev @ repeat drop ; : create-figure ( -- ) graph @ mgl_identity graph @ mgl_clf graph @ mCanvas with w @ h @ endwith mgl_set_size \ parameters @ mgl-params rotation[ @ ]null? if \ graph @ \ [ 1e 3e fsqrt f/ 1e fswap f- 2e f/ 0.7e f* ] fliteral \ fdup \ fdup fdup 1e fswap f- fswap 1e fswap f- \ mgl_set_zoom \ else graph @ 0e 0e 0e 0e mgl_set_zoom \ parameters @ mgl-params fontsize sf@ \ 1.2e f* parameters @ mgl-params fontsize sf! \ then graph @ xmin ymin zmin xmax ymax zmax mgl_set_axis_3d \ graph @ xmin ymin zmin mgl_set_origin graph @ NAN NAN NAN mgl_set_origin mgl-set-params mgl-post-params display_plots ; : fill-pixmap clear-pixmap graph @ mgl_get_rgb mCanvas with w @ h @ endwith * 4 * dup allocate throw dup >r swap 4 / 3 * move r@ mCanvas with w @ h @ endwith memory-pixmap new pxmap ! r> free throw ; : generate-plot ( -- ) create-figure fill-pixmap ; : freeplots plotlist @ dispose-all-plots 0 plotlist ! ; : clf freeplots clear-pixmap draw ; : mgl-rotation! ( f: x y z ) fswap frot parameters @ mgl-params rotation[ @ ]!s generate-plot mcanvas draw ; : mgl-rotation@ ( -- f: x y z ) parameters @ mgl-params rotation[ @ ]@s ; : mgl-colorbar ( -- ) parameters @ mgl-params colorbar @ not parameters @ mgl-params colorbar ! generate-plot mcanvas draw ; : mgl-grid parameters @ mgl-params grid dup @ not swap ! generate-plot mcanvas draw ; : mgl-xlabel ( addr u -- ) parameters @ mgl-params labelx$ dup @ if dup $off $! else $! then generate-plot mcanvas draw ; : mgl-ylabel ( addr u -- ) parameters @ mgl-params labely$ dup @ if dup $off $! else $! then generate-plot mcanvas draw ; : mgl-zlabel ( addr u -- ) parameters @ mgl-params labelz$ dup @ if dup $off $! else $! then generate-plot mcanvas draw ; : dispose clear-pixmap plotlist @ dispose-all-plots graph @ mgl_delete_graph mgl_settings_free parameters @ sizeof mgl-params erase parameters @ free throw super dispose ; : widget CV[ outer with pxmap @ endwith 0<> if outer with pxmap @ endwith icon then ]CV ^^ CK[ 2drop 2drop ]CK $258 $1 *hfil $190 $1 *vfil canvas new ^^bind mCanvas $10 $1 *hfill *hglue new ^^ S[ s" not done" mCanvas text ]S X" Save " button new ^^ S[ close ]S X" Close " button new &3 habox new vfixbox panel &2 vabox new ; class; sizeof a_figure allocate throw constant current-figure current-figure sizeof a_figure erase actor class clear-pointer how: : dispose current-figure a_figure active? off current-figure sizeof a_figure erase super dispose ; class; : init-plot current-figure a_figure active? @ not if screen self mathplot new current-figure a_figure figure ! current-figure a_figure active? on clear-pointer new current-figure a_figure figure @ mathplot with >callback open endwith then ; : s>range[] ( fmin fmax -- :] ) 2 :] dup 1 ]! dup 0 ]! ; : []plot ( x[ str0 xt -- *a_plot ) >r >r dup >r mgl_create_data dup rot mgl_data_set_vector sizeof a_plot allocate throw dup r@ dup ]min ]max s>range[] swap a_plot yrange ! dup r> ]size 0e s>f s>range[] swap a_plot xrange ! dup 0e 0e s>range[] swap a_plot zrange ! dup 0 swap a_plot next ! dup 0 swap a_plot prev ! over 1 ivector* over a_plot hmdtlist ! over r> 2 ivector* over a_plot params ! ['] @ ['] @ 2 ivector* over a_plot ops ! nip r> over a_plot plotfunc ! ; : addplot ( *a_plot -- ) init-plot current-figure a_figure figure @ mathplot with addplot endwith ; : ]plot ( *gsl_vector 0"" -- ) ['] mgl_plot []plot addplot ; : ]stem ( *gsl_vector 0"" -- ) ['] mgl_stem []plot addplot ; : ]bars ( *gsl_vector 0"" -- ) ['] mgl_bars []plot addplot ; : ]step ( *gsl_vector 0"" -- ) ['] mgl_step []plot addplot ; : ]area ( *gsl_vector 0"" -- ) ['] mgl_area []plot addplot ; : [[]]plot ( x[[ str0 xt -- *a_plot ) >r >r dup >r mgl_create_data dup rot mgl_data_set_matrix sizeof a_plot allocate throw dup r@ dup ]]min ]]max s>range[] swap a_plot zrange ! dup r@ ]]size1 0e s>f s>range[] swap a_plot xrange ! dup r> ]]size2 0e s>f s>range[] swap a_plot yrange ! dup 0 swap a_plot next ! dup 0 swap a_plot prev ! over 1 ivector* over a_plot hmdtlist ! over r> 2 ivector* over a_plot params ! ['] @ ['] @ 2 ivector* over a_plot ops ! nip r> over a_plot plotfunc ! ; : ]]surf ( *gsl_matrix 0"" -- ) ['] mgl_surf [[]]plot addplot ; : ]]tile ( *gsl_matrix 0"" -- ) ['] mgl_tile [[]]plot addplot ; : ]]belt ( *gsl_matrix 0"" -- ) ['] mgl_belt [[]]plot addplot ; : ]]fall ( *gsl_matrix 0"" -- ) ['] mgl_fall [[]]plot addplot ; : ]]mesh ( *gsl_matrix 0"" -- ) ['] mgl_mesh [[]]plot addplot ; : ]]msurf ( *gsl_matrix 0"" -- ) init-plot 2dup ]]surf current-figure a_figure figure @ mathplot with hold@ mgl-holdon endwith >r ]]mesh r> current-figure a_figure figure @ mathplot with hold! endwith ; : [[]]plotf ( f:v x[[ str0 xt -- *a_plot ) >r >r dup >r mgl_create_data dup rot mgl_data_set_matrix sizeof a_plot allocate throw dup r@ dup ]]min ]]max s>range[] swap a_plot zrange ! dup r@ ]]size1 0e s>f s>range[] swap a_plot xrange ! dup r> ]]size2 0e s>f s>range[] swap a_plot yrange ! dup 0 swap a_plot next ! dup 0 swap a_plot prev ! over 1 ivector* over a_plot hmdtlist ! over r> f>fs 3 ivector* over a_plot params ! ['] @ ['] @ ['] sf@ 3 ivector* over a_plot ops ! nip r> over a_plot plotfunc ! ; : ]]boxs ( f:v *gsl_matrix 0"" -- ) ['] mgl_boxs [[]]plotf addplot ; : clf current-figure a_figure active? @ if current-figure a_figure figure @ >o mathplot clf o> then ; : fontsize! ( f:size -- ) current-figure a_figure active? @ if current-figure a_figure figure @ >o mathplot fontsize o> then ; : rotation ( F: x y z -- ) current-figure a_figure active? @ if current-figure a_figure figure @ >o mathplot mgl-rotation! o> else fdrop fdrop fdrop then ; : colorbar current-figure a_figure active? @ if current-figure a_figure figure @ >o mathplot mgl-colorbar o> then ; : mglhold current-figure a_figure active? @ if current-figure a_figure figure @ >o mathplot mgl-hold o> then ; : mglholdon current-figure a_figure active? @ if current-figure a_figure figure @ >o mathplot mgl-holdon o> then ; : mglholdoff current-figure a_figure active? @ if current-figure a_figure figure @ >o mathplot mgl-holdoff o> then ; : mglgrid current-figure a_figure active? @ if current-figure a_figure figure @ >o mathplot mgl-grid o> then ; : xlabel ( addr u -- ) current-figure a_figure active? @ if current-figure a_figure figure @ >o mathplot mgl-xlabel o> then ; : ylabel ( addr u -- ) current-figure a_figure active? @ if current-figure a_figure figure @ >o mathplot mgl-ylabel o> then ; : zlabel ( addr u -- ) current-figure a_figure active? @ if current-figure a_figure figure @ >o mathplot mgl-zlabel o> then ; clear previous previous previous previous previous Module; \\\ also mglplot also minos also gsl 100 fvector x[ x[ ]randomize x[ 0 ]plot mathgl-8.0.1/include/mgl2/plot.h0000664000175000017500000005246714167366472016233 0ustar balakinbalakin/*************************************************************************** * plot.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_1D_H_ #define _MGL_1D_H_ #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /// Draw curve for formula with x in x-axis range /** Option "value" set initial number of points. */ void MGL_EXPORT mgl_fplot(HMGL gr, const char *eqY, const char *pen, const char *opt); void MGL_EXPORT mgl_fplot_(uintptr_t *gr, const char *fy, const char *stl, const char *opt, int ly, int ls, int lo); /// Draw curve for formulas parametrically depended on t in range [0,1] /** Option "value" set initial number of points. */ void MGL_EXPORT mgl_fplot_xyz(HMGL gr, const char *eqX, const char *eqY, const char *eqZ, const char *pen, const char *opt); void MGL_EXPORT mgl_fplot_xyz_(uintptr_t *gr, const char *fx, const char *fy, const char *fz, const char *stl, const char *opt, int lx, int ly, int lz, int ls, int lo); /// Draw radar chart (plot in curved coordinates) /** Option "value" set the additional shift of data (i.e. the data a+value is used instead of a).*/ void MGL_EXPORT mgl_radar(HMGL graph, HCDT a, const char *pen, const char *opt); void MGL_EXPORT mgl_radar_(uintptr_t *gr, uintptr_t *a, const char *pen, const char *opt, int l,int lo); /// Draw usual curve {x,y,z} void MGL_EXPORT mgl_plot_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_plot_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw usual curve {x,y} void MGL_EXPORT mgl_plot_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_plot_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw usual curve {x,y} with x in x-axis range void MGL_EXPORT mgl_plot(HMGL graph, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_plot_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw curve {x,y,z} which is colored by c (like tension plot) void MGL_EXPORT mgl_tens_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT c, const char *pen, const char *opt); void MGL_EXPORT mgl_tens_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *c, const char *pen, const char *opt,int,int); /// Draw curve {x,y} which is colored by c (like tension plot) void MGL_EXPORT mgl_tens_xy(HMGL graph, HCDT x, HCDT y, HCDT c, const char *pen, const char *opt); void MGL_EXPORT mgl_tens_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *c, const char *pen, const char *opt,int,int); /// Draw curve {x,y} with x in x-axis range which is colored by c (like tension plot) void MGL_EXPORT mgl_tens(HMGL graph, HCDT y, HCDT c, const char *pen, const char *opt); void MGL_EXPORT mgl_tens_(uintptr_t *graph, uintptr_t *y, uintptr_t *c, const char *pen, const char *opt,int,int); /// Draw tapes which rotates as (bi-)normales of curve {x,y,z} /** The width of tape is proportional to barwidth and can be changed by option "value".*/ void MGL_EXPORT mgl_tape_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_tape_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw tapes which rotates as (bi-)normales of curve {x,y} /** The width of tape is proportional to barwidth and can be changed by option "value".*/ void MGL_EXPORT mgl_tape_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_tape_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw tapes which rotates as (bi-)normales of curve {x,y} with x in x-axis range /** The width of tape is proportional to barwidth and can be changed by option "value".*/ void MGL_EXPORT mgl_tape(HMGL graph, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_tape_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw box-plot (special 5-value plot used in statistic) for data specified parametrically /** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/ void MGL_EXPORT mgl_boxplot_xy(HMGL graph, HCDT x, HCDT a, const char *pen, const char *opt); void MGL_EXPORT mgl_boxplot_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw box-plot (special 5-value plot used in statistic) /** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/ void MGL_EXPORT mgl_boxplot(HMGL graph, HCDT a, const char *pen, const char *opt); void MGL_EXPORT mgl_boxplot_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Fill area between curve {x,y,z} and axis plane /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_area_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_area_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); /// Fill area between curve {x,y} and axis plane /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_area_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_area_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); /// Fill area between curve {x,y} with x in x-axis range and axis plane /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_area(HMGL graph, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_area_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Fill area (draw ribbon) between curves {x1,y1,z1} and {x2,y2,z2} /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_region_3d(HMGL graph, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT y2, HCDT z2, const char *pen, const char *opt); void MGL_EXPORT mgl_region_3d_(uintptr_t *graph, uintptr_t *x1, uintptr_t *y1, uintptr_t *z1, uintptr_t *x2, uintptr_t *y2, uintptr_t *z2, const char *pen, const char *opt,int,int); /// Fill area between curves {x,y1} and {x,y2} /** Style 'i' will fill area only if y1 < y2. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_region_xy(HMGL graph, HCDT x, HCDT y1, HCDT y2, const char *pen, const char *opt); void MGL_EXPORT mgl_region_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int, int); /// Fill area between curves {x,y1} and {x,y2} with x in x-axis range /** Style 'i' will fill area only if y1 < y2. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_region(HMGL graph, HCDT y1, HCDT y2, const char *pen, const char *opt); void MGL_EXPORT mgl_region_(uintptr_t *graph, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int, int); /// Draw vertical lines from points {x,y,z} to axis plane void MGL_EXPORT mgl_stem_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_stem_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw vertical lines from points {x,y} to axis plane void MGL_EXPORT mgl_stem_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_stem_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw vertical lines from points {x,y} with x in x-axis range to axis plane void MGL_EXPORT mgl_stem(HMGL graph, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_stem_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw stairs for points in arrays {x,y,z} void MGL_EXPORT mgl_step_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_step_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw stairs for points in arrays {x,y} void MGL_EXPORT mgl_step_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_step_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw stairs for points in arrays {x,y} with x in x-axis range void MGL_EXPORT mgl_step(HMGL graph, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_step_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw vertical bars from points {x,y,z} to axis plane /** String \a pen may contain: * ‘a’ for drawing boxes one above another (like summation); * ‘f’ for waterfall chart; * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_bars_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, const char *pen, const char *opt); void MGL_EXPORT mgl_bars_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, const char *pen, const char *opt,int,int); /// Draw vertical bars from points {x,y} to axis plane /** String \a pen may contain: * ‘a’ for drawing boxes one above another (like summation); * ‘f’ for waterfall chart; * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_bars_xy(HMGL graph, HCDT x, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_bars_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw vertical bars from points {x,y} with x in x-axis range to axis plane /** String \a pen may contain: * ‘a’ for drawing boxes one above another (like summation); * ‘f’ for waterfall chart; * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_bars(HMGL graph, HCDT y, const char *pen, const char *opt); void MGL_EXPORT mgl_bars_(uintptr_t *graph, uintptr_t *y, const char *pen, const char *opt,int,int); /// Draw horizontal bars from points {v,y} to axis plane /** String \a pen may contain: * ‘a’ for drawing boxes one above another (like summation); * ‘f’ for waterfall chart; * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_barh_yx(HMGL graph, HCDT y, HCDT v, const char *pen, const char *opt); void MGL_EXPORT mgl_barh_yx_(uintptr_t *graph, uintptr_t *y, uintptr_t *v, const char *pen, const char *opt,int,int); /// Draw horizontal bars from points {v,y} with y in y-axis range to axis plane /** String \a pen may contain: * ‘a’ for drawing boxes one above another (like summation); * ‘f’ for waterfall chart; * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ void MGL_EXPORT mgl_barh(HMGL graph, HCDT v, const char *pen, const char *opt); void MGL_EXPORT mgl_barh_(uintptr_t *graph, uintptr_t *v, const char *pen, const char *opt,int,int); /// Draw Open-High-Low-Close (OHLC) diagram /** Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */ void MGL_EXPORT mgl_ohlc_x(HMGL graph, HCDT x, HCDT open, HCDT high, HCDT low, HCDT close, const char *pen, const char *opt); void MGL_EXPORT mgl_ohlc_x_(uintptr_t *graph, uintptr_t *x, uintptr_t *open, uintptr_t *high, uintptr_t *low, uintptr_t *close, const char *pen, const char *opt,int,int); /// Draw Open-High-Low-Close (OHLC) diagram with x in x-axis range /** Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */ void MGL_EXPORT mgl_ohlc(HMGL graph, HCDT open, HCDT high, HCDT low, HCDT close, const char *pen, const char *opt); void MGL_EXPORT mgl_ohlc_(uintptr_t *graph, uintptr_t *open, uintptr_t *high, uintptr_t *low, uintptr_t *close, const char *pen, const char *opt,int,int); /// Draw chart for data a /** Space denote transparent color. Style '#' draw black borders. */ void MGL_EXPORT mgl_chart(HMGL graph, HCDT a, const char *col, const char *opt); void MGL_EXPORT mgl_chart_(uintptr_t *graph, uintptr_t *a, const char *col, const char *opt,int,int); /// Draw error boxes {ex,ey} at points {x,y} /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ void MGL_EXPORT mgl_error_exy(HMGL graph, HCDT x, HCDT y, HCDT ex, HCDT ey, const char *pen, const char *opt); void MGL_EXPORT mgl_error_exy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *ex, uintptr_t *ey, const char *pen, const char *opt,int,int); /// Draw error boxes {ey} at points {x,y} /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ void MGL_EXPORT mgl_error_xy(HMGL graph, HCDT x, HCDT y, HCDT ey, const char *pen, const char *opt); void MGL_EXPORT mgl_error_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *ey, const char *pen, const char *opt,int,int); /// Draw error boxes {ey} at points {x,y} with x in x-axis range /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ void MGL_EXPORT mgl_error(HMGL graph, HCDT y, HCDT ey, const char *pen, const char *opt); void MGL_EXPORT mgl_error_(uintptr_t *graph, uintptr_t *y, uintptr_t *ey, const char *pen, const char *opt,int,int); /// Draw marks with size r at points {x,y,z} void MGL_EXPORT mgl_mark_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *pen, const char *opt); void MGL_EXPORT mgl_mark_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, const char *pen, const char *opt,int,int); /// Draw marks with size r at points {x,y} void MGL_EXPORT mgl_mark_xy(HMGL graph, HCDT x, HCDT y, HCDT r, const char *pen, const char *opt); void MGL_EXPORT mgl_mark_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *r, const char *pen, const char *opt,int,int); /// Draw marks with size r at points {x,y} with x in x-axis range void MGL_EXPORT mgl_mark_y(HMGL graph, HCDT y, HCDT r, const char *pen, const char *opt); void MGL_EXPORT mgl_mark_y_(uintptr_t *graph, uintptr_t *y, uintptr_t *r, const char *pen, const char *opt,int,int); /// Draw Poincare map at condition s==0 for curve {x,y,z} void MGL_EXPORT mgl_pmap_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT s, const char *pen, const char *opt); void MGL_EXPORT mgl_pmap_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, const char *pen, const char *opt,int,int); /// Draw Poincare map at condition s==0 for curve {x,y} void MGL_EXPORT mgl_pmap_xy(HMGL graph, HCDT x, HCDT y, HCDT s, const char *pen, const char *opt); void MGL_EXPORT mgl_pmap_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *r, const char *pen, const char *opt,int,int); /// Draw Poincare map at condition s==0 for curve {x,y} with x in x-axis range void MGL_EXPORT mgl_pmap(HMGL graph, HCDT y, HCDT s, const char *pen, const char *opt); void MGL_EXPORT mgl_pmap_(uintptr_t *graph, uintptr_t *y, uintptr_t *r, const char *pen, const char *opt,int,int); /// Draw tube with variable radius r around curve {x,y,z} void MGL_EXPORT mgl_tube_xyzr(HMGL graph, HCDT x, HCDT y, HCDT z, HCDT r, const char *pen, const char *opt); void MGL_EXPORT mgl_tube_xyzr_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, uintptr_t *r, const char *pen, const char *opt,int,int); /// Draw tube with variable radius r around curve {x,y} void MGL_EXPORT mgl_tube_xyr(HMGL graph, HCDT x, HCDT y, HCDT r, const char *pen, const char *opt); void MGL_EXPORT mgl_tube_xyr_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *r, const char *pen, const char *opt,int,int); /// Draw tube with variable radius r around curve {x,y} with x in x-axis range void MGL_EXPORT mgl_tube_r(HMGL graph, HCDT y, HCDT r, const char *pen, const char *opt); void MGL_EXPORT mgl_tube_r_(uintptr_t *graph, uintptr_t *y, uintptr_t *r, const char *pen, const char *opt,int,int); /// Draw tube with constant radius r around curve {x,y,z} void MGL_EXPORT mgl_tube_xyz(HMGL graph, HCDT x, HCDT y, HCDT z, double r, const char *pen, const char *opt); void MGL_EXPORT mgl_tube_xyz_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, uintptr_t *z, mreal *r, const char *pen, const char *opt,int,int); /// Draw tube with constant radius r around curve {x,y} void MGL_EXPORT mgl_tube_xy(HMGL graph, HCDT x, HCDT y, double r, const char *penl, const char *opt); void MGL_EXPORT mgl_tube_xy_(uintptr_t *graph, uintptr_t *x, uintptr_t *y, mreal *r, const char *pen, const char *opt,int,int); /// Draw tube with constant radius r around curve {x,y} with x in x-axis range void MGL_EXPORT mgl_tube(HMGL graph, HCDT y, double r, const char *pen, const char *opt); void MGL_EXPORT mgl_tube_(uintptr_t *graph, uintptr_t *y, mreal *r, const char *pen, const char *opt,int,int); /// Draw candle plot for data specified parametrically /** Different colors are used for up and down values if 2 colors are specified. * Style ‘#’ force drawing wire candle even for 2-color scheme. */ void MGL_EXPORT mgl_candle_xyv(HMGL gr, HCDT x, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt); void MGL_EXPORT mgl_candle_xyv_(uintptr_t *gr, uintptr_t *x, uintptr_t *v1, uintptr_t *v2, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int); /// Draw candle plot /** Different colors are used for up and down values if 2 colors are specified. * Style ‘#’ force drawing wire candle even for 2-color scheme. */ void MGL_EXPORT mgl_candle_yv(HMGL gr, HCDT v1, HCDT v2, HCDT y1, HCDT y2, const char *pen, const char *opt); void MGL_EXPORT mgl_candle_yv_(uintptr_t *gr, uintptr_t *v1, uintptr_t *v2, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int); /// Draw candle plot with v1=v[i], v2=v[i+1] /** Different colors are used for up and down values if 2 colors are specified. * Style ‘#’ force drawing wire candle even for 2-color scheme. */ void MGL_EXPORT mgl_candle(HMGL gr, HCDT v, HCDT y1, HCDT y2, const char *pen, const char *opt); void MGL_EXPORT mgl_candle_(uintptr_t *gr, uintptr_t *y, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int); /// Draw lines with arrows between points {x1,y1,z1} and {x2,y2,z2} void MGL_EXPORT mgl_lines_xyz(HMGL gr, HCDT x1, HCDT y1, HCDT z1, HCDT x2, HCDT y2, HCDT z2, const char *pen, const char *opt); void MGL_EXPORT mgl_lines_xyz_(uintptr_t *gr, uintptr_t *x1, uintptr_t *y1, uintptr_t *z1, uintptr_t *x2, uintptr_t *y2, uintptr_t *z2, const char *pen, const char *opt,int,int); /// Draw lines with arrows between points {x1,y1,zMin} and {x2,y2,zMin} void MGL_EXPORT mgl_lines_xy(HMGL gr, HCDT x1, HCDT y1, HCDT x2, HCDT y2, const char *pen, const char *opt); void MGL_EXPORT mgl_lines_xy_(uintptr_t *gr, uintptr_t *x1, uintptr_t *y1, uintptr_t *x2, uintptr_t *y2, const char *pen, const char *opt,int,int); /// Draw lines with arrows between points {x1,y} and {x2,y} with y in y-axis range void MGL_EXPORT mgl_lines_x(HMGL gr, HCDT x1, HCDT x2, const char *pen, const char *opt); void MGL_EXPORT mgl_lines_x_(uintptr_t *gr, uintptr_t *x1, uintptr_t *x2, const char *pen, const char *opt,int,int); /// Draw lines lines with arrows between {x,y1} and {x,y2} with x in x-axis range void MGL_EXPORT mgl_lines(HMGL gr, HCDT y1, HCDT y2 ,const char *pen, const char *opt); void MGL_EXPORT mgl_lines_(uintptr_t *gr, uintptr_t *y1, uintptr_t *y2, const char *pen, const char *opt,int,int); #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/glut.h0000664000175000017500000001054014167366472016212 0ustar balakinbalakin/*************************************************************************** * glut.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ //----------------------------------------------------------------------------- #ifndef _MGL_GLUT_H_ #define _MGL_GLUT_H_ #ifdef __cplusplus #include //----------------------------------------------------------------------------- extern "C" { #endif void _mgl_key_up(unsigned char ch,int ,int ); HMGL MGL_EXPORT mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)); /// Switch on/off transparency (do not overwrite user settings) void MGL_EXPORT mgl_glut_toggle_alpha(HMGL gr); /// Switch on/off lighting (do not overwrite user settings) void MGL_EXPORT mgl_glut_toggle_light(HMGL gr); /// Switch off all zooming and rotation void MGL_EXPORT mgl_glut_toggle_no(HMGL gr); /// Update picture by calling user drawing function void MGL_EXPORT mgl_glut_update(HMGL gr); /// Reload user data and update picture void MGL_EXPORT mgl_glut_reload(HMGL gr); /// Show next frame (if one) void MGL_EXPORT mgl_glut_next_frame(HMGL gr); /// Show previous frame (if one) void MGL_EXPORT mgl_glut_prev_frame(HMGL gr); /// Run slideshow (animation) of frames void MGL_EXPORT mgl_glut_animation(HMGL gr); #ifdef __cplusplus } //----------------------------------------------------------------------------- class MGL_EXPORT mglGLUT: public mglGraph { mglGLUT(const mglGLUT &) {} // copying is not allowed const mglGLUT &operator=(const mglGLUT &t) { return t; } public: mglGLUT(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=0, void (*load)(void *p)=0) : mglGraph(-1) { gr = mgl_create_graph_glut(draw,title,par,load); } mglGLUT(int (*draw)(mglGraph *gr), const char *title="MathGL") : mglGraph(-1) { gr = mgl_create_graph_glut(draw?mgl_draw_graph:0,title,(void*)draw,0); } mglGLUT(mglDraw *draw=0, const char *title="MathGL") : mglGraph(-1) { gr = mgl_create_graph_glut(draw?mgl_draw_class:0,title,draw,mgl_reload_class); } virtual ~mglGLUT() {} inline void ToggleAlpha() ///< Switch on/off transparency (do not overwrite user settings) { mgl_glut_toggle_alpha(gr); } inline void ToggleLight() ///< Switch on/off lighting (do not overwrite user settings) { mgl_glut_toggle_light(gr); } inline void ToggleNo() ///< Switch off all zooming and rotation { mgl_glut_toggle_no(gr); } inline void Update() ///< Update picture by calling user drawing function { mgl_glut_update(gr); } inline void ReLoad() ///< Reload user data and update picture { mgl_glut_reload(gr); } inline void NextFrame() ///< Show next frame (if one) { mgl_glut_next_frame(gr); } inline void PrevFrame() ///< Show previous frame (if one) { mgl_glut_prev_frame(gr); } inline void Animation() ///< Run slideshow (animation) of frames { mgl_glut_animation(gr); } inline int Run() {return 0;}; ///< Run main loop for event handling (placed for similarity to mglWnd) }; //----------------------------------------------------------------------------- #endif #endif mathgl-8.0.1/include/mgl2/pde.h0000664000175000017500000002065614167366472016020 0ustar balakinbalakin/*************************************************************************** * pde.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_PDE_H_ #define _MGL_PDE_H_ //----------------------------------------------------------------------------- #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif /// Saves result of PDE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini HADT MGL_EXPORT mgl_pde_solve_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im, mreal dz, mreal k0,const char *opt); uintptr_t MGL_EXPORT mgl_pde_solve_c_(uintptr_t* gr, const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, mreal *dz, mreal *k0,const char *opt,int,int); /// Saves result of PDE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini HMDT MGL_EXPORT mgl_pde_solve(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im, mreal dz, mreal k0,const char *opt); uintptr_t MGL_EXPORT mgl_pde_solve_(uintptr_t* gr, const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, mreal *dz, mreal *k0,const char *opt,int,int); /// Saves result of PDE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini. This function use more accurate but slow algorithm. HADT MGL_EXPORT mgl_pde_adv_c(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im, mreal dz, mreal k0,const char *opt); uintptr_t MGL_EXPORT mgl_pde_adv_c_(uintptr_t* gr, const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, mreal *dz, mreal *k0,const char *opt,int,int); /// Saves result of PDE solving (|u|^2) for "Hamiltonian" ham with initial conditions ini. This function use more accurate but slow algorithm. HMDT MGL_EXPORT mgl_pde_adv(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im, mreal dz, mreal k0,const char *opt); uintptr_t MGL_EXPORT mgl_pde_adv_(uintptr_t* gr, const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, mreal *dz, mreal *k0,const char *opt,int,int); /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) HADT MGL_EXPORT mgl_qo2d_solve_c(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); HADT MGL_EXPORT mgl_qo2d_func_c(mdual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); uintptr_t MGL_EXPORT mgl_qo2d_solve_c_(const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, uintptr_t* ray, mreal *r, mreal *k0, uintptr_t* xx, uintptr_t* yy, int); /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) HMDT MGL_EXPORT mgl_qo2d_solve(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); HMDT MGL_EXPORT mgl_qo2d_func(mdual (*ham)(mreal u, mreal x, mreal y, mreal px, mreal py, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy); uintptr_t MGL_EXPORT mgl_qo2d_solve_(const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, uintptr_t* ray, mreal *r, mreal *k0, uintptr_t* xx, uintptr_t* yy, int); /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) HADT MGL_EXPORT mgl_qo3d_solve_c(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz); HADT MGL_EXPORT mgl_qo3d_func_c(mdual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz); uintptr_t MGL_EXPORT mgl_qo3d_solve_c_(const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, uintptr_t* ray, mreal *r, mreal *k0, uintptr_t* xx, uintptr_t* yy, uintptr_t* zz, int); /// Saves result of PDE solving for "Hamiltonian" ham with initial conditions ini along a curve ray (must have nx>=7 - x,y,z,px,py,pz,tau or nx=5 - x,y,px,py,tau) HMDT MGL_EXPORT mgl_qo3d_solve(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz); HMDT MGL_EXPORT mgl_qo3d_func(mdual (*ham)(mreal u, mreal x, mreal y, mreal z, mreal px, mreal py, mreal pz, void *par), void *par, HCDT ini_re, HCDT ini_im, HCDT ray, mreal r, mreal k0, HMDT xx, HMDT yy, HMDT zz); uintptr_t MGL_EXPORT mgl_qo3d_solve_(const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, uintptr_t* ray, mreal *r, mreal *k0, uintptr_t* xx, uintptr_t* yy, uintptr_t* zz, int); /// Saves result of ODE solving of n equations with right part func and initial conditions x0 over time interval [0,tmax] with time step dt HMDT MGL_EXPORT mgl_ode_solve(void (*func)(const mreal *x, mreal *dx, void *par), int n, const mreal *x0, mreal dt, mreal tmax, void *par); /// Saves result of ODE solving for var variables with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt HMDT MGL_EXPORT mgl_ode_solve_str(const char *func, const char *var, HCDT x0, mreal dt, mreal tmax); /// Saves result of ODE solving for var complex variables with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt HADT MGL_EXPORT mgl_ode_solve_str_c(const char *func, const char *var, HCDT x0, mreal dt, mreal tmax); /// Saves result of ODE solving of n*m equations for m variables var with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt HMDT MGL_EXPORT mgl_ode_solve_set(const char *func, const char *var, char brd, HCDT x0, mreal dt, mreal tmax); /// Saves result of ODE solving of n*m equations for m variables var with right part func (separated by ';') and initial conditions x0 over time interval [0,tmax] with time step dt HADT MGL_EXPORT mgl_ode_solve_set_c(const char *func, const char *var, char brd, HCDT x0, mreal dt, mreal tmax); /// Saves result of ODE solving of n equations with right part func and initial conditions x0 over time interval [0,tmax] with time step dt. Function bord (if not NULL) is called each time step to apply border reflection. HMDT MGL_EXPORT mgl_ode_solve_ex(void (*func)(const mreal *x, mreal *dx, void *par), int n, const mreal *x0, mreal dt, mreal tmax, void *par, void (*bord)(mreal *x, const mreal *xp, void *par)); /// Finds ray with starting point r0, p0 (and prepares ray data for mgl_qo2d_solve) HMDT MGL_EXPORT mgl_ray_trace(const char *ham, mreal x0, mreal y0, mreal z0, mreal px, mreal py, mreal pz, mreal dt, mreal tmax); uintptr_t MGL_EXPORT mgl_ray_trace_(const char *ham, mreal *x0, mreal *y0, mreal *z0, mreal *px, mreal *py, mreal *pz, mreal *dt, mreal *tmax,int); /// Calculate Jacobian determinant for D{x(u,v), y(u,v)} = dx/du*dy/dv-dx/dv*dy/du HMDT MGL_EXPORT mgl_jacobian_2d(HCDT x, HCDT y); uintptr_t MGL_EXPORT mgl_jacobian_2d_(uintptr_t* x, uintptr_t* y); /// Calculate Jacobian determinant for D{x(u,v,w), y(u,v,w), z(u,v,w)} HMDT MGL_EXPORT mgl_jacobian_3d(HCDT x, HCDT y, HCDT z); uintptr_t MGL_EXPORT mgl_jacobian_3d_(uintptr_t* x, uintptr_t* y, uintptr_t* z); #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/base.h0000664000175000017500000011444514167366472016162 0ustar balakinbalakin/*************************************************************************** * base.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_BASE_H_ #define _MGL_BASE_H_ //#if !defined(_MSC_VER) && !defined(__BORLANDC__) #include "mgl2/abstract.h" #ifdef __cplusplus #if (MGL_HAVE_PTHREAD|MGL_HAVE_PTHR_WIDGET) #include #endif #if MGL_HAVE_PTHREAD #define MGL_PUSH(a,v,m) {pthread_mutex_lock(&m); a.push_back(v); pthread_mutex_unlock(&m);} #else #define MGL_PUSH(a,v,m) a.push_back(v); #endif #if MGL_HAVE_PTHREAD #define MGL_PUSHs(func,m) {pthread_mutex_lock(&m); func; pthread_mutex_unlock(&m);} #else #define MGL_PUSHs(func,m) {func;} #endif //----------------------------------------------------------------------------- inline mreal mgl_d(mreal v,mreal v1,mreal v2) { return v2!=v1?(v-v1)/(v2-v1):NAN; } //----------------------------------------------------------------------------- mglPoint GetX(HCDT x, int i, int j, int k=0); mglPoint GetY(HCDT y, int i, int j, int k=0); mglPoint GetZ(HCDT z, int i, int j, int k=0); //----------------------------------------------------------------------------- /// Class for replacement of std::vector // NOTE memcpy is used --> no memory allocation in T template class mglStack { T **dat; unsigned MGL_PB; ///< size of buffer (real size is 2^pb == 1L< &st) { mutex = 0; n=0; nb=1; MGL_PB = mgl_bsize(0); dat = new T*[(size_t)1<(nb<>MGL_PB); for(;nb>MGL_PB; return dat[d][i-(d<>MGL_PB; return dat[d][i-(d<=(nb<>MGL_PB; dat[d][n-(d<=(nb<>MGL_PB; dat[d][n-(d< &operator=(const mglStack &st) { clear(); reserve(st.n); for(size_t i=0;i(const mglPrim &a,const mglPrim &b); //----------------------------------------------------------------------------- /// Structure for light source struct MGL_EXPORT mglLight { mglLight():a(0),b(0),n(false) {} mglLight(const mglLight &aa) : d(aa.d),r(aa.r),q(aa.q),p(aa.p),c(aa.c),a(aa.a),b(aa.b),n(aa.n) {} const mglLight &operator=(const mglLight &aa) { d=aa.d; r=aa.r; q=aa.q; p=aa.p; c=aa.c; a=aa.a; b=aa.b; n=aa.n; return aa; } mglPoint d; ///< Direction of light sources mglPoint r; ///< Position of light sources (NAN for infinity) mglPoint q; ///< Actual position of light sources (filled by LightScale() function) mglPoint p; ///< Actual direction of light sources (filled by LightScale() function) mglColor c; ///< Color of light sources float a; ///< Aperture of light sources float b; ///< Brightness of light sources bool n; ///< Availability of light sources }; //----------------------------------------------------------------------------- /// Structure for inplot struct MGL_EXPORT mglBlock { long n1,n2,n3,n4; ///< coordinates of corners {n1=x1,n2=x2,n3=y1,n4=y2} mglLight light[10]; ///< Light sources float AmbBr; ///< Default ambient light brightness float DifBr; ///< Default diffusive light brightness mglMatrix B; ///< Transformation matrix int id; ///< object id mglBlock():n1(0),n2(0),n3(0),n4(0),AmbBr(0.5),DifBr(0.5),id(0) {} mglBlock(const mglBlock &aa) { memcpy((void*)this, &aa, sizeof(mglBlock)); } const mglBlock &operator=(const mglBlock &aa) { n1=aa.n1; n2=aa.n2; n3=aa.n3; n4=aa.n4; for(int i=0;i<10;i++) light[i]=aa.light[i]; AmbBr=aa.AmbBr; DifBr=aa.DifBr; B=aa.B; id=aa.id; return aa; } }; //----------------------------------------------------------------------------- /// Structure for group of primitives struct MGL_EXPORT mglGroup { std::vector p; ///< list of primitives (not filled!!!) int Id; ///< Current list of primitives std::string Lbl; ///< Group label mglGroup(const char *lbl="", int id=0) : Id(id), Lbl(lbl) {} mglGroup(const mglGroup &aa) : p(aa.p),Id(aa.Id),Lbl(aa.Lbl) {} #if MGL_HAVE_RVAL mglGroup(mglGroup &&aa) : p(aa.p),Id(aa.Id),Lbl(aa.Lbl) {} #endif inline const mglGroup &operator=(const mglGroup &aa) { Lbl = aa.Lbl; Id = aa.Id; p = aa.p; return aa; } }; //----------------------------------------------------------------------------- /// Structure for text label struct MGL_EXPORT mglText { std::wstring text; std::string stl; float val; mglText(const wchar_t *txt=L"", const char *fnt="", float v=0) : text(txt), stl(fnt), val(v) {} mglText(const std::wstring &txt, float v=0): text(txt), val(v) {} mglText(const mglText &aa) : text(aa.text),stl(aa.stl),val(aa.val) {} #if MGL_HAVE_RVAL mglText(mglText &&aa) : text(aa.text),stl(aa.stl),val(aa.val) {} #endif const mglText&operator=(const mglText &aa) { text=aa.text; stl=aa.stl; val=aa.val; return aa; } }; //----------------------------------------------------------------------------- /// Structure for internal point representation struct MGL_EXPORT mglPnt // NOTE: use float for reducing memory size { union { float dat[15]; struct { float x,y,z; // coordinates float u,v,w; // normales float r,g,b,a; // RGBA color float xx,yy,zz; // original coordinates float c,ta; // index in color scheme }; }; int sub; // subplot id and rotation information (later will be in subplot) mglPnt(float X=0, float Y=0, float Z=0, float U=0, float V=0, float W=0, float R=0, float G=0, float B=0, float A=0, short s=0) :x(X),y(Y),z(Z),u(U),v(V),w(W),r(R),g(G),b(B),a(A),xx(X),yy(Y),zz(Z),c(0),ta(0),sub(s) {} mglPnt(const mglPnt &aa) : sub(aa.sub) { memcpy(dat,aa.dat,15*sizeof(float)); } inline const mglPnt&operator=(const mglPnt &aa) { sub=aa.sub; memcpy(dat,aa.dat,15*sizeof(float)); return aa; } inline bool same(const mglPnt &p, mreal d) const { return fabs(x-p.x); MGL_EXTERN template class MGL_EXPORT mglStack; MGL_EXTERN template class MGL_EXPORT std::vector; MGL_EXTERN template class MGL_EXPORT std::vector; MGL_EXTERN template class MGL_EXPORT std::vector; MGL_EXTERN template class MGL_EXPORT std::vector; MGL_EXTERN template class MGL_EXPORT std::vector; MGL_EXTERN template class MGL_EXPORT std::vector; MGL_EXTERN template class MGL_EXPORT mglStack; #endif //----------------------------------------------------------------------------- /// Base class for canvas which handle all basic drawing class MGL_EXPORT mglBase { public: mglBase(); virtual ~mglBase(); mglPoint Min; ///< Lower edge of bounding box for graphics. mglPoint Max; ///< Upper edge of bounding box for graphics. mreal ZMin; ///< Adjusted minimal z-value 1D plots std::string Mess; ///< Buffer for receiving messages int ObjId; ///< object id for mglPrim int HighId; ///< object id to be highlited std::vector Grp; ///< List of groups with names -- need for export mglStack Act; ///< Position of active points std::string PlotId; ///< Id of plot for saving filename (in GLUT window for example) int BBoxX1, BBoxY1, BBoxX2, BBoxY2; ///< BBox region for exporting 2d graphics std::vector UserGlf; ///< User-defined glyphs data mreal CDef; ///< Default (current) color in texture mreal AlphaDef; ///< Default value of alpha channel (transparency) mreal BarWidth; ///< Relative width of rectangles in Bars(). int MeshNum; ///< Set approximate number of lines in Mesh and Grid. By default (=0) it draw all lines. int FaceNum; ///< Set approximate number of visible faces and lines. By default (=0) it draw everything. char Arrow1, Arrow2;///< Style of arrows at end and at start of curve long InUse; ///< Smart pointer (number of users) uint32_t Flag; ///< Flags for controlling drawing mreal size_opt; ///< Value of size option (or NAN if not specified) inline bool get(uint32_t fl) const { return Flag&fl; } inline void set(uint32_t fl) { Flag |= fl; } inline void clr(uint32_t fl) { Flag &=~fl; } inline void set(bool v,uint32_t fl) { Flag = v ? Flag|fl : Flag&(~fl); } /// Set axis range scaling -- simplified way to shift/zoom axis range -- need to replot whole image! inline void ZoomAxis(const mglPoint &p1=mglPoint(0,0,0,0), const mglPoint &p2=mglPoint(1,1,1,1)) { AMin = p1; AMax = p2; } /// Set values of mglGraph::Min and mglGraph::Max inline void SetRanges(mreal x1, mreal x2, mreal y1, mreal y2, mreal z1=0, mreal z2=0, mreal c1=0, mreal c2=0) { SetRanges(mglPoint(x1,y1,z1,c1),mglPoint(x2,y2,z2,c2)); } void SetRanges(const mglPoint &v1, const mglPoint &v2); /// Set values of mglGraph::Cmin and mglGraph::Cmax as minimal and maximal values of data a void CRange(HCDT a, bool add = false, mreal fact=0); void CRange(mreal v1,mreal v2,bool add=false); /// Set values of mglGraph::Min.x and mglGraph::Max.x as minimal and maximal values of data a void XRange(HCDT a, bool add = false, mreal fact=0); void XRange(mreal v1,mreal v2,bool add=false); /// Set values of mglGraph::Min.x and mglGraph::Max.x as minimal and maximal values of data a void YRange(HCDT a, bool add = false, mreal fact=0); void YRange(mreal v1,mreal v2,bool add=false); /// Set values of mglGraph::Min.x and mglGraph::Max.x as minimal and maximal values of data a void ZRange(HCDT a, bool add = false, mreal fact=0); void ZRange(mreal v1,mreal v2,bool add=false); /// Set ranges for automatic variables void SetAutoRanges(mreal x1, mreal x2, mreal y1=0, mreal y2=0, mreal z1=0, mreal z2=0, mreal c1=0, mreal c2=0); /// Set axis origin void SetOrigin(mreal x0, mreal y0, mreal z0=NAN, mreal c0=NAN); /// Save ranges into internal variable and put parsed mreal SaveState(const char *opt); /// Load ranges from internal variable void LoadState(); /// Increase ZMin mreal AdjustZMin() { ZMin /= MGL_FEPSILON; return Max.z - ZMin*(Max.z-Min.z); } /// Safetly set the transformation formulas for coordinate. void SetFunc(const char *EqX, const char *EqY, const char *EqZ=0, const char *EqA=0); /// Set one of predefined transformation rule void SetCoor(int how); /// Safetly set the cutting off condition (formula). void CutOff(const char *EqCut); /// Set to draw Ternary axis (triangle like axis, grid and so on) void Ternary(int tern); /// Set cutting for points outside of bounding box inline void SetCut(bool val) { set(val, MGL_ENABLE_CUT); } /// Set additional cutting box inline void SetCutBox(mreal x1, mreal y1, mreal z1, mreal x2, mreal y2, mreal z2) { CutMin.Set(x1,y1,z1); CutMax.Set(x2,y2,z2); } inline void SetCutBox(const mglPoint &v1, const mglPoint &v2) { CutMin=v1; CutMax=v2; } /// Reset mask to solid state inline void ResetMask() { mask = MGL_SOLID_MASK; MaskAn = DefMaskAn; } /// Set default mask rotation angle inline void SetMaskAngle(int angle) { DefMaskAn = angle; } /// Set the using of light on/off. virtual bool Light(bool enable) { bool t=get(MGL_ENABLE_LIGHT); set(enable,MGL_ENABLE_LIGHT); return t; } /// Set to attach light sources to inplot. virtual bool AttachLight(bool enable) { bool t=get(MGL_LOCAL_LIGHT); set(enable,MGL_LOCAL_LIGHT); return t; } /// Set ambient light brightness virtual void SetAmbient(mreal bright=0.5); /// Set diffusive light brightness virtual void SetDiffuse(mreal bright=0.5); /// Use diffusive light (only for local light sources) inline void SetDifLight(bool dif) { SetDiffuse(dif?0.5:0); } /// Set the transparency on/off. virtual bool Alpha(bool enable) { bool t=get(MGL_ENABLE_ALPHA); set(enable,MGL_ENABLE_ALPHA); return t; } /// Set default value of alpha-channel inline void SetAlphaDef(mreal val) { AlphaDef=val; } /// Set default palette inline void SetPalette(const char *colors) { Txt[0].Set(mgl_have_color(colors)?colors:MGL_DEF_PAL,-1); } inline void ResetPal() { CurrPal=0; } inline long GetNumPal(long id) const { return Txt[labs(id)/256].n; } /// Set default color scheme inline void SetDefScheme(const char *colors) { Txt[1].Set(mgl_have_color(colors)?colors:MGL_DEF_SCH); } /// Set number of mesh lines inline void SetMeshNum(int val) { MeshNum=val; } /// Set relative width of rectangles in Bars, Barh, BoxPlot inline void SetBarWidth(mreal val) { BarWidth=val>0?val:-BarWidth*val; } /// Set size of marks inline void SetMarkSize(mreal val) { MarkSize=val>0?0.02*val:-val*MarkSize; } /// Set size of arrows inline void SetArrowSize(mreal val) { ArrowSize=val>0?0.03*val:-val*ArrowSize; } /// Get unscaled arrow size inline mreal GetArrowSize() const { return ArrowSize/0.03; } /// Set warning code ant fill Message void SetWarn(int code, const char *who); int inline GetWarn() const { return WarnCode; } virtual void StartAutoGroup (const char *)=0; void StartGroup(const char *name, int id); virtual void EndGroup()=0; // { LoadState(); } /// Highlight group inline void Highlight(int id) { HighId=id; } /// Set FontSize by size in pt and picture DPI (default is 16 pt for dpi=72) virtual void SetFontSizePT(mreal pt, int dpi=72){ FontSize = pt*27.f/dpi; } /// Set FontSize by size in centimeters and picture DPI (default is 0.56 cm = 16 pt) inline void SetFontSizeCM(mreal cm, int dpi=72) { SetFontSizePT(cm*28.45f,dpi); } /// Set FontSize by size in inch and picture DPI (default is 0.22 in = 16 pt) inline void SetFontSizeIN(mreal in, int dpi=72) { SetFontSizePT(in*72.27f,dpi); } /// Set font typeface. Note that each mglFont instance can be used with ONLY ONE mglGraph instance at a moment of time! void SetFont(mglFont *f); /// Get current typeface. Note that this variable can be deleted at next SetFont() call! inline mglFont *GetFont() { return fnt; } /// Restore font void RestoreFont(); /// Load font from file void LoadFont (const char *name, const char *path=NULL); /// Copy font from another mglGraph instance void CopyFont(mglBase *gr); /// Set default font size void SetFontHscale(mreal val); inline void SetFontSize(mreal val) { FontSize=val>0 ? val:-FontSize*val; } inline mreal GetFontSize() const { return FontSize; } mreal TextWidth(const char *text, const char *font, mreal size) const MGL_FUNC_PURE; mreal TextWidth(const wchar_t *text, const char *font, mreal size) const MGL_FUNC_PURE; mreal TextHeight(const char *text, const char *font, mreal size) const MGL_FUNC_PURE; mreal TextHeight(const wchar_t *text, const char *font, mreal size) const MGL_FUNC_PURE; mreal TextHeight(const char *font, mreal size) const MGL_FUNC_PURE; inline mreal FontFactor() const { return font_factor; } virtual mreal GetRatio() const MGL_FUNC_CONST; virtual int GetWidth() const MGL_FUNC_CONST; virtual int GetHeight() const MGL_FUNC_CONST; /// Add user-defined glyph void DefineGlyph(HCDT x, HCDT y, unsigned char id=0); /// Set to use or not text rotation inline void SetRotatedText(bool val) { set(val,MGL_ENABLE_RTEXT); } /// Set default font style and color inline void SetFontDef(const char *font){ mgl_strncpy(FontDef, font, 31); } /// Set to use or not text rotation inline void SetTickRotate(bool val) { set(val,MGL_TICKS_ROTATE); } /// Set to use or not text rotation inline void SetTickSkip(bool val) { set(val,MGL_TICKS_SKIP); } /// Add string to legend void AddLegend(const char *text,const char *style); void AddLegend(const wchar_t *text,const char *style); /// Clear saved legend string inline void ClearLegend() { Leg.clear(); } /// Set plot quality virtual void SetQuality(int qual=MGL_DRAW_NORM) { Quality=qual; } inline int GetQuality() const { return Quality; } inline void SetDrawReg(long nx=1, long ny=1, long m=0) { dr_x=nx; dr_y=ny; dr_p=m; } // ~~~~~~~~~~~~~~~~~~~~~~ Developer functions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// Add point to the Pnt and return its position inline long AddPnt(const mglPoint &p, mreal c=-1, const mglPoint &n=mglPoint(NAN), mreal a=-1, int scl=1) { return AddPnt(&B,p,c,n,a,scl); } long AddPnt(const mglMatrix *M, const mglPoint &p, mreal c=-1, const mglPoint &n=mglPoint(NAN), mreal a=-1, int scl=1); bool AddPntQ(mglPnt &q, const mglMatrix *M, mglPoint p, mreal c=-1, mglPoint n=mglPoint(NAN), mreal a=-1, int scl=1); inline bool AddPntQ(mglPnt &q, mglPoint p, mreal c=-1, const mglPoint &n=mglPoint(NAN), mreal a=-1, int scl=1) { return AddPntQ(q,&B,p,c,n,a,scl); } inline bool AddPntQ(long id, const mglMatrix *M, const mglPoint &p, mreal c=-1, const mglPoint &n=mglPoint(NAN), mreal a=-1, int scl=1) { return AddPntQ(Pnt[id],M,p,c,n,a,scl); } inline bool AddPntQ(long id, const mglPoint &p, mreal c=-1, const mglPoint &n=mglPoint(NAN), mreal a=-1, int scl=1) { return AddPntQ(Pnt[id],&B,p,c,n,a,scl); } inline void SetPntOff(size_t id) { Pnt[id].x=NAN; } long AllocPnts(size_t num); long PushPnts(size_t num, const mglPnt *qq); long CopyNtoC(long k, mreal c); bool CopyNtoC(mglPnt &q, long k, mreal c); inline bool CopyNtoC(long id, long k, mreal c) { return (id>=0)?CopyNtoC(Pnt[id],k,c):false; } long CopyProj(long from, const mglPoint &p, const mglPoint &n, short sub=0); bool CopyProj(mglPnt &q, long from, const mglPoint &p, const mglPoint &n, short sub=0); void CopyProj(long id, long from, const mglPoint &p, const mglPoint &n, short sub=0) { if(id>=0) CopyProj(Pnt[id],from,p,n,sub); } void DisablePnt(long id) { Pnt[id].x = NAN; } void SetRGBA(long k, const mglColor &c) { if(k>=0) {mglPnt &p=Pnt[k]; p.r = c.r; p.g = c.g; p.b = c.b; p.a = c.a;} } virtual void Reserve(long n); ///< Allocate n-cells for Pnt and return current position /// Set to reduce accuracy of points (to reduce size of output files) inline void SetReduceAcc(bool val) { set(val, MGL_REDUCEACC); } /// Add glyph of current font to the Glf and return its position long AddGlyph(int s, long j); /// Add glyph to the Glf and return its position long AddGlyph(unsigned char id); /// Add active point as k-th element of Pnt void AddActive(long k,int n=0); /// Clear unused points and primitives void ClearUnused(); inline mreal GetPenWidth() { return PenWidth; } inline const mglMatrix *GetB() const { return &B; } inline mglPoint GetPntP(long i) const { const mglPnt &p=Pnt[i]; return mglPoint(p.x,p.y,p.z); } inline mglPoint GetPntN(long i) const { const mglPnt &p=Pnt[i]; return mglPoint(p.u,p.v,p.w); } inline mglColor GetPntC(long i) const { const mglPnt &p=Pnt[i]; return mglColor(p.r,p.g,p.b,p.a); } inline float GetClrC(long i) const { return Pnt[i].c; } inline const mglGlyph &GetGlf(long i) const { return Glf[i]; } inline long GetGlfNum() const { return Glf.size(); } inline const mglPnt &GetPnt(long i) const { return Pnt[i]; } inline long GetPntNum() const { return Pnt.size(); } inline bool SamePnt(long i, long j) const { if(i<0 || j<0) return true; const mglPnt &p=Pnt[i], &q=Pnt[j]; return mgl_isnan(p.x) || mgl_isnan(q.x) || (p.x==q.x && p.y==q.y); } inline bool ValidPnt(size_t i) { return mgl_isnum(Pnt[i].x); } // inline mglPrim &GetPrm(long i) { return Prm[i]; } inline mglPrim &GetPrm(long i, bool sort=true) { return (sort && PrmInd) ? Prm[PrmInd[i]]:Prm[i]; } inline const mglPrim &GetPrm(long i, bool sort=true) const { return (sort && PrmInd) ? Prm[PrmInd[i]]:Prm[i]; } inline long GetPrmNum() const { return Prm.size(); } inline const mglText &GetPtx(long i) const { return Ptx[i]; } inline long GetPtxNum() const { return Ptx.size(); } inline const mglTexture &GetTxt(long i) const { return Txt[i]; } inline long GetTxtNum() const { return Txt.size(); } /// Scale coordinates and cut off some points virtual bool ScalePoint(const mglMatrix *M, mglPoint &p, mglPoint &n, bool use_nan=true) const; inline const mglBlock &GetSub(size_t i) const { return Sub[i]; } inline const mglBlock &GetSub() const { return Sub.back(); } virtual mreal GetOrgX(char dir, bool inv=false) const=0; ///< Get Org.x (parse NAN value) virtual mreal GetOrgY(char dir, bool inv=false) const=0; ///< Get Org.y (parse NAN value) virtual mreal GetOrgZ(char dir, bool inv=false) const=0; ///< Get Org.z (parse NAN value) /// Get color depending on single variable z, which should be scaled if scale=true inline mreal GetC(long s,mreal z,bool scale = true) const { return s+(scale?GetA(z):(z<0?0:z/MGL_FEPSILON)); } // { return s+(scale?GetA(z):(z>0?z/MGL_FEPSILON:0)); } /// Get alpha value depending on single variable a mreal GetA(mreal a) const MGL_FUNC_PURE; /// Set pen/palette char SetPenPal(const char *stl, long *id=0, bool pal=true); /// Add texture (like color scheme) and return the position of first color long AddTexture(const char *cols, int smooth=0); // inline mreal AddTexture(char col) { return AddTexture(mglColor(col)); } mreal AddTexture(mglColor col); inline void DefColor(mglColor col) { CDef = AddTexture(col); } /// Set mask for face coloring void SetMask(const char *mask); /// Set next color from palette mreal NextColor(long &id); mreal NextColor(long id, long sh); virtual void mark_plot(long p, char type, mreal size=1)=0; virtual void arrow_plot(long p1, long p2, char st)=0; virtual void line_plot(long p1, long p2)=0; virtual void trig_plot(long p1, long p2, long p3)=0; virtual void quad_plot(long p1, long p2, long p3, long p4)=0; virtual void smbl_plot(long p1, char id, double size)=0; void curve_plot(size_t n, size_t kq, size_t step=1); virtual void Glyph(mreal x, mreal y, mreal f, int style, long icode, mreal col)=0; virtual float GetGlyphPhi(const mglPnt &q, float phi)=0; virtual mreal text_plot(long p,const wchar_t *text,const char *fnt,mreal size=-1,mreal sh=0,mreal col=-('k'),bool rot=true)=0; void vect_plot(long p1, long p2, mreal s=1); // check if visible virtual bool trig_vis(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3) const =0; virtual bool quad_vis(const mglPnt &p1, const mglPnt &p2, const mglPnt &p3, const mglPnt &p4) const =0; inline mreal mark_size() { return MarkSize*font_factor; } // inline char last_color() { return last_style[1]; } inline const char *last_line() { return last_style; } int PrmCmp(size_t i, size_t j) const MGL_FUNC_PURE; // compare 2 primitives with indexes i,j /// Check if plot termination is asked bool NeedStop() { if(event_cb) event_cb(event_par); return Stop; } /// Ask to stop drawing void AskStop(bool stop=true) { Stop = stop; } /// Set callback function for event processing void SetEventFunc(void (*func)(void *), void *par) { event_cb=func; event_par=par; } protected: bool limit_pm1; ///< limit coordinates in range [-1,+1] for OpenGL only volatile bool Stop; ///< Flag that execution should be terminated. void (*event_cb)(void *); ///< Function to be called for event processing void *event_par; ///< Parameter for event processing function mglPoint OMin; ///< Lower edge for original axis (before scaling) mglPoint OMax; ///< Upper edge for original axis (before scaling) mglPoint AMin; ///< Lower edge for axis scaling mglPoint AMax; ///< Upper edge for axis scaling mglPoint FMin; ///< Actual lower edge after transformation formulas. mglPoint FMax; ///< Actual upper edge after transformation formulas. mglPoint Org; ///< Center of axis cross section. int WarnCode; ///< Warning code size_t *PrmInd; ///< Indexes of sorted primitives mglStack Pnt; ///< Internal points mglStack Prm; ///< Primitives (lines, triangles and so on) -- need for export std::vector Sub; ///< InPlot regions std::vector Ptx; ///< Text labels for mglPrim std::vector Leg; ///< Text labels for legend std::vector Glf; ///< Glyphs data std::vector Txt; ///< Pointer to textures #if MGL_HAVE_PTHREAD pthread_mutex_t mutexPnt, mutexTxt, mutexLeg, mutexGlf, mutexAct, mutexDrw; pthread_mutex_t mutexSub, mutexPrm, mutexPtx, mutexStk, mutexGrp, mutexClf; #endif void *lockClf; ///< pointer to mutex for mglStack int TernAxis; ///< Flag that Ternary axis is used unsigned PDef; ///< Pen bit mask mreal pPos; ///< Current position in pen mask mreal PenWidth; ///< Pen width for further line plotting (must be >0 !!!) // long numT; ///< Number of textures mreal AmbBr; ///< Default ambient light brightness mreal DifBr; ///< Default diffusive light brightness mreal persp; ///< Original value for perspective mglMatrix Bp; ///< Transformation matrix for View() and Zoom() mglMatrix B; ///< Transformation matrix mglMatrix B1; ///< Transformation matrix for colorbar mglFont *fnt; ///< Class for printing vector text mreal FontSize; ///< The size of font for tick and axis labels char FontDef[32]; ///< Font specification (see mglGraph::Puts). Default is Roman with align at center. int Quality; ///< Quality of plot (0x0-pure, 0x1-fast; 0x2-fine; 0x4 - low memory) HMEX fx; ///< Transformation formula for x direction. HMEX fy; ///< Transformation formula for y direction. HMEX fz; ///< Transformation formula for z direction. HMEX fa; ///< Transformation formula for coloring. HMEX fc; ///< Cutting off condition (formula). long CurrPal; ///< Current palette index mreal MarkSize; ///< The size of marks for 1D plots. mreal ArrowSize; ///< The size of arrows. char last_style[64];///< Last pen style TODO: replace by std::string mreal font_factor; ///< Font scaling factor long dr_x, dr_y, dr_p; ///< default drawing region for quality&4 mode virtual void LightScale(const mglMatrix *M)=0; ///< Scale positions of light sources void ClearPrmInd(); // block for SaveState() mglPoint MinS; ///< Saved lower edge of bounding box for graphics. mglPoint MaxS; ///< Saved upper edge of bounding box for graphics. mreal MSS, ASS, FSS, ADS, MNS, LSS; ///< Saved state mreal PrevState; ///< Previous value of SaveState() long CSS; ///< Saved flags bool saved; ///< State is saved std::string leg_str;///< text to be save in legend union { uint64_t mask; ///< Mask to be used for coloring unsigned char mask_ch[8]; }; int MaskAn; ///< Mask rotation angle in degrees int DefMaskAn; ///< Default mask rotation angle in degrees private: mglBase(const mglBase &){} // copying is not allowed const mglBase &operator=(const mglBase &t){return t;} // copying is not allowed mglPoint CutMin; ///< Lower edge of bounding box for cut off. mglPoint CutMax; ///< Upper edge of bounding box for cut off. bool RecalcCRange(); ///< Recalculate internal parameter for correct coloring. void RecalcBorder(); ///< Recalculate internal parameter for correct transformation rules. bool SetFBord(mreal x,mreal y,mreal z); ///< Set internal boundng box depending on transformation formula void ClearEq(); ///< Clear the used variables for axis transformation }; //----------------------------------------------------------------------------- bool MGL_EXPORT mgl_check_dim0(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *name, bool less=false); bool MGL_EXPORT mgl_check_dim1(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT r, const char *name, bool less=false); bool MGL_EXPORT mgl_check_dim2(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT a, const char *name, bool less=false); bool MGL_EXPORT mgl_check_dim3(HMGL gr, bool both, HCDT x, HCDT y, HCDT z, HCDT a, HCDT b, const char *name); bool MGL_EXPORT mgl_check_vec3(HMGL gr, HCDT x, HCDT y, HCDT z, HCDT ax, HCDT ay, HCDT az, const char *name); bool MGL_EXPORT mgl_check_trig(HMGL gr, HCDT nums, HCDT x, HCDT y, HCDT z, HCDT a, const char *name, int d=3); bool MGL_EXPORT mgl_isnboth(HCDT x, HCDT y, HCDT z, HCDT a); bool MGL_EXPORT mgl_isboth(HCDT x, HCDT y, HCDT z, HCDT a); inline bool mgl_islog(mreal a,mreal b) { return a*b>0 && (b/a+a/b)>=10.1; } //----------------------------------------------------------------------------- #endif #endif mathgl-8.0.1/include/mgl2/datac_cf.h0000664000175000017500000006173714167366472017001 0ustar balakinbalakin/*************************************************************************** * data_cf.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_DATAC_CF_H_ #define _MGL_DATAC_CF_H_ //----------------------------------------------------------------------------- #include "mgl2/abstract.h" //----------------------------------------------------------------------------- #if MGL_HAVE_GSL #include #include #else struct gsl_vector; struct gsl_matrix; #endif //----------------------------------------------------------------------------- #ifdef __cplusplus class mglDataC; typedef mglDataC* HADT; extern "C" { #else typedef void *HADT; #endif /// Get integer power of x cmdual MGL_EXPORT_CONST mgl_ipowc(mdual x,int n); cmdual MGL_EXPORT_PURE mgl_ipowc_(mdual *x,int *n); /// Get complex number from string. Parse (%g,%g), {%g,%g} and [%g,%g] if adv!=0. cmdual MGL_EXPORT mgl_atoc(const char *s, int adv); /// Get exp(i*a) cmdual MGL_EXPORT_CONST mgl_expi(mdual a); /// Create HMDT object HADT MGL_EXPORT mgl_create_datac(); uintptr_t MGL_EXPORT mgl_create_datac_(); /// Create HMDT object with specified sizes HADT MGL_EXPORT mgl_create_datac_size(long nx, long ny, long nz); uintptr_t MGL_EXPORT mgl_create_datac_size_(int *nx, int *ny, int *nz); /// Create HMDT object with data from file HADT MGL_EXPORT mgl_create_datac_file(const char *fname); uintptr_t MGL_EXPORT mgl_create_datac_file_(const char *fname, int len); /// Delete HMDT object void MGL_EXPORT mgl_delete_datac(HADT dat); void MGL_EXPORT mgl_delete_datac_(uintptr_t *dat); /// Rearange data dimensions void MGL_EXPORT mgl_datac_rearrange(HADT dat, long mx,long my,long mz); void MGL_EXPORT mgl_datac_rearrange_(uintptr_t *dat, int *mx, int *my, int *mz); /// Link external data array (don't delete it at exit) void MGL_EXPORT mgl_datac_link(HADT dat, mdual *A,long mx,long my,long mz); void MGL_EXPORT mgl_datac_link_(uintptr_t *d, mdual *A, int *nx,int *ny,int *nz); /// Allocate memory and copy the data from the (float *) array void MGL_EXPORT mgl_datac_set_float(HADT dat, const float *A,long mx,long my,long mz); void MGL_EXPORT mgl_datac_set_float_(uintptr_t *dat, const float *A,int *NX,int *NY,int *NZ); /// Allocate memory and copy the data from the (double *) array void MGL_EXPORT mgl_datac_set_double(HADT dat, const double *A,long mx,long my,long mz); void MGL_EXPORT mgl_datac_set_double_(uintptr_t *dat, const double *A,int *NX,int *NY,int *NZ); /// Allocate memory and copy the data from the (dual *) array void MGL_EXPORT mgl_datac_set_complex(HADT dat, const mdual *A,long mx,long my,long mz); void MGL_EXPORT mgl_datac_set_complex_(uintptr_t *d, const mdual *A,int *NX,int *NY,int *NZ); /// Import data from abstract type void MGL_EXPORT mgl_datac_set(HADT dat, HCDT a); void MGL_EXPORT mgl_datac_set_(uintptr_t *dat, uintptr_t *a); /// Allocate memory and copy the data from the gsl_vector void MGL_EXPORT mgl_datac_set_vector(HADT dat, gsl_vector *v); /// Allocate memory and copy the data from the gsl_matrix void MGL_EXPORT mgl_datac_set_matrix(HADT dat, gsl_matrix *m); /// Set value of data element [i,j,k] void MGL_EXPORT mgl_datac_set_value(HADT dat, mdual v, long i, long j, long k); void MGL_EXPORT mgl_datac_set_value_(uintptr_t *d, mdual *v, int *i, int *j, int *k); /// Get value of data element [i,j,k] cmdual MGL_EXPORT mgl_datac_get_value(HCDT dat, long i, long j, long k); cmdual MGL_EXPORT mgl_datac_get_value_(uintptr_t *d, int *i, int *j, int *k); /// Allocate memory and scanf the data from the string void MGL_EXPORT mgl_datac_set_values(HADT dat, const char *val, long nx, long ny, long nz); void MGL_EXPORT mgl_datac_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l); /// Get array as solution of tridiagonal matrix solution a[i]*x[i-1]+b[i]*x[i]+c[i]*x[i+1]=d[i] /** String \a how may contain: * 'x', 'y', 'z' for solving along x-,y-,z-directions, or * 'h' for solving along hexagonal direction at x-y plain (need nx=ny), * 'c' for using periodical boundary conditions, * 'd' for diffraction/diffuse calculation. * NOTE: It work for flat data model only (i.e. for a[i,j]==a[i+nx*j]) */ HADT MGL_EXPORT mgl_datac_tridmat(HCDT A, HCDT B, HCDT C, HCDT D, const char *how); uintptr_t MGL_EXPORT mgl_datac_tridmat_(uintptr_t *A, uintptr_t *B, uintptr_t *C, uintptr_t *D, const char *how, int); /// Returns pointer to internal data array MGL_EXPORT_PURE mdual *mgl_datac_data(HADT dat); /// Returns pointer to data element [i,j,k] MGL_EXPORT mdual *mgl_datac_value(HADT dat, long i,long j,long k); /// Set the data from HCDT objects for real and imaginary parts void MGL_EXPORT mgl_datac_set_ri(HADT dat, HCDT re, HCDT im); void MGL_EXPORT mgl_datac_set_ri_(uintptr_t *dat, uintptr_t *re, uintptr_t *im); /// Set the data from HCDT objects as amplitude and phase of complex data void MGL_EXPORT mgl_datac_set_ap(HADT dat, HCDT abs, HCDT phi); void MGL_EXPORT mgl_datac_set_ap_(uintptr_t *dat, uintptr_t *abs, uintptr_t *phi); /// Read data from tab-separated text file with auto determining size int MGL_EXPORT mgl_datac_read(HADT dat, const char *fname); int MGL_EXPORT mgl_datac_read_(uintptr_t *d, const char *fname,int l); /// Read data from text file with size specified at beginning of the file int MGL_EXPORT mgl_datac_read_mat(HADT dat, const char *fname, long dim); int MGL_EXPORT mgl_datac_read_mat_(uintptr_t *dat, const char *fname, int *dim, int); /// Read data from text file with specifeid size int MGL_EXPORT mgl_datac_read_dim(HADT dat, const char *fname,long mx,long my,long mz); int MGL_EXPORT mgl_datac_read_dim_(uintptr_t *dat, const char *fname,int *mx,int *my,int *mz,int); /// Read data from tab-separated text files with auto determining size which filenames are result of sprintf(fname,templ,t) where t=from:step:to int MGL_EXPORT mgl_datac_read_range(HADT d, const char *templ, double from, double to, double step, int as_slice); int MGL_EXPORT mgl_datac_read_range_(uintptr_t *d, const char *fname, mreal *from, mreal *to, mreal *step, int *as_slice,int l); /// Read data from tab-separated text files with auto determining size which filenames are satisfied to template (like "t_*.dat") int MGL_EXPORT mgl_datac_read_all(HADT dat, const char *templ, int as_slice); int MGL_EXPORT mgl_datac_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l); /// Save whole data array (for ns=-1) or only ns-th slice to text file void MGL_EXPORT mgl_datac_save(HCDT dat, const char *fname,long ns); void MGL_EXPORT mgl_datac_save_(uintptr_t *dat, const char *fname,int *ns,int); /// Read data array from HDF file (parse HDF4 and HDF5 files) int MGL_EXPORT mgl_datac_read_hdf(HADT d,const char *fname,const char *data); int MGL_EXPORT mgl_datac_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n); /// Save data to HDF file void MGL_EXPORT mgl_datac_save_hdf(HCDT d,const char *fname,const char *data,int rewrite); void MGL_EXPORT mgl_datac_save_hdf_(uintptr_t *d, const char *fname, const char *data, int *rewrite,int l,int n); /// Create or recreate the array with specified size and fill it by zero void MGL_EXPORT mgl_datac_create(HADT dat, long nx,long ny,long nz); void MGL_EXPORT mgl_datac_create_(uintptr_t *dat, int *nx,int *ny,int *nz); /// Transpose dimensions of the data (generalization of Transpose) void MGL_EXPORT mgl_datac_transpose(HADT dat, const char *dim); void MGL_EXPORT mgl_datac_transpose_(uintptr_t *dat, const char *dim,int); /// Get sub-array of the data with given fixed indexes HADT MGL_EXPORT mgl_datac_subdata(HCDT dat, long xx,long yy,long zz); uintptr_t MGL_EXPORT mgl_datac_subdata_(uintptr_t *dat, int *xx,int *yy,int *zz); /// Get sub-array of the data with given fixed indexes (like indirect access) HADT MGL_EXPORT mgl_datac_subdata_ext(HCDT dat, HCDT xx, HCDT yy, HCDT zz); uintptr_t MGL_EXPORT mgl_datac_subdata_ext_(uintptr_t *dat, uintptr_t *xx,uintptr_t *yy,uintptr_t *zz); /// Get column (or slice) of the data filled by formulas of named columns HADT MGL_EXPORT mgl_datac_column(HCDT dat, const char *eq); uintptr_t MGL_EXPORT mgl_datac_column_(uintptr_t *dat, const char *eq,int l); /// Get trace of the data array HADT MGL_EXPORT mgl_datac_trace(HCDT d); uintptr_t MGL_EXPORT mgl_datac_trace_(uintptr_t *d); /// Resize the data to new sizes HADT MGL_EXPORT mgl_datac_resize(HCDT dat, long mx,long my,long mz); uintptr_t MGL_EXPORT mgl_datac_resize_(uintptr_t *dat, int *mx,int *my,int *mz); /// Resize the data to new sizes of box [x1,x2]*[y1,y2]*[z1,z2] HADT MGL_EXPORT mgl_datac_resize_box(HCDT dat, long mx,long my,long mz,mreal x1,mreal x2,mreal y1,mreal y2,mreal z1,mreal z2); uintptr_t MGL_EXPORT mgl_datac_resize_box_(uintptr_t *dat, int *mx,int *my,int *mz,mreal *x1,mreal *x2,mreal *y1,mreal *y2,mreal *z1,mreal *z2); /// Get momentum (1D-array) of data along direction 'dir'. String looks like "x1" for median in x-direction, "x2" for width in x-dir and so on. HADT MGL_EXPORT mgl_datac_momentum(HCDT dat, char dir, const char *how); uintptr_t MGL_EXPORT mgl_datac_momentum_(uintptr_t *dat, char *dir, const char *how, int,int); /// Get array which values is result of interpolation this for coordinates from other arrays HADT MGL_EXPORT mgl_datac_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm); uintptr_t MGL_EXPORT mgl_datac_evaluate_(uintptr_t *dat, uintptr_t *idat, uintptr_t *jdat, uintptr_t *kdat, int *norm); /// Get array which is result of summation in given direction or directions HADT MGL_EXPORT mgl_datac_sum(HCDT dat, const char *dir); uintptr_t MGL_EXPORT mgl_datac_sum_(uintptr_t *dat, const char *dir,int); /// Get the data which is direct multiplication (like, d[i,j] = this[i]*a[j] and so on) HADT MGL_EXPORT mgl_datac_combine(HCDT dat1, HCDT dat2); uintptr_t MGL_EXPORT mgl_datac_combine_(uintptr_t *dat1, uintptr_t *dat2); /// Get data from sections ids, separated by value val along specified direction. /** If section id is negative then reverse order is used (i.e. -1 give last section). */ HADT MGL_EXPORT mgl_datac_section(HCDT dat, HCDT ids, char dir, mreal val); uintptr_t MGL_EXPORT mgl_datac_section_(uintptr_t *d, uintptr_t *ids, const char *dir, mreal *val,int); /// Get data from section id, separated by value val along specified direction. /** If section id is negative then reverse order is used (i.e. -1 give last section). */ HADT MGL_EXPORT mgl_datac_section_val(HCDT dat, long id, char dir, mreal val); uintptr_t MGL_EXPORT mgl_datac_section_val_(uintptr_t *d, int *id, const char *dir, mreal *val,int); /// Evaluate formula 'str' for given list of variables. HADT MGL_EXPORT mgl_formula_calc_c(const char *str, long n, ...); /// Equidistantly fill the data to range [x1,x2] in direction dir void MGL_EXPORT mgl_datac_fill(HADT dat, mdual x1,mdual x2,char dir); void MGL_EXPORT mgl_datac_fill_(uintptr_t *dat, mdual *x1,mdual *x2,const char *dir,int); /// Modify the data by specified formula assuming x,y,z in range [r1,r2] void MGL_EXPORT mgl_datac_fill_eq(HMGL gr, HADT dat, const char *eq, HCDT vdat, HCDT wdat,const char *opt); void MGL_EXPORT mgl_datac_fill_eq_(uintptr_t *gr, uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,const char *opt, int, int); /// Fill dat by interpolated values of vdat parametrically depended on xdat for x in range [x1,x2] using global spline void MGL_EXPORT mgl_datac_refill_gs(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl); void MGL_EXPORT mgl_datac_refill_gs_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl); /// Fill dat by interpolated values of vdat parametrically depended on xdat for x in range [x1,x2] void MGL_EXPORT mgl_datac_refill_x(HADT dat, HCDT xdat, HCDT vdat, mreal x1, mreal x2, long sl); void MGL_EXPORT mgl_datac_refill_x_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *vdat, mreal *x1, mreal *x2, long *sl); /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat for x,y in range [x1,x2]*[y1,y2] void MGL_EXPORT mgl_datac_refill_xy(HADT dat, HCDT xdat, HCDT ydat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, long sl); void MGL_EXPORT mgl_datac_refill_xy_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, long *sl); /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in range [x1,x2]*[y1,y2]*[z1,z2] void MGL_EXPORT mgl_datac_refill_xyz(HADT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, mreal x1, mreal x2, mreal y1, mreal y2, mreal z1, mreal z2); void MGL_EXPORT mgl_datac_refill_xyz_(uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, uintptr_t *vdat, mreal *x1, mreal *x2, mreal *y1, mreal *y2, mreal *z1, mreal *z2); /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range void MGL_EXPORT mgl_datac_refill_gr(HMGL gr, HADT dat, HCDT xdat, HCDT ydat, HCDT zdat, HCDT vdat, long sl, const char *opt); void MGL_EXPORT mgl_datac_refill_gr_(uintptr_t *gr, uintptr_t *dat, uintptr_t *xdat, uintptr_t *ydat, uintptr_t *zdat, uintptr_t *vdat, long *sl, const char *opt,int); /// Modify the data by specified formula void MGL_EXPORT mgl_datac_modify(HADT dat, const char *eq,long dim); void MGL_EXPORT mgl_datac_modify_(uintptr_t *dat, const char *eq,int *dim,int); /// Modify the data by specified formula void MGL_EXPORT mgl_datac_modify_vw(HADT dat, const char *eq,HCDT vdat,HCDT wdat); void MGL_EXPORT mgl_datac_modify_vw_(uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,int); /// Limit the data to be inside [-v,v], keeping the original phase void MGL_EXPORT mgl_datac_limit(HADT dat, mreal v); void MGL_EXPORT mgl_datac_limit_(uintptr_t *dat, mreal *v); /// Keep the data phase/value along line i and j in given direction. /** Parameter "how" may contain: 'x','y' or 'z' for direction (default is 'y'); 'a' for keeping amplitude instead of phase.*/ void MGL_EXPORT mgl_datac_keep(HADT dat, const char *how, long i, long j); void MGL_EXPORT mgl_datac_keep_(uintptr_t *d, const char *how, long *i, long *j, int); /// Put value to data element(s) void MGL_EXPORT mgl_datac_put_val(HADT dat, mdual val, long i, long j, long k); void MGL_EXPORT mgl_datac_put_val_(uintptr_t *dat, mdual *val, int *i, int *j, int *k); /// Put array to data element(s) void MGL_EXPORT mgl_datac_put_dat(HADT dat, HCDT val, long i, long j, long k); void MGL_EXPORT mgl_datac_put_dat_(uintptr_t *dat, uintptr_t *val, int *i, int *j, int *k); /// Reduce size of the data void MGL_EXPORT mgl_datac_squeeze(HADT dat, long rx,long ry,long rz,long smooth); void MGL_EXPORT mgl_datac_squeeze_(uintptr_t *dat, int *rx,int *ry,int *rz,int *smooth); /// Extend data dimensions void MGL_EXPORT mgl_datac_extend(HADT dat, long n1, long n2); void MGL_EXPORT mgl_datac_extend_(uintptr_t *dat, int *n1, int *n2); /// Insert data rows/columns/slices void MGL_EXPORT mgl_datac_insert(HADT dat, char dir, long at, long num); void MGL_EXPORT mgl_datac_insert_(uintptr_t *dat, const char *dir, int *at, int *num, int); /// Delete data rows/columns/slices void MGL_EXPORT mgl_datac_delete(HADT dat, char dir, long at, long num); void MGL_EXPORT mgl_datac_delete_(uintptr_t *dat, const char *dir, int *at, int *num, int); /// Joind another data array void MGL_EXPORT mgl_datac_join(HADT dat, HCDT d); void MGL_EXPORT mgl_datac_join_(uintptr_t *dat, uintptr_t *d); /// Smooth the data on specified direction or directions /** String \a dir may contain: * ‘x’, ‘y’, ‘z’ for 1st, 2nd or 3d dimension; * ‘dN’ for linear averaging over N points; * ‘3’ for linear averaging over 3 points; * ‘5’ for linear averaging over 5 points. * By default quadratic averaging over 5 points is used. */ void MGL_EXPORT mgl_datac_smooth(HADT d, const char *dirs, mreal delta); void MGL_EXPORT mgl_datac_smooth_(uintptr_t *dat, const char *dirs, mreal *delta,int); /// Cumulative summation the data in given direction or directions void MGL_EXPORT mgl_datac_cumsum(HADT dat, const char *dir); void MGL_EXPORT mgl_datac_cumsum_(uintptr_t *dat, const char *dir,int); /// Integrate (cumulative summation) the data in given direction or directions void MGL_EXPORT mgl_datac_integral(HADT dat, const char *dir); void MGL_EXPORT mgl_datac_integral_(uintptr_t *dat, const char *dir,int); /// Differentiate the data in given direction or directions void MGL_EXPORT mgl_datac_diff(HADT dat, const char *dir); void MGL_EXPORT mgl_datac_diff_(uintptr_t *dat, const char *dir,int); /// Differentiate the parametrically specified data along direction v1 with v2,v3=const (v3 can be NULL) void MGL_EXPORT mgl_datac_diff_par(HADT dat, HCDT v1, HCDT v2, HCDT v3); void MGL_EXPORT mgl_datac_diff_par_(uintptr_t *dat, uintptr_t *v1, uintptr_t *v2, uintptr_t *v3); /// Double-differentiate (like Laplace operator) the data in given direction void MGL_EXPORT mgl_datac_diff2(HADT dat, const char *dir); void MGL_EXPORT mgl_datac_diff2_(uintptr_t *dat, const char *dir,int); /// Swap left and right part of the data in given direction (useful for Fourier spectrum) void MGL_EXPORT mgl_datac_swap(HADT dat, const char *dir); void MGL_EXPORT mgl_datac_swap_(uintptr_t *dat, const char *dir,int); /// Roll data along direction dir by num slices void MGL_EXPORT mgl_datac_roll(HADT dat, char dir, long num); void MGL_EXPORT mgl_datac_roll_(uintptr_t *dat, const char *dir, int *num, int); /// Mirror the data in given direction (useful for Fourier spectrum) void MGL_EXPORT mgl_datac_mirror(HADT dat, const char *dir); void MGL_EXPORT mgl_datac_mirror_(uintptr_t *dat, const char *dir,int); /// Crop the data void MGL_EXPORT mgl_datac_crop(HADT dat, long n1, long n2, char dir); void MGL_EXPORT mgl_datac_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int); /// Crop the data to be most optimal for FFT (i.e. to closest value of 2^n*3^m*5^l) void MGL_EXPORT mgl_datac_crop_opt(HADT dat, const char *how); void MGL_EXPORT mgl_datac_crop_opt_(uintptr_t *dat, const char *how,int); /// Multiply the data by other one for each element void MGL_EXPORT mgl_datac_mul_dat(HADT dat, HCDT d); void MGL_EXPORT mgl_datac_mul_dat_(uintptr_t *dat, uintptr_t *d); /// Divide the data by other one for each element void MGL_EXPORT mgl_datac_div_dat(HADT dat, HCDT d); void MGL_EXPORT mgl_datac_div_dat_(uintptr_t *dat, uintptr_t *d); /// Add the other data void MGL_EXPORT mgl_datac_add_dat(HADT dat, HCDT d); void MGL_EXPORT mgl_datac_add_dat_(uintptr_t *dat, uintptr_t *d); /// Subtract the other data void MGL_EXPORT mgl_datac_sub_dat(HADT dat, HCDT d); void MGL_EXPORT mgl_datac_sub_dat_(uintptr_t *dat, uintptr_t *d); /// Multiply each element by the number void MGL_EXPORT mgl_datac_mul_num(HADT dat, mdual d); void MGL_EXPORT mgl_datac_mul_num_(uintptr_t *dat, mdual *d); /// Divide each element by the number void MGL_EXPORT mgl_datac_div_num(HADT dat, mdual d); void MGL_EXPORT mgl_datac_div_num_(uintptr_t *dat, mdual *d); /// Add the number void MGL_EXPORT mgl_datac_add_num(HADT dat, mdual d); void MGL_EXPORT mgl_datac_add_num_(uintptr_t *dat, mdual *d); /// Subtract the number void MGL_EXPORT mgl_datac_sub_num(HADT dat, mdual d); void MGL_EXPORT mgl_datac_sub_num_(uintptr_t *dat, mdual *d); /// Apply Hankel transform void MGL_EXPORT mgl_datac_hankel(HADT dat, const char *dir); void MGL_EXPORT mgl_datac_hankel_(uintptr_t *dat, const char *dir,int); /// Apply Sin-Fourier transform void MGL_EXPORT mgl_datac_sinfft(HADT dat, const char *dir); void MGL_EXPORT mgl_datac_sinfft_(uintptr_t *dat, const char *dir,int); /// Apply Cos-Fourier transform void MGL_EXPORT mgl_datac_cosfft(HADT dat, const char *dir); void MGL_EXPORT mgl_datac_cosfft_(uintptr_t *dat, const char *dir,int); /// Apply Fourier transform void MGL_EXPORT mgl_datac_fft(HADT dat, const char *dir); void MGL_EXPORT mgl_datac_fft_(uintptr_t *dat, const char *dir,int); /// Find correlation between 2 data arrays HADT MGL_EXPORT mgl_datac_correl(HCDT dat1, HCDT dat2, const char *dir); uintptr_t MGL_EXPORT mgl_datac_correl_(uintptr_t *dat1, uintptr_t *dat2, const char *dir,int); /// Calculate one step of diffraction by finite-difference method with parameter q /** Parameter \a how may contain: * ‘x‘,‘y‘,‘z‘ or ‘r‘ for directions or axial along x, * ‘e‘,‘g‘,‘0‘,‘1‘,‘2‘,‘3‘ for boundary conditions: exp, Gaussian, zero, constant, linear, quadratic.*/ void MGL_EXPORT mgl_datac_diffr(HADT dat, const char *how, mreal q); void MGL_EXPORT mgl_datac_diffr_(uintptr_t *d, const char *how, double q,int l); /// Apply wavelet transform /** Parameter \a dir may contain: * ‘x‘,‘y‘,‘z‘ for directions, * ‘d‘ for daubechies, ‘D‘ for centered daubechies, * ‘h‘ for haar, ‘H‘ for centered haar, * ‘b‘ for bspline, ‘B‘ for centered bspline, * ‘i‘ for applying inverse transform. */ void MGL_EXPORT mgl_datac_wavelet(HADT dat, const char *how, int k); void MGL_EXPORT mgl_datac_wavelet_(uintptr_t *d, const char *dir, int *k,int); /// Set as the data envelop void MGL_EXPORT mgl_datac_envelop(HADT dat, char dir); void MGL_EXPORT mgl_datac_envelop_(uintptr_t *dat, const char *dir, int); /// Get real part of data values HMDT MGL_EXPORT mgl_datac_real(HCDT dat); uintptr_t MGL_EXPORT mgl_datac_real_(uintptr_t *dat); /// Get imaginary part of data values HMDT MGL_EXPORT mgl_datac_imag(HCDT dat); uintptr_t MGL_EXPORT mgl_datac_imag_(uintptr_t *dat); /// Get absolute value of data values, i.e. |u| HMDT MGL_EXPORT mgl_datac_abs(HCDT dat); uintptr_t MGL_EXPORT mgl_datac_abs_(uintptr_t *dat); /// Get argument of data values HMDT MGL_EXPORT mgl_datac_arg(HCDT dat); uintptr_t MGL_EXPORT mgl_datac_arg_(uintptr_t *dat); /// Get square of absolute value of data values, i.e. |u|^2 HMDT MGL_EXPORT mgl_datac_norm(HCDT dat); uintptr_t MGL_EXPORT mgl_datac_norm_(uintptr_t *dat); /// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] cmdual MGL_EXPORT mgl_datac_linear(HCDT d, mreal x,mreal y,mreal z); cmdual MGL_EXPORT mgl_datac_linear_(uintptr_t *d, mreal *x,mreal *y,mreal *z); /// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] cmdual MGL_EXPORT mgl_datac_linear_ext(HCDT d, mreal x,mreal y,mreal z, mdual *dx,mdual *dy,mdual *dz); cmdual MGL_EXPORT mgl_datac_linear_ext_(uintptr_t *d, mreal *x,mreal *y,mreal *z, mdual *dx,mdual *dy,mdual *dz); /// Interpolate by cubic spline the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] cmdual MGL_EXPORT mgl_datac_spline(HCDT dat, mreal x,mreal y,mreal z); cmdual MGL_EXPORT mgl_datac_spline_(uintptr_t *dat, mreal *x,mreal *y,mreal *z); /// Interpolate by cubic spline the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] cmdual MGL_EXPORT mgl_datac_spline_ext(HCDT dat, mreal x,mreal y,mreal z, mdual *dx,mdual *dy,mdual *dz); cmdual MGL_EXPORT mgl_datac_spline_ext_(uintptr_t *dat, mreal *x,mreal *y,mreal *z, mdual *dx,mdual *dy,mdual *dz); /// Prepare coefficients for global spline interpolation HADT MGL_EXPORT mgl_gsplinec_init(HCDT x, HCDT v); uintptr_t MGL_EXPORT mgl_gspline_init_(uintptr_t *x, uintptr_t *v); /// Evaluate global spline (and its derivatives d1, d2 if not NULL) using prepared coefficients \a coef cmdual MGL_EXPORT mgl_gsplinec(HCDT coef, mreal dx, mdual *d1, mdual *d2); cmdual MGL_EXPORT mgl_gsplinec_(uintptr_t *c, mreal *dx, mdual *d1, mdual *d2); /// Find roots for set of nonlinear equations defined by textual formulas HADT MGL_EXPORT mgl_find_roots_txt_c(const char *func, const char *vars, HCDT ini); uintptr_t MGL_EXPORT mgl_find_roots_txt_c_(const char *func, const char *vars, uintptr_t *ini,int,int); #ifdef __cplusplus } #endif //----------------------------------------------------------------------------- #endif mathgl-8.0.1/include/mgl2/mgl.fs0000664000175000017500000011374614167366472016213 0ustar balakinbalakin\ Mathgl library wrapper \ Copyright (C) 2008-2013, Sergey Plis, Alexey Balakin \ \ This program is free software; you can redistribute it and/or modify \ it under the terms of the GNU General Public License as published by \ the Free Software Foundation; either version 2 of the License, or \ (at your option) any later version. \ \ This program is distributed in the hope that it will be useful, \ but WITHOUT ANY WARRANTY; without even the implied warranty of \ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the \ GNU General Public License for more details. Module mathgl library libmgl libmgl.so library libmgl-glut libmgl-glut.so library libmgl-fltk libmgl-fltk.so library libmgl-qt libmgl-qt.so library libmgl-wx libmgl-wx.so legacy off libmgl mgl_create_graph_gl (ptr) mgl_create_graph_gl libmgl-glut mgl_create_graph_glut ptr ptr ptr (ptr) mgl_create_graph_glut libmgl-fltk mgl_create_graph_fltk ptr ptr ptr (ptr) mgl_create_graph_fltk libmgl-fltk mgl_fltk_run (void) mgl_fltk_run libmgl-qt mgl_create_graph_qt ptr ptr ptr (ptr) mgl_create_graph_qt libmgl-qt mgl_qt_run (void) mgl_qt_run libmgl mgl_get_warn ptr (int) mgl_get_warn libmgl mgl_set_warn ptr int ptr (void) mgl_set_warn libmgl gl_get_mess ptr (ptr) gl_get_mess libmgl mgl_set_plotid ptr ptr (void) mgl_set_plotid libmgl gl_get_plotid ptr (ptr) gl_get_plotid libmgl mgl_get_quality ptr (int) mgl_get_quality libmgl mgl_set_quality int ptr (void) mgl_set_quality libmgl mgl_set_draw_reg int int int ptr (void) mgl_set_draw_reg libmgl mgl_is_frames ptr (int) mgl_is_frames libmgl mgl_get_flag int ptr (int) mgl_get_flag libmgl mgl_set_flag int int ptr (void) mgl_set_flag libmgl mgl_use_graph int ptr (int) mgl_use_graph libmgl mgl_start_group ptr ptr (void) mgl_start_group libmgl mgl_end_group ptr (void) mgl_end_group libmgl mgl_highlight int ptr (void) mgl_highlight libmgl mgl_set_palette ptr ptr (void) mgl_set_palette libmgl mgl_set_color double double double char (void) mgl_set_color libmgl mgl_set_def_sch ptr ptr (void) mgl_set_def_sch libmgl mgl_set_mask ptr char (void) mgl_set_mask libmgl mgl_set_mask_angle int ptr (void) mgl_set_mask_angle libmgl mgl_set_alpha_default double ptr (void) mgl_set_alpha_default libmgl mgl_set_bar_width double ptr (void) mgl_set_bar_width libmgl mgl_set_meshnum int ptr (void) mgl_set_meshnum libmgl mgl_set_facenum int ptr (void) mgl_set_facenum libmgl mgl_clear_unused ptr (void) mgl_clear_unused libmgl mgl_set_ambbr double ptr (void) mgl_set_ambbr libmgl mgl_set_difbr double ptr (void) mgl_set_difbr libmgl mgl_set_light_dif int ptr (void) mgl_set_light_dif libmgl mgl_set_cut int ptr (void) mgl_set_cut libmgl mgl_set_cut_box double double double double double double ptr (void) mgl_set_cut_box libmgl mgl_set_cutoff ptr ptr (void) mgl_set_cutoff libmgl mgl_set_ranges double double double double double double ptr (void) mgl_set_ranges libmgl mgl_set_range_val double double char ptr (void) mgl_set_range_val libmgl mgl_set_range_dat int ptr char ptr (void) mgl_set_range_dat libmgl mgl_set_auto_ranges double double double double double double double double ptr (void) mgl_set_auto_ranges libmgl mgl_zoom_axis double double double double double double double double ptr (void) mgl_zoom_axis libmgl mgl_set_origin double double double ptr (void) mgl_set_origin libmgl mgl_set_func ptr ptr ptr ptr ptr (void) mgl_set_func libmgl mgl_set_coor int ptr (void) mgl_set_coor libmgl mgl_set_ternary int ptr (void) mgl_set_ternary libmgl mgl_set_tick_rotate int ptr (void) mgl_set_tick_rotate libmgl mgl_set_tick_skip int ptr (void) mgl_set_tick_skip libmgl mgl_def_font ptr ptr (void) mgl_def_font libmgl mgl_set_mark_size double ptr (void) mgl_set_mark_size libmgl mgl_set_arrow_size double ptr (void) mgl_set_arrow_size libmgl mgl_set_font_size double ptr (void) mgl_set_font_size libmgl mgl_set_font_def ptr ptr (void) mgl_set_font_def libmgl mgl_set_rotated_text int ptr (void) mgl_set_rotated_text libmgl mgl_load_font ptr ptr ptr (void) mgl_load_font libmgl mgl_copy_font ptr ptr (void) mgl_copy_font libmgl mgl_restore_font ptr (void) mgl_restore_font libmgl mgl_srnd int (void) mgl_srnd libmgl mgl_rnd (double) mgl_rnd libmgl mgl_ipow int double (double) mgl_ipow libmgl mgl_get_time ptr ptr (double) mgl_get_time libmgl mgl_create_data (ptr) mgl_create_data libmgl mgl_create_data_size int int int (ptr) mgl_create_data_size libmgl mgl_create_data_file ptr (ptr) mgl_create_data_file libmgl mgl_delete_data ptr (void) mgl_delete_data libmgl gl_data_info ptr (ptr) gl_data_info libmgl mgl_data_rearrange int int int ptr (void) mgl_data_rearrange libmgl mgl_data_link int int int ptr ptr (void) mgl_data_link libmgl mgl_data_set_float int int int ptr ptr (void) mgl_data_set_float libmgl mgl_data_set_double int int int ptr ptr (void) mgl_data_set_double libmgl mgl_data_set ptr ptr (void) mgl_data_set libmgl mgl_data_set_vector ptr ptr (void) mgl_data_set_vector libmgl mgl_data_set_matrix ptr ptr (void) mgl_data_set_matrix libmgl mgl_data_set_value int int int sf ptr (void) mgl_data_set_value libmgl mgl_data_get_value int int int ptr (sf) mgl_data_get_value libmgl mgl_data_set_values int int int ptr ptr (void) mgl_data_set_values libmgl mgl_data_read_hdf ptr ptr ptr (int) mgl_data_read_hdf libmgl mgl_data_save_hdf int ptr ptr ptr (void) mgl_data_save_hdf libmgl mgl_datas_hdf int ptr ptr (int) mgl_datas_hdf libmgl mgl_data_read ptr ptr (int) mgl_data_read libmgl mgl_data_read_mat int ptr ptr (int) mgl_data_read_mat libmgl mgl_data_read_dim int int int ptr ptr (int) mgl_data_read_dim libmgl mgl_data_read_range int double double double ptr ptr (int) mgl_data_read_range libmgl mgl_data_read_all int ptr ptr (int) mgl_data_read_all libmgl mgl_data_save int ptr ptr (void) mgl_data_save libmgl mgl_data_export int sf sf ptr ptr ptr (void) mgl_data_export libmgl mgl_data_import sf sf ptr ptr ptr (void) mgl_data_import libmgl mgl_data_create int int int ptr (void) mgl_data_create libmgl mgl_data_transpose ptr ptr (void) mgl_data_transpose libmgl mgl_data_norm int int sf sf ptr (void) mgl_data_norm libmgl mgl_data_norm_slice int int char sf sf ptr (void) mgl_data_norm_slice libmgl mgl_data_subdata int int int ptr (ptr) mgl_data_subdata libmgl mgl_data_subdata_ext ptr ptr ptr ptr (ptr) mgl_data_subdata_ext libmgl mgl_data_column ptr ptr (ptr) mgl_data_column libmgl mgl_data_set_id ptr ptr (void) mgl_data_set_id libmgl mgl_data_fill char sf sf ptr (void) mgl_data_fill libmgl mgl_data_fill_eq ptr ptr ptr ptr ptr ptr (void) mgl_data_fill_eq libmgl mgl_data_refill_x int sf sf ptr ptr ptr (void) mgl_data_refill_x libmgl mgl_data_refill_xy int sf sf sf sf ptr ptr ptr ptr (void) mgl_data_refill_xy libmgl mgl_data_refill_xyz sf sf sf sf sf sf ptr ptr ptr ptr ptr (void) mgl_data_refill_xyz libmgl mgl_data_refill_gr ptr int ptr ptr ptr ptr ptr ptr (void) mgl_data_refill_gr libmgl mgl_data_grid ptr ptr ptr ptr ptr ptr (void) mgl_data_grid libmgl mgl_data_grid_xy sf sf sf sf ptr ptr ptr ptr (void) mgl_data_grid_xy libmgl mgl_data_put_val int int int sf ptr (void) mgl_data_put_val libmgl mgl_data_put_dat int int int ptr ptr (void) mgl_data_put_dat libmgl mgl_data_modify int ptr ptr (void) mgl_data_modify libmgl mgl_data_modify_vw ptr ptr ptr ptr (void) mgl_data_modify_vw libmgl mgl_data_squeeze int int int int ptr (void) mgl_data_squeeze libmgl mgl_data_max ptr (sf) mgl_data_max libmgl mgl_data_min ptr (sf) mgl_data_min libmgl gl_data_value int int int ptr (ptr) gl_data_value libmgl gl_data_data ptr (ptr) gl_data_data libmgl mgl_data_get_nx ptr (int) mgl_data_get_nx libmgl mgl_data_get_ny ptr (int) mgl_data_get_ny libmgl mgl_data_get_nz ptr (int) mgl_data_get_nz libmgl mgl_data_first ptr ptr ptr ptr ptr (sf) mgl_data_first libmgl mgl_data_last ptr ptr ptr ptr ptr (sf) mgl_data_last libmgl mgl_data_find int int int char ptr ptr (int) mgl_data_find libmgl mgl_data_find_any ptr ptr (int) mgl_data_find_any libmgl mgl_data_max_int ptr ptr ptr ptr (sf) mgl_data_max_int libmgl mgl_data_max_real ptr ptr ptr ptr (sf) mgl_data_max_real libmgl mgl_data_min_int ptr ptr ptr ptr (sf) mgl_data_min_int libmgl mgl_data_min_real ptr ptr ptr ptr (sf) mgl_data_min_real libmgl mgl_data_momentum_val ptr ptr ptr ptr char ptr (sf) mgl_data_momentum_val libmgl mgl_data_combine ptr ptr (ptr) mgl_data_combine libmgl mgl_data_extend int int ptr (void) mgl_data_extend libmgl mgl_data_insert int int char ptr (void) mgl_data_insert libmgl mgl_data_delete int int char ptr (void) mgl_data_delete libmgl mgl_data_join ptr ptr (void) mgl_data_join libmgl mgl_data_smooth sf ptr ptr (void) mgl_data_smooth libmgl mgl_data_sum ptr ptr (ptr) mgl_data_sum libmgl mgl_data_max_dir ptr ptr (ptr) mgl_data_max_dir libmgl mgl_data_min_dir ptr ptr (ptr) mgl_data_min_dir libmgl mgl_data_cumsum ptr ptr (void) mgl_data_cumsum libmgl mgl_data_integral ptr ptr (void) mgl_data_integral libmgl mgl_data_diff ptr ptr (void) mgl_data_diff libmgl mgl_data_diff_par ptr ptr ptr ptr (void) mgl_data_diff_par libmgl mgl_data_diff2 ptr ptr (void) mgl_data_diff2 libmgl mgl_data_swap ptr ptr (void) mgl_data_swap libmgl mgl_data_roll int char ptr (void) mgl_data_roll libmgl mgl_data_mirror ptr ptr (void) mgl_data_mirror libmgl mgl_data_sort int int ptr (void) mgl_data_sort libmgl mgl_data_hankel ptr ptr (void) mgl_data_hankel libmgl mgl_data_sinfft ptr ptr (void) mgl_data_sinfft libmgl mgl_data_cosfft ptr ptr (void) mgl_data_cosfft libmgl mgl_data_fill_sample ptr ptr (void) mgl_data_fill_sample libmgl mgl_data_correl ptr ptr ptr (ptr) mgl_data_correl libmgl mgl_clear_fft (void) mgl_clear_fft libmgl mgl_data_spline sf sf sf ptr (sf) mgl_data_spline libmgl mgl_data_linear sf sf sf ptr (sf) mgl_data_linear libmgl mgl_data_spline_ext ptr ptr ptr sf sf sf ptr (sf) mgl_data_spline_ext libmgl mgl_data_linear_ext ptr ptr ptr sf sf sf ptr (sf) mgl_data_linear_ext libmgl mgl_data_solve_1d int int sf ptr (sf) mgl_data_solve_1d libmgl mgl_data_solve int ptr char sf ptr (ptr) mgl_data_solve libmgl mgl_data_trace ptr (ptr) mgl_data_trace libmgl mgl_data_resize int int int ptr (ptr) mgl_data_resize libmgl mgl_data_resize_box sf sf sf sf sf sf int int int ptr (ptr) mgl_data_resize_box libmgl mgl_data_hist int sf sf int ptr (ptr) mgl_data_hist libmgl mgl_data_hist_w int sf sf int ptr ptr (ptr) mgl_data_hist_w libmgl mgl_data_momentum ptr char ptr (ptr) mgl_data_momentum libmgl mgl_data_evaluate int ptr ptr ptr ptr (ptr) mgl_data_evaluate libmgl mgl_data_envelop char ptr (void) mgl_data_envelop libmgl mgl_data_sew sf ptr ptr (void) mgl_data_sew libmgl mgl_data_crop char int int ptr (void) mgl_data_crop libmgl mgl_data_clean int ptr (void) mgl_data_clean libmgl mgl_data_mul_dat ptr ptr (void) mgl_data_mul_dat libmgl mgl_data_div_dat ptr ptr (void) mgl_data_div_dat libmgl mgl_data_add_dat ptr ptr (void) mgl_data_add_dat libmgl mgl_data_sub_dat ptr ptr (void) mgl_data_sub_dat libmgl mgl_data_mul_num sf ptr (void) mgl_data_mul_num libmgl mgl_data_div_num sf ptr (void) mgl_data_div_num libmgl mgl_data_add_num sf ptr (void) mgl_data_add_num libmgl mgl_data_sub_num sf ptr (void) mgl_data_sub_num libmgl mgl_transform_a ptr ptr ptr (ptr) mgl_transform_a libmgl mgl_transform ptr ptr ptr (ptr) mgl_transform libmgl mgl_data_fourier ptr ptr ptr (void) mgl_data_fourier libmgl mgl_data_stfa char int ptr ptr (ptr) mgl_data_stfa libmgl mgl_triangulation_3d ptr ptr ptr (ptr) mgl_triangulation_3d libmgl mgl_triangulation_2d ptr ptr (ptr) mgl_triangulation_2d libmgl mgl_find_root_txt char sf ptr (sf) mgl_find_root_txt libmgl mgl_data_roots char ptr ptr (ptr) mgl_data_roots libmgl mgl_datac_save int ptr ptr (void) mgl_datac_save libmgl mgl_datac_save_hdf int ptr ptr ptr (void) mgl_datac_save_hdf libmgl mgl_datac_real ptr (ptr) mgl_datac_real libmgl mgl_datac_imag ptr (ptr) mgl_datac_imag libmgl mgl_datac_abs ptr (ptr) mgl_datac_abs libmgl mgl_datac_arg ptr (ptr) mgl_datac_arg libmgl mgl_text_xyz ptr ptr ptr ptr ptr ptr ptr (void) mgl_text_xyz libmgl mgl_textw_xyz ptr ptr ptr ptr ptr ptr ptr (void) mgl_textw_xyz libmgl mgl_text_xy ptr ptr ptr ptr ptr ptr (void) mgl_text_xy libmgl mgl_textw_xy ptr ptr ptr ptr ptr ptr (void) mgl_textw_xy libmgl mgl_text_y ptr ptr ptr ptr ptr (void) mgl_text_y libmgl mgl_textw_y ptr ptr ptr ptr ptr (void) mgl_textw_y libmgl mgl_cont_gen ptr ptr ptr ptr ptr double ptr (void) mgl_cont_gen libmgl mgl_contf_gen ptr ptr ptr ptr ptr double double ptr (void) mgl_contf_gen libmgl mgl_cont_xy_val ptr ptr ptr ptr ptr ptr ptr (void) mgl_cont_xy_val libmgl mgl_cont_val ptr ptr ptr ptr ptr (void) mgl_cont_val libmgl mgl_cont_xy ptr ptr ptr ptr ptr ptr (void) mgl_cont_xy libmgl mgl_cont ptr ptr ptr ptr (void) mgl_cont libmgl mgl_contf_xy_val ptr ptr ptr ptr ptr ptr ptr (void) mgl_contf_xy_val libmgl mgl_contf_val ptr ptr ptr ptr ptr (void) mgl_contf_val libmgl mgl_contf_xy ptr ptr ptr ptr ptr ptr (void) mgl_contf_xy libmgl mgl_contf ptr ptr ptr ptr (void) mgl_contf libmgl mgl_contd_xy_val ptr ptr ptr ptr ptr ptr ptr (void) mgl_contd_xy_val libmgl mgl_contd_val ptr ptr ptr ptr ptr (void) mgl_contd_val libmgl mgl_contd_xy ptr ptr ptr ptr ptr ptr (void) mgl_contd_xy libmgl mgl_contd ptr ptr ptr ptr (void) mgl_contd libmgl mgl_contv_xy_val ptr ptr ptr ptr ptr ptr ptr (void) mgl_contv_xy_val libmgl mgl_contv_val ptr ptr ptr ptr ptr (void) mgl_contv_val libmgl mgl_contv_xy ptr ptr ptr ptr ptr ptr (void) mgl_contv_xy libmgl mgl_contv ptr ptr ptr ptr (void) mgl_contv libmgl mgl_axial_xy_val ptr ptr ptr ptr ptr ptr ptr (void) mgl_axial_xy_val libmgl mgl_axial_val ptr ptr ptr ptr ptr (void) mgl_axial_val libmgl mgl_axial_xy ptr ptr ptr ptr ptr ptr (void) mgl_axial_xy libmgl mgl_axial ptr ptr ptr ptr (void) mgl_axial libmgl mgl_torus ptr ptr ptr ptr ptr (void) mgl_torus libmgl mgl_grid3_xyz ptr double ptr ptr ptr ptr ptr ptr (void) mgl_grid3_xyz libmgl mgl_grid3 ptr double ptr ptr ptr (void) mgl_grid3 libmgl mgl_dens3_xyz ptr double ptr ptr ptr ptr ptr ptr (void) mgl_dens3_xyz libmgl mgl_dens3 ptr double ptr ptr ptr (void) mgl_dens3 libmgl mgl_cont3_xyz_val ptr double ptr ptr ptr ptr ptr ptr ptr (void) mgl_cont3_xyz_val libmgl mgl_cont3_val ptr double ptr ptr ptr ptr (void) mgl_cont3_val libmgl mgl_cont3_xyz ptr double ptr ptr ptr ptr ptr ptr (void) mgl_cont3_xyz libmgl mgl_cont3 ptr double ptr ptr ptr (void) mgl_cont3 libmgl mgl_contf3_xyz_val ptr double ptr ptr ptr ptr ptr ptr ptr (void) mgl_contf3_xyz_val libmgl mgl_contf3_val ptr double ptr ptr ptr ptr (void) mgl_contf3_val libmgl mgl_contf3_xyz ptr double ptr ptr ptr ptr ptr ptr (void) mgl_contf3_xyz libmgl mgl_contf3 ptr double ptr ptr ptr (void) mgl_contf3 libmgl mgl_fit_1 ptr ptr ptr ptr ptr ptr (ptr) mgl_fit_1 libmgl mgl_fit_2 ptr ptr ptr ptr ptr ptr (ptr) mgl_fit_2 libmgl mgl_fit_3 ptr ptr ptr ptr ptr ptr (ptr) mgl_fit_3 libmgl mgl_fit_xy ptr ptr ptr ptr ptr ptr ptr (ptr) mgl_fit_xy libmgl mgl_fit_xyz ptr ptr ptr ptr ptr ptr ptr ptr (ptr) mgl_fit_xyz libmgl mgl_fit_xyza ptr ptr ptr ptr ptr ptr ptr ptr ptr (ptr) mgl_fit_xyza libmgl mgl_fit_ys ptr ptr ptr ptr ptr ptr ptr (ptr) mgl_fit_ys libmgl mgl_fit_xys ptr ptr ptr ptr ptr ptr ptr ptr (ptr) mgl_fit_xys libmgl mgl_fit_xyzs ptr ptr ptr ptr ptr ptr ptr ptr ptr (ptr) mgl_fit_xyzs libmgl mgl_fit_xyzas ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr (ptr) mgl_fit_xyzas libmgl gl_get_fit ptr (ptr) gl_get_fit libmgl mgl_hist_x ptr ptr ptr ptr (ptr) mgl_hist_x libmgl mgl_hist_xy ptr ptr ptr ptr ptr (ptr) mgl_hist_xy libmgl mgl_hist_xyz ptr ptr ptr ptr ptr ptr (ptr) mgl_hist_xyz libmgl mgl_puts_fit double ptr ptr double double double ptr (void) mgl_puts_fit libmgl mgl_fplot ptr ptr ptr ptr (void) mgl_fplot libmgl mgl_fplot_xyz ptr ptr ptr ptr ptr ptr (void) mgl_fplot_xyz libmgl mgl_radar ptr ptr ptr ptr (void) mgl_radar libmgl mgl_plot_xyz ptr ptr ptr ptr ptr ptr (void) mgl_plot_xyz libmgl mgl_plot_xy ptr ptr ptr ptr ptr (void) mgl_plot_xy libmgl mgl_plot ptr ptr ptr ptr (void) mgl_plot libmgl mgl_tens_xyz ptr ptr ptr ptr ptr ptr ptr (void) mgl_tens_xyz libmgl mgl_tens_xy ptr ptr ptr ptr ptr ptr (void) mgl_tens_xy libmgl mgl_tens ptr ptr ptr ptr ptr (void) mgl_tens libmgl mgl_tape_xyz ptr ptr ptr ptr ptr ptr (void) mgl_tape_xyz libmgl mgl_tape_xy ptr ptr ptr ptr ptr (void) mgl_tape_xy libmgl mgl_tape ptr ptr ptr ptr (void) mgl_tape libmgl mgl_boxplot_xy ptr ptr ptr ptr ptr (void) mgl_boxplot_xy libmgl mgl_boxplot ptr ptr ptr ptr (void) mgl_boxplot libmgl mgl_area_xyz ptr ptr ptr ptr ptr ptr (void) mgl_area_xyz libmgl mgl_area_xy ptr ptr ptr ptr ptr (void) mgl_area_xy libmgl mgl_area ptr ptr ptr ptr (void) mgl_area libmgl mgl_region_xy ptr ptr ptr ptr ptr ptr (void) mgl_region_xy libmgl mgl_region ptr ptr ptr ptr ptr (void) mgl_region libmgl mgl_stem_xyz ptr ptr ptr ptr ptr ptr (void) mgl_stem_xyz libmgl mgl_stem_xy ptr ptr ptr ptr ptr (void) mgl_stem_xy libmgl mgl_stem ptr ptr ptr ptr (void) mgl_stem libmgl mgl_step_xyz ptr ptr ptr ptr ptr ptr (void) mgl_step_xyz libmgl mgl_step_xy ptr ptr ptr ptr ptr (void) mgl_step_xy libmgl mgl_step ptr ptr ptr ptr (void) mgl_step libmgl mgl_bars_xyz ptr ptr ptr ptr ptr ptr (void) mgl_bars_xyz libmgl mgl_bars_xy ptr ptr ptr ptr ptr (void) mgl_bars_xy libmgl mgl_bars ptr ptr ptr ptr (void) mgl_bars libmgl mgl_barh_yx ptr ptr ptr ptr ptr (void) mgl_barh_yx libmgl mgl_barh ptr ptr ptr ptr (void) mgl_barh libmgl mgl_ohlc_x ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_ohlc_x libmgl mgl_ohlc ptr ptr ptr ptr ptr ptr ptr (void) mgl_ohlc libmgl mgl_chart ptr ptr ptr ptr (void) mgl_chart libmgl mgl_error_exy ptr ptr ptr ptr ptr ptr ptr (void) mgl_error_exy libmgl mgl_error_xy ptr ptr ptr ptr ptr ptr (void) mgl_error_xy libmgl mgl_error ptr ptr ptr ptr ptr (void) mgl_error libmgl mgl_mark_xyz ptr ptr ptr ptr ptr ptr ptr (void) mgl_mark_xyz libmgl mgl_mark_xy ptr ptr ptr ptr ptr ptr (void) mgl_mark_xy libmgl mgl_mark_y ptr ptr ptr ptr ptr (void) mgl_mark_y libmgl mgl_tube_xyzr ptr ptr ptr ptr ptr ptr ptr (void) mgl_tube_xyzr libmgl mgl_tube_xyr ptr ptr ptr ptr ptr ptr (void) mgl_tube_xyr libmgl mgl_tube_r ptr ptr ptr ptr ptr (void) mgl_tube_r libmgl mgl_tube_xyz ptr ptr double ptr ptr ptr ptr (void) mgl_tube_xyz libmgl mgl_tube_xy ptr ptr double ptr ptr ptr (void) mgl_tube_xy libmgl mgl_tube ptr ptr double ptr ptr (void) mgl_tube libmgl mgl_candle_xyv ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_candle_xyv libmgl mgl_candle_yv ptr ptr ptr ptr ptr ptr ptr (void) mgl_candle_yv libmgl mgl_candle ptr ptr ptr ptr ptr ptr (void) mgl_candle libmgl mgl_fsurf ptr ptr ptr ptr (void) mgl_fsurf libmgl mgl_fsurf_xyz ptr ptr ptr ptr ptr ptr (void) mgl_fsurf_xyz libmgl mgl_grid_xy ptr ptr ptr ptr ptr ptr (void) mgl_grid_xy libmgl mgl_grid ptr ptr ptr ptr (void) mgl_grid libmgl mgl_mesh_xy ptr ptr ptr ptr ptr ptr (void) mgl_mesh_xy libmgl mgl_mesh ptr ptr ptr ptr (void) mgl_mesh libmgl mgl_fall_xy ptr ptr ptr ptr ptr ptr (void) mgl_fall_xy libmgl mgl_fall ptr ptr ptr ptr (void) mgl_fall libmgl mgl_belt_xy ptr ptr ptr ptr ptr ptr (void) mgl_belt_xy libmgl mgl_belt ptr ptr ptr ptr (void) mgl_belt libmgl mgl_surf_xy ptr ptr ptr ptr ptr ptr (void) mgl_surf_xy libmgl mgl_surf ptr ptr ptr ptr (void) mgl_surf libmgl mgl_dens_xy ptr ptr ptr ptr ptr ptr (void) mgl_dens_xy libmgl mgl_dens ptr ptr ptr ptr (void) mgl_dens libmgl mgl_boxs_xy ptr ptr ptr ptr ptr ptr (void) mgl_boxs_xy libmgl mgl_boxs ptr ptr ptr ptr (void) mgl_boxs libmgl mgl_tile_xy ptr ptr ptr ptr ptr ptr (void) mgl_tile_xy libmgl mgl_tile ptr ptr ptr ptr (void) mgl_tile libmgl mgl_tiles_xy ptr ptr ptr ptr ptr ptr ptr (void) mgl_tiles_xy libmgl mgl_tiles ptr ptr ptr ptr ptr (void) mgl_tiles libmgl mgl_surfc_xy ptr ptr ptr ptr ptr ptr ptr (void) mgl_surfc_xy libmgl mgl_surfc ptr ptr ptr ptr ptr (void) mgl_surfc libmgl mgl_surfa_xy ptr ptr ptr ptr ptr ptr ptr (void) mgl_surfa_xy libmgl mgl_surfa ptr ptr ptr ptr ptr (void) mgl_surfa libmgl mgl_stfa_xy ptr ptr int ptr ptr ptr ptr ptr (void) mgl_stfa_xy libmgl mgl_stfa ptr ptr int ptr ptr ptr (void) mgl_stfa libmgl mgl_map_xy ptr ptr ptr ptr ptr ptr ptr (void) mgl_map_xy libmgl mgl_map ptr ptr ptr ptr ptr (void) mgl_map libmgl mgl_surf3_xyz_val ptr ptr ptr ptr ptr ptr double ptr (void) mgl_surf3_xyz_val libmgl mgl_surf3_val ptr ptr ptr double ptr (void) mgl_surf3_val libmgl mgl_surf3_xyz ptr ptr ptr ptr ptr ptr ptr (void) mgl_surf3_xyz libmgl mgl_surf3 ptr ptr ptr ptr (void) mgl_surf3 libmgl mgl_surf3a_xyz_val ptr ptr ptr ptr ptr ptr ptr double ptr (void) mgl_surf3a_xyz_val libmgl mgl_surf3a_val ptr ptr ptr ptr double ptr (void) mgl_surf3a_val libmgl mgl_surf3a_xyz ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_surf3a_xyz libmgl mgl_surf3a ptr ptr ptr ptr ptr (void) mgl_surf3a libmgl mgl_surf3c_xyz_val ptr ptr ptr ptr ptr ptr ptr double ptr (void) mgl_surf3c_xyz_val libmgl mgl_surf3c_val ptr ptr ptr ptr double ptr (void) mgl_surf3c_val libmgl mgl_surf3c_xyz ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_surf3c_xyz libmgl mgl_surf3c ptr ptr ptr ptr ptr (void) mgl_surf3c libmgl mgl_cloud_xyz ptr ptr ptr ptr ptr ptr ptr (void) mgl_cloud_xyz libmgl mgl_cloud ptr ptr ptr ptr (void) mgl_cloud libmgl mgl_beam_val int ptr double ptr ptr ptr ptr double ptr (void) mgl_beam_val libmgl mgl_beam int int ptr double ptr ptr ptr ptr ptr (void) mgl_beam libmgl mgl_traj_xy ptr ptr ptr ptr ptr ptr ptr (void) mgl_traj_xy libmgl mgl_traj_xyz ptr ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_traj_xyz libmgl mgl_vect_xy ptr ptr ptr ptr ptr ptr ptr (void) mgl_vect_xy libmgl mgl_vect_2d ptr ptr ptr ptr ptr (void) mgl_vect_2d libmgl mgl_vect_xyz ptr ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_vect_xyz libmgl mgl_vect_3d ptr ptr ptr ptr ptr ptr (void) mgl_vect_3d libmgl mgl_flow_xy ptr ptr ptr ptr ptr ptr ptr (void) mgl_flow_xy libmgl mgl_flow_2d ptr ptr ptr ptr ptr (void) mgl_flow_2d libmgl mgl_flow_xyz ptr ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_flow_xyz libmgl mgl_flow_3d ptr ptr ptr ptr ptr ptr (void) mgl_flow_3d libmgl mgl_flowp_xy ptr ptr ptr ptr ptr ptr double double double ptr (void) mgl_flowp_xy libmgl mgl_flowp_2d ptr ptr ptr ptr double double double ptr (void) mgl_flowp_2d libmgl mgl_flowp_xyz ptr ptr ptr ptr ptr ptr ptr ptr double double double ptr (void) mgl_flowp_xyz libmgl mgl_flowp_3d ptr ptr ptr ptr ptr double double double ptr (void) mgl_flowp_3d libmgl mgl_pipe_xy ptr double ptr ptr ptr ptr ptr ptr (void) mgl_pipe_xy libmgl mgl_pipe_2d ptr double ptr ptr ptr ptr (void) mgl_pipe_2d libmgl mgl_pipe_xyz ptr double ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_pipe_xyz libmgl mgl_pipe_3d ptr double ptr ptr ptr ptr ptr (void) mgl_pipe_3d libmgl mgl_grad_xyz ptr ptr ptr ptr ptr ptr ptr (void) mgl_grad_xyz libmgl mgl_grad_xy ptr ptr ptr ptr ptr ptr (void) mgl_grad_xy libmgl mgl_grad ptr ptr ptr ptr (void) mgl_grad libmgl mgl_vect3_xyz ptr double ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_vect3_xyz libmgl mgl_vect3 ptr double ptr ptr ptr ptr ptr (void) mgl_vect3 libmgl mgl_mark ptr double double double ptr (void) mgl_mark libmgl mgl_ball double double double ptr (void) mgl_ball libmgl mgl_line int ptr double double double double double double ptr (void) mgl_line libmgl mgl_curve int ptr double double double double double double double double double double double double ptr (void) mgl_curve libmgl mgl_error_box ptr double double double double double double ptr (void) mgl_error_box libmgl mgl_face ptr double double double double double double double double double double double double ptr (void) mgl_face libmgl mgl_facex double double ptr double double double double double ptr (void) mgl_facex libmgl mgl_facey double double ptr double double double double double ptr (void) mgl_facey libmgl mgl_facez double double ptr double double double double double ptr (void) mgl_facez libmgl mgl_sphere ptr double double double double ptr (void) mgl_sphere libmgl mgl_drop double double ptr double double double double double double double ptr (void) mgl_drop libmgl mgl_cone ptr double double double double double double double double ptr (void) mgl_cone libmgl mgl_ellipse ptr double double double double double double double ptr (void) mgl_ellipse libmgl mgl_rhomb ptr double double double double double double double ptr (void) mgl_rhomb libmgl mgl_cones_xyz ptr ptr ptr ptr ptr ptr (void) mgl_cones_xyz libmgl mgl_cones_xz ptr ptr ptr ptr ptr (void) mgl_cones_xz libmgl mgl_cones ptr ptr ptr ptr (void) mgl_cones libmgl mgl_dew_xy ptr ptr ptr ptr ptr ptr ptr (void) mgl_dew_xy libmgl mgl_dew_2d ptr ptr ptr ptr ptr (void) mgl_dew_2d libmgl mgl_puts_dir double ptr ptr double double double double double double ptr (void) mgl_puts_dir libmgl mgl_putsw_dir double ptr ptr double double double double double double ptr (void) mgl_putsw_dir libmgl mgl_textmark_xyzr ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_textmark_xyzr libmgl mgl_textmarkw_xyzr ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_textmarkw_xyzr libmgl mgl_textmark_xyr ptr ptr ptr ptr ptr ptr ptr (void) mgl_textmark_xyr libmgl mgl_textmarkw_xyr ptr ptr ptr ptr ptr ptr ptr (void) mgl_textmarkw_xyr libmgl mgl_textmark_yr ptr ptr ptr ptr ptr ptr (void) mgl_textmark_yr libmgl mgl_textmarkw_yr ptr ptr ptr ptr ptr ptr (void) mgl_textmarkw_yr libmgl mgl_textmark ptr ptr ptr ptr ptr (void) mgl_textmark libmgl mgl_textmarkw ptr ptr ptr ptr ptr (void) mgl_textmarkw libmgl mgl_label_xyz ptr ptr ptr ptr ptr ptr ptr (void) mgl_label_xyz libmgl mgl_labelw_xyz ptr ptr ptr ptr ptr ptr ptr (void) mgl_labelw_xyz libmgl mgl_label_xy ptr ptr ptr ptr ptr ptr (void) mgl_label_xy libmgl mgl_labelw_xy ptr ptr ptr ptr ptr ptr (void) mgl_labelw_xy libmgl mgl_label_y ptr ptr ptr ptr ptr (void) mgl_label_y libmgl mgl_labelw_y ptr ptr ptr ptr ptr (void) mgl_labelw_y libmgl mgl_table ptr ptr ptr ptr double double ptr (void) mgl_table libmgl mgl_tablew ptr ptr ptr ptr double double ptr (void) mgl_tablew libmgl mgl_triplot_xyzc ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_triplot_xyzc libmgl mgl_triplot_xyz ptr ptr ptr ptr ptr ptr ptr (void) mgl_triplot_xyz libmgl mgl_triplot_xy ptr ptr ptr ptr ptr ptr (void) mgl_triplot_xy libmgl mgl_quadplot_xyzc ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_quadplot_xyzc libmgl mgl_quadplot_xyz ptr ptr ptr ptr ptr ptr ptr (void) mgl_quadplot_xyz libmgl mgl_quadplot_xy ptr ptr ptr ptr ptr ptr (void) mgl_quadplot_xy libmgl mgl_tricont_xyzcv ptr ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_tricont_xyzcv libmgl mgl_tricont_xycv ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_tricont_xycv libmgl mgl_tricont_xyzc ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_tricont_xyzc libmgl mgl_tricont_xyc ptr ptr ptr ptr ptr ptr ptr (void) mgl_tricont_xyc libmgl mgl_dots ptr ptr ptr ptr ptr ptr (void) mgl_dots libmgl mgl_dots_a ptr ptr ptr ptr ptr ptr ptr (void) mgl_dots_a libmgl mgl_dots_ca ptr ptr ptr ptr ptr ptr ptr ptr (void) mgl_dots_ca libmgl mgl_crust ptr ptr ptr ptr ptr ptr (void) mgl_crust libmgl mgl_dens_x ptr double ptr ptr ptr (void) mgl_dens_x libmgl mgl_dens_y ptr double ptr ptr ptr (void) mgl_dens_y libmgl mgl_dens_z ptr double ptr ptr ptr (void) mgl_dens_z libmgl mgl_cont_x ptr double ptr ptr ptr (void) mgl_cont_x libmgl mgl_cont_y ptr double ptr ptr ptr (void) mgl_cont_y libmgl mgl_cont_z ptr double ptr ptr ptr (void) mgl_cont_z libmgl mgl_cont_x_val ptr double ptr ptr ptr ptr (void) mgl_cont_x_val libmgl mgl_cont_y_val ptr double ptr ptr ptr ptr (void) mgl_cont_y_val libmgl mgl_cont_z_val ptr double ptr ptr ptr ptr (void) mgl_cont_z_val libmgl mgl_contf_x ptr double ptr ptr ptr (void) mgl_contf_x libmgl mgl_contf_y ptr double ptr ptr ptr (void) mgl_contf_y libmgl mgl_contf_z ptr double ptr ptr ptr (void) mgl_contf_z libmgl mgl_contf_x_val ptr double ptr ptr ptr ptr (void) mgl_contf_x_val libmgl mgl_contf_y_val ptr double ptr ptr ptr ptr (void) mgl_contf_y_val libmgl mgl_contf_z_val ptr double ptr ptr ptr ptr (void) mgl_contf_z_val libmgl mgl_create_graph int int (ptr) mgl_create_graph libmgl mgl_delete_graph ptr (void) mgl_delete_graph libmgl mgl_set_size int int ptr (void) mgl_set_size libmgl mgl_set_def_param ptr (void) mgl_set_def_param libmgl mgl_combine_gr ptr ptr (void) mgl_combine_gr libmgl mgl_finish ptr (void) mgl_finish libmgl mgl_set_tick_len double double ptr (void) mgl_set_tick_len libmgl mgl_set_axis_stl ptr ptr ptr ptr (void) mgl_set_axis_stl libmgl mgl_adjust_ticks ptr ptr (void) mgl_adjust_ticks libmgl mgl_set_ticks double int double char ptr (void) mgl_set_ticks libmgl mgl_set_ticks_str int ptr char ptr (void) mgl_set_ticks_str libmgl mgl_set_ticks_wcs int ptr char ptr (void) mgl_set_ticks_wcs libmgl mgl_set_ticks_val int ptr ptr char ptr (void) mgl_set_ticks_val libmgl mgl_set_ticks_valw int ptr ptr char ptr (void) mgl_set_ticks_valw libmgl mgl_tune_ticks double int ptr (void) mgl_tune_ticks libmgl mgl_set_tick_templ ptr char ptr (void) mgl_set_tick_templ libmgl mgl_set_tick_templw ptr char ptr (void) mgl_set_tick_templw libmgl mgl_set_ticks_time ptr double char ptr (void) mgl_set_ticks_time libmgl mgl_set_tick_shift double double double double ptr (void) mgl_set_tick_shift libmgl mgl_box ptr (void) mgl_box libmgl mgl_box_str int ptr ptr (void) mgl_box_str libmgl mgl_axis ptr ptr ptr ptr (void) mgl_axis libmgl mgl_axis_grid ptr ptr ptr ptr (void) mgl_axis_grid libmgl mgl_label ptr double ptr char ptr (void) mgl_label libmgl mgl_labelw ptr double ptr char ptr (void) mgl_labelw libmgl mgl_colorbar ptr ptr (void) mgl_colorbar libmgl mgl_colorbar_ext double double double double ptr ptr (void) mgl_colorbar_ext libmgl mgl_colorbar_val ptr ptr ptr (void) mgl_colorbar_val libmgl mgl_colorbar_val_ext double double double double ptr ptr ptr (void) mgl_colorbar_val_ext libmgl mgl_add_legend ptr ptr ptr (void) mgl_add_legend libmgl mgl_add_legendw ptr ptr ptr (void) mgl_add_legendw libmgl mgl_clear_legend ptr (void) mgl_clear_legend libmgl mgl_legend_pos ptr ptr double double ptr (void) mgl_legend_pos libmgl mgl_legend ptr ptr int ptr (void) mgl_legend libmgl mgl_set_legend_marks int ptr (void) mgl_set_legend_marks libmgl mgl_show_image int ptr ptr (void) mgl_show_image libmgl mgl_write_frame ptr ptr ptr (void) mgl_write_frame libmgl mgl_write_tga ptr ptr ptr (void) mgl_write_tga libmgl mgl_write_bmp ptr ptr ptr (void) mgl_write_bmp libmgl mgl_write_jpg ptr ptr ptr (void) mgl_write_jpg libmgl mgl_write_png ptr ptr ptr (void) mgl_write_png libmgl mgl_write_png_solid ptr ptr ptr (void) mgl_write_png_solid libmgl mgl_write_bps ptr ptr ptr (void) mgl_write_bps libmgl mgl_write_eps ptr ptr ptr (void) mgl_write_eps libmgl mgl_write_svg ptr ptr ptr (void) mgl_write_svg libmgl mgl_write_tex ptr ptr ptr (void) mgl_write_tex libmgl mgl_write_obj int ptr ptr ptr (void) mgl_write_obj libmgl mgl_write_obj_old int ptr ptr ptr (void) mgl_write_obj_old libmgl mgl_write_stl ptr ptr ptr (void) mgl_write_stl libmgl mgl_write_off int ptr ptr ptr (void) mgl_write_off libmgl mgl_write_xyz ptr ptr ptr (void) mgl_write_xyz libmgl mgl_write_prc int ptr ptr ptr (void) mgl_write_prc libmgl mgl_write_gif ptr ptr ptr (void) mgl_write_gif libmgl mgl_start_gif int ptr ptr (void) mgl_start_gif libmgl mgl_close_gif ptr (void) mgl_close_gif libmgl mgl_export_mgld ptr ptr ptr (void) mgl_export_mgld libmgl mgl_import_mgld int ptr ptr (void) mgl_import_mgld libmgl mgl_write_json ptr ptr ptr (void) mgl_write_json libmgl mgl_write_json_z ptr ptr ptr (void) mgl_write_json_z libmgl gl_get_json ptr (ptr) gl_get_json libmgl gl_get_rgb ptr (ptr) gl_get_rgb libmgl gl_get_rgba ptr (ptr) gl_get_rgba libmgl mgl_set_obj_id int ptr (void) mgl_set_obj_id libmgl mgl_get_obj_id int int ptr (int) mgl_get_obj_id libmgl mgl_get_spl_id int int ptr (int) mgl_get_spl_id libmgl mgl_get_width ptr (int) mgl_get_width libmgl mgl_get_height ptr (int) mgl_get_height libmgl mgl_calc_xyz ptr ptr ptr int int ptr (void) mgl_calc_xyz libmgl mgl_calc_scr ptr ptr double double double ptr (void) mgl_calc_scr libmgl mgl_is_active int int int ptr (int) mgl_is_active libmgl mgl_new_frame ptr (int) mgl_new_frame libmgl mgl_end_frame ptr (void) mgl_end_frame libmgl mgl_get_num_frame ptr (int) mgl_get_num_frame libmgl mgl_reset_frames ptr (void) mgl_reset_frames libmgl mgl_get_frame int ptr (void) mgl_get_frame libmgl mgl_set_frame int ptr (void) mgl_set_frame libmgl mgl_show_frame int ptr (void) mgl_show_frame libmgl mgl_del_frame int ptr (void) mgl_del_frame libmgl mgl_set_transp_type int ptr (void) mgl_set_transp_type libmgl mgl_set_alpha int ptr (void) mgl_set_alpha libmgl mgl_set_fog double double ptr (void) mgl_set_fog libmgl mgl_set_light int ptr (void) mgl_set_light libmgl mgl_set_light_n int int ptr (void) mgl_set_light_n libmgl mgl_add_light double double double int ptr (void) mgl_add_light libmgl mgl_add_light_ext double double char double double double int ptr (void) mgl_add_light_ext libmgl mgl_add_light_loc double double char double double double double double double int ptr (void) mgl_add_light_loc libmgl mgl_mat_pop ptr (void) mgl_mat_pop libmgl mgl_mat_push ptr (void) mgl_mat_push libmgl mgl_clf ptr (void) mgl_clf libmgl mgl_clf_rgb double double double ptr (void) mgl_clf_rgb libmgl mgl_clf_chr char ptr (void) mgl_clf_chr libmgl mgl_subplot ptr int int int ptr (void) mgl_subplot libmgl mgl_subplot_d double double ptr int int int ptr (void) mgl_subplot_d libmgl mgl_multiplot ptr int int int int int ptr (void) mgl_multiplot libmgl mgl_inplot double double double double ptr (void) mgl_inplot libmgl mgl_relplot double double double double ptr (void) mgl_relplot libmgl mgl_columnplot double int int ptr (void) mgl_columnplot libmgl mgl_gridplot double int int int ptr (void) mgl_gridplot libmgl mgl_stickplot double double int int ptr (void) mgl_stickplot libmgl mgl_title double ptr ptr ptr (void) mgl_title libmgl mgl_titlew double ptr ptr ptr (void) mgl_titlew libmgl mgl_set_plotfactor double ptr (void) mgl_set_plotfactor libmgl mgl_aspect double double double ptr (void) mgl_aspect libmgl mgl_rotate double double double ptr (void) mgl_rotate libmgl mgl_rotate_vector double double double double ptr (void) mgl_rotate_vector libmgl mgl_perspective double ptr (void) mgl_perspective libmgl mgl_view double double double ptr (void) mgl_view libmgl mgl_zoom double double double double ptr (void) mgl_zoom libmgl mgl_wnd_set_delay double ptr (void) mgl_wnd_set_delay libmgl mgl_wnd_get_delay ptr (double) mgl_wnd_get_delay libmgl mgl_setup_window int int ptr (void) mgl_setup_window libmgl mgl_wnd_toggle_alpha ptr (void) mgl_wnd_toggle_alpha libmgl mgl_wnd_toggle_light ptr (void) mgl_wnd_toggle_light libmgl mgl_wnd_toggle_zoom ptr (void) mgl_wnd_toggle_zoom libmgl mgl_wnd_toggle_rotate ptr (void) mgl_wnd_toggle_rotate libmgl mgl_wnd_toggle_no ptr (void) mgl_wnd_toggle_no libmgl mgl_wnd_update ptr (void) mgl_wnd_update libmgl mgl_wnd_reload ptr (void) mgl_wnd_reload libmgl mgl_wnd_adjust ptr (void) mgl_wnd_adjust libmgl mgl_wnd_next_frame ptr (void) mgl_wnd_next_frame libmgl mgl_wnd_prev_frame ptr (void) mgl_wnd_prev_frame libmgl mgl_wnd_animation ptr (void) mgl_wnd_animation libmgl mgl_get_last_mouse_pos ptr ptr ptr ptr (void) mgl_get_last_mouse_pos libmgl mgl_create_parser (ptr) mgl_create_parser libmgl mgl_use_parser int ptr (int) mgl_use_parser libmgl mgl_delete_parser ptr (void) mgl_delete_parser libmgl mgl_parser_add_param ptr int ptr (void) mgl_parser_add_param libmgl mgl_parser_add_paramw ptr int ptr (void) mgl_parser_add_paramw libmgl mgl_parser_add_var ptr ptr (ptr) mgl_parser_add_var libmgl mgl_parser_add_varw ptr ptr (ptr) mgl_parser_add_varw libmgl mgl_parser_find_var ptr ptr (ptr) mgl_parser_find_var libmgl mgl_parser_find_varw ptr ptr (ptr) mgl_parser_find_varw libmgl mgl_parser_del_var ptr ptr (void) mgl_parser_del_var libmgl mgl_parser_del_varw ptr ptr (void) mgl_parser_del_varw libmgl mgl_parser_del_all ptr (void) mgl_parser_del_all libmgl mgl_parse_line int ptr ptr ptr (int) mgl_parse_line libmgl mgl_parse_linew int ptr ptr ptr (int) mgl_parse_linew libmgl mgl_parse_text ptr ptr ptr (void) mgl_parse_text libmgl mgl_parse_textw ptr ptr ptr (void) mgl_parse_textw libmgl mgl_parser_restore_once ptr (void) mgl_parser_restore_once libmgl mgl_parser_allow_setsize int ptr (void) mgl_parser_allow_setsize libmgl mgl_parser_allow_file_io int ptr (void) mgl_parser_allow_file_io libmgl mgl_parser_stop ptr (void) mgl_parser_stop libmgl mgl_parser_cmd_type ptr ptr (int) mgl_parser_cmd_type libmgl gl_parser_cmd_desc ptr ptr (ptr) gl_parser_cmd_desc libmgl gl_parser_cmd_frmt ptr ptr (ptr) gl_parser_cmd_frmt libmgl gl_parser_cmd_name int ptr (ptr) gl_parser_cmd_name libmgl mgl_parser_cmd_num ptr (int) mgl_parser_cmd_num libmgl mgl_parser_calc ptr ptr (ptr) mgl_parser_calc libmgl mgl_parser_calcw ptr ptr (ptr) mgl_parser_calcw libmgl mgl_create_expr ptr (ptr) mgl_create_expr libmgl mgl_delete_expr ptr (void) mgl_delete_expr libmgl mgl_expr_eval double double double ptr (double) mgl_expr_eval libmgl mgl_expr_eval_v ptr ptr (double) mgl_expr_eval_v libmgl mgl_expr_diff double double double char ptr (double) mgl_expr_diff libmgl mgl_expr_diff_v ptr char ptr (double) mgl_expr_diff_v libmgl mgl_gauss_rnd (double) mgl_gauss_rnd libmgl mgl_fft_freq int ptr (void) mgl_fft_freq libmgl mgl_strcls ptr (void) mgl_strcls libmgl mgl_strpos ptr ptr (int) mgl_strpos libmgl mgl_chrpos char ptr (int) mgl_chrpos libmgl mgl_istrue char (int) mgl_istrue mathgl-8.0.1/include/mgl2/mgl.h0000664000175000017500000045571114167366472016033 0ustar balakinbalakin/*************************************************************************** * mgl.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_H_ #define _MGL_H_ #include "mgl2/mgl_cf.h" #ifdef __cplusplus #include "mgl2/data.h" #include "mgl2/datac.h" #include //----------------------------------------------------------------------------- /// Wrapper class for all graphics class MGL_EXPORT mglGraph { mglGraph(const mglGraph &) {gr=0;} // copying is not allowed const mglGraph &operator=(const mglGraph &t) { gr=0; return t; } protected: HMGL gr; public: HMPR pr; ///< Pointer to associated MGL parser mglGraph(int kind=-1) { pr = NULL; if(kind==0) gr=mgl_create_graph(600, 400); #if MGL_HAVE_OPENGL else if(kind==1) gr=mgl_create_graph_gl(); #else else if(kind==1) { gr=mgl_default_graph(); mgl_use_graph(gr,1); SetGlobalWarn("OpenGL support was disabled. Please, enable it and rebuild MathGL."); } #endif else { gr=mgl_default_graph(); mgl_use_graph(gr,1); } } mglGraph(int kind, int width, int height) { pr = NULL; if(kind==0) gr=mgl_create_graph(width, height); #if MGL_HAVE_OPENGL else if(kind==1) gr=mgl_create_graph_gl(); #else else if(kind==1) { gr=mgl_default_graph(); mgl_use_graph(gr,1); SetGlobalWarn("OpenGL support was disabled. Please, enable it and rebuild MathGL."); } #endif else { gr=mgl_default_graph(); mgl_use_graph(gr,1); mgl_set_size(gr,width,height); } } mglGraph(HMGL graph) { pr = NULL; gr = graph; mgl_use_graph(gr,1); } virtual ~mglGraph() { if(mgl_use_graph(gr,-1)<1) mgl_delete_graph(gr); } /// Get pointer to internal HMGL object inline HMGL Self() { return gr; } /// Set default parameters for plotting inline void DefaultPlotParam() { mgl_set_def_param(gr); } /// Set name of plot for saving filename inline void SetPlotId(const char *id) { mgl_set_plotid(gr,id); } /// Get name of plot for saving filename inline const char *GetPlotId() { return mgl_get_plotid(gr); } /// Ask to stop drawing inline void Stop(bool stop=true) { mgl_ask_stop(gr, stop); } /// Check if plot termination is asked inline bool NeedStop() { return mgl_need_stop(gr); } /// Set callback function for event processing inline void SetEventFunc(void (*func)(void *), void *par=NULL) { mgl_set_event_func(gr, func, par); } /// Set the transparency on/off. inline void Alpha(bool enable) { mgl_set_alpha(gr, enable); } /// Set the gray-scale mode on/off. inline void Gray(bool enable) { mgl_set_gray(gr, enable); } /// Set default value of alpha-channel inline void SetAlphaDef(double alpha) { mgl_set_alpha_default(gr, alpha); } /// Set the transparency type (0 - usual, 1 - glass, 2 - lamp) inline void SetTranspType(int type) { mgl_set_transp_type(gr, type); } /// Set the size of semi-transparent area around lines, marks, glyphs, ... Default is 1. inline void SetPenDelta(double d) { mgl_pen_delta(gr,d); } /// Set the using of light on/off. inline void Light(bool enable) { mgl_set_light(gr, enable); } /// Switch on/off the specified light source. inline void Light(int n,bool enable) { mgl_set_light_n(gr, n, enable); } /// Use diffusive light (only for local light sources) -- OBSOLETE inline void SetDifLight(bool dif) { mgl_set_light_dif(gr, dif); } /// Set to attach light settings to inplot. inline void AttachLight(bool enable) { mgl_set_attach_light(gr, enable); } /// Add a light source. inline void AddLight(int n, mglPoint p, char col='w', double bright=0.5, double ap=0) { mgl_add_light_ext(gr, n, p.x, p.y, p.z, col, bright, ap); } inline void AddLight(int n, mglPoint r, mglPoint p, char col='w', double bright=0.5, double ap=0) { mgl_add_light_loc(gr, n, r.x, r.y, r.z, p.x, p.y, p.z, col, bright, ap); } /// Set ambient light brightness inline void SetAmbient(double i) { mgl_set_ambbr(gr, i); } /// Set diffusive light brightness inline void SetDiffuse(double i) { mgl_set_difbr(gr, i); } /// Set the fog distance or switch it off (if d=0). inline void Fog(double d, double dz=0.25) { mgl_set_fog(gr, d, dz); } /// Set relative width of rectangles in Bars, Barh, BoxPlot, Candle, OHLC (default is 0.7) inline void SetBarWidth(double width) { mgl_set_bar_width(gr, width); } /// Set default size of marks (locally you can use "size" option) inline void SetMarkSize(double size) { mgl_set_mark_size(gr, size); } /// Set default size of arrows (locally you can use "size" option) inline void SetArrowSize(double size) { mgl_set_arrow_size(gr, size); } /// Set number of mesh lines (use 0 to draw all of them) inline void SetMeshNum(int num) { mgl_set_meshnum(gr, num); } /// Set number of visible faces (use 0 to draw all of them) inline void SetFaceNum(int num) { mgl_set_facenum(gr, num); } /// Set TeX parsing at text drawing inline void SetTeXparse(bool val) { mgl_set_tex_parse(gr, val); } /// Set cutting for points outside of bounding box inline void SetCut(bool cut) { mgl_set_cut(gr, cut); } /// Set additional cutting box inline void SetCutBox(mglPoint p1, mglPoint p2) { mgl_set_cut_box(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z); } /// Set the cutting off condition (formula) inline void CutOff(const char *EqC) { mgl_set_cutoff(gr, EqC); } /// Set default font size inline void SetFontSize(double size) { mgl_set_font_size(gr, size); } /// Set default font style and color inline void SetFontDef(const char *fnt) { mgl_set_font_def(gr, fnt); } /// Set FontSize by size in pt and picture DPI (default is 16 pt for dpi=72) virtual void SetFontSizePT(double pt, int dpi=72) { SetFontSize(pt*27.f/dpi); } /// Set FontSize by size in centimeters and picture DPI (default is 0.56 cm = 16 pt) inline void SetFontSizeCM(double cm, int dpi=72) { SetFontSizePT(cm*28.45f,dpi); } /// Set FontSize by size in inch and picture DPI (default is 0.22 in = 16 pt) inline void SetFontSizeIN(double in, int dpi=72) { SetFontSizePT(in*72.27f,dpi); } /// Load font from file inline void LoadFont(const char *name, const char *path=NULL) { mgl_load_font(gr, name, path); } /// Copy font from another mglGraph instance inline void CopyFont(const mglGraph *GR) { mgl_copy_font(gr, GR->gr);} /// Restore font (load default font for new HMGL objects) inline void RestoreFont() { mgl_restore_font(gr); } /// Set to use or not text rotation inline void SetRotatedText(bool enable) { mgl_set_rotated_text(gr, enable); } /// Set to scale text in relative subplots too inline void SetScaleText(bool enable) { mgl_set_scale_text(gr, enable); } /// Set default font for all new HMGL and mglGraph objects static inline void SetDefFont(const char *name, const char *path=NULL) { mgl_def_font(name,path); } /// Add user-defined glyph for symbol and set its optional id inline void DefineSymbol(char id, const mglDataA &x, const mglDataA &y) { mgl_define_symbol(gr, id, &x, &y); } /// Set default palette inline void SetPalette(const char *colors) { mgl_set_palette(gr, colors); } /// Set default color scheme inline void SetDefScheme(const char *sch) { mgl_set_def_sch(gr, sch); } /// Sets RGB values for color with given id static inline void SetColor(char id, double r, double g, double b) { mgl_set_color(id, r, g, b); } /// Set mask for face coloring as array of type 'unsigned char[8]' static inline void SetMask(char id, const char *mask) { mgl_set_mask(id, mask); } /// Set mask for face coloring as uint64_t number static inline void SetMask(char id, uint64_t mask) { mgl_set_mask_val(id, mask); } /// Set default mask rotation angle inline void SetMaskAngle(int angle) { mgl_set_mask_angle(gr, angle); } /// Get last warning code inline int GetWarn() { return mgl_get_warn(gr);} /// Set warning code ant fill message inline void SetWarn(int code, const char *info) { mgl_set_warn(gr,code,info); } /// Get text of warning message(s) inline const char *Message() { return mgl_get_mess(gr); } /// Set global warning message static inline void SetGlobalWarn(const char *text) { mgl_set_global_warn(text); } /// Get text of global warning message(s) static inline const char *GlobalWarn() { return mgl_get_global_warn(); } /// Clear global warning message static inline void ClearGlobalWarn() { mgl_clear_global_warn(); } /// Suppress printing warnings to stderr static inline void SuppressWarn(bool on) { mgl_suppress_warn(on); } /// Check if MathGL version is valid (return false) or not (return true) static inline bool CheckVersion(const char *ver) { return mgl_check_version(ver); } /// Display progress of something. inline void Progress(int value, int maximal) { mgl_progress(value, maximal, gr); } /// Set axis range scaling -- simplified way to shift/zoom axis range -- need to replot whole image! inline void ZoomAxis(mglPoint p1=mglPoint(0,0,0,0), mglPoint p2=mglPoint(1,1,1,1)) { mgl_zoom_axis(gr, p1.x,p1.y,p1.z,p1.c, p2.x,p2.y,p2.z,p2.c); } /// Add [v1, v2] to the current range in direction dir inline void AddRange(char dir, double v1, double v2) { mgl_add_range_val(gr, dir, v1, v2); } /// Set range in direction dir as [v1, v2] inline void SetRange(char dir, double v1, double v2) { mgl_set_range_val(gr, dir, v1, v2); } /// Set range in direction dir as minimal and maximal values of data a inline void SetRange(char dir, const mglDataA &dat, bool add=false) { mgl_set_range_dat(gr, dir, &dat, add); } /// Set values of axis range as minimal and maximal values of corresponding data inline void SetRanges(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz, const mglDataA &cc) { mgl_set_range_dat(gr,'x',&xx,0); mgl_set_range_dat(gr,'y',&yy,0); mgl_set_range_dat(gr,'z',&zz,0); mgl_set_range_dat(gr,'c',&cc,0); } /// Set values of axis range as minimal and maximal values of corresponding data inline void SetRanges(const mglDataA &xx, const mglDataA &yy, const mglDataA &zz) { mgl_set_range_dat(gr,'x',&xx,0); mgl_set_range_dat(gr,'y',&yy,0); mgl_set_range_dat(gr,'z',&zz,0); mgl_set_range_dat(gr,'c',&zz,0); } /// Set values of axis range as minimal and maximal values of corresponding data inline void SetRanges(const mglDataA &xx, const mglDataA &yy) { mgl_set_range_dat(gr,'x',&xx,0); mgl_set_range_dat(gr,'y',&yy,0); } /// Set values of axis ranges inline void SetRanges(double x1, double x2, double y1, double y2, double z1=0, double z2=0) { mgl_set_ranges(gr, x1, x2, y1, y2, z1, z2); } /// Set values of axis ranges inline void SetRanges(mglPoint p1, mglPoint p2) { mgl_set_ranges(gr, p1.x, p2.x, p1.y, p2.y, p1.z, p2.z); } /// Set ranges for automatic variables inline void SetAutoRanges(double x1, double x2, double y1=0, double y2=0, double z1=0, double z2=0, double c1=0, double c2=0) { mgl_set_auto_ranges(gr, x1, x2, y1, y2, z1, z2, c1, c2); } /// Set ranges for automatic variables inline void SetAutoRanges(mglPoint p1, mglPoint p2) { mgl_set_auto_ranges(gr, p1.x, p2.x, p1.y, p2.y, p1.z, p2.z, p1.c, p2.c); } /// Set axis origin inline void SetOrigin(mglPoint p) { mgl_set_origin(gr, p.x, p.y, p.z); } inline void SetOrigin(double x0, double y0, double z0=mglNaN) { mgl_set_origin(gr, x0, y0, z0); } /// Set the transformation formulas for coordinate. Use "" or NULL for built-in ones inline void SetFunc(const char *EqX, const char *EqY, const char *EqZ=NULL, const char *EqA=NULL) { mgl_set_func(gr, EqX, EqY, EqZ, EqA); } /// Set one of predefined transformation rule inline void SetCoor(int how) { mgl_set_coor(gr, how); } /// Set to draw Ternary axis (triangle like axis, grid and so on) /** val=1 for Ternary axis (a+b+c=1, z=z), * val=2 for Quaternary axis (a+b+c+d=1), * val|4 for projections. */ inline void Ternary(int val) { mgl_set_ternary(gr, val); } /// Set to use or not tick labels rotation inline void SetTickRotate(bool val) { mgl_set_tick_rotate(gr,val); } /// Set to use or not tick labels skipping inline void SetTickSkip(bool val) { mgl_set_tick_skip(gr,val); } /// Set tick length inline void SetTickLen(double len, double stt=1) { mgl_set_tick_len(gr, len, stt); } /// Set axis and ticks style inline void SetAxisStl(const char *stl="k", const char *tck=0, const char *sub=0) { mgl_set_axis_stl(gr, stl, tck, sub); } /// Set time templates for ticks inline void SetTicksTime(char dir, double d=0, const char *t="") { mgl_set_ticks_time(gr,dir,d,t); } /// Set ticks text (\n separated). Use "" to disable this feature. inline void SetTicksVal(char dir, const char *lbl, bool add=false) { mgl_set_ticks_str(gr,dir,lbl,add); } inline void SetTicksVal(char dir, const wchar_t *lbl, bool add=false) { mgl_set_ticks_wcs(gr,dir,lbl,add); } /// Set ticks position and text (\n separated). Use "" to disable this feature. inline void SetTicksVal(char dir, const mglDataA &v, const char *lbl, bool add=false) { mgl_set_ticks_val(gr,dir,&v,lbl,add); } inline void SetTicksVal(char dir, const mglDataA &v, const wchar_t *lbl, bool add=false) { mgl_set_ticks_valw(gr,dir,&v,lbl,add); } /// Add manual tick at given position. Use "" to disable this feature. inline void AddTick(char dir, double val, const char *lbl) { mgl_add_tick(gr,dir,val,lbl); } inline void AddTick(char dir, double val, const wchar_t *lbl) { mgl_add_tickw(gr,dir,val,lbl); } /// Set the ticks parameters and string for its factor inline void SetTicks(char dir, double d=0, int ns=0, double org=mglNaN, const char *factor="") { mgl_set_ticks_fact(gr, dir, d, ns, org, factor); } inline void SetTicks(char dir, double d, int ns, double org, const wchar_t *factor) { mgl_set_ticks_factw(gr, dir, d, ns, org, factor); } /// Auto adjust ticks inline void Adjust(const char *dir="xyzc") { mgl_adjust_ticks(gr, dir); } /// Set templates for ticks inline void SetTickTempl(char dir, const char *t) { mgl_set_tick_templ(gr,dir,t); } inline void SetTickTempl(char dir, const wchar_t *t) { mgl_set_tick_templw(gr,dir,t); } /// Tune ticks (tune|1 for common multiplier, tune|2 for common component) inline void SetTuneTicks(int tune, double fact_pos=1.15) { mgl_tune_ticks(gr, tune, fact_pos); } /// Set additional shift of tick labels inline void SetTickShift(mglPoint p) { mgl_set_tick_shift(gr,p.x,p.y,p.z,p.c); } /// Set to use UTC time instead of local time inline void SetTimeUTC(bool enable) { mgl_set_flag(gr,enable, MGL_USE_GMTIME); } /// Set to draw tick labels at axis origin inline void SetOriginTick(bool enable=true) { mgl_set_flag(gr,!enable, MGL_NO_ORIGIN); } /// Disable accurate but slower primitive cutting at axis borders inline void SetFastCut(bool enable) { mgl_set_flag(gr,enable, MGL_FAST_PRIM); } /// Set bit-value flag of HMGL state (for advanced users only) inline void SetFlagAdv(int val, uint32_t flag) { mgl_set_flag(gr, val, flag); } /// Put further plotting in m-th cell of nx*ny grid of the image. /** String \a style may contain: * '<' for reserving space at left * '>' for reserving space at right * '^' for reserving space at top * '_' for reserving space at bottom * '#' for using whole region. */ inline void SubPlot(int nx,int ny,int m,const char *style="<>_^", double dx=0, double dy=0) { mgl_subplot_d(gr, nx, ny, m, style, dx, dy); } /// Put further plotting in rectangle of dx*dy cells starting from m-th cell of nx*ny grid of the image and shift it by distance {sx,sy}. /** String \a style may contain: * '<' for reserving space at left * '>' for reserving space at right * '^' for reserving space at top * '_' for reserving space at bottom * '#' for using whole region. */ inline void MultiPlot(int nx,int ny,int m, int dx, int dy, const char *style="<>_^", double sx=0, double sy=0) { mgl_multiplot_d(gr, nx, ny, m, dx, dy, style, sx, sy); } /// Put further plotting in a region [x1,x2]*[y1,y2] of the image or subplot (x1,x2,y1,y2 in range [0, 1]). inline void InPlot(double x1,double x2,double y1,double y2, bool rel=true) { if(rel) mgl_relplot(gr, x1, x2, y1, y2); else mgl_inplot(gr, x1, x2, y1, y2); } /// Put further plotting in column cell of previous subplot inline void ColumnPlot(int num, int ind, double d=0) { mgl_columnplot(gr,num,ind,d); } /// Put further plotting in matrix cell of previous subplot inline void GridPlot(int nx, int ny, int ind, double d=0) { mgl_gridplot(gr,nx,ny,ind,d); } /// Put further plotting in cell of stick rotated on angles tet, phi inline void StickPlot(int num, int i, double tet, double phi) { mgl_stickplot(gr,num,i,tet,phi); } /// Put further plotting in cell of stick sheared on sx, sy. inline void ShearPlot(int num, int i, mreal sx, mreal sy, mreal xd=1, mreal yd=0) { mgl_shearplot(gr,num,i,sx,sy,xd,yd); } /// Set factor of plot size inline void SetPlotFactor(double val) { mgl_set_plotfactor(gr,val); } /// Push transformation matrix into stack inline void Push() { mgl_mat_push(gr); } /// Pop transformation matrix from stack inline void Pop() { mgl_mat_pop(gr); } /// Add title for current subplot/inplot /** Style '#' draw box around the title. */ inline void Title(const char *title,const char *stl="",double size=-2) { mgl_title(gr,title,stl,size); } /// Add title for current subplot/inplot /** Style '#' draw box around the title. */ inline void Title(const wchar_t *title,const char *stl="",double size=-2) { mgl_titlew(gr,title,stl,size); } /// Set aspect ratio for further plotting. inline void Aspect(double Ax,double Ay,double Az=1) { mgl_aspect(gr, Ax, Ay, Az); } /// Shear a further plotting. inline void Shear(double Sx,double Sy) { mgl_shear(gr, Sx, Sy); } /// Rotate a further plotting. inline void Rotate(double TetX,double TetZ=0,double TetY=0) { mgl_rotate(gr, TetX, TetZ, TetY); } /// Rotate a further plotting around vector {x,y,z}. inline void RotateN(double Tet,double x,double y,double z) { mgl_rotate_vector(gr, Tet, x, y, z); } /// Set perspective (in range [0,1)) for plot. Set to zero for switching off. inline void Perspective(double val) { mgl_perspective(gr, val); } /// Set angle of view independently from Rotate(). inline void View(double TetX,double TetZ=0,double TetY=0) { mgl_view(gr, TetX, TetZ, TetY); } /// Set angle of view independently from Rotate(). inline void ViewAsRotate(double TetZ,double TetX,double TetY=0) { mgl_view(gr, -TetX, -TetZ, -TetY); } /// Zoom in/out a part of picture (use Zoom(0, 0, 1, 1) for restore default) inline void Zoom(double x1, double y1, double x2, double y2) { mgl_zoom(gr, x1, y1, x2, y2); } /// Set size of frame in pixels. Normally this function is called internally. inline void SetSize(int width, int height, bool clf=true) { if(clf) mgl_set_size(gr, width, height); else mgl_scale_size(gr, width, height); } /// Scaling for all further set size calls. static inline void SetSizeScl(double scl) { mgl_set_size_scl(scl); } /// Set plot quality /** qual=0 -- no face drawing (fastest), * qual=1 -- no color interpolation (fast), * qual=2 -- high quality (normal), * qual|4 -- direct bitmap drawing (low memory usage); * qual|8 for dots drawing instead of primitives (extremely fast). */ inline void SetQuality(int qual=MGL_DRAW_NORM) { mgl_set_quality(gr, qual); } /// Get plot quality inline int GetQuality() { return mgl_get_quality(gr); } /// Set drawing region for Quality&4 inline void SetDrawReg(long nx=1, long ny=1, long m=0) { mgl_set_draw_reg(gr,nx,ny,m); } /// Start group of objects inline void StartGroup(const char *name) { mgl_start_group(gr, name); } /// End group of objects inline void EndGroup() { mgl_end_group(gr); } /// Highlight objects with given id inline void Highlight(int id) { mgl_highlight(gr, id); } /// Set boundary box for export graphics into 2D file formats. /** If x2<0 (y2<0) then full width (height) will be used. * If x1<0 or y1<0 or x1>=x2|Width or y1>=y2|Height then cropping will be disabled. */ inline void SetBBox(int x1=0, int y1=0, int x2=-1, int y2=-1) { mgl_set_bbox(gr,x1,y1,x2,y2); } /// Show current image inline void ShowImage(const char *viewer, bool keep=0) { mgl_show_image(gr, viewer, keep); } /// Write the frame in file (depending extension, write current frame if fname is empty) inline void WriteFrame(const char *fname=0,const char *descr="") { mgl_write_frame(gr, fname, descr); } /// Write the frame in file using JPEG format inline void WriteJPEG(const char *fname,const char *descr="") { mgl_write_jpg(gr, fname, descr); } /// Write the frame in file using PNG format with transparency inline void WritePNG(const char *fname,const char *descr="", bool alpha=true) { if(alpha) mgl_write_png(gr, fname, descr); else mgl_write_png_solid(gr, fname, descr); } /// Write the frame in file using BMP format inline void WriteBMP(const char *fname,const char *descr="") { mgl_write_bmp(gr, fname, descr); } /// Write the frame in file using BMP format inline void WriteTGA(const char *fname,const char *descr="") { mgl_write_tga(gr, fname, descr); } /// Write the frame in file using PostScript format inline void WriteEPS(const char *fname,const char *descr="") { mgl_write_eps(gr, fname, descr); } /// Write the frame in file using LaTeX format inline void WriteTEX(const char *fname,const char *descr="") { mgl_write_tex(gr, fname, descr); } /// Write the frame in file using PostScript format as bitmap inline void WriteBPS(const char *fname,const char *descr="") { mgl_write_bps(gr, fname, descr); } /// Write the frame in file using SVG format inline void WriteSVG(const char *fname,const char *descr="") { mgl_write_svg(gr, fname, descr); } /// Write the frame in file using GIF format (only for current frame!) inline void WriteGIF(const char *fname,const char *descr="") { mgl_write_gif(gr, fname, descr); } /// Write the frame in file using OBJ format inline void WriteOBJ(const char *fname,const char *descr="",bool use_png=true) { mgl_write_obj(gr, fname, descr, use_png); } /// Write the frame in file using OBJ format - Balakin way inline void WriteOBJold(const char *fname,const char *descr="",bool use_png=true) { mgl_write_obj_old(gr, fname, descr, use_png); } /// Write the frame in file using XYZ format inline void WriteXYZ(const char *fname,const char *descr="") { mgl_write_xyz(gr, fname, descr); } /// Write the frame in file using STL format (faces only) inline void WriteSTL(const char *fname,const char *descr="") { mgl_write_stl(gr, fname, descr); } /// Write the frame in file using OFF format inline void WriteOFF(const char *fname,const char *descr="", bool colored=false) { mgl_write_off(gr, fname, descr,colored); } // /// Write the frame in file using X3D format // inline void WriteX3D(const char *fname,const char *descr="") // { mgl_write_x3d(gr, fname, descr); } /// Write the frame in file using PRC format inline void WritePRC(const char *fname,const char *descr="",bool make_pdf=true) { mgl_write_prc(gr, fname, descr, make_pdf); } /// Export in JSON format suitable for later drawing by JavaScript inline void WriteJSON(const char *fname,const char *descr="",bool force_z=false) { if(force_z) mgl_write_json_z(gr, fname, descr); else mgl_write_json(gr, fname, descr); } /// Return string of JSON data suitable for later drawing by JavaScript inline const char *GetJSON() { return mgl_get_json(gr); } /// Force preparing the image. It can be useful for OpenGL mode mostly. inline void Finish() { mgl_finish(gr); } /// Create new frame. inline void NewFrame() { mgl_new_frame(gr); } /// Finish frame drawing inline void EndFrame() { mgl_end_frame(gr); } /// Get the number of created frames inline int GetNumFrame() { return mgl_get_num_frame(gr); } /// Reset frames counter (start it from zero) inline void ResetFrames() { mgl_reset_frames(gr); } /// Delete primitives for i-th frame (work if MGL_VECT_FRAME is set on) inline void DelFrame(int i) { mgl_del_frame(gr, i); } /// Get drawing data for i-th frame (work if MGL_VECT_FRAME is set on) inline void GetFrame(int i) { mgl_get_frame(gr, i); } /// Set drawing data for i-th frame (work if MGL_VECT_FRAME is set on). Work as EndFrame() but don't add frame to GIF image. inline void SetFrame(int i) { mgl_set_frame(gr, i); } /// Append drawing data from i-th frame (work if MGL_VECT_FRAME is set on) inline void ShowFrame(int i){ mgl_show_frame(gr, i); } /// Clear list of primitives for current drawing inline void ClearFrame() { mgl_clear_frame(gr); } /// Start write frames to cinema using GIF format inline void StartGIF(const char *fname, int ms=100) { mgl_start_gif(gr, fname,ms); } /// Stop writing cinema using GIF format inline void CloseGIF() { mgl_close_gif(gr); } /// Export points and primitives in file using MGLD format inline void ExportMGLD(const char *fname, const char *descr=0) { mgl_export_mgld(gr, fname, descr); } /// Import points and primitives from file using MGLD format inline void ImportMGLD(const char *fname, bool add=false) { mgl_import_mgld(gr, fname, add); } /// Copy RGB values into array which is allocated by user /** Position of element {i,j} is [3*i + 3*Width*j]. */ inline bool GetRGB(char *imgdata, int imglen) { long w=mgl_get_width(gr), h=mgl_get_height(gr); if(imglen>=3*w*h) memcpy(imgdata, mgl_get_rgb(gr),3*w*h); return imglen>=3*w*h; } /// Get RGB values of current bitmap /** Position of element {i,j} is [3*i + 3*Width*j]. */ inline const unsigned char *GetRGB() { return mgl_get_rgb(gr); } /// Copy RGBA values into array which is allocated by user /** Position of element {i,j} is [4*i + 4*Width*j]. */ inline bool GetRGBA(char *imgdata, int imglen) { long w=mgl_get_width(gr), h=mgl_get_height(gr); if(imglen>=4*w*h) memcpy(imgdata, mgl_get_rgba(gr),4*w*h); return imglen>=4*w*h; } /// Get RGBA values of current bitmap /** Position of element {i,j} is [4*i + 4*Width*j]. */ inline const unsigned char *GetRGBA() { return mgl_get_rgba(gr); } /// Copy BGRN values into array which is allocated by user inline bool GetBGRN(unsigned char *imgdata, int imglen) { long w=mgl_get_width(gr), h=mgl_get_height(gr), i; const unsigned char *buf=mgl_get_rgb(gr); if(imglen>=4*w*h) for(i=0;i=4*w*h; } /// Copy RGBA values of background image into array which is allocated by user /** Position of element {i,j} is [4*i + 4*Width*j]. */ inline bool GetBackground(char *imgdata, int imglen) { long w=mgl_get_width(gr), h=mgl_get_height(gr); if(imglen>=4*w*h) memcpy(imgdata, mgl_get_background(gr),4*w*h); return imglen>=4*w*h; } /// Get RGBA values of background image /** Position of element {i,j} is [4*i + 4*Width*j]. */ inline const unsigned char *GetBackground() { return mgl_get_background(gr); } /// Get width of the image inline int GetWidth() { return mgl_get_width(gr); } /// Get height of the image inline int GetHeight() { return mgl_get_height(gr);} /// Calculate 3D coordinate {x,y,z} for screen point {xs,ys} inline mglPoint CalcXYZ(int xs, int ys) { mreal x,y,z; mgl_calc_xyz(gr,xs,ys,&x,&y,&z); return mglPoint(x,y,z); } /// Calculate screen point {xs,ys} for 3D coordinate {x,y,z} inline mglPoint CalcScr(mglPoint p) { int xs,ys; mgl_calc_scr(gr,p.x,p.y,p.z,&xs,&ys); return mglPoint(xs,ys); } /// Set object/subplot id inline void SetObjId(int id) { mgl_set_obj_id(gr,id); } /// Get object id inline int GetObjId(long x,long y) { return mgl_get_obj_id(gr,x,y); } /// Get subplot id inline int GetSplId(long x,long y) { return mgl_get_spl_id(gr,x,y); } /// Check if {\a xs,\a ys} is close to active point with accuracy d, and return its position or -1 inline long IsActive(int xs, int ys, int d=1) { return mgl_is_active(gr,xs,ys,d); } /// Combine plots from 2 canvases. Result will be saved into this inline void Combine(const mglGraph *g) { mgl_combine_gr(gr,g->gr); } /// Clear up the frame and fill background by specified color inline void Clf(double r, double g, double b) { mgl_clf_rgb(gr, r, g, b); } /// Clear up the frame and fill background by specified color inline void Clf(double r, double g, double b, double a) { mgl_clf_rgba(gr, r, g, b, a); } /// Clear up the frame and fill background by specified color inline void Clf(mglColor c) { mgl_clf_rgba(gr, c.r, c.g, c.b, c.a); } /// Clear up the frame and fill background by specified color with manual transparency inline void Clf(const char *col) { mgl_clf_str(gr, col); } /// Clear up the frame and fill background by specified color inline void Clf(char col) { mgl_clf_chr(gr, col); } /// Clear up the frame inline void Clf() { mgl_clf(gr); } /// Clear unused points and primitives. Useful only in combination with SetFaceNum(). inline void ClearUnused() { mgl_clear_unused(gr); } /// Load background image (basic variant: no scaling, whole image) inline void LoadBackground(const char *fname, double alpha=1) { mgl_load_background(gr,fname,alpha); } /// Load image for background from file. /** Parameter 'how' can be: * 'a' for filling current subplot only; * 's' for scaling (resizing) image to whole area; * 'c' for centering image; * 'm' for tessellate image as mosaic. */ inline void LoadBackground(const char *fname, const char *how, double alpha=1) { mgl_load_background_ext(gr,fname,how,alpha); } /// Fill background image by specified color. Colors r,g,b should be in range [0,1]. inline void FillBackground(const mglColor &cc) { mgl_fill_background(gr, cc.r,cc.g,cc.b,cc.a); } /// Force drawing the image and use it as background one inline void Rasterize() { mgl_rasterize(gr); } /// Draws the point (ball) at position {x,y,z} with color c inline void Ball(mglPoint p, char c='r') { char s[3]={'.',c,0}; mgl_mark(gr, p.x, p.y, p.z, s); } /// Draws the mark at position p inline void Mark(mglPoint p, const char *mark) { mgl_mark(gr, p.x, p.y, p.z, mark); } /// Draws the line between points by specified pen /** Large \a n (for example, n=100) should be used for geodesic line in curved coordinates */ inline void Line(mglPoint p1, mglPoint p2, const char *pen="B",int n=2) { mgl_line(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, pen, n); } /// Draws the spline curve between points by specified pen inline void Curve(mglPoint p1, mglPoint d1, mglPoint p2, mglPoint d2, const char *pen="B", int n=100) { mgl_curve(gr, p1.x, p1.y, p1.z, d1.x, d1.y, d1.z, p2.x, p2.y, p2.z, d2.x, d2.y, d2.z, pen, n); } /// Draws the 3d error box e for point p inline void Error(mglPoint p, mglPoint e, const char *pen="k") { mgl_error_box(gr, p.x, p.y, p.z, e.x, e.y, e.z, pen); } /// Draws Lamerey diagram for mapping x_new = f(x_old) /** String \a stl may contain: ‘v’ for drawing arrows; ‘~’ for disable 1st segment. * Option value set the number of segments (default is 20).*/ inline void Lamerey(double x0, const mglDataA &f, const char *stl="", const char *opt="") { mgl_lamerey_dat(gr,x0,&f,stl,opt); } inline void Lamerey(double x0, const char *func, const char *stl="", const char *opt="") { mgl_lamerey_str(gr,x0,func,stl,opt); } /// Draws Bifurcation diagram for mapping x_new = f(x_old) in x-axis range /** Option value set the number of stationary points (default is 1024).*/ inline void Bifurcation(double dx, const mglDataA &f, const char *stl="", const char *opt="") { mgl_bifurcation_dat(gr,dx,&f,stl,opt); } inline void Bifurcation(double dx, const char *func, const char *stl="", const char *opt="") { mgl_bifurcation_str(gr,dx,func,stl,opt); } /// Draws Iris plots for determining cross-dependences of data arrays /** NOTE: using the same ranges and empty ids will not draw axis. This will add data to existing Iris plot. * Option value set the size of data labels ids, separated by ';'.*/ inline void Iris(mglDataA &dats, const char *ids, const char *stl="", const char *opt="") { mgl_iris_1(gr,&dats,ids,stl,opt); } inline void Iris(mglDataA &dats, const wchar_t *ids, const char *stl="", const char *opt="") { mgl_irisw_1(gr,&dats,ids,stl,opt); } inline void Iris(mglDataA &dats, mglDataA &ranges, const char *ids, const char *stl="", const char *opt="") { mgl_iris(gr,&dats,&ranges,ids,stl,opt); } inline void Iris(mglDataA &dats, mglDataA &ranges, const wchar_t *ids, const char *stl="", const char *opt="") { mgl_irisw(gr,&dats,&ranges,ids,stl,opt); } /// Draws the face between points with color stl (include interpolation up to 4 colors). inline void Face(mglPoint p1, mglPoint p2, mglPoint p3, mglPoint p4, const char *stl="r") { mgl_face(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, p3.x, p3.y, p3.z, p4.x, p4.y, p4.z, stl); } /// Draws the face in y-z plane at point p with color stl (include interpolation up to 4 colors). inline void FaceX(mglPoint p, double wy, double wz, const char *stl="w", double dx=0, double dy=0) { mgl_facex(gr, p.x, p.y, p.z, wy, wz, stl, dx, dy); } /// Draws the face in x-z plane at point p with color stl (include interpolation up to 4 colors). inline void FaceY(mglPoint p, double wx, double wz, const char *stl="w", double dx=0, double dy=0) { mgl_facey(gr, p.x, p.y, p.z, wx, wz, stl, dx, dy); } /// Draws the face in x-y plane at point p with color stl (include interpolation up to 4 colors). inline void FaceZ(mglPoint p, double wx, double wy, const char *stl="w", double dx=0, double dy=0) { mgl_facez(gr, p.x, p.y, p.z, wx, wy, stl, dx, dy); } /// Draws the drop at point p in direction d with color col and radius r /** Parameter \a shift set the degree of drop oblongness: ‘0’ is sphere, ‘1’ is maximally oblongness drop. Parameter \a ap set relative width of the drop (this is analogue of “ellipticity” for the sphere).*/ inline void Drop(mglPoint p, mglPoint d, double r, const char *col="r", double shift=1, double ap=1) { mgl_drop(gr, p.x, p.y, p.z, d.x, d.y, d.z, r, col, shift, ap); } /// Draws the sphere at point p with color col and radius r inline void Sphere(mglPoint p, double r, const char *col="r") { mgl_sphere(gr, p.x, p.y, p.z, r, col); } /// Draws the cone between points p1,p2 with radius r1,r2 and with style stl /** Parameter \a stl can contain: * ‘@’ for drawing edges; * ‘#’ for wired cones; * ‘t’ for drawing tubes/cylinder instead of cones/prisms; * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones.*/ inline void Cone(mglPoint p1, mglPoint p2, double r1, double r2=-1, const char *stl="r@") { mgl_cone(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z,r1,r2,stl); } /// Draws the ellipse between points p1,p2 with color stl and width r /** Parameter \a stl can contain: * ‘#’ for wired figure (boundary only); * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ inline void Ellipse(mglPoint p1, mglPoint p2, double r, const char *stl="r") { mgl_ellipse(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, r,stl); } /// Draws the circle at point p with color stl and radius r /** Parameter \a stl can contain: * ‘#’ for wired figure (boundary only); * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ inline void Circle(mglPoint p, double r, const char *stl="r") { mgl_ellipse(gr, p.x, p.y, p.z, p.x, p.y, p.z, r,stl); } /// Draws the rhomb between points p1,p2 with color stl and width r /** Parameter \a stl can contain: * ‘#’ for wired figure (boundary only); * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ inline void Rhomb(mglPoint p1, mglPoint p2, double r, const char *stl="r") { mgl_rhomb(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, r,stl); } /// Draws the polygon based on points p1,p2 with color stl /** Parameter \a stl can contain: * ‘#’ for wired figure (boundary only); * ‘@’ for filled figure and with boundary (second color or black one is used for boundary).*/ inline void Polygon(mglPoint p1, mglPoint p2, int n, const char *stl="r") { mgl_polygon(gr, p1.x, p1.y, p1.z, p2.x, p2.y, p2.z, n,stl); } /// Draws the arc around axis pr with center at p0 and starting from p1, by color stl and angle a (in degrees) inline void Arc(mglPoint p0, mglPoint pa, mglPoint p1, double a, const char *stl="r") { mgl_arc_ext(gr, p0.x,p0.y,p0.z, pa.x,pa.y,pa.z, p1.x,p1.y,p1.z, a,stl); } /// Draws the arc around axis 'z' with center at p0 and starting from p1, by color stl and angle a (in degrees) inline void Arc(mglPoint p0, mglPoint p1, double a, const char *stl="r") { mgl_arc_ext(gr, p0.x,p0.y,p0.z, 0,0,1, p1.x,p1.y,p0.z, a,stl); } /// Draws bitmap (logo) which is stretched along whole axis range inline void Logo(long w, long h, const unsigned char *rgba, bool smooth=false, const char *opt="") { mgl_logo(gr, w, h, rgba, smooth, opt); } inline void Logo(const char *fname, bool smooth=false, const char *opt="") { mgl_logo_file(gr, fname, smooth, opt); } /// Draw user-defined symbol in position p inline void Symbol(mglPoint p, char id, const char *how="", double size=-1) { mgl_symbol(gr, p.x, p.y, p.z, id, how, size); } /// Draw user-defined symbol in position p along direction d inline void Symbol(mglPoint p, mglPoint d, char id, const char *how="", double size=-1) { mgl_symbol_dir(gr, p.x, p.y, p.z, d.x, d.y, d.z, id, how, size); } /// Print text in position p with specified font inline void Putsw(mglPoint p,const wchar_t *text,const char *font=":C",double size=-1) { mgl_putsw(gr, p.x, p.y, p.z, text, font, size); } /// Print text in position p with specified font inline void Puts(mglPoint p,const char *text,const char *font=":C",double size=-1) { mgl_puts(gr, p.x, p.y, p.z, text, font, size); } /// Print text in position p with specified font inline void Putsw(double x, double y,const wchar_t *text,const char *font=":AC",double size=-1) { mgl_putsw(gr, x, y, 0, text, font, size); } /// Print text in position p with specified font inline void Puts(double x, double y,const char *text,const char *font=":AC",double size=-1) { mgl_puts(gr, x, y, 0, text, font, size); } /// Print text in position p along direction d with specified font inline void Putsw(mglPoint p, mglPoint d, const wchar_t *text, const char *font=":L", double size=-1) { mgl_putsw_dir(gr, p.x, p.y, p.z, d.x, d.y, d.z, text, font, size); } /// Print text in position p along direction d with specified font inline void Puts(mglPoint p, mglPoint d, const char *text, const char *font=":L", double size=-1) { mgl_puts_dir(gr, p.x, p.y, p.z, d.x, d.y, d.z, text, font, size); } /// Print text along the curve inline void Text(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *text, const char *font="", const char *opt="") { mgl_text_xyz(gr, &x, &y, &z, text, font, opt); } /// Print text along the curve inline void Text(const mglDataA &x, const mglDataA &y, const char *text, const char *font="", const char *opt="") { mgl_text_xy(gr, &x, &y, text, font, opt); } /// Print text along the curve inline void Text(const mglDataA &y, const char *text, const char *font="", const char *opt="") { mgl_text_y(gr, &y, text, font, opt); } /// Print text along the curve inline void Text(const mglDataA &x, const mglDataA &y, const mglDataA &z, const wchar_t *text, const char *font="", const char *opt="") { mgl_textw_xyz(gr, &x, &y, &z, text, font, opt); } /// Print text along the curve inline void Text(const mglDataA &x, const mglDataA &y, const wchar_t *text, const char *font="", const char *opt="") { mgl_textw_xy(gr, &x, &y, text, font, opt); } /// Print text along the curve inline void Text(const mglDataA &y, const wchar_t *text, const char *font="", const char *opt="") { mgl_textw_y(gr, &y, text, font, opt); } /// Draws bounding box outside the plotting volume with color c. /** Style ‘@’ produce filled back faces. */ inline void Box(const char *col="", bool ticks=true) { mgl_box_str(gr, col, ticks); } /// Draw axises with ticks in direction(s) dir. /** Parameter \a dir may contain: * ‘xyzt’for drawing axis in corresponding direction; * ‘XYZT’ for drawing axis in corresponding direction but with inverted positions of labels; * ‘~’, ‘_’ for disabling tick labels; * ‘U’ for disabling rotation of tick labels; * ‘^’ for inverting default axis origin; * ‘!’ for disabling ticks tuning; * ‘AKDTVISO’ for drawing arrow at the end of axis; * ‘a’ for forced adjusting of axis ticks; * ‘f’ for printing ticks labels in fixed format; * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; * ‘F’ for printing ticks labels in LaTeX format; * ‘+’ for printing ‘+’ for positive ticks; * ‘-’ for printing usual ‘-’ in ticks labels; * ‘0123456789’ for precision at printing ticks labels. * Option "value" set the manual rotation angle for the ticks. */ inline void Axis(const char *dir="xyzt", const char *stl="", const char *opt="") { mgl_axis(gr, dir,stl,opt); } /// Draw grid lines perpendicular to direction(s) dir. inline void Grid(const char *dir="xyzt",const char *pen="B", const char *opt="") { mgl_axis_grid(gr, dir, pen, opt); } /// Print the label text for axis dir. /** Option "value" set additional shifting of the label. */ inline void Label(char dir, const char *text, double pos=+1, const char *opt="") { mgl_label(gr, dir, text, pos, opt); } /// Print the label text for axis dir. /** Option "value" set additional shifting of the label. */ inline void Label(char dir, const wchar_t *text, double pos=+1, const char *opt="") { mgl_labelw(gr, dir, text, pos, opt); } /// Draw colorbar at edge of axis /** Parameter \a sch may contain: * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; * ‘I’ for positioning near bounding (by default, at edges of subplot); * ‘A’ for using absolute coordinates; * ‘~’ for disabling tick labels. * ‘!’ for disabling ticks tuning; * ‘f’ for printing ticks labels in fixed format; * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; * ‘F’ for printing ticks labels in LaTeX format; * ‘+’ for printing ‘+’ for positive ticks; * ‘-’ for printing usual ‘-’ in ticks labels; * ‘0123456789’ for precision at printing ticks labels.*/ inline void Colorbar(const char *sch="", const char *opt="") { mgl_colorbar(gr, sch, opt); } /// Draw colorbar at manual position /** Parameter \a sch may contain: * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; * ‘I’ for positioning near bounding (by default, at edges of subplot); * ‘A’ for using absolute coordinates; * ‘~’ for disabling tick labels. * ‘!’ for disabling ticks tuning; * ‘f’ for printing ticks labels in fixed format; * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; * ‘F’ for printing ticks labels in LaTeX format; * ‘+’ for printing ‘+’ for positive ticks; * ‘-’ for printing usual ‘-’ in ticks labels; * ‘0123456789’ for precision at printing ticks labels.*/ inline void Colorbar(const char *sch,double x,double y,double w=1,double h=1, const char *opt="") { mgl_colorbar_ext(gr, sch, x,y,w,h, opt); } /// Draw colorbar with manual colors at edge of axis /** Parameter \a sch may contain: * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; * ‘I’ for positioning near bounding (by default, at edges of subplot); * ‘A’ for using absolute coordinates; * ‘~’ for disabling tick labels. * ‘!’ for disabling ticks tuning; * ‘f’ for printing ticks labels in fixed format; * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; * ‘F’ for printing ticks labels in LaTeX format; * ‘+’ for printing ‘+’ for positive ticks; * ‘-’ for printing usual ‘-’ in ticks labels; * ‘0123456789’ for precision at printing ticks labels.*/ inline void Colorbar(const mglDataA &val, const char *sch="", const char *opt="") { mgl_colorbar_val(gr, &val, sch, opt); } /// Draw colorbar with manual colors at manual position /** Parameter \a sch may contain: * ‘<>^_’ for positioning at left, at right, at top or at bottom correspondingly; * ‘I’ for positioning near bounding (by default, at edges of subplot); * ‘A’ for using absolute coordinates; * ‘~’ for disabling tick labels. * ‘!’ for disabling ticks tuning; * ‘f’ for printing ticks labels in fixed format; * ‘E’ for using ‘E’ instead of ‘e’ in ticks labels; * ‘F’ for printing ticks labels in LaTeX format; * ‘+’ for printing ‘+’ for positive ticks; * ‘-’ for printing usual ‘-’ in ticks labels; * ‘0123456789’ for precision at printing ticks labels.*/ inline void Colorbar(const mglDataA &val, const char *sch,double x,double y,double w=1,double h=1, const char *opt="") { mgl_colorbar_val_ext(gr, &val, sch, x,y,w,h, opt); } /// Add string to legend inline void AddLegend(const char *text,const char *style) { mgl_add_legend(gr, text, style); } inline void AddLegend(const wchar_t *text,const char *style) { mgl_add_legendw(gr, text, style); } /// Clear saved legend string inline void ClearLegend() { mgl_clear_legend(gr); } /// Draw legend of accumulated strings at position {x,y} /** Parameter fnt may contain: * font style for legend text; * colors for background (first one), border (second one) and text (last one); * ‘A’ for positioning in absolute coordinates; * ‘^’ for positioning outside of specified point; * ‘-’ for arranging entries horizontally; * ‘#’ for drawing box around legend. * Option value set the space between line samples and text (default is 0.1).*/ inline void Legend(double x, double y, const char *font="#", const char *opt="") { mgl_legend_pos(gr, x, y, font, opt); } /// Draw legend of accumulated strings /** Parameter fnt may contain: * font style for legend text; * colors for background (first one), border (second one) and text (last one); * ‘A’ for positioning in absolute coordinates; * ‘^’ for positioning outside of specified point; * ‘-’ for arranging entries horizontally; * ‘#’ for drawing box around legend. * Option value set the space between line samples and text (default is 0.1). * Parameter \a where sets position: 0 at bottom-left, 1 at bottom-right, 2 at top-left, 3 at top-right (default).*/ inline void Legend(int where=3, const char *font="#", const char *opt="") { mgl_legend(gr, where, font, opt); } /// Set number of marks in legend sample inline void SetLegendMarks(int num) { mgl_set_legend_marks(gr, num); } /// Draw usual curve {x,y,z} inline void Plot(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_plot_xyz(gr, &x, &y, &z, pen, opt); } /// Draw usual curve {x,y} inline void Plot(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_plot_xy(gr, &x, &y, pen,opt); } /// Draw usual curve {x,y} with x in x-axis range inline void Plot(const mglDataA &y, const char *pen="", const char *opt="") { mgl_plot(gr, &y, pen,opt); } /// Draw tapes which rotates as (bi-)normales of curve {x,y,z} /** The width of tape is proportional to barwidth and can be changed by option "value".*/ inline void Tape(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_tape_xyz(gr, &x, &y, &z, pen, opt); } /// Draw tapes which rotates as (bi-)normales of curve {x,y} /** The width of tape is proportional to barwidth and can be changed by option "value".*/ inline void Tape(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_tape_xy(gr, &x, &y, pen,opt); } /// Draw tapes which rotates as (bi-)normales of curve {x,y} with x in x-axis range /** The width of tape is proportional to barwidth and can be changed by option "value".*/ inline void Tape(const mglDataA &y, const char *pen="", const char *opt="") { mgl_tape(gr, &y, pen,opt); } /// Draw radar chart (plot in curved coordinates) /** Option "value" set the additional shift of data (i.e. the data a+value is used instead of a).*/ inline void Radar(const mglDataA &a, const char *pen="", const char *opt="") { mgl_radar(gr, &a, pen, opt); } /// Draw stairs for points in arrays {x,y,z} inline void Step(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_step_xyz(gr, &x, &y, &z, pen, opt); } /// Draw stairs for points in arrays {x,y} inline void Step(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_step_xy(gr, &x, &y, pen, opt); } /// Draw stairs for points in arrays {x,y} with x in x-axis range inline void Step(const mglDataA &y, const char *pen="", const char *opt="") { mgl_step(gr, &y, pen, opt); } /// Draw curve {x,y,z} which is colored by c (like tension plot) inline void Tens(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *pen="", const char *opt="") { mgl_tens_xyz(gr, &x, &y, &z, &c, pen, opt); } /// Draw curve {x,y} which is colored by c (like tension plot) inline void Tens(const mglDataA &x, const mglDataA &y, const mglDataA &c, const char *pen="", const char *opt="") { mgl_tens_xy(gr, &x, &y, &c, pen, opt); } /// Draw curve {x,y} with x in x-axis range which is colored by c (like tension plot) inline void Tens(const mglDataA &y, const mglDataA &c, const char *pen="", const char *opt="") { mgl_tens(gr, &y, &c, pen, opt); } /// Fill area between curve {x,y,z} and axis plane /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Area(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_area_xyz(gr, &x, &y, &z, pen, opt); } /// Fill area between curve {x,y} and axis plane /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Area(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_area_xy(gr, &x, &y, pen, opt); } /// Fill area between curve {x,y} with x in x-axis range and axis plane /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Area(const mglDataA &y, const char *pen="", const char *opt="") { mgl_area(gr, &y, pen, opt); } /// Fill area between curves {x,y1} and {x,y2} with x in x-axis range /** Style 'i' will fill area only if y1 < y2. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Region(const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_region(gr, &y1, &y2, pen, opt); } /// Fill area between curves {x,y1} and {x,y2} /** Style 'i' will fill area only if y1 < y2. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Region(const mglDataA &x, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_region_xy(gr, &x, &y1, &y2, pen, opt); } /// Fill area (draw ribbon) between curves {x1,y1,z1} and {x2,y2,z2} /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Region(const mglDataA &x1, const mglDataA &y1, const mglDataA &z1, const mglDataA &x2, const mglDataA &y2, const mglDataA &z2, const char *pen="", const char *opt="") { mgl_region_3d(gr, &x1, &y1, &z1, &x2, &y2, &z2, pen, opt); } /// Fill area (draw ribbon) between curves {x1,y1} and {x2,y2} /** Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Region(const mglDataA &x1, const mglDataA &y1, const mglDataA &x2, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_region_3d(gr, &x1, &y1, NULL, &x2, &y2, NULL, pen, opt); } /// Draw lines with arrows between points {x1,y1,z1} and {x2,y2,z2} inline void Lines(const mglDataA &x1, const mglDataA &y1, const mglDataA &z1, const mglDataA &x2, const mglDataA &y2, const mglDataA &z2, const char *pen="", const char *opt="") { mgl_lines_xyz(gr, &x1, &y1, &z1, &x2, &y2, &z2, pen, opt); } /// Draw lines with arrows between points {x1,y1,zMin} and {x2,y2,zMin} inline void Lines(const mglDataA &x1, const mglDataA &y1, const mglDataA &x2, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_lines_xy(gr, &x1, &y1, &x2, &y2, pen, opt); } /// Draw lines with arrows between: points {x1,y} and {x2,y} with y in y-axis range if \a pen contain 'x'; or points {x,y1} and {x,y2} with x in x-axis range. inline void Lines(const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="") { if(mglchr(pen,'x')) mgl_lines_x(gr, &y1, &y2, pen, opt); else mgl_lines(gr, &y1, &y2, pen, opt); } /// Draw vertical lines from points {x,y,z} to axis plane inline void Stem(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_stem_xyz(gr, &x, &y, &z, pen, opt); } /// Draw vertical lines from points {x,y} to axis plane inline void Stem(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_stem_xy(gr, &x, &y, pen, opt); } /// Draw vertical lines from points {x,y} with x in x-axis range to axis plane inline void Stem(const mglDataA &y, const char *pen="", const char *opt="") { mgl_stem(gr, &y, pen, opt); } /// Draw vertical bars from points {x,y,z} to axis plane /** String \a pen may contain: * ‘a’ for drawing boxes one above another (like summation); * ‘f’ for waterfall chart; * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Bars(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="", const char *opt="") { mgl_bars_xyz(gr, &x, &y, &z, pen, opt); } /// Draw vertical bars from points {x,y} to axis plane /** String \a pen may contain: * ‘a’ for drawing boxes one above another (like summation); * ‘f’ for waterfall chart; * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Bars(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_bars_xy(gr, &x, &y, pen, opt); } /// Draw vertical bars from points {x,y} with x in x-axis range to axis plane /** String \a pen may contain: * ‘a’ for drawing boxes one above another (like summation); * ‘f’ for waterfall chart; * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Bars(const mglDataA &y, const char *pen="", const char *opt="") { mgl_bars(gr, &y, pen, opt); } /// Draw horizontal bars from points {x,y} to axis plane /** String \a pen may contain: * ‘a’ for drawing boxes one above another (like summation); * ‘f’ for waterfall chart; * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Barh(const mglDataA &y, const mglDataA &v, const char *pen="", const char *opt="") { mgl_barh_yx(gr, &y, &v, pen, opt); } /// Draw horizontal bars from points {x,y} with y in y-axis range to axis plane /** String \a pen may contain: * ‘a’ for drawing boxes one above another (like summation); * ‘f’ for waterfall chart; * ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Barh(const mglDataA &v, const char *pen="", const char *opt="") { mgl_barh(gr, &v, pen, opt); } /// Draw chart for data a /** Space denote transparent color. Style '#' draw black borders. */ inline void Chart(const mglDataA &a, const char *colors="", const char *opt="") { mgl_chart(gr, &a, colors,opt); } /// Draw Open-High-Low-Close (OHLC) diagram /** Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */ inline void OHLC(const mglDataA &x, const mglDataA &open, const mglDataA &high, const mglDataA &low, const mglDataA &close, const char *pen="", const char *opt="") { mgl_ohlc_x(gr, &x, &open,&high,&low,&close,pen,opt); } /// Draw Open-High-Low-Close (OHLC) diagram with x in x-axis range /** Different colors for up and down values are used if number of specified colors is equal to 2*number of curves. */ inline void OHLC(const mglDataA &open, const mglDataA &high, const mglDataA &low, const mglDataA &close, const char *pen="", const char *opt="") { mgl_ohlc(gr, &open,&high,&low,&close,pen,opt); } /// Draw box-plot (special 5-value plot used in statistic) /** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/ inline void BoxPlot(const mglDataA &x, const mglDataA &y, const char *pen="", const char *opt="") { mgl_boxplot_xy(gr, &x, &y, pen,opt); } /// Draw box-plot (special 5-value plot used in statistic) with x in x-axis range /** String \a pen may contain ‘<’, ‘^’, ‘>’ for aligning boxes: at left, centered, at right.*/ inline void BoxPlot(const mglDataA &y, const char *pen="", const char *opt="") { mgl_boxplot(gr, &y, pen,opt); } /// Draw candle plot /** Different colors are used for up and down values if 2 colors are specified. * Style ‘#’ force drawing wire candle even for 2-color scheme. */ inline void Candle(const mglDataA &x, const mglDataA &v1, const mglDataA &v2, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_candle_xyv(gr, &x, &v1, &v2, &y1, &y2, pen, opt); } /// Draw candle plot with x in x-axis range /** Different colors are used for up and down values if 2 colors are specified. * Style ‘#’ force drawing wire candle even for 2-color scheme. */ inline void Candle(const mglDataA &v1, const mglDataA &v2, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_candle_yv(gr, &v1, &v2, &y1, &y2, pen, opt); } inline void Candle(const mglDataA &v1, const mglDataA &v2, const char *pen="", const char *opt="") { mgl_candle_yv(gr, &v1, &v2, NULL, NULL, pen, opt); } /// Draw candle plot with v1=v[i], v2=v[i+1] /** Different colors are used for up and down values if 2 colors are specified. * Style ‘#’ force drawing wire candle even for 2-color scheme. */ inline void Candle(const mglDataA &y, const mglDataA &y1, const mglDataA &y2, const char *pen="", const char *opt="") { mgl_candle(gr, &y, &y1, &y2, pen, opt); } /// Draw candle plot with v1=v[i], v2=v[i+1] /** Different colors are used for up and down values if 2 colors are specified. * Style ‘#’ force drawing wire candle even for 2-color scheme. */ inline void Candle(const mglDataA &y, const char *pen="", const char *opt="") { mgl_candle(gr, &y, NULL, NULL, pen, opt); } /// Draw cones from points {x,y,z} to axis plane /** String \a pen may contain: * ‘@’ for drawing edges; * ‘#’ for wired cones; * ‘t’ for drawing tubes/cylinders instead of cones/prisms; * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Cones(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *pen="@", const char *opt="") { mgl_cones_xyz(gr, &x, &y, &z, pen, opt); } /// Draw cones from points {x,z} to axis plane /** String \a pen may contain: * ‘@’ for drawing edges; * ‘#’ for wired cones; * ‘t’ for drawing tubes/cylinders instead of cones/prisms; * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Cones(const mglDataA &x, const mglDataA &z, const char *pen="@", const char *opt="") { mgl_cones_xz(gr, &x, &z, pen, opt); } /// Draw cones from points {x,z} with x in x-axis range to axis plane /** String \a pen may contain: * ‘@’ for drawing edges; * ‘#’ for wired cones; * ‘t’ for drawing tubes/cylinders instead of cones/prisms; * ‘4’, ‘6’, ‘8’ for drawing square, hex- or octo-prism instead of cones; * ‘<’, ‘^’ or ‘>’ for aligning cones left, right or centering them at its x-coordinates. * Gradient filling is used if number of specified colors is equal to 2*number of curves.*/ inline void Cones(const mglDataA &z, const char *pen="@", const char *opt="") { mgl_cones(gr, &z, pen, opt); } /// Draw error boxes {ey} at points {x,y} with x in x-axis range /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ inline void Error(const mglDataA &y, const mglDataA &ey, const char *pen="", const char *opt="") { mgl_error(gr, &y, &ey, pen, opt); } /// Draw error boxes {ey} at points {x,y} /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ inline void Error(const mglDataA &x, const mglDataA &y, const mglDataA &ey, const char *pen="", const char *opt="") { mgl_error_xy(gr, &x, &y, &ey, pen, opt); } /// Draw error boxes {ex,ey} at points {x,y} /** Style ‘@’ set to draw large semitransparent mark instead of error box.*/ inline void Error(const mglDataA &x, const mglDataA &y, const mglDataA &ex, const mglDataA &ey, const char *pen="", const char *opt="") { mgl_error_exy(gr, &x, &y, &ex, &ey, pen, opt); } /// Draw marks with size r at points {x,y,z} inline void Mark(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *pen, const char *opt="") { mgl_mark_xyz(gr, &x, &y, &z, &r, pen, opt); } /// Draw marks with size r at points {x,y} inline void Mark(const mglDataA &x, const mglDataA &y, const mglDataA &r, const char *pen, const char *opt="") { mgl_mark_xy(gr, &x, &y, &r, pen, opt); } /// Draw marks with size r at points {x,y} with x in x-axis range inline void Mark(const mglDataA &y, const mglDataA &r, const char *pen, const char *opt="") { mgl_mark_y(gr, &y, &r, pen, opt); } /// Draw Poincare map at condition s==0 for curve {x,y,z} inline void Pmap(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &s, const char *pen, const char *opt="") { mgl_pmap_xyz(gr, &x, &y, &z, &s, pen, opt); } /// Draw Poincare map at condition s==0 for curve {x,y} inline void Pmap(const mglDataA &x, const mglDataA &y, const mglDataA &s, const char *pen, const char *opt="") { mgl_pmap_xy(gr, &x, &y, &s, pen, opt); } /// Draw Poincare map at condition s==0 for curve {x,y} with x in x-axis range inline void Pmap(const mglDataA &y, const mglDataA &s, const char *pen, const char *opt="") { mgl_pmap(gr, &y, &s, pen, opt); } /// Draw textual marks with size r at points {x,y,z} inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *text, const char *fnt="", const char *opt="") { mgl_textmark_xyzr(gr, &x, &y, &z, &r, text, fnt, opt); } /// Draw textual marks with size r at points {x,y} inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &r, const char *text, const char *fnt="", const char *opt="") { mgl_textmark_xyr(gr, &x, &y, &r, text, fnt, opt); } /// Draw textual marks with size r at points {x,y} with x in x-axis range inline void TextMark(const mglDataA &y, const mglDataA &r, const char *text, const char *fnt="", const char *opt="") { mgl_textmark_yr(gr, &y, &r, text, fnt, opt); } /// Draw textual marks at points {x,y} with x in x-axis range inline void TextMark(const mglDataA &y, const char *text, const char *fnt="", const char *opt="") { mgl_textmark(gr, &y, text, fnt, opt); } /// Draw textual marks with size r at points {x,y,z} inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_textmarkw_xyzr(gr, &x, &y, &z, &r, text, fnt, opt); } /// Draw textual marks with size r at points {x,y} inline void TextMark(const mglDataA &x, const mglDataA &y, const mglDataA &r, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_textmarkw_xyr(gr, &x, &y, &r, text, fnt, opt); } /// Draw textual marks with size r at points {x,y} with x in x-axis range inline void TextMark(const mglDataA &y, const mglDataA &r, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_textmarkw_yr(gr, &y, &r, text, fnt, opt); } /// Draw textual marks at points {x,y} with x in x-axis range inline void TextMark(const mglDataA &y, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_textmarkw(gr, &y, text, fnt, opt); } /// Draw labels for points coordinate(s) at points {x,y,z} /** String \a fnt may contain: * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *text, const char *fnt="", const char *opt="") { mgl_label_xyz(gr, &x, &y, &z, text, fnt, opt); } /// Draw labels for points coordinate(s) at points {x,y} /** String \a fnt may contain: * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &x, const mglDataA &y, const char *text, const char *fnt="", const char *opt="") { mgl_label_xy(gr, &x, &y, text, fnt, opt); } /// Draw labels for points coordinate(s) at points {x,y} with x in x-axis range /** String \a fnt may contain: * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &y, const char *text, const char *fnt="", const char *opt="") { mgl_label_y(gr, &y, text, fnt, opt); } /// Draw labels for points coordinate(s) at points {x,y,z} /** String \a fnt may contain: * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &x, const mglDataA &y, const mglDataA &z, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_labelw_xyz(gr, &x, &y, &z, text, fnt, opt); } /// Draw labels for points coordinate(s) at points {x,y} /** String \a fnt may contain: * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &x, const mglDataA &y, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_labelw_xy(gr, &x, &y, text, fnt, opt); } /// Draw labels for points coordinate(s) at points {x,y} with x in x-axis range /** String \a fnt may contain: * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers.*/ inline void Label(const mglDataA &y, const wchar_t *text, const char *fnt="", const char *opt="") { mgl_labelw_y(gr, &y, text, fnt, opt); } /// Draw table for values val along given direction with row labels text /** String \a fnt may contain: * ‘#’ for drawing cell borders; * ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’); * ‘=’ for equal width of all cells; * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers. * Option value set the width of the table (default is 1).*/ inline void Table(const mglDataA &val, const char *text, const char *fnt="#|", const char *opt="") { mgl_table(gr, 0, 0, &val, text, fnt, opt); } /// Draw table for values val along given direction with row labels text /** String \a fnt may contain: * ‘#’ for drawing cell borders; * ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’); * ‘=’ for equal width of all cells; * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers. * Option value set the width of the table (default is 1).*/ inline void Table(const mglDataA &val, const wchar_t *text, const char *fnt="#|", const char *opt="") { mgl_tablew(gr, 0, 0, &val, text, fnt, opt); } /// Draw table for values val along given direction with row labels text at given position /** String \a fnt may contain: * ‘#’ for drawing cell borders; * ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’); * ‘=’ for equal width of all cells; * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers. * Option value set the width of the table (default is 1).*/ inline void Table(double x, double y, const mglDataA &val, const char *text, const char *fnt="#|", const char *opt="") { mgl_table(gr, x, y, &val, text, fnt, opt); } /// Draw table for values val along given direction with row labels text at given position /** String \a fnt may contain: * ‘#’ for drawing cell borders; * ‘|’ for limiting table widh by subplot one (equal to option ‘value 1’); * ‘=’ for equal width of all cells; * ‘f’ for fixed format of printed numbers; * ‘E’ for using ‘E’ instead of ‘e’; * ‘F’ for printing in LaTeX format; * ‘+’ for printing ‘+’ for positive numbers; * ‘-’ for printing usual ‘-’; * ‘0123456789’ for precision at printing numbers. * Option value set the width of the table (default is 1).*/ inline void Table(double x, double y, const mglDataA &val, const wchar_t *text, const char *fnt="#|", const char *opt="") { mgl_tablew(gr, x, y, &val, text, fnt, opt); } /// Draw tube with radius r around curve {x,y,z} inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *pen="", const char *opt="") { mgl_tube_xyzr(gr, &x, &y, &z, &r, pen, opt); } /// Draw tube with radius r around curve {x,y,z} inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &z, double r, const char *pen="", const char *opt="") { mgl_tube_xyz(gr, &x, &y, &z, r, pen, opt); } /// Draw tube with radius r around curve {x,y} inline void Tube(const mglDataA &x, const mglDataA &y, const mglDataA &r, const char *pen="", const char *opt="") { mgl_tube_xyr(gr, &x, &y, &r, pen, opt); } /// Draw tube with radius r around curve {x,y} inline void Tube(const mglDataA &x, const mglDataA &y, double r, const char *pen="", const char *opt="") { mgl_tube_xy(gr, &x, &y, r, pen, opt); } /// Draw tube with radius r around curve {x,y} with x in x-axis range inline void Tube(const mglDataA &y, const mglDataA &r, const char *pen="", const char *opt="") { mgl_tube_r(gr, &y, &r, pen, opt); } /// Draw tube with radius r around curve {x,y} with x in x-axis range inline void Tube(const mglDataA &y, double r, const char *pen="", const char *opt="") { mgl_tube(gr, &y, r, pen, opt); } /// Draw surface of curve {r,z} rotation around axis /** Style ‘#’ produce wire plot. Style ‘.’ produce plot by dots.*/ inline void Torus(const mglDataA &r, const mglDataA &z, const char *pen="", const char *opt="") { mgl_torus(gr, &r, &z, pen,opt); } /// Draw mesh lines for 2d data specified parametrically inline void Mesh(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_mesh_xy(gr, &x, &y, &z, stl, opt); } /// Draw mesh lines for 2d data inline void Mesh(const mglDataA &z, const char *stl="", const char *opt="") { mgl_mesh(gr, &z, stl, opt); } /// Draw waterfall plot for 2d data specified parametrically /** Style 'x' draw lines in x-direction. */ inline void Fall(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_fall_xy(gr, &x, &y, &z, stl, opt); } /// Draw waterfall plot for 2d data /** Style 'x' draw lines in x-direction. */ inline void Fall(const mglDataA &z, const char *stl="", const char *opt="") { mgl_fall(gr, &z, stl, opt); } /// Draw belts for 2d data specified parametrically /** Style 'x' draw belts in x-direction. */ inline void Belt(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_belt_xy(gr, &x, &y, &z, stl, opt); } /// Draw belts for 2d data /** Style 'x' draw belts in x-direction. */ inline void Belt(const mglDataA &z, const char *stl="", const char *opt="") { mgl_belt(gr, &z, stl, opt); } /// Draw belts for 2d data specified parametrically with color proportional to c /** Style 'x' draw belts in x-direction. */ inline void BeltC(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *stl="", const char *opt="") { mgl_beltc_xy(gr, &x, &y, &z, &c, stl, opt); } /// Draw belts for 2d data with color proportional to c /** Style 'x' draw belts in x-direction. */ inline void BeltC(const mglDataA &z, const mglDataA &c, const char *stl="", const char *opt="") { mgl_beltc(gr, &z, &c, stl, opt); } /// Draw surface for 2d data specified parametrically with color proportional to z /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void Surf(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_surf_xy(gr, &x, &y, &z, stl, opt); } /// Draw surface for 2d data with color proportional to z /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void Surf(const mglDataA &z, const char *stl="", const char *opt="") { mgl_surf(gr, &z, stl, opt); } /// Draw grid lines for density plot of 2d data specified parametrically inline void Grid(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_grid_xy(gr, &x, &y, &z, stl, opt); } /// Draw grid lines for density plot of 2d data inline void Grid(const mglDataA &z, const char *stl="", const char *opt="") { mgl_grid(gr, &z, stl, opt); } /// Draw vertical tiles with manual colors c for 2d data specified parametrically inline void Tile(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *stl="", const char *opt="") { mgl_tile_xyc(gr, &x, &y, &z, &c, stl, opt); } /// Draw vertical tiles for 2d data specified parametrically inline void Tile(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_tile_xy(gr, &x, &y, &z, stl, opt); } /// Draw vertical tiles for 2d data inline void Tile(const mglDataA &z, const char *stl="", const char *opt="") { mgl_tile(gr, &z, stl, opt); } /// Draw density plot for 2d data specified parametrically /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void Dens(const mglDataA &x, const mglDataA &y, const mglDataA &c, const char *stl="", const char *opt="") { mgl_dens_xy(gr, &x, &y, &c, stl, opt); } /// Draw density plot for 2d data /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void Dens(const mglDataA &c, const char *stl="", const char *opt="") { mgl_dens(gr, &c, stl, opt); } /// Draw vertical boxes for 2d data specified parametrically /** Style ‘#’ draw filled boxes. */ inline void Boxs(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *stl="", const char *opt="") { mgl_boxs_xy(gr, &x, &y, &z, stl, opt); } /// Draw vertical boxes for 2d data /** Style ‘#’ draw filled boxes. */ inline void Boxs(const mglDataA &z, const char *stl="", const char *opt="") { mgl_boxs(gr, &z, stl, opt); } /// Draw contour lines on parametric surface at manual levels for 2d data specified parametrically /** Style ‘f’ to draw solid contours. * Style 't'/'T' draw contour labels below/above contours.*/ inline void ContP(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") { mgl_contp_val(gr, &v, &x, &y, &z, &a, sch, opt); } /// Draw contour lines on parametric surface at manual levels for 2d data specified parametrically /** Style ‘f’ to draw solid contours. * Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ inline void ContP(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") { mgl_contp(gr, &x, &y, &z, &a, sch, opt); } /// Draw contour lines at manual levels for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. * Style 't'/'T' draw contour labels below/above contours.*/ inline void Cont(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_cont_xy_val(gr, &v, &x, &y, &z, sch, opt); } /// Draw contour lines for 2d data /** Style ‘_’ to draw contours at bottom of axis box. * Style 't'/'T' draw contour labels below/above contours.*/ inline void Cont(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="") { mgl_cont_val(gr, &v, &z, sch, opt); } /// Draw contour lines at manual levels for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ inline void Cont(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_cont_xy(gr, &x, &y, &z, sch, opt); } /// Draw contour lines for 2d data /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ inline void Cont(const mglDataA &z, const char *sch="", const char *opt="") { mgl_cont(gr, &z, sch, opt); } /// Draw contour lines at a[i,j]=val specified parametrically /** Style 't'/'T' draw contour labels below/above contours.*/ inline void ContGen(mreal val, const mglDataA &a, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_cont_gen(gr, val, &a, &x, &y, &z, sch, opt); } /// Draw solid contours at manual levels for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContF(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contf_xy_val(gr, &v, &x, &y, &z, sch, opt); } /// Draw solid contours at manual levels for 2d data /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContF(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contf_val(gr, &v, &z, sch, opt); } /// Draw solid contours for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ inline void ContF(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contf_xy(gr, &x, &y, &z, sch, opt); } /// Draw solid contours for 2d data /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ inline void ContF(const mglDataA &z, const char *sch="", const char *opt="") { mgl_contf(gr, &z, sch, opt); } /// Draw solid contours between a[i,j]=v1 and a[i,j]=v2 specified parametrically */ inline void ContFGen(mreal v1, mreal v2, const mglDataA &a, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contf_gen(gr, v1,v2, &a, &x, &y, &z, sch, opt); } /// Draw solid contours at manual levels for 2d data specified parametrically with specified colors /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContD(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contd_xy_val(gr, &v, &x, &y, &z, sch, opt); } /// Draw solid contours at manual levels for 2d data with specified colors /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContD(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contd_val(gr, &v, &z, sch, opt); } /// Draw solid contours for 2d data specified parametrically with specified colors /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ inline void ContD(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contd_xy(gr, &x, &y, &z, sch, opt); } /// Draw solid contours for 2d data with specified colors /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ inline void ContD(const mglDataA &z, const char *sch="", const char *opt="") { mgl_contd(gr, &z, sch, opt); } /// Draw contour tubes between manual levels for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContV(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contv_xy_val(gr, &v, &x, &y, &z, sch, opt); } /// Draw contour tubes between manual levels for 2d data /** Style ‘_’ to draw contours at bottom of axis box. */ inline void ContV(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contv_val(gr, &v, &z, sch, opt); } /// Draw contour tubes for 2d data specified parametrically /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ inline void ContV(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_contv_xy(gr, &x, &y, &z, sch, opt); } /// Draw contour tubes for 2d data /** Style ‘_’ to draw contours at bottom of axis box. * Option "value" set the number of contour levels (default is 7). */ inline void ContV(const mglDataA &z, const char *sch="", const char *opt="") { mgl_contv(gr, &z, sch, opt); } /// Draw axial-symmetric isosurfaces at manual levels for 2d data specified parametrically /** String \a sch may contain: * ‘#’ for wired plot; * ‘.’ for plot by dots; * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */ inline void Axial(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_axial_xy_val(gr, &v, &x, &y, &z, sch,opt); } /// Draw axial-symmetric isosurfaces at manual levels for 2d data /** String \a sch may contain: * ‘#’ for wired plot; * ‘.’ for plot by dots; * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). */ inline void Axial(const mglDataA &v, const mglDataA &z, const char *sch="", const char *opt="") { mgl_axial_val(gr, &v, &z, sch, opt); } /// Draw axial-symmetric isosurfaces for 2d data specified parametrically /** String \a sch may contain: * ‘#’ for wired plot; * ‘.’ for plot by dots; * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). * Option "value" set the number of isosurfaces (default is 3). */ inline void Axial(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_axial_xy(gr, &x, &y, &z, sch, opt); } /// Draw axial-symmetric isosurfaces for 2d data /** String \a sch may contain: * ‘#’ for wired plot; * ‘.’ for plot by dots; * ‘x’, ‘z’ for rotation around x-, z-axis correspondingly (default is y-axis). * Option "value" set the number of isosurfaces (default is 3). */ inline void Axial(const mglDataA &z, const char *sch="", const char *opt="") { mgl_axial(gr, &z, sch, opt); } /// Draw curves of cross-section of isosurfaces a and b at manual levels for 3d data specified parametrically /** Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void DCont(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *sch="", const char *opt="") { mgl_dcont_xyz(gr, &v, &x, &y, &z, &a, &b, sch, opt); } /// Draw curves of cross-section of isosurfaces a and b at manual levels for 3d data /** Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void DCont(const mglDataA &v, const mglDataA &a, const mglDataA &b, const char *sch="", const char *opt="") { mgl_dcont(gr, &v, &a, &b, sch, opt); } /// Draw curves of cross-section of isosurfaces a and b at manual levels for 3d data specified parametrically /** Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of isosurfaces (default is 3). */ inline void DCont(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *sch="", const char *opt="") { mgl_dcont_xyz(gr, NULL, &x, &y, &z, &a, &b, sch, opt); } /// Draw curves of cross-section of isosurfaces a and b at manual levels for 3d data /** Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of isosurfaces (default is 3). */ inline void DCont(const mglDataA &a, const mglDataA &b, const char *sch="", const char *opt="") { mgl_dcont(gr, NULL, &a, &b, sch, opt); } /// Draw grid lines for density plot at slice for 3d data specified parametrically /** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ inline void Grid3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_grid3_xyz(gr, &x, &y, &z, &a, stl, sVal, opt); } /// Draw grid lines for density plot at slice for 3d data /** Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ inline void Grid3(const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_grid3(gr, &a, stl, sVal, opt); } /// Draw density plot at slice for 3d data specified parametrically /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ inline void Dens3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_dens3_xyz(gr, &x, &y, &z, &a, stl, sVal, opt); } /// Draw density plot at slice for 3d data /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly.*/ inline void Dens3(const mglDataA &a, const char *stl="", double sVal=-1, const char *opt="") { mgl_dens3(gr, &a, stl, sVal, opt); } /// Draw isosurface for 3d data specified parametrically /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/ inline void Surf3(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="") { mgl_surf3_xyz_val(gr, Val, &x, &y, &z, &a, stl, opt); } /// Draw isosurface for 3d data /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots.*/ inline void Surf3(double Val, const mglDataA &a, const char *stl="", const char *opt="") { mgl_surf3_val(gr, Val, &a, stl, opt); } /// Draw isosurfaces for 3d data specified parametrically /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="") { mgl_surf3_xyz(gr, &x, &y, &z, &a, stl, opt); } /// Draw isosurfaces for 3d data /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3(const mglDataA &a, const char *stl="", const char *opt="") { mgl_surf3(gr, &a, stl, opt); } /// Draw a semi-transparent cloud for 3d data specified parametrically /** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */ inline void Cloud(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *stl="", const char *opt="") { mgl_cloud_xyz(gr, &x, &y, &z, &a, stl, opt); } /// Draw a semi-transparent cloud for 3d data /** Style ‘.’ produce plot by dots. Style ‘i’ use inverted values for transparency. */ inline void Cloud(const mglDataA &a, const char *stl="", const char *opt="") { mgl_cloud(gr, &a, stl, opt); } /// Draw contour lines at manual levels along slice for 3d data specified parametrically /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void Cont3(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3_xyz_val(gr, &v, &x, &y, &z, &a, sch, sVal, opt); } /// Draw contour lines at manual levels along slice for 3d data /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void Cont3(const mglDataA &v, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3_val(gr, &v, &a, sch, sVal, opt); } /// Draw contour lines along slice for 3d data specified parametrically /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ inline void Cont3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3_xyz(gr, &x, &y, &z, &a, sch, sVal, opt); } /// Draw contour lines along slice for 3d data /** Style ‘#’ draw grid lines. * Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ inline void Cont3(const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_cont3(gr, &a, sch, sVal, opt); } /// Draw solid contours at manual levels along slice for 3d data specified parametrically /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */ inline void ContF3(const mglDataA &v, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3_xyz_val(gr, &v, &x, &y, &z, &a, sch, sVal, opt); } /// Draw solid contours at manual levels along slice for 3d data /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. */ inline void ContF3(const mglDataA &v, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3_val(gr, &v, &a, sch, sVal, opt); } /// Draw solid contours along slice for 3d data specified parametrically /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Option "value" set the number of contour levels (default is 7).*/ inline void ContF3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3_xyz(gr, &x, &y, &z, &a, sch, sVal, opt); } /// Draw solid contours along slice for 3d data /** Style ‘#’ draw grid lines. Style ‘x’ or ‘z’ produce plot perpendicular to x- or z-direction correspondingly. * Option "value" set the number of contour levels (default is 7).*/ inline void ContF3(const mglDataA &a, const char *sch="", double sVal=-1, const char *opt="") { mgl_contf3(gr, &a, sch, sVal, opt); } /// Draw several isosurfaces for 3d beam in curvilinear coordinates /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots. * Variable \a flag is bitwise: * ‘0x1’ - draw in accompanied (not laboratory) coordinates; * ‘0x2’ - draw projection to \rho-z plane; * ‘0x4’ - draw normalized in each slice field.*/ inline void Beam(const mglDataA &tr, const mglDataA &g1, const mglDataA &g2, const mglDataA &a, double r, const char *stl=0, int flag=0, int num=3) { mgl_beam(gr, &tr,&g1,&g2,&a,r,stl,flag,num); } /// Draw isosurface at value \a val for 3d beam in curvilinear coordinates /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots. * Variable \a flag is bitwise: * ‘0x1’ - draw in accompanied (not laboratory) coordinates; * ‘0x2’ - draw projection to \rho-z plane; * ‘0x4’ - draw normalized in each slice field.*/ inline void Beam(double val, const mglDataA &tr, const mglDataA &g1, const mglDataA &g2, const mglDataA &a, double r, const char *stl=NULL, int flag=0) { mgl_beam_val(gr,val,&tr,&g1,&g2,&a,r,stl,flag); } /// Draw vertical tiles with variable size r and manual colors c for 2d data specified parametrically inline void TileS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const mglDataA &c, const char *stl="", const char *opt="") { mgl_tiles_xyc(gr, &x, &y, &z, &r, &c, stl, opt); } /// Draw vertical tiles with variable size r for 2d data specified parametrically inline void TileS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &r, const char *stl="", const char *opt="") { mgl_tiles_xy(gr, &x, &y, &z, &r, stl, opt); } /// Draw vertical tiles with variable size r for 2d data inline void TileS(const mglDataA &z, const mglDataA &r, const char *stl="", const char *opt="") { mgl_tiles(gr, &z, &r, stl, opt); } /// Draw surface for 2d data specified parametrically with color proportional to c /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void SurfC(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_surfc_xy(gr, &x, &y, &z, &c, sch,opt); } /// Draw surface for 2d data with color proportional to c /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void SurfC(const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_surfc(gr, &z, &c, sch,opt); } /// Draw surface for 2d data specified parametrically with alpha proportional to c /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void SurfA(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_surfa_xy(gr, &x, &y, &z, &c, sch,opt); } /// Draw surface for 2d data with alpha proportional to c /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void SurfA(const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_surfa(gr, &z, &c, sch,opt); } /// Draw surface for 2d data specified parametrically with color proportional to c and alpha proportional to a /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void SurfCA(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const mglDataA &a, const char *sch="", const char *opt="") { mgl_surfca_xy(gr, &x, &y, &z, &c, &a, sch,opt); } /// Draw surface for 2d data with color proportional to c and alpha proportional to a /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void SurfCA(const mglDataA &z, const mglDataA &c, const mglDataA &a, const char *sch="", const char *opt="") { mgl_surfca(gr, &z, &c, &a, sch,opt); } /// Color map of matrix a to matrix b, both matrix can parametrically depend on coordinates /** Style ‘.’ produce plot by dots. */ inline void Map(const mglDataA &x, const mglDataA &y, const mglDataA &a, const mglDataA &b, const char *sch="", const char *opt="") { mgl_map_xy(gr, &x, &y, &a, &b, sch, opt); } /// Color map of matrix a to matrix b /** Style ‘.’ produce plot by dots. */ inline void Map(const mglDataA &a, const mglDataA &b, const char *sch="", const char *opt="") { mgl_map(gr, &a, &b, sch, opt); } /// Draw density plot for spectra-gramm specified parametrically /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void STFA(const mglDataA &x, const mglDataA &y, const mglDataA &re, const mglDataA &im, int dn, const char *sch="", const char *opt="") { mgl_stfa_xy(gr, &x, &y, &re, &im, dn, sch, opt); } /// Draw density plot for spectra-gramm /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void STFA(const mglDataA &re, const mglDataA &im, int dn, const char *sch="", const char *opt="") { mgl_stfa(gr, &re, &im, dn, sch, opt); } /// Draw isosurface for 3d data specified parametrically with alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ inline void Surf3A(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a_xyz_val(gr, Val, &x, &y, &z, &a, &b, stl, opt); } /// Draw isosurface for 3d data with alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ inline void Surf3A(double Val, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a_val(gr, Val, &a, &b, stl, opt); } /// Draw isosurfaces for 3d data specified parametrically with alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3A(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a_xyz(gr, &x, &y, &z, &a, &b, stl, opt); } /// Draw isosurfaces for 3d data with alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3A(const mglDataA &a, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3a(gr, &a, &b, stl, opt); } /// Draw isosurface for 3d data specified parametrically with color proportional to c /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ inline void Surf3C(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="") { mgl_surf3c_xyz_val(gr, Val, &x, &y, &z, &a, &c, stl,opt); } /// Draw isosurface for 3d data with color proportional to c /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ inline void Surf3C(double Val, const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="") { mgl_surf3c_val(gr, Val, &a, &c, stl, opt); } /// Draw isosurfaces for 3d data specified parametrically with color proportional to c /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3C(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="") { mgl_surf3c_xyz(gr, &x, &y, &z, &a, &c, stl, opt); } /// Draw isosurfaces for 3d data specified parametrically with color proportional to c /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3C(const mglDataA &a, const mglDataA &c, const char *stl="", const char *opt="") { mgl_surf3c(gr, &a, &c, stl, opt); } /// Draw isosurface for 3d data specified parametrically with color proportional to c and alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ inline void Surf3CA(double Val, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3ca_xyz_val(gr, Val, &x, &y, &z, &a, &c, &b, stl,opt); } /// Draw isosurface for 3d data with color proportional to c and alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. */ inline void Surf3CA(double Val, const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3ca_val(gr, Val, &a, &c, &b, stl, opt); } /// Draw isosurfaces for 3d data specified parametrically with color proportional to c and alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3CA(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3ca_xyz(gr, &x, &y, &z, &a, &c, &b, stl, opt); } /// Draw isosurfaces for 3d data with color proportional to c and alpha proportional to b /** Style ‘#’ draw wired plot. Style ‘.’ produce plot by dots. * Option "value" set the number of isosurfaces (default is 3). */ inline void Surf3CA(const mglDataA &a, const mglDataA &c, const mglDataA &b, const char *stl="", const char *opt="") { mgl_surf3ca(gr, &a, &c, &b, stl, opt); } /// Plot dew drops for vector field {ax,ay} parametrically depended on coordinate {x,y} inline void Dew(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_dew_xy(gr, &x, &y, &ax, &ay, sch, opt); } /// Plot dew drops for vector field {ax,ay} inline void Dew(const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_dew_2d(gr, &ax, &ay, sch, opt); } /// Plot vectors at position {x,y} along {ax,ay} with length/color proportional to |a| /** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */ inline void Traj(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_traj_xy(gr, &x, &y, &ax, &ay, sch, opt); } /// Plot vectors at position {x,y,z} along {ax,ay,az} with length/color proportional to |a| /** Option value set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if value=0). */ inline void Traj(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_traj_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, opt); } /// Plot vector field {ax,ay} parametrically depended on coordinate {x,y} with length/color proportional to |a| /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows. */ inline void Vect(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_vect_xy(gr, &x, &y, &ax, &ay, sch, opt); } /// Plot vector field {ax,ay} with length/color proportional to |a| /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows. */ inline void Vect(const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_vect_2d(gr, &ax, &ay, sch, opt); } /// Plot vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with length/color proportional to |a| /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows. */ inline void Vect(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_vect_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, opt); } /// Plot vector field {ax,ay,az} with length/color proportional to |a| /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows. */ inline void Vect(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_vect_3d(gr, &ax, &ay, &az, sch, opt); } /// Draw vector plot along slice for 3d data specified parametrically /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows, * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */ inline void Vect3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *stl="", double sVal=-1, const char *opt="") { mgl_vect3_xyz(gr, &x, &y, &z, &ax,&ay,&az, stl, sVal, opt); } /// Draw vector plot along slice for 3d data /** String \a sch may contain: * ‘f’ for drawing arrows with fixed lengths, * ‘ >’, ‘<’ for drawing arrows to or from the ce*ll point (default is centering), * ‘.’ for drawing hachures with dots instead of arrows, * ‘=’ for enabling color gradient along arrows, * ‘ x’, ‘z’ for producing plot perpendicular to x- or z-direction correspondingly. */ inline void Vect3(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *stl="", double sVal=-1, const char *opt="") { mgl_vect3(gr, &ax,&ay,&az, stl, sVal, opt); } /// Plot flows for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ inline void Flow(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_flow_xy(gr, &x, &y, &ax, &ay, sch, opt); } /// Plot flows for vector field {ax,ay} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ inline void Flow(const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_flow_2d(gr, &ax, &ay, sch, opt); } /// Plot flows for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ inline void Flow(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_flow_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, opt); } /// Plot flows for vector field {ax,ay,az} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ inline void Flow(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_flow_3d(gr, &ax, &ay, &az, sch, opt); } /// Plot flow from point p for vector field {ax,ay} parametrically depended on coordinate {x,y} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads. */ inline void FlowP(mglPoint p, const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_flowp_xy(gr, p.x, p.y, p.z, &x, &y, &ax, &ay, sch, opt); } /// Plot flow from point p for vector field {ax,ay} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads. */ inline void FlowP(mglPoint p, const mglDataA &ax, const mglDataA &ay, const char *sch="", const char *opt="") { mgl_flowp_2d(gr, p.x, p.y, p.z, &ax, &ay, sch, opt); } /// Plot flow from point p for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */ inline void FlowP(mglPoint p, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_flowp_xyz(gr, p.x, p.y, p.z, &x, &y, &z, &ax, &ay, &az, sch, opt); } /// Plot flow from point p for vector field {ax,ay,az} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. */ inline void FlowP(mglPoint p, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", const char *opt="") { mgl_flowp_3d(gr, p.x, p.y, p.z, &ax, &ay, &az, sch, opt); } /// Plot flows from given plain for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * 'v' for drawing arrows on the threads; * 't' for drawing tapes of normals in x-y and y-z planes. * Option "value" sets the number of threads (default is 5). */ inline void Flow3(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double sVal=-1, const char *opt="") { mgl_flow3_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, sVal, opt); } /// Plot flows from given plain for vector field {ax,ay,az} with color proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * 'v' for drawing arrows on the threads; * 't' for drawing tapes of normals in x-y and y-z planes. * Option "value" sets the number of threads (default is 5). */ inline void Flow3(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double sVal=-1, const char *opt="") { mgl_flow3(gr, &ax, &ay, &az, sch, sVal, opt); } /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y,z} /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ inline void Grad(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &phi, const char *sch="", const char *opt="") { mgl_grad_xyz(gr,&x,&y,&z,&phi,sch,opt); } /// Plot flows for gradient of scalar field phi parametrically depended on coordinate {x,y} /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ inline void Grad(const mglDataA &x, const mglDataA &y, const mglDataA &phi, const char *sch="", const char *opt="") { mgl_grad_xy(gr,&x,&y,&phi,sch,opt); } /// Plot flows for gradient of scalar field phi /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘v’ for drawing arrows on the threads; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ inline void Grad(const mglDataA &phi, const char *sch="", const char *opt="") { mgl_grad(gr,&phi,sch,opt); } /// Plot flow pipes for vector field {ax,ay} parametrically depended on coordinate {x,y} with color and radius proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘i’ for pipe radius to be inverse proportional to amplitude. * Option "value" sets the number of threads (default is 5). */ inline void Pipe(const mglDataA &x, const mglDataA &y, const mglDataA &ax, const mglDataA &ay, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_xy(gr, &x, &y, &ax, &ay, sch, r0, opt); } /// Plot flow pipes for vector field {ax,ay} with color and radius proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘i’ for pipe radius to be inverse proportional to amplitude. * Option "value" sets the number of threads (default is 5). */ inline void Pipe(const mglDataA &ax, const mglDataA &ay, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_2d(gr, &ax, &ay, sch, r0, opt); } /// Plot flow pipes for vector field {ax,ay,az} parametrically depended on coordinate {x,y,z} with color and radius proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘i’ for pipe radius to be inverse proportional to amplitude; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ inline void Pipe(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_xyz(gr, &x, &y, &z, &ax, &ay, &az, sch, r0, opt); } /// Plot flow pipes for vector field {ax,ay,az} with color and radius proportional to |a| /** String \a sch may contain: * color scheme: up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); * ‘#’ for starting threads from edges only; * ‘i’ for pipe radius to be inverse proportional to amplitude; * ‘x’, ‘z’ for drawing tapes of normals in x-y and y-z planes correspondingly. * Option "value" sets the number of threads (default is 5). */ inline void Pipe(const mglDataA &ax, const mglDataA &ay, const mglDataA &az, const char *sch="", double r0=0.05, const char *opt="") { mgl_pipe_3d(gr, &ax, &ay, &az, sch, r0, opt); } /// Draw density plot for data at x = sVal /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void DensX(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_dens_x(gr, &a, stl, sVal, opt); } /// Draw density plot for data at y = sVal /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void DensY(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_dens_y(gr, &a, stl, sVal, opt); } /// Draw density plot for data at z = sVal /** Style ‘#’ draw grid lines. Style ‘.’ produce plot by dots.*/ inline void DensZ(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_dens_z(gr, &a, stl, sVal, opt); } /// Draw contour lines for data at x = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ inline void ContX(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_x(gr, &a, stl, sVal, opt); } /// Draw contour lines at manual levels for data at x = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void ContX(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_x_val(gr, &v, &a, stl, sVal, opt); } /// Draw contour lines for data at y = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ inline void ContY(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_y(gr, &a, stl, sVal, opt); } /// Draw contour lines at manual levels for data at y = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void ContY(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_y_val(gr, &v, &a, stl, sVal, opt); } /// Draw contour lines for data at z = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. * Option "value" set the number of contour levels (default is 7). */ inline void ContZ(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_z(gr, &a, stl, sVal, opt); } /// Draw contour lines at manual levels for data at z = sVal /** Style ‘t’/‘T’ draw contour labels below/above contours. */ inline void ContZ(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_cont_z_val(gr, &v, &a, stl, sVal, opt); } /// Draw solid contours for data at x = sVal /** Option "value" set the number of contour levels (default is 7). */ inline void ContFX(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_x(gr, &a, stl, sVal, opt); } /// Draw solid contours at manual levels for data at x = sVal inline void ContFX(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_x_val(gr, &v, &a, stl, sVal, opt); } /// Draw solid contours for data at y = sVal /** Option "value" set the number of contour levels (default is 7). */ inline void ContFY(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_y(gr, &a, stl, sVal, opt); } /// Draw solid contours at manual levels for data at y = sVal inline void ContFY(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_y_val(gr, &v, &a, stl, sVal, opt); } /// Draw solid contours for data at z = sVal /** Option "value" set the number of contour levels (default is 7). */ inline void ContFZ(const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_z(gr, &a, stl, sVal, opt); } /// Draw solid contours at manual levels for data at z = sVal inline void ContFZ(const mglDataA &v, const mglDataA &a, const char *stl="", double sVal=mglNaN, const char *opt="") { mgl_contf_z_val(gr, &v, &a, stl, sVal, opt); } /// Draw curve for formula with x in x-axis range /** Option "value" set initial number of points. */ inline void FPlot(const char *fy, const char *stl="", const char *opt="") { mgl_fplot(gr, fy, stl, opt); } /// Draw curve for formulas parametrically depended on t in range [0,1] /** Option "value" set initial number of points. */ inline void FPlot(const char *fx, const char *fy, const char *fz, const char *stl, const char *opt="") { mgl_fplot_xyz(gr, fx, fy, fz, stl, opt); } /// Draw surface by formula with x,y in axis range /** Option "value" set initial number of points. */ inline void FSurf(const char *fz, const char *stl="", const char *opt="") { mgl_fsurf(gr, fz, stl, opt); } /// Draw surface by formulas parametrically depended on u,v in range [0,1] /** Option "value" set initial number of points. */ inline void FSurf(const char *fx, const char *fy, const char *fz, const char *stl, const char *opt="") { mgl_fsurf_xyz(gr, fx, fy, fz, stl, opt); } /// Draw triangle mesh for points in arrays {x,y,z} with specified color c. /** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the triangle colors, else vertex colors. */ inline void TriPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_triplot_xyzc(gr, &nums, &x, &y, &z, &c, sch, opt); } /// Draw triangle mesh for points in arrays {x,y,z} /** Style ‘#’ produce wire plot. */ inline void TriPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_triplot_xyz(gr, &nums, &x, &y, &z, sch, opt); } /// Draw triangle mesh for points in arrays {x,y} /** Style ‘#’ produce wire plot. */ inline void TriPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const char *sch="", const char *opt="") { mgl_triplot_xy(gr, &nums, &x, &y, sch, opt); } /// Draw quad mesh for points in arrays {x,y,z} with specified color c /** Style ‘#’ produce wire plot. If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ inline void QuadPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const char *sch="", const char *opt="") { mgl_quadplot_xyzc(gr, &nums, &x, &y, &z, &c, sch, opt); } /// Draw quad mesh for points in arrays {x,y,z} /** Style ‘#’ produce wire plot. */ inline void QuadPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_quadplot_xyz(gr, &nums, &x, &y, &z, sch, opt); } /// Draw quad mesh for points in arrays {x,y} /** Style ‘#’ produce wire plot. */ inline void QuadPlot(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const char *sch="", const char *opt="") { mgl_quadplot_xy(gr, &nums, &x, &y, sch, opt); } /// Draw contour lines for triangle mesh for points in arrays {x,y,z} /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ inline void TriCont(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_tricont_xyc(gr, &nums, &x, &y, &z, sch, opt); } /// Draw contour lines for triangle mesh for points in arrays {x,y,z} /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. * Option "value" set the number of contour levels (default is 7). */ inline void TriContV(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_tricont_xycv(gr, &v, &nums, &x, &y, &z, sch, opt); } /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ inline void TriCont(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") { mgl_tricont_xyzc(gr, &nums, &x, &y, &z, &a, sch, opt); } /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ inline void TriContV(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") { mgl_tricont_xyzcv(gr, &v, &nums, &x, &y, &z, &a, sch, opt); } /// Draw contour lines for triangle mesh for points in arrays {x,y,z} with specified color c. /** Style ‘_’ to draw contours at bottom of axis box. * Style ‘t’/‘T’ draw contour labels below/above contours. * If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ inline void TriCont(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") { mgl_tricont_xyzcv(gr, &v, &nums, &x, &y, &z, &a, sch, opt); } /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} /** Option "value" set the number of contour levels (default is 7). */ inline void TriContVt(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_tricontv_xyc(gr, &nums, &x, &y, &z, sch, opt); } /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c /** Option "value" set the number of contour levels (default is 7). */ inline void TriContVt(const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") { mgl_tricontv_xyzc(gr, &nums, &x, &y, &z, &a, sch, opt); } /// Draw contour tubes for triangle mesh for points in arrays {x,y,z} with specified color c /** If id.ny=c.nx then c set the quadrangle colors, else vertex colors. */ inline void TriContVt(const mglDataA &v, const mglDataA &nums, const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") { mgl_tricontv_xyzcv(gr, &v, &nums, &x, &y, &z, &a, sch, opt); } /// Draw dots in points {x,y,z}. inline void Dots(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_dots(gr, &x, &y, &z, sch, opt); } /// Draw semitransparent dots in points {x,y,z} with specified alpha a. inline void Dots(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *sch="", const char *opt="") { mgl_dots_a(gr, &x, &y, &z, &a, sch, opt); } /// Draw semitransparent dots in points {x,y,z} with specified color c and alpha a. inline void Dots(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &c, const mglDataA &a, const char *sch="", const char *opt="") { mgl_dots_ca(gr, &x, &y, &z, &c, &a, sch, opt); } /// Draw surface reconstructed for points in arrays {x,y,z}. /** Style ‘#’ produce wired plot. */ inline void Crust(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *sch="", const char *opt="") { mgl_crust(gr, &x, &y, &z, sch, opt); } /// Fit data along x-direction for each data row. Return array with values for found formula. inline mglData Fit(const mglDataA &y, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_1(gr, &y, eq,vars,0, opt)); } /// Fit data along x-direction for each data row starting from \a ini values. Return array with values for found formula. inline mglData Fit(const mglDataA &y, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_1(gr, &y, eq, vars, &ini, opt)); } /// Fit data along x-, y-directions for each data slice. Return array with values for found formula. inline mglData Fit2(const mglDataA &z, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_2(gr, &z, eq, vars,0, opt)); } /// Fit data along x-, y-direction for each data slice starting from \a ini values. Return array with values for found formula. inline mglData Fit2(const mglDataA &z, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_2(gr, &z, eq, vars, &ini, opt)); } /// Fit data along along all directions. Return array with values for found formula. inline mglData Fit3(const mglDataA &a, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_3(gr, &a, eq, vars,0, opt)); } /// Fit data along all directions starting from \a ini values. Return array with values for found formula. inline mglData Fit3(const mglDataA &a, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_3(gr, &a, eq, vars, &ini, opt)); } /// Fit data along x-direction for each data row. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xy(gr, &x, &y, eq, vars,0, opt)); } /// Fit data along x-direction for each data row starting from \a ini values. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xy(gr, &x, &y, eq, vars, &ini, opt)); } /// Fit data along x-, y-directions for each data slice. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xyz(gr, &x, &y, &z, eq, vars,0, opt)); } /// Fit data along x-, y-directions for each data slice starting from \a ini values. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xyz(gr, &x, &y, &z, eq, vars, &ini, opt)); } /// Fit data along along all directions. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xyza(gr, &x, &y, &z, &a, eq, vars,0, opt)); } /// Fit data along along all directions starting from \a ini values. Return array with values for found formula. inline mglData Fit(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xyza(gr, &x, &y, &z, &a, eq,vars, &ini, opt)); } /// Fit data with dispersion s along x-direction for each data row. Return array with values for found formula. inline mglData FitS(const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_ys(gr, &y, &s, eq, vars,0, opt)); } /// Fit data with dispersion s along x-direction for each data row starting from \a ini values. Return array with values for found formula. inline mglData FitS(const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_ys(gr, &y, &s, eq, vars, &ini, opt)); } /// Fit data with dispersion s along x-direction for each data row. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xys(gr, &x, &y, &s, eq, vars,0, opt)); } /// Fit data with dispersion s along x-direction for each data row starting from \a ini values. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xys(gr, &x, &y, &s, eq, vars, &ini, opt)); } /// Fit data with dispersion s along x-, y-directions for each data slice. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &s, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xyzs(gr, &x, &y, &z, &s, eq, vars,0, opt)); } /// Fit data with dispersion s along x-, y-directions for each data slice starting from \a ini values. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xyzs(gr, &x, &y, &z, &s, eq, vars, &ini, opt)); } /// Fit data with dispersion s along all directions. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &s, const char *eq, const char *vars, const char *opt="") { return mglData(true,mgl_fit_xyzas(gr, &x, &y, &z, &a, &s, eq, vars,0, opt)); } /// Fit data with dispersion s along all directions starting from \a ini values. Return array with values for found formula. inline mglData FitS(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const mglDataA &s, const char *eq, const char *vars, mglData &ini, const char *opt="") { return mglData(true,mgl_fit_xyzas(gr, &x, &y, &z, &a, &s, eq, vars, &ini, opt)); } /// Print fitted last formula (with coefficients) inline void PutsFit(mglPoint p, const char *prefix=0, const char *font="", double size=-1) { mgl_puts_fit(gr, p.x, p.y, p.z, prefix, font, size); } /// Get last fitted formula inline const char *GetFit() const { return mgl_get_fit(gr); } /// Get chi for last fitted formula static inline mreal GetFitChi() { return mgl_get_fit_chi(); } /// Get covariance matrix for last fitted formula static inline mglData GetFitCovar() { return mglData(mgl_get_fit_covar()); } /// Solve PDE with x,y,z in range axis range inline mglData PDE(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, double dz=0.1, double k0=100, const char *opt="") { return mglData(true,mgl_pde_solve(gr,ham,&ini_re,&ini_im,dz,k0, opt)); } /// Solve PDE with x,y,z in range axis range inline mglDataC PDEc(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, double dz=0.1, double k0=100, const char *opt="") { return mglDataC(true,mgl_pde_solve_c(gr,ham,&ini_re,&ini_im,dz,k0, opt)); } /// Solve PDE with x,y,z in range axis range using advanced (slow!!!) method (2d only) inline mglData APDE(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, double dz=0.1, double k0=100, const char *opt="") { return mglData(true,mgl_pde_adv(gr,ham,&ini_re,&ini_im,dz,k0, opt)); } /// Solve PDE with x,y,z in range axis range using advanced (slow!!!) method (2d only) inline mglDataC APDEc(const char *ham, const mglDataA &ini_re, const mglDataA &ini_im, double dz=0.1, double k0=100, const char *opt="") { return mglDataC(true,mgl_pde_adv_c(gr,ham,&ini_re,&ini_im,dz,k0, opt)); } /// Fill data by formula with x,y,z in range axis range inline void Fill(mglData &u, const char *eq, const char *opt="") { mgl_data_fill_eq(gr, &u, eq, 0, 0, opt); } inline void Fill(mglData &u, const char *eq, const mglDataA &v, const char *opt="") { mgl_data_fill_eq(gr, &u, eq, &v, 0, opt); } inline void Fill(mglData &u, const char *eq, const mglDataA &v, const mglDataA &w, const char *opt="") { mgl_data_fill_eq(gr, &u, eq, &v, &w, opt); } /// Fill data by formula with x,y,z in range axis range inline void Fill(mglDataC &u, const char *eq, const char *opt="") { mgl_datac_fill_eq(gr, &u, eq, 0, 0, opt); } inline void Fill(mglDataC &u, const char *eq, const mglDataA &v, const char *opt="") { mgl_datac_fill_eq(gr, &u, eq, &v, 0, opt); } inline void Fill(mglDataC &u, const char *eq, const mglDataA &v, const mglDataA &w, const char *opt="") { mgl_datac_fill_eq(gr, &u, eq, &v, &w, opt); } /// Fill dat by interpolated values of vdat parametrically depended on xdat for x in axis range inline void Refill(mglData &dat, const mglDataA &xdat, const mglDataA &vdat, long sl=-1, const char *opt="") { mgl_data_refill_gr(gr,&dat,&xdat,0,0,&vdat,sl,opt); } /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat for x,y in axis range inline void Refill(mglData &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, long sl=-1, const char *opt="") { mgl_data_refill_gr(gr,&dat,&xdat,&ydat,0,&vdat,sl,opt); } /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range inline void Refill(mglData &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, const char *opt="") { mgl_data_refill_gr(gr,&dat,&xdat,&ydat,&zdat,&vdat,-1,opt); } /// Fill dat by interpolated values of vdat parametrically depended on xdat for x in axis range inline void Refill(mglDataC &dat, const mglDataA &xdat, const mglDataA &vdat, long sl=-1, const char *opt="") { mgl_datac_refill_gr(gr,&dat,&xdat,0,0,&vdat,sl,opt); } /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat for x,y in axis range inline void Refill(mglDataC &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &vdat, long sl=-1, const char *opt="") { mgl_datac_refill_gr(gr,&dat,&xdat,&ydat,0,&vdat,sl,opt); } /// Fill dat by interpolated values of vdat parametrically depended on xdat,ydat,zdat for x,y,z in axis range inline void Refill(mglDataC &dat, const mglDataA &xdat, const mglDataA &ydat, const mglDataA &zdat, const mglDataA &vdat, const char *opt="") { mgl_datac_refill_gr(gr,&dat,&xdat,&ydat,&zdat,&vdat,-1,opt); } /// Set the data by triangulated surface values assuming x,y,z in range axis range inline void DataGrid(mglData &d, const mglDataA &x, const mglDataA &y, const mglDataA &z, const char *opt="") { mgl_data_grid(gr,&d,&x,&y,&z,opt); } /// Make histogram (distribution) of data. This function do not plot data. /** Option "value" sets the size of output array (default is mglFitPnts=100). */ inline mglData Hist(const mglDataA &x, const mglDataA &a, const char *opt="") { return mglData(true, mgl_hist_x(gr, &x, &a, opt)); } /// Make histogram (distribution) of data. This function do not plot data. /** Option "value" sets the size of output array (default is mglFitPnts=100). */ inline mglData Hist(const mglDataA &x, const mglDataA &y, const mglDataA &a, const char *opt="") { return mglData(true, mgl_hist_xy(gr, &x, &y, &a, opt)); } /// Make histogram (distribution) of data. This function do not plot data. /** Option "value" sets the size of output array (default is mglFitPnts=100). */ inline mglData Hist(const mglDataA &x, const mglDataA &y, const mglDataA &z, const mglDataA &a, const char *opt="") { return mglData(true, mgl_hist_xyz(gr, &x, &y, &z, &a, opt)); } inline void Compression(bool){} // NOTE: Add later -- IDTF /// Set the preference for vertex color on/off (for formats that support it, now only PRC does). inline void VertexColor(bool enable) { mgl_set_flag(gr,enable, MGL_PREFERVC); } /// Render only front side of surfaces for dubugging purposes (for formats that support it, now only PRC does). inline void DoubleSided(bool enable) { mgl_set_flag(gr,!enable, MGL_ONESIDED); } // inline void TextureColor(bool){} // NOTE: Add later -- IDTF }; //----------------------------------------------------------------------------- /// Wrapper class for MGL parsing class MGL_EXPORT mglParse { HMPR pr; mglParse &operator=(mglParse &p) { pr = p.pr; mgl_use_parser(pr,1); return p; } public: mglParse(HMPR p) { pr = p; mgl_use_parser(pr,1); } mglParse(mglParse &p) { pr = p.pr; mgl_use_parser(pr,1); } mglParse(bool setsize=false) { pr=mgl_create_parser(); mgl_parser_allow_setsize(pr, setsize); } virtual ~mglParse() { #pragma omp critical if(mgl_use_parser(pr,-1)<1) mgl_delete_parser(pr); } /// Get pointer to internal mglParser object inline HMPR Self() { return pr; } /// Parse and draw single line of the MGL script inline int Parse(mglGraph *gr, const char *str, int pos) { return mgl_parse_line(gr->Self(), pr, str, pos); } inline int Parse(mglGraph *gr, const wchar_t *str, int pos) { return mgl_parse_linew(gr->Self(), pr, str, pos); } /// Execute MGL script text with '\n' separated lines inline void Execute(mglGraph *gr, const char *str) { mgl_parse_text(gr->Self(), pr, str); } inline void Execute(mglGraph *gr, const wchar_t *str) { mgl_parse_textw(gr->Self(), pr, str); } /// Execute and draw script from the file inline void Execute(mglGraph *gr, FILE *fp, bool print=false) { mgl_parse_file(gr->Self(), pr, fp, print); } /// Return type of command: 0 - not found, 1 - other data plot, 2 - func plot, /// 3 - setup, 4 - data handle, 5 - data create, 6 - subplot, 7 - program /// 8 - 1d plot, 9 - 2d plot, 10 - 3d plot, 11 - dd plot, 12 - vector plot /// 13 - axis, 14 - primitives, 15 - axis setup, 16 - text/legend, 17 - data transform inline int CmdType(const char *name) { return mgl_parser_cmd_type(pr, name); } /// Return string of command format (command name and its argument[s]) inline const char *CmdFormat(const char *name) { return mgl_parser_cmd_frmt(pr, name); } /// Return description of MGL command inline const char *CmdDesc(const char *name) { return mgl_parser_cmd_desc(pr, name); } /// Get name of command with number n inline const char *GetCmdName(long n) { return mgl_parser_cmd_name(pr,n); } /// Get number of defined commands inline long GetCmdNum() { return mgl_parser_cmd_num(pr); } /// Load new commands from external dynamic Library (must have "const mglCommand *mgl_cmd_extra" variable) inline void LoadDLL(const char *fname) { mgl_parser_load(pr, fname); } /// Apply one step for equation d vars[i]/dt = eqs[i] using Runge-Kutta method inline void RK_Step(const char *eqs, const char *vars, mreal dt=1) { mgl_rk_step(pr, eqs, vars, dt); } inline void RK_Step(const wchar_t *eqs, const wchar_t *vars, mreal dt=1) { mgl_rk_step_w(pr, eqs, vars, dt); } // Open all data arrays from HDF file and assign it as variables of parser p inline void OpenHDF(const char *fname) { mgl_parser_openhdf(pr, fname); } /// Set value for parameter $N inline void AddParam(int id, const char *str) { mgl_parser_add_param(pr, id, str); } inline void AddParam(int id, const wchar_t *str) { mgl_parser_add_paramw(pr, id, str); } /// Restore once flag inline void RestoreOnce() { mgl_parser_restore_once(pr); } /// Allow changing size of the picture inline void AllowSetSize(bool allow) { mgl_parser_allow_setsize(pr, allow); } /// Allow reading/saving files inline void AllowFileIO(bool allow) { mgl_parser_allow_file_io(pr, allow); } /// Allow loading commands from external libraries inline void AllowDllCall(bool allow) { mgl_parser_allow_dll_call(pr, allow); } /// Set flag to stop script parsing inline void Stop() { mgl_parser_stop(pr); } /// Set variant of argument(s) separated by '?' to be used in further commands inline void SetVariant(int var=0) { mgl_parser_variant(pr, var); } /// Set starting object ID inline void StartID(int id=0) { mgl_parser_start_id(pr, id); } /// Return result of formula evaluation inline mglData Calc(const char *formula) { return mglData(true,mgl_parser_calc(pr,formula)); } inline mglData Calc(const wchar_t *formula) { return mglData(true,mgl_parser_calcw(pr,formula)); } /// Return result of formula evaluation as complex data inline mglDataC CalcComplex(const char *formula) { return mglDataC(true,mgl_parser_calc_complex(pr,formula)); } inline mglDataC CalcComplex(const wchar_t *formula) { return mglDataC(true,mgl_parser_calc_complexw(pr,formula)); } /// Find variable with given name or add a new one /// NOTE !!! You must not delete obtained data arrays !!! inline mglDataA *AddVar(const char *name) { return mgl_parser_add_var(pr, name); } inline mglDataA *AddVar(const wchar_t *name) { return mgl_parser_add_varw(pr, name); } /// Find variable with given name or return NULL if no one /// NOTE !!! You must not delete obtained data arrays !!! inline mglDataA *FindVar(const char *name) { return mgl_parser_find_var(pr, name); } inline mglDataA *FindVar(const wchar_t *name) { return mgl_parser_find_varw(pr, name); } /// Get variable with given id. Can be NULL for temporary ones. /// NOTE !!! You must not delete obtained data arrays !!! inline mglDataA *GetVar(unsigned long id) { return mgl_parser_get_var(pr,id); } /// Get number of variables inline long GetNumVar() { return mgl_parser_num_var(pr); } /// Delete variable with name inline void DeleteVar(const char *name) { mgl_parser_del_var(pr, name); } inline void DeleteVar(const wchar_t *name) { mgl_parser_del_varw(pr, name); } /// Delete all data variables void DeleteAll() { mgl_parser_del_all(pr); } /// Get constant with given id. Can be NULL if not found. /// NOTE !!! You must not delete obtained data arrays !!! inline mglNum *GetConst(unsigned long id) { return mgl_parser_get_const(pr,id); } /// Get number of constants inline long GetNumConst() { return mgl_parser_num_const(pr); } }; //----------------------------------------------------------------------------- #endif #endif mathgl-8.0.1/include/mgl2/abstract.h0000664000175000017500000005606214167366472017053 0ustar balakinbalakin/*************************************************************************** * abstract.h is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU Lesser General Public License as * * published by the Free Software Foundation; either version 3 of the * * License, or (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU Lesser General Public * * License along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef _MGL_ABSTRACT_H_ #define _MGL_ABSTRACT_H_ #include "mgl2/define.h" //----------------------------------------------------------------------------- #ifdef __cplusplus #include "mgl2/type.h" #define MGL_TO_WCS(str,code) if(str && *str){size_t s=mbstowcs(0,str,0); wchar_t *wcs=new wchar_t[s+1]; mbstowcs(wcs,str,s); wcs[s]=0; code; delete []wcs;}else{const wchar_t *wcs=L""; code;} //----------------------------------------------------------------------------- class mglBase; class mglData; class mglDataA; class mglDataC; class mglParser; class mglFormula; class mglFormulaC; class mglFont; typedef mglBase* HMGL; typedef mglData* HMDT; typedef mglDataC* HADT; typedef mglParser* HMPR; typedef mglFormula* HMEX; typedef mglFormulaC* HAEX; typedef const mglDataA* HCDT; //----------------------------------------------------------------------------- std::string MGL_EXPORT mgl_data_to_string(HCDT d, long ns); std::string MGL_EXPORT mgl_datac_to_string(HCDT d, long ns); /// Get section separated by symbol ch. This is analog of QString::section(). std::string MGL_EXPORT mgl_str_arg(const std::string &str, char ch, int n1, int n2=-1); std::wstring MGL_EXPORT mgl_wcs_arg(const std::wstring &str, wchar_t ch, int n1, int n2); /// Get sections separated by symbol ch std::vector MGL_EXPORT mgl_str_args(const std::string &str, char ch); std::vector MGL_EXPORT mgl_wcs_args(const std::wstring &str, wchar_t ch); /// Get string from real number std::string MGL_EXPORT mgl_str_num(double val); /// Get string from complex number std::string MGL_EXPORT mgl_str_num(dual val); //----------------------------------------------------------------------------- extern "C" { #else #define mglDataA void #define mglNum void typedef void *HMGL; typedef void *HMDT; typedef void *HADT; typedef void *HMEX; typedef void *HAEX; typedef void *HMPR; typedef const void *HCDT; #endif /// Set buffer size for number of primitives as (1< mglDataList; #else __declspec(dllimport) extern std::vector mglDataList; #endif //----------------------------------------------------------------------------- /// Abstract class for data array class MGL_EXPORT mglDataA { public: mglString s; ///< Data name mglString id; ///< column (or slice) names bool temp; ///< This is temporary variable void (*func)(void *); ///< Callback function for destroying void *o; ///< Pointer to external object mglDataA() { mgl_init(); mglDataList.push_back(this); temp=false; func=0; o=0; } virtual ~mglDataA() { for(long i = mglDataList.size()-1; i>=0; i--) if(mglDataList[i] == this) { mglDataList.erase(mglDataList.begin()+i); break; } if(func) func(o); } /// Set name for data variable (can be used in mgl_formula_calc() or in MGL scripts) inline void Name(const char *name) { s = name; } inline void Name(const wchar_t *name) { s = name; } /// Get name of data variable inline const wchar_t *Name() const { return s.w; } /// Set names for columns (slices) inline void SetColumnId(const char *ids) { id = ids; } /// Make new id inline void NewId() { id = ""; } /// Get names for columns (slices) inline const char *GetColumnId() const { return id.s; } virtual void set_v(mreal /*val*/, long /*i*/,long /*j*/=0,long /*k*/=0) {} /// Get the interpolated value and its derivatives in given data cell without border checking virtual mreal valueD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const =0; /// Get the interpolated value in given data cell without border checking virtual mreal value(mreal x,mreal y=0,mreal z=0) const =0; /// Interpolate by linear function the data to given point inline mreal linear(mreal x,mreal y=0,mreal z=0) const { return mgl_data_linear_ext(this,x,y,z,0,0,0); } /// Interpolate by linear function the data to given point and get the gradient inline mreal linearD(mreal x,mreal y=0,mreal z=0,mreal *dx=0,mreal *dy=0,mreal *dz=0) const { return mgl_data_linear_ext(this,x,y,z,dx,dy,dz); } virtual mreal v(long i,long j=0,long k=0) const = 0; virtual mreal vthr(long i) const { return v(i%GetNx(), (i/GetNx())%GetNy(), i/(GetNx()*GetNy())); } virtual dual vc(long i,long j=0,long k=0) const { return v(i,j,k); } virtual dual vcthr(long i) const { return vthr(i); } virtual long GetNx() const = 0; virtual long GetNy() const = 0; virtual long GetNz() const = 0; inline long GetNN() const { return GetNx()*GetNy()*GetNz(); } virtual mreal dvx(long i,long j=0,long k=0) const = 0; // { return i>0 ? (i0 ? (j0 ? (k1?GetNx()-1:1; dif.y*=GetNy()>1?GetNy()-1:1; dif.z*=GetNz()>1?GetNz()-1:1; return res; } /// Interpolate by linear function the data to given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] inline mreal Linear(mreal x,mreal y=0,mreal z=0) const { return mgl_data_linear_ext(this,x,y,z,0,0,0); } /// Interpolate by line the data to given point x,\a y,\a z which normalized in range [0, 1] inline mreal Linear1(mreal x,mreal y=0,mreal z=0) const { return mgl_data_linear_ext(this,x*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1),0,0,0); } /// Interpolate by linear function the data and return its derivatives at given point x=[0...nx-1], y=[0...ny-1], z=[0...nz-1] inline mreal Linear(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const { return mgl_data_linear_ext(this,x,y,z, &(dif.x),&(dif.y), &(dif.z)); } /// Interpolate by line the data and return its derivatives at given point x,\a y,\a z which normalized in range [0, 1] inline mreal Linear1(mglPoint &dif, mreal x,mreal y=0,mreal z=0) const { mreal res=mgl_data_linear_ext(this,x*(GetNx()-1),y*(GetNy()-1),z*(GetNz()-1), &(dif.x),&(dif.y), &(dif.z)); dif.x*=GetNx()>1?GetNx()-1:1; dif.y*=GetNy()>1?GetNy()-1:1; dif.z*=GetNz()>1?GetNz()-1:1; return res; } }; //----------------------------------------------------------------------------- /// Structure for color ID struct MGL_EXPORT mglColorID { char id; mglColor col; }; MGL_EXPORT extern mglColorID mglColorIds[31]; // MGL_EXPORT extern std::string mglGlobalMess; ///< Buffer for receiving global messages //----------------------------------------------------------------------------- #endif #ifdef MGL_SRC #define _Da_(d) (*((const mglDataA *)(d))) #define _DA_(a) ((const mglDataA *)*(a)) #define _GR_ ((mglBase *)(*gr)) //#define _D_(d) *((mglData *)*(d)) #define _DM_(a) ((mglData *)*(a)) #define _DT_ ((mglData *)*d) #endif #endif mathgl-8.0.1/include/xpm/0000775000175000017500000000000014167366472015031 5ustar balakinbalakinmathgl-8.0.1/include/xpm/mark_sf.xpm0000664000175000017500000000063114167366472017201 0ustar balakinbalakin/* XPM */ static const char * mark_sf_xpm[] = { "16 16 2 1", " c None", ". c #007f00", "................", "................", "................", "................", "................", "................", "................", "................", "................", "................", "................", "................", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/mask_i.xpm0000664000175000017500000000062514167366472017025 0ustar balakinbalakin/* XPM */ static const char *mask_i_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "................", "................", "................", "................", "..######..######", "..######..######", "................", "................", "................", "................", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/barrow_k.xpm0000664000175000017500000000062314167366472017366 0ustar balakinbalakin/* XPM */ const char * barrow_k_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " .. ", " ... .. ", " .... .. ", " ..... .. ", " ........ ", "............... ", " ........ ", " ..... .. ", " .... .. ", " ... .. ", " .. ", " ", " ", " "}; mathgl-8.0.1/include/xpm/squize.xpm0000664000175000017500000000064714167366472017106 0ustar balakinbalakin/* XPM */ static const char * squize_xpm[] = { "16 16 3 1", " c None", ". c #007f00", "+ c #7FFF7F", " ", " ", " ...... ", " . . ", " . . ", " . . . . ", " +. . . .+ ", "...... ......", " +. . . .+ ", " . . . . ", " . . ", " . . ", " . . ", " ...... ", " ", " "}; mathgl-8.0.1/include/xpm/barrow_d.xpm0000664000175000017500000000062314167366472017357 0ustar balakinbalakin/* XPM */ const char * barrow_d_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " . ", " ... ", " ..... ", " ....... ", "............... ", " ....... ", " ..... ", " ... ", " . ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/crop.xpm0000664000175000017500000000062614167366472016526 0ustar balakinbalakin/* XPM */ static const char * crop_xpm[] = { "16 16 2 1", " c None", ". c #007f7f", " ", " . ", " ", " . ", " ", " . . ...... ", " . . ", " . . ", " . . ", " . . ", " ...... . . ", " ", " . ", " ", " . ", " "}; mathgl-8.0.1/include/xpm/barrow_t.xpm0000664000175000017500000000062314167366472017377 0ustar balakinbalakin/* XPM */ const char * barrow_t_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " .. ", " .... ", " ...... ", " ........ ", "............... ", " ........ ", " ...... ", " .... ", " .. ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/integr.xpm0000664000175000017500000000063014167366472017046 0ustar balakinbalakin/* XPM */ static const char * integr_xpm[] = { "16 16 2 1", " c None", ". c #007f7f", " ", " ", " ", " . ", " . ", " . . ", " . . ", " . . ", " . ... . . ", " . . . . ", " . . . . ", " . ... . . ", " . ", " ", " ", " "}; mathgl-8.0.1/include/xpm/oper.xpm0000664000175000017500000000062614167366472016530 0ustar balakinbalakin/* XPM */ static const char * oper_xpm[] = { "16 16 2 1", " c None", ". c #007f7f", " ", " . ", " . ", " ..... ..... ", " . ", " . ", " ", " ", " ", " . . ", " . . . . ", " . ... ", " . ... ", " . . . . ", " . . ", " "}; mathgl-8.0.1/include/xpm/right_1.xpm0000664000175000017500000000065014167366472017115 0ustar balakinbalakin/* XPM */ static const char * right_1_xpm[] = { "16 16 3 1", ". c None", "+ c #7F0000", "@ c #FF0000", "................", "................", "........+.......", "........++......", "........+@+.....", "..+++++++@@+....", "..+@@@@@@@@@+...", "..+@@@@@@@@@@+..", "..+@@@@@@@@@@@+.", "..+@@@@@@@@@@+..", "..+@@@@@@@@@+...", "..+++++++@@+....", "........+@+.....", "........++......", "........+.......", "................"}; mathgl-8.0.1/include/xpm/arrow_i.xpm0000664000175000017500000000063114167366472017221 0ustar balakinbalakin/* XPM */ static const char * arrow_i_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " .. ", " .. ", " .. ", " .. ", " .. ", " ...............", " .. ", " .. ", " .. ", " .. ", " .. ", " ", " ", " "}; mathgl-8.0.1/include/xpm/axis_sh.xpm0000664000175000017500000000065014167366472017216 0ustar balakinbalakin/* XPM */ static const char * axis_sh_xpm[] = { "16 16 3 1", " c None", ". c #007f7f", "+ c #FF0000", " ", " . ", ". . + ", " . +++ ", " . + ", ". . + + + ", " . +++++++++ ", " . + + + ", ". . + ", " . +++ ", " . + ", ". . ", " . ", " ............. ", ". ", " . . . . . "}; mathgl-8.0.1/include/xpm/rotate.xpm0000664000175000017500000000064414167366472017061 0ustar balakinbalakin/* XPM */ static const char *rotate_xpm[]={ "16 16 3 1", ". c None", "# c #000080", "a c #8080ff", "......#########.", "......#aaaaaa#..", ".......#aaaa##..", "..###..#aaaaa#..", ".#aa#..#aaa#aa#.", ".#aa#...#a##aa#.", "#aa#....#a#.#aa#", "#aa#.....#..#aa#", "#aa#........#aa#", "#aa#........#aa#", ".#a#........#a#.", ".#aa#......#aa#.", "..#aa##..##aa#..", "...#aaa##aaa#...", "....##aaaa##....", "......####......"}; mathgl-8.0.1/include/xpm/mask_s_.xpm0000664000175000017500000000062514167366472017176 0ustar balakinbalakin/* XPM */ static const char *mask_S_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "................", "................", "....########....", "....########....", "....########....", "....########....", "....########....", "....########....", "....########....", "....########....", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/text.xpm0000664000175000017500000000062614167366472016547 0ustar balakinbalakin/* XPM */ static const char * text_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ............ ", " ............ ", " . .. . ", " .. ", " .. ", " .. ", " .. ", " .. ", " .. ", " .. ", " .. ", " .. ", " .. ", " .... ", " "}; mathgl-8.0.1/include/xpm/mask_d_.xpm0000664000175000017500000000062514167366472017157 0ustar balakinbalakin/* XPM */ static const char *mask_D_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "........##......", "........##......", "......######....", "......######....", "....##########..", "....##########..", "......######....", "......######....", "........##......", "........##......", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/dash_d.xpm0000664000175000017500000000063014167366472017000 0ustar balakinbalakin/* XPM */ static const char * dash_d_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", " ", " ", " ", ". . . . ", " ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/tran.xpm0000664000175000017500000000066414167366472016531 0ustar balakinbalakin/* XPM */ static const char * tran_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #FF0000", "@ c #0000FF", " ", " ", " ......++++++++ ", " . . + ", " . . ..+ + + ++ ", " . . + ", " . . ..+ + + ++ ", " .++++.++++++++ ", " . . .. ", " . . @ ", " . . .. @@@ ", " . . @ ", " . . .. @ ", " . . @@ ", " . . .. @@@ ", " ...... "}; mathgl-8.0.1/include/xpm/mask_m.xpm0000664000175000017500000000062514167366472017031 0ustar balakinbalakin/* XPM */ static const char *mask_m_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "................", "................", "................", "................", "################", "################", "................", "................", "................", "................", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/arc.xpm0000664000175000017500000000062514167366472016327 0ustar balakinbalakin/* XPM */ static const char * arc_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ...... ", " .. .. ", " . . ", " . ", " . ", " .", " .", " .", " ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/oper_m.xpm0000664000175000017500000000064714167366472017047 0ustar balakinbalakin/* XPM */ static const char * oper_m_xpm[] = { "16 16 3 1", " c None", ". c #007f7f", "+ c #7FAFAF", " ", " ", " ", " ", " . . ", " +. .+ ", " +.+ ...... ", " ...... ", " +.+ ...... ", " +. .+ ", " . . ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/mark_rf.xpm0000664000175000017500000000063114167366472017200 0ustar balakinbalakin/* XPM */ static const char * mark_rf_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " .. ", " .... ", " ..... ", " ....... ", " ........ ", " .......... ", " ........... ", " ............", " ............", " ........... ", " .......... ", " ........ ", " ....... ", " ..... ", " .... ", " .. "}; mathgl-8.0.1/include/xpm/prev_sl.xpm0000664000175000017500000000070614167366472017234 0ustar balakinbalakin/* XPM */ static const char * prev_sl_xpm[] = { "16 16 5 1", " c None", ". c #00007F", "+ c #007FFF", "@ c #0000FF", "# c #003F80", " ", " .. ", " .+. ", " .++. ", " .+@++. ", " .+@+@++.... ", " .+@+@+@+@+@. ", " .+@+@@@@@@@@. ", " .@@@@@@@@@@@@. ", " .#@#@@@@@@@@. ", " .#@#@#@#@#@. ", " .#@#@#@.... ", " .#@#@. ", " .##. ", " .#. ", " .. "}; mathgl-8.0.1/include/xpm/mark_o.xpm0000664000175000017500000000063014167366472017026 0ustar balakinbalakin/* XPM */ static const char * mark_o_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ...... ", " .. .. ", " . . ", " . . ", " . . ", ". .", ". .", ". .", ". .", ". .", ". .", " . . ", " . . ", " . . ", " .. .. ", " ...... "}; mathgl-8.0.1/include/xpm/barrow_v.xpm0000664000175000017500000000062314167366472017401 0ustar balakinbalakin/* XPM */ const char * barrow_v_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ... ", " .... ", " ..... ", " ...... ", "........... ", " ...... ", " ..... ", " .... ", " ... ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/mark_t.xpm0000664000175000017500000000063014167366472017033 0ustar balakinbalakin/* XPM */ static const char * mark_t_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " .. ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", ". .", "................", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/mark_tf.xpm0000664000175000017500000000063114167366472017202 0ustar balakinbalakin/* XPM */ static const char * mark_tf_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " .. ", " .... ", " ...... ", " ...... ", " ........ ", " .......... ", " .......... ", " ............ ", " .............. ", " .............. ", "................", "................", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/mark_v.xpm0000664000175000017500000000063014167366472017035 0ustar balakinbalakin/* XPM */ static const char * mark_v_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", "................", ". .", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " .. "}; mathgl-8.0.1/include/xpm/mask_d.xpm0000664000175000017500000000062514167366472017020 0ustar balakinbalakin/* XPM */ static const char *mask_d_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "........##......", "........##......", "......##..##....", "......##..##....", "....##......##..", "....##......##..", "......##..##....", "......##..##....", "........##......", "........##......", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/plot.xpm0000664000175000017500000000066414167366472016543 0ustar balakinbalakin/* XPM */ static const char * plot_xpm[] = { "16 16 4 1", " c None", ". c #007f7f", "+ c #0000FF", "@ c #FF0000", " ", " . ", ".. + ", " . ++ ", " . + ", ".. + ", " . + ", " . + ", ".. @@@+ ", " . @ +@ @ ", " .@@ + @ @ ", ".. + @@@ ", " . ++ ", " .++ ", "............... ", " . . . . "}; mathgl-8.0.1/include/xpm/vect.xpm0000664000175000017500000000174014167366472016522 0ustar balakinbalakin/* XPM */ static const char * vect_xpm[] = { "16 16 41 1", " c None", ". c #B3FF00", "+ c #AEF900", "@ c #FBF400", "# c #FEF700", "$ c #FFDA00", "% c #AFFB00", "& c #FDF600", "* c #FDF500", "= c #FD9600", "- c #FD9000", "; c #FA8F00", "> c #FEAB00", ", c #FD9500", "' c #FB9400", ") c #FE9100", "! c #FBAA00", "~ c #FCA900", "{ c #FF9700", "] c #FF9200", "^ c #FDA900", "/ c #FDAB00", "( c #FB9D00", "_ c #FC0B00", ": c #FF0A00", "< c #FF4400", "[ c #FB4200", "} c #FC9E00", "| c #FE9F00", "1 c #FD4400", "2 c #FC4400", "3 c #FFA000", "4 c #FB1600", "5 c #FCAD00", "6 c #D00000", "7 c #D20000", "8 c #FD1500", "9 c #FA1500", "0 c #FEAF00", "a c #D10000", "b c #FDAE00", " .+ @# $ ", " % &@ $ ", ". & ", " * ", " = -; >", " ,' ) !~", "{ ] ^ ", " ] / ", " (", " _: <[ }|", " _ 12 3 ", " < | ", " ", " 4 5", " 67 89 50", "a 8 b "}; mathgl-8.0.1/include/xpm/oper_d.xpm0000664000175000017500000000063014167366472017026 0ustar balakinbalakin/* XPM */ static const char * oper_d_xpm[] = { "16 16 2 1", " c None", ". c #007f7f", " ", " ", " ", " . ", " . ", " . ", " . ...... ", " . ", " . ...... ", " . ", " . ", " . ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/oper_of.xpm0000664000175000017500000000065014167366472017211 0ustar balakinbalakin/* XPM */ static const char * oper_of_xpm[] = { "16 16 3 1", " c None", ". c #007f7f", "+ c #FF0000", " . ++ ", " . . ++ ", " . . ++++++", " . .... .++++++", " . . . . ++ ", " . .... . ++ ", " . ", " ..... ", " . . ", " .. . ", " . . . ", " . . ", " .... . . ", ". .. . ..... ", ". . . ", " .. . . "}; mathgl-8.0.1/include/xpm/mark_l.xpm0000664000175000017500000000063014167366472017023 0ustar balakinbalakin/* XPM */ static const char * mark_l_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " .. ", " .. . ", " . . ", " .. . ", " . . ", " .. . ", " . . ", ". . ", ". . ", " . . ", " .. . ", " . . ", " .. . ", " . . ", " .. . ", " .. "}; mathgl-8.0.1/include/xpm/folder.xpm0000664000175000017500000000455414167366472017042 0ustar balakinbalakin/* XPM */ static const char * folder_xpm[] = { "16 16 111 2", " c None", ". c #7A7A7A", "+ c #797979", "@ c #787878", "# c #C9C9C9", "$ c #C7C7C7", "% c #C5C5C5", "& c #C4C4C4", "* c #B4B4B4", "= c #747474", "- c #737373", "; c #B0B0B0", "> c #ADADAD", ", c #ABABAB", "' c #AAAAAA", ") c #ACACAC", "! c #8D8D8D", "~ c #8C8C8C", "{ c #808080", "] c #6C6C6C", "^ c #6E6E6E", "/ c #C1C1C0", "( c #A7A7A7", "_ c #A5A5A5", ": c #A4A4A4", "< c #B6B6B6", "[ c #B9B9B9", "} c #BBBBBB", "| c #A2A2A2", "1 c #6A6A6A", "2 c #BDBDBD", "3 c #416DA6", "4 c #3666A5", "5 c #3566A4", "6 c #3465A4", "7 c #3768A6", "8 c #656565", "9 c #B7B7B7", "0 c #3566A5", "a c #BED3EA", "b c #BFD4EA", "c c #BED4EA", "d c #BED3E9", "e c #B8CFE8", "f c #3465A5", "g c #5F5F5F", "h c #B3B3B3", "i c #C1D5EA", "j c #91B4DB", "k c #91B5DB", "l c #92B5DB", "m c #96B8DC", "n c #B7CFE7", "o c #3466A4", "p c #5B5B5B", "q c #AEAEAE", "r c #3667A5", "s c #C4D7EB", "t c #94B7DC", "u c #91B4DA", "v c #B6CDE6", "w c #565656", "x c #A9A9A9", "y c #3666A4", "z c #C6D8EC", "A c #99BADD", "B c #95B7DC", "C c #8EB2DA", "D c #8BB0D9", "E c #B8CFE7", "F c #515151", "G c #A5A5A4", "H c #3767A5", "I c #BED2E9", "J c #9BBADD", "K c #99B9DD", "L c #95B6DC", "M c #90B3DA", "N c #8EB2D9", "O c #89AED8", "P c #87ADD7", "Q c #8BB0D8", "R c #B1C9E5", "S c #4C4C4C", "T c #A1A1A1", "U c #3868A5", "V c #A9C4E2", "W c #81A8D5", "X c #7AA4D3", "Y c #7EA7D4", "Z c #9CBADD", "` c #484848", " . c #9B9B9B", ".. c #3867A4", "+. c #85ABD5", "@. c #6E9CCE", "#. c #6D9CCE", "$. c #709ECF", "%. c #84ABD5", "&. c #494949", "*. c #999999", "=. c #3968A5", "-. c #7EA6D3", ";. c #78A3D2", ">. c #79A4D3", ",. c #7AA5D1", "'. c #788697", "). c #3A69A5", "!. c #5083BA", "~. c #4578B2", "{. c #464D53", " ", ". + + + + + + ", "@ # $ % & & * = ", "- % ; > , ' ) ! ! ~ ~ ~ { ] ", "^ / ) ' ( _ : : ) < [ } | 1 ", "1 2 3 4 4 4 4 4 5 5 5 5 6 6 6 7 ", "8 9 0 a b b c c c d d d d d e f ", "g h 5 i j j k k l l l l l m n o ", "p q r s t t t t t t t t t u v 0 ", "w x y z A A A A A A A B C D E 0 ", "F G H I J K L l M N O P P Q R 0 ", "S T U V W X X X X X X X X Y Z 0 ", "` ...+.@.#.#.#.#.#.#.#.#.$.%.0 ", "&.*.=.-.;.;.;.;.;.;.;.;.;.>.,.0 ", "` '.).!.!.!.!.!.!.!.!.!.!.!.~.4 ", "{.6 6 6 6 6 6 6 6 6 6 6 6 6 5 "}; mathgl-8.0.1/include/xpm/delete.xpm0000664000175000017500000000064714167366472017030 0ustar balakinbalakin/* XPM */ static const char * delete_xpm[] = { "16 16 3 1", " c none", ". c #000000", "= c #afafaf", " ", " ", " ", " .. .. ", " .=. .=. ", " .=. .=. ", " .=..=. ", " .==. ", " .==. ", " .=..=. ", " .=. .=. ", " .=. .=. ", " .. .. ", " ", " ", " "}; mathgl-8.0.1/include/xpm/arrow_d.xpm0000664000175000017500000000063114167366472017214 0ustar balakinbalakin/* XPM */ static const char * arrow_d_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " . ", " ... ", " ..... ", " ....... ", " ...............", " ....... ", " ..... ", " ... ", " . ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/mark_df.xpm0000664000175000017500000000063114167366472017162 0ustar balakinbalakin/* XPM */ static const char * mark_df_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " .. ", " .... ", " ...... ", " ........ ", " .......... ", " ............ ", " .............. ", "................", "................", " .............. ", " ............ ", " .......... ", " ........ ", " ...... ", " .... ", " .. "}; mathgl-8.0.1/include/xpm/diff2.xpm0000664000175000017500000000064614167366472016557 0ustar balakinbalakin/* XPM */ static const char * diff2_xpm[] = { "16 16 3 1", " c None", ". c #007f7f", "+ c #7FaFaF", " ", " ", " ", " ", " . ", " .. ", " .+.. ", " +. ..+ ", " . .. ", " .+ +.. ", " +. ..+ ", " . .. ", " .+ +.. ", " ............ ", " ", " "}; mathgl-8.0.1/include/xpm/alpha.xpm0000664000175000017500000000445314167366472016652 0ustar balakinbalakin/* XPM */ static const char * alpha_xpm[] = { "16 16 107 2", " c None", ". c #395155", "+ c #3A5155", "@ c #384F54", "# c #4C6A71", "$ c #68929C", "% c #B8FFFF", "& c #B1F9FF", "* c #B7FFFF", "= c #6B939C", "- c #113F4A", "; c #7CADB9", "> c #B4FCFF", ", c #84BAC8", "' c #51585B", ") c #78888C", "! c #79898D", "~ c #4D4D4D", "{ c #17B0D6", "] c #2CE0FF", "^ c #1D99B8", "/ c #1F282B", "( c #A1E2F3", "_ c #ABF0FF", ": c #ACF2FF", "< c #658187", "[ c #E1FFFF", "} c #D7F8FF", "| c #D7F9FF", "1 c #D7F7FF", "2 c #428494", "3 c #28D6FF", "4 c #2AD6FF", "5 c #26C3EA", "6 c #1A88A2", "7 c #346974", "8 c #7BB8C6", "9 c #9FDEEE", "0 c #97D4E3", "a c #C2E2E9", "b c #D6F8FF", "c c #C5E6ED", "d c #2DB7DA", "e c #2AD1FB", "f c #23BFE6", "g c #0B6A81", "h c #42B0CC", "i c #4DB0C8", "j c #3A575C", "k c #7B878A", "l c #7D8A8E", "m c #7D8A8D", "n c #3B4A4E", "o c #0586A5", "p c #00BEED", "q c #005A70", "r c #317F93", "s c #56DFFF", "t c #47AEC7", "u c #7ADDF6", "v c #81ECFF", "w c #84F0FF", "x c #2F7E90", "y c #00DBFF", "z c #0094B9", "A c #3FA4BC", "B c #4CC5E4", "C c #72D1E7", "D c #7FE4FE", "E c #80E5FF", "F c #78D1E8", "G c #0EABD1", "H c #00BBEA", "I c #51D4F4", "J c #3A7888", "K c #85EEFF", "L c #60C0D8", "M c #00B7E6", "N c #0096BB", "O c #215764", "P c #3FA7C0", "Q c #70C6DC", "R c #83ECFF", "S c #378599", "T c #00B1DE", "U c #4AC5E4", "V c #447B89", "W c #82E8FF", "X c #84E4FD", "Y c #007696", "Z c #00556A", "` c #0A1A1E", " . c #4FC5E2", ".. c #75D1E8", "+. c #81E7FF", "@. c #598B98", "#. c #00B1DF", "$. c #235C69", "%. c #6BC4DA", "&. c #82E6FF", "*. c #148099", "=. c #2C5B65", "-. c #74D6F0", ";. c #074F61", ">. c #13353F", ",. c #67B8C9", "'. c #0E191C", " . + + @ ", " # $ % & & * = - ", " ; > , ' ) ! ~ { ] ^ ", " / ( _ : < [ } | 1 2 3 4 5 6 ", " 7 8 9 0 a b } } b c d e f g ", " h i j k l l l l m n o p q ", " r s t u v v v v w x y z ", " A B C D E E E F G H ", " I J K D E E L M N ", " O P Q E E R S T ", " U V W E X Y Z ", " ` ...+.@.#. ", " $.%.&.*. ", " =.-.;. ", " >.,. ", " '. "}; mathgl-8.0.1/include/xpm/axis.xpm0000664000175000017500000000062614167366472016527 0ustar balakinbalakin/* XPM */ static const char * axis_xpm[] = { "16 16 2 1", " c None", ". c #007f7f", " ", " .. ", " . ", " . ", " .. ", " . ", " . ", " .. ", " . ", " . ", " .. ", " . ", " . ", " .............. ", " . . . . ", " "}; mathgl-8.0.1/include/xpm/mark_cf.xpm0000664000175000017500000000063114167366472017161 0ustar balakinbalakin/* XPM */ static const char * mark_cf_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ...... ", " .. .. ", " . . ", " . . ", " . . ", ". .", ". .", ". .. .", ". .. .", ". .", ". .", " . . ", " . . ", " . . ", " .. .. ", " ...... "}; mathgl-8.0.1/include/xpm/insert.xpm0000664000175000017500000000066614167366472017073 0ustar balakinbalakin/* XPM */ static const char * insert_xpm[] = { "16 16 4 1", " c None", ". c #0000FF", "# c #000000", "w c #FFFFFF", " ", " ", ". ############ ", ".. #wwwwwwwwww# ", "...#w########w# ", "....wwwwwwwwww# ", ".....########w# ", "......wwwwwwww# ", ".......######w# ", "........wwwwww# ", ".......######w# ", "......wwwwwwww# ", ".....########w# ", "....wwwwwwwwww# ", "...############ ", ".. "}; mathgl-8.0.1/include/xpm/oper_dir.xpm0000664000175000017500000000063214167366472017363 0ustar balakinbalakin/* XPM */ static const char * oper_dir_xpm[] = { "16 16 2 1", " c None", ". c #007f7f", " . ", " . . ", " . . ", " . .... . ", " . . . . ", " . .... . ", " . ", " ..... ", " . . ", " .. . ", " . . . ", " . . ", " .... . . ", ". .. . ..... ", ". . . ", " .. . . "}; mathgl-8.0.1/include/xpm/mask_s.xpm0000664000175000017500000000062514167366472017037 0ustar balakinbalakin/* XPM */ static const char *mask_s_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "................", "................", "....########....", "....########....", "....##....##....", "....##....##....", "....##....##....", "....##....##....", "....########....", "....########....", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/mark_.xpm0000664000175000017500000000062714167366472016655 0ustar balakinbalakin/* XPM */ static const char * mark__xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", " ", " ", " ", " .. ", " .. ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/update.xpm0000664000175000017500000000062714167366472017046 0ustar balakinbalakin/* XPM */ static const char *update_xpm[] = { "16 16 2 1", " c None", ". c #007ffF", " ", " ", " .... ", " . . ", " . ..... ", " . ... ", " . ", " ", " ", " . ", " ... . ", " ..... . ", " . . ", " .... ", " ", " "}; mathgl-8.0.1/include/xpm/up_1.xpm0000664000175000017500000000064514167366472016430 0ustar balakinbalakin/* XPM */ static const char * up_1_xpm[] = { "16 16 3 1", ". c None", "+ c #7F0000", "@ c #FF0000", "................", "................", "........+.......", ".......+@+......", "......+@@@+.....", ".....+@@@@@+....", "....+@@@@@@@+...", "...+@@@@@@@@@+..", "..++++@@@@@++++.", ".....+@@@@@+....", ".....+@@@@@+....", ".....+@@@@@+....", ".....+@@@@@+....", ".....+@@@@@+....", ".....+++++++....", "................"}; mathgl-8.0.1/include/xpm/last.xpm0000664000175000017500000000062614167366472016526 0ustar balakinbalakin/* XPM */ static const char * last_xpm[] = { "16 16 2 1", " c None", ". c #0000FF", " ", " ", " ", " . .. ", " ... .. ", " ..... .. ", " ....... .. ", " ......... .. ", " ............ ", " ............ ", " ......... .. ", " ....... .. ", " ..... .. ", " ... .. ", " . .. ", " "}; mathgl-8.0.1/include/xpm/fileprint.xpm0000664000175000017500000000070414167366472017554 0ustar balakinbalakin/* XPM */ static const char *fileprint[] = { " 16 14 6 1", ". c #000000", "# c #848284", "a c #c6c3c6", "b c #ffff00", "c c #ffffff", "d c None", "ddddd.........dd", "dddd.cccccccc.dd", "dddd.c.....c.ddd", "ddd.cccccccc.ddd", "ddd.c.....c....d", "dd.cccccccc.a.a.", "d..........a.a..", ".aaaaaaaaaa.a.a.", ".............aa.", ".aaaaaa###aa.a.d", ".aaaaaabbbaa...d", ".............a.d", "d.aaaaaaaaa.a.dd", "dd...........ddd" }; mathgl-8.0.1/include/xpm/mask_j.xpm0000664000175000017500000000062514167366472017026 0ustar balakinbalakin/* XPM */ static const char *mask_j_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "................", "................", "................", "................", "..##..##########", "..##..##########", "................", "................", "................", "................", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/mark_pf.xpm0000664000175000017500000000063114167366472017176 0ustar balakinbalakin/* XPM */ static const char * mark_pf_xpm[] = { "16 16 2 1", " c None", ". c #007f00", "................", ". . .", ". . .", ". . .", ". . .", ". . .", ". . .", ". . .", "................", ". . .", ". . .", ". . .", ". . .", ". . .", ". . .", "................"}; mathgl-8.0.1/include/xpm/pause.xpm0000664000175000017500000000064614167366472016702 0ustar balakinbalakin/* XPM */ static const char * pause_xpm[] = { "16 16 3 1", " c None", ". c #afafaf", "q c #000000", " ", " ", " ", " qqq qqq ", " q.q q.q ", " q.q q.q ", " q.q q.q ", " q.q q.q ", " q.q q.q ", " q.q q.q ", " q.q q.q ", " q.q q.q ", " qqq qqq ", " ", " ", " "}; mathgl-8.0.1/include/xpm/curve.xpm0000664000175000017500000000062714167366472016710 0ustar balakinbalakin/* XPM */ static const char * curve_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " .", " .", " . ", " . ", " . ", " . ", " .. ", " .. ", " .. ", " .. ", " . ", " . ", " . ", " . ", ". ", ". "}; mathgl-8.0.1/include/xpm/norm_1.xpm0000664000175000017500000000064714167366472016761 0ustar balakinbalakin/* XPM */ static const char * norm_1_xpm[] = { "16 16 3 1", ". c None", "+ c #7F0000", "@ c #FF0000", "................", "................", "................", "................", "................", "................", "................", ".++++++++++++++.", ".+@@@@@@@@@@@@+.", ".+@@@@@@@@@@@@+.", ".++++++++++++++.", "................", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/line.xpm0000664000175000017500000000062614167366472016512 0ustar balakinbalakin/* XPM */ static const char * line_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " .", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", ". "}; mathgl-8.0.1/include/xpm/arrow_t.xpm0000664000175000017500000000063114167366472017234 0ustar balakinbalakin/* XPM */ static const char * arrow_t_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " .. ", " .... ", " ...... ", " ........ ", " ...............", " ........ ", " ...... ", " .... ", " .. ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/dash_l.xpm0000664000175000017500000000063014167366472017010 0ustar balakinbalakin/* XPM */ static const char * dash_l_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", " ", " ", " ", ".... .... ", " ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/down_1.xpm0000664000175000017500000000064714167366472016755 0ustar balakinbalakin/* XPM */ static const char * down_1_xpm[] = { "16 16 3 1", ". c None", "+ c #7F0000", "@ c #FF0000", "................", "................", ".....+++++++....", ".....+@@@@@+....", ".....+@@@@@+....", ".....+@@@@@+....", ".....+@@@@@+....", ".....+@@@@@+....", "..++++@@@@@++++.", "...+@@@@@@@@@+..", "....+@@@@@@@+...", ".....+@@@@@+....", "......+@@@+.....", ".......+@+......", "........+.......", "................"}; mathgl-8.0.1/include/xpm/mask_a.xpm0000664000175000017500000000062514167366472017015 0ustar balakinbalakin/* XPM */ static const char *mask_a_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "##............##", "##............##", "..##........##..", "..##........##..", "....##....##....", "....##....##....", "......####......", "......####......", "......####......", "......####......", "....##....##....", "....##....##....", "..##........##..", "..##........##..", "##............##", "##............##"}; mathgl-8.0.1/include/xpm/comment.xpm0000664000175000017500000000063114167366472017221 0ustar balakinbalakin/* XPM */ static const char * comment_xpm[] = { "16 16 2 1", " c None", ". c #009f00", " ", " ", " ", " . . ", " . . ", " . . ", " ............ ", " . . ", " . . ", " . . ", " . . ", " ............ ", " . . ", " . . ", " . . ", " "}; mathgl-8.0.1/include/xpm/mask_p.xpm0000664000175000017500000000062514167366472017034 0ustar balakinbalakin/* XPM */ static const char *mask_p_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "........##......", "........##......", "........##......", "........##......", "........##......", "........##......", "################", "################", "........##......", "........##......", "........##......", "........##......", "........##......", "........##......", "........##......", "........##......"}; mathgl-8.0.1/include/xpm/mark_a.xpm0000664000175000017500000000063014167366472017010 0ustar balakinbalakin/* XPM */ static const char * mark_a_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " . . ", " . . ", " . . ", " . . ", " . . ", " ... ", " .............. ", " ... ", " . . ", " . . ", " . . ", " . . ", " . . ", " ", " "}; mathgl-8.0.1/include/xpm/mask_r.xpm0000664000175000017500000000062514167366472017036 0ustar balakinbalakin/* XPM */ static const char *mask_r_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "..####..........", "..####..........", "..##..####......", "..##..####......", "..##......####..", "..##......####..", "..##..####......", "..##..####......", "..####..........", "..####..........", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/zoom_out.xpm0000664000175000017500000000455614167366472017444 0ustar balakinbalakin/* XPM */ static const char * zoom_out_xpm[] = { "16 16 111 2", " c None", ". c #878B87", "+ c #868C8A", "@ c #888B89", "# c #ACB6BF", "$ c #CDD6DD", "% c #E4E7E9", "& c #929594", "* c #CFD8E0", "= c #D3DDE5", "- c #A4BFDC", "; c #99B9DA", "> c #9AB9DA", ", c #A4BFDD", "' c #CFDAE5", ") c #B4C9DF", "! c #9DBDDD", "~ c #B5CDE6", "{ c #5C84B8", "] c #5B84B8", "^ c #B0CAE4", "/ c #9ABADD", "( c #98B9DC", "_ c #BCD1E8", ": c #5F87B9", "< c #FFFFFF", "[ c #5A84B7", "} c #ABC6E2", "| c #91B4DA", "1 c #868C8B", "2 c #9DBBDA", "3 c #B6CDE6", "4 c #5D85B8", "5 c #5982B7", "6 c #A7C3E1", "7 c #9FBDDE", "8 c #9EBBDA", "9 c #878B88", "0 c #8EB2D6", "a c #5A83B7", "b c #5681B6", "c c #9EBDDE", "d c #86ACD4", "e c #89AED4", "f c #8AAFD7", "g c #94B6DB", "h c #547FB5", "i c #507DB4", "j c #85ACD5", "k c #7BA5D2", "l c #878C8B", "m c #CFD8DE", "n c #A7C1DD", "o c #86ADD6", "p c #89AED6", "q c #4E7BB3", "r c #4F7CB3", "s c #8BB0D7", "t c #A9C3DE", "u c #D0D8DE", "v c #888B87", "w c #B1BAC1", "x c #D9E1E8", "y c #94B6DA", "z c #96B7DB", "A c #527EB5", "B c #537EB5", "C c #97B8DB", "D c #DAE2E8", "E c #B2BBC1", "F c #8A8C8A", "G c #D7DDE2", "H c #CAD8E6", "I c #A4C0DF", "J c #A6C2E0", "K c #5781B6", "L c #D8DEE3", "M c #949895", "N c #DADFE3", "O c #E1E6EA", "P c #C7D7E8", "Q c #BDD2E6", "R c #BED2E6", "S c #C8D8E8", "T c #DFE5EA", "U c #DBE0E4", "V c #959896", "W c #9DA09B", "X c #60625F", "Y c #8A8D8A", "Z c #BCC1C4", "` c #DCE0E2", " . c #E9EBEB", ".. c #BDC2C5", "+. c #898C88", "@. c #878A84", "#. c #B9BCB6", "$. c #BDBFBC", "%. c #61635F", "&. c #8A8C88", "*. c #8D918D", "=. c #8B8D89", "-. c #8E918D", ";. c #575955", ">. c #7A7B78", ",. c #B7B8B6", "'. c #595B57", "). c #555753", "!. c #767873", "~. c #A0A29F", "{. c #565854", " . + . . + . ", " @ # $ % % $ # @ ", " & * = - ; > , ' * & ", " @ * ) ! ~ { ] ^ / ) * @ ", ". # ' ( _ : < < [ } | ' # . ", "1 $ 2 3 4 < < < 5 6 7 8 $ + ", "9 % 0 ^ [ a < < b c | d % . ", "9 % e f g h < < i j k e % . ", "l m n o p q < < r s p t u l ", "v w x y z A < < B ( C D E v ", " F G H I J K K 6 J H L . ", " M N O P Q R S T U V W X ", " Y Z ` . .` ..+.@.#.$.%. ", " &.*.=.=.-.&. ;.>.@.,.'.", " ).!.~.'.", " ).{. "}; mathgl-8.0.1/include/xpm/mark_d.xpm0000664000175000017500000000063014167366472017013 0ustar balakinbalakin/* XPM */ static const char * mark_d_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " .. ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", ". .", ". .", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " .. "}; mathgl-8.0.1/include/xpm/mask_l.xpm0000664000175000017500000000062514167366472017030 0ustar balakinbalakin/* XPM */ static const char *mask_l_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "..........####..", "..........####..", "......####..##..", "......####..##..", "..####......##..", "..####......##..", "......####..##..", "......####..##..", "..........####..", "..........####..", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/dash_i.xpm0000664000175000017500000000063014167366472017005 0ustar balakinbalakin/* XPM */ static const char * dash_i_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", " ", " ", " ", ".. . .. . .. . .", " ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/dash_j.xpm0000664000175000017500000000063014167366472017006 0ustar balakinbalakin/* XPM */ static const char * dash_j_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", " ", " ", " ", ".... . .... .", " ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/unused/0000775000175000017500000000000014167366472016334 5ustar balakinbalakinmathgl-8.0.1/include/xpm/unused/smth.xpm0000664000175000017500000000064514167366472020042 0ustar balakinbalakin/* XPM */ static const char * smth_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #FF0000", " ", " ", " ", " ", " . ", " . ", " . . . ", " . . .. ", " +++. . . ", " +. ++ +++. ", " . .++ ++ ", " . . . .+ ", " . . . . ", " . ", " . ", " "}; mathgl-8.0.1/include/xpm/unused/sum.xpm0000664000175000017500000000062514167366472017671 0ustar balakinbalakin/* XPM */ static const char * sum_xpm[] = { "16 16 2 1", " c None", ". c #000000", " ", " ", " .......... ", " . . ", " . . ", " . ", " . ", " . ", " .. ", " . ", " . ", " . ", " . . ", " . . ", " .......... ", " "}; mathgl-8.0.1/include/xpm/unused/swap.xpm0000664000175000017500000000066414167366472020042 0ustar balakinbalakin/* XPM */ static const char * swap_xpm[] = { "16 16 4 1", " c None", ". c #0000FF", "+ c #000000", "@ c #FF0000", " ", " . .. ", " . . ", " . . ", " . . ", " ...... ", " + + ", " + + ", " + + ", " + + + + ", " ++ @@@ ++ ", " +++ @ @ +++ ", " @ @ ", " @ @ ", " @@@ @@@ ", " "}; mathgl-8.0.1/include/xpm/mask_u.xpm0000664000175000017500000000062514167366472017041 0ustar balakinbalakin/* XPM */ static const char *mask_u_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "................", "................", "................", "................", "......####......", "......####......", "....##....##....", "....##....##....", "..##........##..", "..##........##..", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/style.xpm0000664000175000017500000000064614167366472016725 0ustar balakinbalakin/* XPM */ static const char * style_xpm[] = { "16 16 3 1", " c None", ". c #FF0000", "q c #7F0000", " ", " ", " ", " qqq qqq ", " q.q q.q ", " q.q q.q ", " q.q q.q ", " q q ", " q q ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/first.xpm0000664000175000017500000000062714167366472016713 0ustar balakinbalakin/* XPM */ static const char * first_xpm[] = { "16 16 2 1", " c None", ". c #0000FF", " ", " ", " ", " .. . ", " .. ... ", " .. ..... ", " .. ....... ", " .. ......... ", " ............ ", " ............ ", " .. ......... ", " .. ....... ", " .. ..... ", " .. ... ", " .. . ", " "}; mathgl-8.0.1/include/xpm/preview.xpm0000664000175000017500000000653414167366472017250 0ustar balakinbalakin/* XPM */ static const char *preview_xpm[] = { "16 16 174 2", " c None", ". c #EA6E0E", "+ c #F67F06", "@ c #E3BB18", "# c #A4E757", "$ c #56E6A3", "% c #25DAD6", "& c #11E5EB", "* c #2AF5D0", "= c #72F588", "- c #B0EC4B", "; c #C7DC34", "> c #C3E336", ", c #98F563", "' c #3FF6BC", ") c #07D5F5", "! c #0E9EEA", "~ c #F44C0A", "{ c #FC0E00", "] c #FB1900", "^ c #FF5B00", "/ c #F7C407", "( c #B5FD49", "_ c #4BFFB3", ": c #0BF6F3", "< c #05D9F9", "[ c #0CD2F2", "} c #14DEEB", "| c #1BF0E3", "1 c #20FEDE", "2 c #27FFD7", "3 c #2BFDD3", "4 c #3BEEC3", "5 c #F14F0A", "6 c #FC1400", "7 c #FB1700", "8 c #FF5000", "9 c #FBBA03", "0 c #B8FD46", "a c #39FCC5", "b c #01CAFE", "c c #0088FF", "d c #0075FF", "e c #008FFF", "f c #01CCFE", "g c #22FCDC", "h c #73FF8B", "i c #BAFC44", "j c #D3E228", "k c #F47B0A", "l c #FF8C00", "m c #F4BA0A", "n c #CBE733", "o c #7DFC81", "p c #2BEDD3", "q c #03C1FB", "r c #0090FF", "s c #0082FF", "t c #009DFF", "u c #08D4F7", "v c #3AFAC4", "w c #98FF66", "x c #E7EF18", "y c #FEBC01", "z c #F4920A", "A c #F4AD0B", "B c #D4F62A", "C c #63FD9B", "D c #16D9E9", "E c #0296FD", "F c #0063FF", "G c #0059FF", "H c #0076FF", "I c #00B6FF", "J c #1AF2E4", "K c #6EFF90", "L c #C8FD36", "M c #F9E306", "N c #FFB900", "O c #FFA800", "P c #F4AF0B", "Q c #EFBD0D", "R c #A0FF5E", "S c #1BF3E3", "T c #009CFF", "U c #0056FF", "V c #0041FF", "W c #005DFF", "X c #00A0FF", "Y c #0EEEF0", "Z c #5FFF9F", "` c #B7FF47", " . c #F1FA0D", ".. c #F9E606", "+. c #F0E70E", "@. c #D4F42A", "#. c #9CF05F", "$. c #F4AA0A", "%. c #DFF01F", "&. c #8DFD71", "*. c #4CF4B2", "=. c #2DDFD1", "-. c #21D5DE", ";. c #1CDFE2", ">. c #20F4DE", ",. c #3BFFC3", "'. c #79FF85", "). c #80FF7E", "!. c #72FE8C", "~. c #51FAAD", "{. c #28EFD6", "]. c #14CDEA", "^. c #F4760A", "/. c #FF6B00", "(. c #FD6D00", "_. c #F87A05", ":. c #F1910C", "<. c #E9B615", "[. c #D8DF26", "}. c #B2FC4C", "|. c #70FF8E", "1. c #2DFED1", "2. c #0BE3F3", "3. c #04B9FB", "4. c #0099FE", "5. c #0085FF", "6. c #007EFF", "7. c #0A84F4", "8. c #F1480A", "9. c #EA0500", "0. c #C50000", "a. c #B30000", "b. c #BB0100", "c. c #DA0600", "d. c #FA3500", "e. c #FCB403", "f. c #ACFD52", "g. c #24F8DA", "h. c #00A5FF", "i. c #0036FF", "j. c #0046FF", "k. c #007FFF", "l. c #11C0EA", "m. c #F4440A", "n. c #E10100", "o. c #B20000", "p. c #990000", "q. c #9B0000", "r. c #B90000", "s. c #EB0500", "t. c #FF6700", "u. c #E9E716", "v. c #75FF89", "w. c #1EE7E0", "x. c #09B9F6", "y. c #06ACF8", "z. c #11C6ED", "A. c #38F0C6", "B. c #8FF26F", "C. c #E9630E", "D. c #F43606", "E. c #E92406", "F. c #E02006", "G. c #DE2006", "H. c #F43706", "I. c #F56806", "J. c #F5A106", "K. c #EBCC11", "L. c #CED92D", "M. c #B9DB41", "N. c #B9DD43", "O. c #C8D933", "P. c #E3CE18", "Q. c #E8AB10", " ", " ", " ", ". + @ # $ % & * = - ; > , ' ) ! ", "~ { ] ^ / ( _ : < [ } | 1 2 3 4 ", "5 6 7 8 9 0 a b c d e f g h i j ", "k l m n o p q r s t u v w x y z ", "A B C D E F G H I J K L M N O P ", "Q R S T U V W X Y Z ` ...+.@.#.", "$.%.&.*.=.-.;.>.,.Z '.).!.~.{.].", "^./.(._.:.<.[.}.|.1.2.3.4.5.6.7.", "8.9.0.a.b.c.d.e.f.g.h.U i.j.k.l.", "m.n.o.p.q.r.s.t.u.v.w.x.y.z.A.B.", "C.D.E.F.G.E.H.I.J.K.L.M.N.O.P.Q.", " ", " "}; mathgl-8.0.1/include/xpm/box.xpm0000664000175000017500000000066314167366472016354 0ustar balakinbalakin/* XPM */ static const char * box_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #666666", "= c #ffffff", " ", " ......... ", " .+======.. ", " .=+=====.=. ", " .==+====.==. ", " .===+===.===. ", " .........====. ", " .====+==.====. ", " .====+==.====. ", " .====+++.++++. ", " .===+===.===. ", " .==+====.==. ", " .=+=====.=. ", " .+======.. ", " ......... ", " "}; mathgl-8.0.1/include/xpm/mark_n.xpm0000664000175000017500000000061114167366472017024 0ustar balakinbalakin/* XPM */ static const char * mark_n_xpm[] = { "16 16 1 1", " c None", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/barrow_o.xpm0000664000175000017500000000062314167366472017372 0ustar balakinbalakin/* XPM */ const char * barrow_o_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " .... ", " ...... ", " ........ ", " ........ ", ".............. ", " ........ ", " ........ ", " ....... ", " .... ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/wire.xpm0000664000175000017500000000062614167366472016531 0ustar balakinbalakin/* XPM */ static const char * wire_xpm[] = { "16 16 2 1", " c None", ". c #007f7f", " ", " ", " ", " . . ", " . . ", " . . ", " ............ ", " . . ", " . . ", " . . ", " . . ", " ............ ", " . . ", " . . ", " . . ", " "}; mathgl-8.0.1/include/xpm/show_sl.xpm0000664000175000017500000000065014167366472017236 0ustar balakinbalakin/* XPM */ static const char * show_sl_xpm[] = { "16 16 3 1", " c None", ". c #000000", "+ c #007FFF", " ", " ", " ............ ", " . .++++++. . ", " ...++++++... ", " . .++++++. . ", " . .++++++. . ", " ...++++++... ", " . .++++++. . ", " . .++++++. . ", " ...++++++... ", " . .++++++. . ", " . .++++++. . ", " ...++++++... ", " . .++++++. . ", " ............ "}; mathgl-8.0.1/include/xpm/barrow_s.xpm0000664000175000017500000000062314167366472017376 0ustar balakinbalakin/* XPM */ const char * barrow_s_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ........ ", " ........ ", " ........ ", " ........ ", ".............. ", " ........ ", " ........ ", " ........ ", " ........ ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/arrow_k.xpm0000664000175000017500000000063114167366472017223 0ustar balakinbalakin/* XPM */ static const char * arrow_k_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " .. ", " .. ... ", " .. .... ", " .. ..... ", " ........ ", " ...............", " ........ ", " .. ..... ", " .. .... ", " .. ... ", " .. ", " ", " ", " "}; mathgl-8.0.1/include/xpm/barrow_a.xpm0000664000175000017500000000062314167366472017354 0ustar balakinbalakin/* XPM */ const char * barrow_a_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ... ", " .... ", " ..... ", " ...... ", "............... ", " ...... ", " ..... ", " .... ", " ... ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/mark_r.xpm0000664000175000017500000000063014167366472017031 0ustar balakinbalakin/* XPM */ static const char * mark_r_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " .. ", " . .. ", " . . ", " . .. ", " . . ", " . .. ", " . . ", " . .", " . .", " . . ", " . .. ", " . . ", " . .. ", " . . ", " . .. ", " .. "}; mathgl-8.0.1/include/xpm/mark_x.xpm0000664000175000017500000000063014167366472017037 0ustar balakinbalakin/* XPM */ static const char * mark_x_xpm[] = { "16 16 2 1", " c None", ". c #007f00", ". .", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " .. ", " .. ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", ". ."}; mathgl-8.0.1/include/xpm/table.xpm0000664000175000017500000000071614167366472016652 0ustar balakinbalakin/* XPM */ static const char * table_xpm[] = { "16 16 4 1", " c None", "# c #000000", "o c #777777", ". c #FFFFFF", " ", " ###############", " #ooo#oooo#oooo#", " #ooo#oooo#oooo#", " ###############", " #ooo#....#....#", " #ooo#....#....#", " ###############", " #ooo#....#....#", " #ooo#....#....#", " ###############", " #ooo#....#....#", " #ooo#....#....#", " ###############", " ", " "}; mathgl-8.0.1/include/xpm/other.xpm0000664000175000017500000000423214167366472016701 0ustar balakinbalakin/* XPM */ static const char * other_xpm[] = { "16 16 98 2", " c None", ". c #FFFFFF", "+ c #00CAFF", "@ c #00ADFF", "# c #0000EB", "$ c #00007F", "% c #0000B4", "& c #0000B9", "* c #00D1FF", "= c #73FF8B", "- c #68FF96", "; c #00BFFF", "> c #0000C3", ", c #0000C7", "' c #01DDFD", ") c #0041FF", "! c #0DFBF1", "~ c #3EFFC0", "{ c #00EEFF", "] c #0024FF", "^ c #000082", "/ c #000083", "( c #2EFFD0", "_ c #00E9FF", ": c #0001EA", "< c #0074FF", "[ c #009CFF", "} c #0058FF", "| c #0000D5", "1 c #009FFF", "2 c #63FF9B", "3 c #0000C1", "4 c #00009D", "5 c #0000F7", "6 c #0042FF", "7 c #0030FF", "8 c #0000DC", "9 c #000080", "0 c #0017FE", "a c #00E0FF", "b c #0000F6", "c c #0075FF", "d c #0094FF", "e c #0044FF", "f c #0000BE", "g c #000086", "h c #000BFE", "i c #004FFF", "j c #0000AC", "k c #006EFF", "l c #10FEEE", "m c #35FFC9", "n c #0000C9", "o c #0083FF", "p c #0031FF", "q c #000090", "r c #0007F9", "s c #0BF9F3", "t c #7EFF80", "u c #58FFA6", "v c #007DFF", "w c #000085", "x c #1FFFDF", "y c #000081", "z c #0039FF", "A c #00DBFF", "B c #01BDFD", "C c #0AFEF4", "D c #0000AA", "E c #00009A", "F c #001BFC", "G c #00C9FE", "H c #4BFFB3", "I c #0006F7", "J c #008FFF", "K c #6FFF8F", "L c #F5FF09", "M c #FFDB00", "N c #F1FB0D", "O c #0021FF", "P c #0000EA", "Q c #13FCEB", "R c #F0FF0E", "S c #FF8700", "T c #FF5B00", "U c #EDFC11", "V c #12FDEC", "W c #0003E9", "X c #00B7FF", "Y c #98FF66", "Z c #FFDF00", "` c #FFB300", " . c #00B8FF", ".. c #0067FF", "+. c #04E9FA", "@. c #1DFCE1", "#. c #00EDFF", "$. c #000088", " + @ # $ $ % ", " & * = - ; > $ $ , ' ", " $ $ ) ! ~ { ] ^ $ $ / ( _ ", " $ $ : < [ } | $ $ $ $ 1 2 3 ", " $ $ 4 5 6 7 8 9 $ $ $ 0 a 7 $ ", " $ $ / b c d e f $ $ g h i 8 $ ", " $ $ j k l m * # $ $ n o p q $ ", " $ $ r s t u v w $ $ j x 1 y $ ", " $ $ z A B $ $ $ $ $ $ C ~ D $ ", " $ $ $ $ E F [ G [ 0 E $ H I $ ", " $ $ $ D J K L M N K J D $ O $ ", " $ $ P Q R S T S U V W $ $ $ ", " $ f X Y Z ` Z Y .f $ $ $ ", " $ > ..+.@.#...> $ $ ", " $ $ y $.^ $ ", " $ $ $ "}; mathgl-8.0.1/include/xpm/none.xpm0000664000175000017500000000062614167366472016522 0ustar balakinbalakin/* XPM */ static const char * none_xpm[] = { "16 16 2 1", " c None", ". c #007f00", "................", ".. ..", ". . . .", ". . . .", ". . . .", ". . . .", ". . . .", ". .. .", ". .. .", ". . . .", ". . . .", ". . . .", ". . . .", ". . . .", ".. ..", "................"}; mathgl-8.0.1/include/xpm/next_sl.xpm0000664000175000017500000000070614167366472017236 0ustar balakinbalakin/* XPM */ static const char * next_sl_xpm[] = { "16 16 5 1", " c None", ". c #00007F", "+ c #007FFF", "@ c #0000FF", "# c #003F80", " ", " .. ", " .+. ", " .++. ", " .++@+. ", " ....++@+@+. ", " .@+@+@+@+@+. ", " .@@@@@@@@+@+. ", " .@@@@@@@@@@@@. ", " .@@@@@@@@#@#. ", " .@#@#@#@#@#. ", " ....@#@#@#. ", " .@#@#. ", " .##. ", " .#. ", " .. "}; mathgl-8.0.1/include/xpm/dash_s.xpm0000664000175000017500000000063014167366472017017 0ustar balakinbalakin/* XPM */ static const char * dash_s_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", " ", " ", " ", "................", " ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/diff.xpm0000664000175000017500000000062614167366472016473 0ustar balakinbalakin/* XPM */ static const char * diff_xpm[] = { "16 16 2 1", " c None", ". c #007f7f", " ", " ", " .. ", " . . . ", " . . ", " .... . ", " . . . .. ", " . . . . . ", " .. . . ", " . .... ", " . . . ", " . . . . .", " . .. . ", " . .", " ", " "}; mathgl-8.0.1/include/xpm/polygon.xpm0000664000175000017500000000062614167366472017252 0ustar balakinbalakin/* XPM */ static const char *polygon_xpm[]={ "16 16 2 1", " c None", ". c #007f00", " ", " .. ", " . . ", " .. .. ", " . . ", " .. .. ", ". .", ". .", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " . . ", " .......... "}; mathgl-8.0.1/include/xpm/window.xpm0000664000175000017500000000105614167366472017070 0ustar balakinbalakin/* XPM */ static const char * window_xpm[] = { "16 16 10 1", " c None", ". c #000000", "+ c #333377", "@ c #FFFFFF", "# c #777777", "$ c #00007F", "% c #4444FF", "& c #FF0000", "* c #007F00", "= c #7F0000", " ", " ", ".............. ", ".++++++++++++. ", ".@@@@@#@@@@@@. ", ".@$.............", ".@@.%%%%%%%%%%%.", ".@$.@@@@@#@@@@@.", ".@@.@$$@@#@@@@@.", ".@$.@@@@@#@@@@@.", ".@@.@$&*@#@@@@@.", "....@@@@@#@@@@@.", " .@$&=@#@@@@@.", " .@@@@@#@@@@@.", " .............", " "}; mathgl-8.0.1/include/xpm/cons.xpm0000664000175000017500000000066414167366472016527 0ustar balakinbalakin/* XPM */ static const char * cons_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #0000FF", "@ c #FF0000", " ", " .............. ", " . . ", " . . . . . . .. ", " . . ", " . . . . . . .. ", " .............. ", " ", " +++++++++++++ ", " +++++++++ ", " +++++ ", " + ", " @@@@@@@@@@@@@@ ", " @ @ @ @ @ @ @@ ", " @@@@@@@@@@@@@@ ", " "}; mathgl-8.0.1/include/xpm/zoom_1.xpm0000664000175000017500000000064714167366472016772 0ustar balakinbalakin/* XPM */ static const char * zoom_1_xpm[] = { "16 16 3 1", ". c None", "+ c #7F0000", "@ c #FF0000", "................", "................", "......++++......", "......+@@+......", "......+@@+......", "......+@@+......", "......+@@+......", ".++++++@@++++++.", ".+@@@@@@@@@@@@+.", ".+@@@@@@@@@@@@+.", ".++++++@@++++++.", "......+@@+......", "......+@@+......", "......+@@+......", "......+@@+......", "......++++......"}; mathgl-8.0.1/include/xpm/oper_a.xpm0000664000175000017500000000063014167366472017023 0ustar balakinbalakin/* XPM */ static const char * oper_a_xpm[] = { "16 16 2 1", " c None", ". c #007f7f", " ", " ", " ", " ", " . ", " . ", " . ...... ", " ....... ", " . ...... ", " . ", " . ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/tiles.xpm0000664000175000017500000000461314167366472016703 0ustar balakinbalakin/* XPM */ static const char * tiles_xpm[] = { "16 16 113 2", " c None", ". c #00D9FB", "+ c #00FEC7", "@ c #7DFF1E", "# c #DBDF08", "$ c #EAC004", "% c #E5D403", "& c #FF5D00", "* c #FC1600", "= c #FC2500", "- c #00EAE9", "; c #00E9CA", "> c #05F1B1", ", c #03F8B5", "' c #00FFC7", ") c #00FFD6", "! c #FF5900", "~ c #FD0600", "{ c #FA0000", "] c #FF2600", "^ c #00A1FF", "/ c #00CEFF", "( c #00FEE9", "_ c #00FF71", ": c #80FF12", "< c #CFFF07", "[ c #FF7000", "} c #FF5800", "| c #FE7200", "1 c #F9B100", "2 c #00EDF2", "3 c #1AFF56", "4 c #C1FA00", "5 c #FDD600", "6 c #FFA700", "7 c #FF9200", "8 c #F3D400", "9 c #A0FD21", "0 c #21F996", "a c #ECF100", "b c #FFC900", "c c #FF9B00", "d c #FF9300", "e c #FDA700", "f c #AEFF05", "g c #00F9C7", "h c #00AAFF", "i c #0052FF", "j c #FDCA00", "k c #E6DE00", "l c #FCA900", "m c #ADFF00", "n c #00FCC3", "o c #00C8FF", "p c #0089FF", "q c #0079FE", "r c #0094FF", "s c #00CDFF", "t c #93E71F", "u c #6BF55F", "v c #57FA76", "w c #3EFF80", "x c #1BFF89", "y c #00FF84", "z c #00FF95", "A c #F52C00", "B c #F03200", "C c #F23E00", "D c #FB5B00", "E c #F39E00", "F c #D4EA00", "G c #3BFF31", "H c #00FCD9", "I c #00C2FF", "J c #FE5500", "K c #E70200", "L c #B30000", "M c #9C0000", "N c #A30000", "O c #C30000", "P c #F61400", "Q c #FF9600", "R c #99FD04", "S c #01FDD5", "T c #00A6FF", "U c #0054FF", "V c #0037FF", "W c #EC0400", "X c #BD0000", "Y c #A20000", "Z c #A00000", "` c #B70000", " . c #EA0100", ".. c #FF5600", "+. c #EDE300", "@. c #0CF5CC", "#. c #06D2E4", "$. c #09CEE0", "%. c #18E5C1", "&. c #4AFF6C", "*. c #C1EB09", "=. c #FF7200", "-. c #FE4F00", ";. c #F73E00", ">. c #F03A00", ",. c #F03800", "'. c #F63A00", "). c #E2BD00", "!. c #D0C10A", "~. c #CDC110", "{. c #DFBB02", "]. c #F7B100", "^. c #FF9C00", " ", " ", " . + @ # $ % ", "& * = - ; > , ' ) ", "! ~ { ] ^ / ( _ : < ", "[ } | 1 2 3 4 5 6 ", "7 8 9 0 a b c d ", "e f g h i j k ", "l m n o p q r s ", " t u v w x y z ", " A B C D E F G H I ", "J K L M N O P Q R S T U V ", "} W X Y Z ` ...+. @.#.$.%.&.*.", "=.-.;.>.,.'. ).!.~.{.].^.", " ", " "}; mathgl-8.0.1/include/xpm/mark_p.xpm0000664000175000017500000000063014167366472017027 0ustar balakinbalakin/* XPM */ static const char * mark_p_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " . ", " . ", " . ", " . ", " . ", " . ", " . ", " . ", "................", " . ", " . ", " . ", " . ", " . ", " . ", " . "}; mathgl-8.0.1/include/xpm/func.xpm0000664000175000017500000000062614167366472016516 0ustar balakinbalakin/* XPM */ static const char * func_xpm[] = { "16 16 2 1", " c None", ". c #007f7f", " ", " ", " ", " . . . ", " . . . ", " . . . ", " ... . . . . ", " . . . . . ", " . . .. . ", " . . .. . ", " . . . . . ", " . . . . . ", " . . ", " . . ", " ", " "}; mathgl-8.0.1/include/xpm/barrow_i.xpm0000664000175000017500000000062314167366472017364 0ustar balakinbalakin/* XPM */ const char * barrow_i_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " .. ", " .. ", " .. ", " .. ", " .. ", "............... ", " .. ", " .. ", " .. ", " .. ", " .. ", " ", " ", " "}; mathgl-8.0.1/include/xpm/mark_s.xpm0000664000175000017500000000063014167366472017032 0ustar balakinbalakin/* XPM */ static const char * mark_s_xpm[] = { "16 16 2 1", " c None", ". c #007f00", "................", ". .", ". .", ". .", ". .", ". .", ". .", ". .", ". .", ". .", ". .", ". .", ". .", ". .", ". .", "................"}; mathgl-8.0.1/include/xpm/mark_lf.xpm0000664000175000017500000000063114167366472017172 0ustar balakinbalakin/* XPM */ static const char * mark_lf_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " .. ", " .... ", " ..... ", " ....... ", " ........ ", " .......... ", " ........... ", "............ ", "............ ", " ........... ", " .......... ", " ........ ", " ....... ", " ..... ", " .... ", " .. "}; mathgl-8.0.1/include/xpm/udav.xpm0000664000175000017500000003340714167366472016525 0ustar balakinbalakin/* XPM */ static const char *udav_xpm[]={ "64 64 349 2", "Qt c None", "#n c #000080", "#h c #010180", "#y c #010181", "#s c #020281", "#c c #020282", "dg c #030382", ".8 c #030383", "#r c #040483", "#m c #040484", "#g c #050584", "#M c #050585", "#q c #060685", "a. c #060686", "#p c #070786", "ck c #070787", "aj c #080887", "bm c #080888", "aK c #090988", "a4 c #090989", "aJ c #0a0a89", "## c #0a0a8a", "#G c #0b0b8a", "cx c #0b0b8b", "b7 c #0c0c8b", "#z c #0c0c8c", "b6 c #0d0d8c", "b8 c #0d0d8d", "#l c #0e0e8d", "cj c #0e0e8e", "b5 c #0f0f8e", "#S c #0f0f8f", "ci c #10108f", "bE c #101090", "b4 c #111190", "c2 c #111191", "#W c #121291", "b9 c #121292", "#b c #131392", "b3 c #131393", "ak c #141493", "aD c #141494", "bG c #151594", "aq c #151595", "bF c #161695", "#i c #161696", "aE c #171796", "ae c #171797", ".5 c #181897", "cq c #181898", "#L c #191998", "bU c #191999", "b2 c #1a1a99", "aL c #1a1a9a", "ds c #1b1b9a", "#A c #1b1b9b", "#k c #1c1c9b", "#f c #1c1c9c", "cG c #1d1d9c", "bM c #1d1d9d", "bN c #1e1e9d", "ch c #1e1e9e", "bL c #1f1f9e", "b1 c #1f1f9f", "#j c #20209f", "bO c #2020a0", "cS c #2121a0", "bY c #2121a1", "db c #2222a1", "bK c #2222a2", "bn c #2323a2", "a# c #2323a3", "bH c #2424a4", "bJ c #2525a4", "a3 c #2525a5", "#o c #2626a5", "df c #2626a6", "#. c #2727a6", "bP c #2727a7", "ai c #2828a7", "cF c #2828a8", "cf c #2929a9", "b0 c #2a2aa9", "#x c #2a2aaa", ".7 c #2b2baa", "bI c #2b2bab", "cy c #2c2cab", "a5 c #2c2cac", "aI c #2d2dac", "#d c #2d2dad", "cp c #2e2ead", "bo c #2e2eae", "ap c #2f2fae", "#1 c #3030b0", "cg c #3131b1", "bZ c #3232b1", "de c #3333b2", "dw c #3333b3", "bQ c #3434b4", "bp c #3535b5", "c3 c #3636b5", "#R c #3636b6", "cC c #3737b7", "aC c #3838b7", "#t c #3838b8", "#T c #3939b8", "#F c #3939b9", "bq c #3a3ab9", "#6 c #3a3aba", "aM c #3c3cbb", "#B c #3d3dbc", "cr c #3d3dbd", "#N c #3e3ebd", "dA c #3e3ebe", "ar c #3f3fbe", "bA c #3f3fbf", "bR c #4040c0", "bS c #4141c0", "dh c #4141c1", "ce c #4242c1", "da c #4343c3", "br c #4444c3", "#X c #4545c4", "a6 c #4545c5", "cM c #4646c5", "bw c #4646c6", "#e c #4747c6", "bs c #4747c7", "bv c #4848c7", "aB c #4848c8", "bt c #4949c8", "bu c #4949c9", "bx c #4a4ac9", "as c #4a4aca", "cs c #4b4bca", "ct c #4b4bcb", "#u c #4c4ccb", "bl c #4c4ccc", "dz c #5050cf", "c6 c #5151d0", "a7 c #5151d1", "by c #5252d1", "#H c #5353d2", "dx c #5454d3", "d# c #5454d4", "at c #5555d5", "aA c #5656d5", "cw c #5656d6", "dy c #5757d6", "bz c #5858d8", "#a c #5959d9", "cE c #5a5ad9", "cL c #5b5bdb", "a8 c #5c5cdb", "aN c #5c5cdc", ".6 c #5d5ddd", "c5 c #5e5edd", "bk c #5e5ede", "dt c #5f5fde", "cT c #6060df", "al c #6262e1", "au c #6262e2", "az c #6464e4", "af c #6565e4", "cD c #6565e5", "#2 c #6666e6", "d. c #6767e7", "co c #6868e7", ".9 c #6868e8", "av c #6969e8", "cN c #6a6aea", "a2 c #6b6bea", "c. c #6b6beb", "dk c #6c6ceb", "aO c #6c6cec", "ay c #6d6dec", "ad c #6e6eee", "ax c #6f6fef", "bD c #7070f0", "#w c #7171f0", "aw c #7171f1", "cu c #7272f1", "c7 c #7272f2", "a9 c #7373f2", "aF c #7373f3", "dn c #7474f4", "b. c #7878f7", "#C c #7979f8", ".4 c #7979f9", "aP c #7a7af9", "aa c #7b7bfa", "b# c #7c7cfb", "cd c #7e7efd", "bX c #7f7ffe", ".3 c #800000", ".1 c #800101", "ba c #8080ff", ".2 c #810101", ".X c #810202", "dp c #8181ff", ".W c #820202", ".Y c #820303", "#5 c #8282ff", ".Z c #830303", "aH c #8383ff", ".R c #840505", "#v c #8484ff", ".S c #850606", "bb c #8585ff", ".T c #860707", "#K c #8686ff", ".U c #870808", ".V c #880808", "aQ c #8888ff", ".Q c #890a0a", "dr c #8989ff", ".K c #8a0a0a", "cz c #8a8aff", ".j c #8b0b0b", "cK c #8b8bff", "bc c #8c8cff", "cU c #8d8dff", ".B c #8e0e0e", ".P c #8e0f0f", "ao c #8e8eff", ".L c #8f0f0f", "cH c #9090ff", "bd c #9292ff", ".C c #931414", "aR c #9393ff", ".O c #941414", "#D c #9494ff", "#O c #9595ff", "cV c #9696ff", ".M c #981818", "#E c #9898ff", ".c c #991a1a", "cO c #9999ff", ".N c #9a1b1b", ".s c #9b1b1b", ".J c #9d1e1e", "be c #9d9dff", "aS c #9e9eff", "dd c #9f9fff", "c8 c #a1a1ff", ".D c #a32424", "#7 c #a3a3ff", "#I c #a5a5ff", ".r c #a72828", "aT c #a7a7ff", "do c #a8a8ff", "cn c #a9a9ff", ".# c #ab2c2c", "c9 c #ababff", ".A c #ac2c2c", "cW c #adadff", "#Y c #aeaeff", ".I c #af2f2f", "du c #b0b0ff", "#0 c #b1b1ff", "c4 c #b2b2ff", "bf c #b3b3ff", ".E c #b43535", "cA c #b4b4ff", "#Q c #b5b5ff", "dv c #b6b6ff", "cl c #b7b7ff", "cX c #b8b8ff", "aU c #b9b9ff", "cc c #babaff", ".i c #bc3c3c", "bW c #bcbcff", "dm c #bdbdff", ".H c #be3f3f", "aZ c #bebeff", "bB c #bfbfff", "aV c #c0c0ff", ".b c #c14141", ".t c #c14242", "bg c #c1c1ff", "#V c #c2c2ff", ".F c #c34343", "#9 c #c3c3ff", "cY c #c4c4ff", "#J c #c5c5ff", "cP c #c6c6ff", "aW c #c7c7ff", "aY c #c8c8ff", ".a c #c94949", "bC c #c9c9ff", ".k c #ca4a4a", "c1 c #cacaff", ".G c #cb4b4b", "aX c #cbcbff", "di c #ccccff", "dj c #cdcdff", "bh c #ceceff", "a1 c #d0d0ff", "c# c #d1d1ff", "c0 c #d2d2ff", "cR c #d3d3ff", ".z c #d45555", "cZ c #d4d4ff", "bT c #d6d6ff", "dl c #d8d8ff", "#3 c #dadaff", "am c #dbdbff", "bi c #dcdcff", "ag c #ddddff", "#P c #dfdfff", "cI c #e1e1ff", "bV c #e4e4ff", ".q c #e66666", "dc c #e6e6ff", "aG c #e7e7ff", ".d c #e86969", "cb c #e8e8ff", "cJ c #eaeaff", "ab c #ececff", ".u c #ed6d6d", "bj c #ededff", "cB c #efefff", "#U c #f0f0ff", "cQ c #f1f1ff", "cv c #f2f2ff", "dq c #f4f4ff", "cm c #f5f5ff", "ca c #f6f6ff", "a0 c #f7f7ff", "an c #f9f9ff", "ah c #fafaff", "#Z c #fbfbff", "ac c #fcfcff", "#8 c #fdfdff", "#4 c #fefeff", ".y c #ff7f7f", ".h c #ff8686", ".v c #ff9292", ".l c #ff9595", ".x c #ff9d9d", ".w c #ffa5a5", ".p c #ffb0b0", ".e c #ffb3b3", ".g c #ffbfbf", ".f c #ffcece", ".m c #ffd9d9", ".o c #ffe8e8", ".n c #fff8f8", ".0 c #ffff00", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.#.a.b.cQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.c.d.e.f.g.h.iQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.j.k.l.m.n.o.p.q.rQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.s.t.u.v.w.x.y.z.A.BQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.C.D.E.F.G.a.H.I.J.BQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.K.L.C.M.N.N.M.O.P.QQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.R.S.T.U.V.V.V.U.T.SQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.W.X.W.W.W.W.Y.Y.Z.RQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.1.1.1.1.1.1.2.W.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.3.3.3.3.3.2.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.4.5.2.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.6.7.8.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.9#..8.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0###a#b#c.0.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0#d#e#f#g#h.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0#i#j#k#l#m#h#n#o.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0#p#q#r#s#n#n#m#t#u#v#w#x.0.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0#y#h#n#m#r#q#z#A#B#C#D#E#F.0.0.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0#r#s#h#h#h#y#r#G#j#H#I#J#K#L.0.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0#n#n#n#y#M#b#N#O#P#Q#R.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0#h#n#h#r#S#T#E#U#V#N.0.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0#h#h#r#W#X#Y#Z#0#1.0.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0#y#q#k#2#3#4#5.5.0.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0#c#z#6#7#8#9#X#q.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0a.a#aaabacadae.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0#m.5afagah#Kai.0.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0.0.0.0.0.0.0.0.0#gaj.0.0.0.0.0.0.0.0.0akalamanaoapaj.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt.0.0a.aqa#aparasatauavadawaxayazaAaBaCa#aDaEaFaGanaHaIaJ.0.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtaKaL#xaM#uaNaOaPaQaRaSaT#0aUaVaWaXaXaYaZ#Y#E#.aSa0a1a2a3a4.0.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQt###fa5#Ta6a7a8afaOa9b.b#babbbcbdbeaTbfbgbhbiaGbjbk#3#Z#IblaLajbm.0.0.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtaDbnbobpbqarbrbsbtbuaBbvbw#e#ebx#ubybzaladaaao#7bAbB#8bCbDapbEa.aObqbF.0.0QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtbGbH#dbobI#x.7a5a5#xaibJbK#jbLbMbNbNbObnbP#dbQbRbSaZ#4bTbbarbUa4#ZbVbWbXbr#LQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQt#SbYapbZb0b1b2b2aLbUaEb3b4b5b6b7#G#####Gb7b8#Sb9c.bT#4c#bbbrbL#z#q#Pca#8cbcccdcebFQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQt#icf#taMcgchcicj#Scjb7a4ck#q#g#m#r.8.8.8.8#rblclca#ZaUaF#NbMb8a.#MaQ#0amcmah#Pcncocpa4QtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQt#Gcq.7crcsctcra3b6aJbma.#m.8#c#s#y#y#y#hbJcu#Vcvcvcaaocw#1.5cx#q#rcybSalczcA#PcacBaYaQa6aEQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQt###ka#cCctaNcDazcEbt#tcFch.5cGb0bRazcHbBcIbjbVcJcKcLaCbLbEbm#m.8##bE#AaIcMcNcOcPcbcQcR#EatcSQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtajcj#L#dcCcscTcu#5cUcVbe#IcWcXcYbhcZc0c1cRcUaycsbZbNc2aJ#M.8#ca..8#q##b9bLc3aAbXc4biab#3#7c5#o#pQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQt#qaKb8bGchbSaBc6cE#2c7bX#KbccVc8c9#Qd.d#da#1db#i#laK#M.8#s#sa.#h#y#c#r#pb8cqb0btaF#7a1dccZdda8#o#MQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQt#g#g#paJb8b9.5chbJbI#1c3cC#t#Rde#ddf#jcqb9b6aK#q#r#c#s#y#y.0#h#n#n#h#ydg#M##ak#odhc.dddi#PdjcVd#dbQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQt.8.8#m#M#paK###zcj#SbEbEbE#S#lb7aJaj#q#m.8#c#s#y#h#h#s.0.0.0Qt#m#h#h#y#c#maKb9bndhdkbeaXdldm#vbw#LQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQt#c#c#cdgdg.8#r#m#m#m#m#m#r.8dg#c#s#y#h#h#h#n#h#y.0.0QtQtQtQtQtQtQt#y#y#s#maK#ba3brdndodia1aU#Obyb4QtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQt#s#y#y#y#y#y#y#y#y#y#h#h#h#h#n#n#n#n#n#n#yQtQtQtQtQtQtQtQtQtQtQtQtQt#y#c#maJaDbIa7dpaZdqaha1drbAb3QtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtdg#y#h#h#n#n#n#n#n#n#n#n#n#n#n#n#hdgQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#s#c#Mcxdsc3dtaodudvaScudhdsQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtdg#y#h#h#h#n#n#n#h#y#cQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtdg#pbEb1dwbwdxdydzdA#xaEQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#maJb5bGdsbLbOchaLakb8ckQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#q#qckaKaJ####a4bm#p#pQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#m#c#cdgdgdg.8.8.8#rQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#y#h#h#h#h#h#y#s#rQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#h#n#n#n#n#h#cQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt#h#h#yQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt", "QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"}; mathgl-8.0.1/include/xpm/dash_m.xpm0000664000175000017500000000063014167366472017011 0ustar balakinbalakin/* XPM */ static const char * dash_m_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", " ", " ", " ", ".. .. .. .. ", " ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/zoom_in.xpm0000664000175000017500000000441514167366472017235 0ustar balakinbalakin/* XPM */ static const char * zoom_in_xpm[] = { "16 16 105 2", " c None", ". c #878B87", "+ c #868C8A", "@ c #888B89", "# c #ACB6BF", "$ c #CDD6DD", "% c #E4E7E9", "& c #929594", "* c #CFD8E0", "= c #D3DDE5", "- c #A4BFDC", "; c #99B9DA", "> c #9AB9DA", ", c #A4BFDD", "' c #CFDAE5", ") c #B4C9DF", "! c #9DBDDD", "~ c #B5CDE6", "{ c #5C84B8", "] c #5B84B8", "^ c #B0CAE4", "/ c #9ABADD", "( c #98B9DC", "_ c #BCD1E8", ": c #5F87B9", "< c #FFFFFF", "[ c #5A84B7", "} c #ABC6E2", "| c #91B4DA", "1 c #868C8B", "2 c #9DBBDA", "3 c #B6CDE6", "4 c #5D85B8", "5 c #5E86B8", "6 c #5982B7", "7 c #5781B6", "8 c #9FBDDE", "9 c #9EBBDA", "0 c #878B88", "a c #8EB2D6", "b c #5983B7", "c c #507DB4", "d c #86ACD4", "e c #89AED4", "f c #4E7BB3", "g c #4A78B2", "h c #878C8B", "i c #CFD8DE", "j c #A7C1DD", "k c #86ADD6", "l c #4F7CB3", "m c #89AED6", "n c #A9C3DE", "o c #D0D8DE", "p c #888B87", "q c #B1BAC1", "r c #D9E1E8", "s c #94B6DA", "t c #96B7DB", "u c #527EB5", "v c #537EB5", "w c #97B8DB", "x c #DAE2E8", "y c #B2BBC1", "z c #8A8C8A", "A c #D7DDE2", "B c #CAD8E6", "C c #A4C0DF", "D c #A6C2E0", "E c #A7C3E1", "F c #D8DEE3", "G c #949895", "H c #DADFE3", "I c #E1E6EA", "J c #C7D7E8", "K c #BDD2E6", "L c #BED2E6", "M c #C8D8E8", "N c #DFE5EA", "O c #DBE0E4", "P c #959896", "Q c #9DA09B", "R c #60625F", "S c #8A8D8A", "T c #BCC1C4", "U c #DCE0E2", "V c #E9EBEB", "W c #BDC2C5", "X c #898C88", "Y c #878A84", "Z c #B9BCB6", "` c #BDBFBC", " . c #61635F", ".. c #8A8C88", "+. c #8D918D", "@. c #8B8D89", "#. c #8E918D", "$. c #575955", "%. c #7A7B78", "&. c #B7B8B6", "*. c #595B57", "=. c #555753", "-. c #767873", ";. c #A0A29F", ">. c #565854", " . + . . + . ", " @ # $ % % $ # @ ", " & * = - ; > , ' * & ", " @ * ) ! ~ { ] ^ / ) * @ ", ". # ' ( _ : < < [ } | ' # . ", "1 $ 2 3 4 5 < < 6 7 8 9 $ + ", "0 % a b < < < < < < c d % . ", "0 % e f < < < < < < g e % . ", "h i j k f f < < l f m n o h ", "p q r s t u < < v ( w x y p ", " z A B C D 7 7 E D B F . ", " G H I J K L M N O P Q R ", " S T U V V U W X Y Z ` . ", " ..+.@.@.#... $.%.Y &.*.", " =.-.;.*.", " =.>. "}; mathgl-8.0.1/include/xpm/size.xpm0000664000175000017500000000062614167366472016535 0ustar balakinbalakin/* XPM */ static const char * size_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " .............. ", " . . . ", " . ... . ", " . . . ", " . . . ", " . . . . . ", " .............. ", " . . . . . ", " . . . ", " . . . ", " . . . ", " . ... . ", " . . . ", " .............. "}; mathgl-8.0.1/include/xpm/left_1.xpm0000664000175000017500000000064714167366472016740 0ustar balakinbalakin/* XPM */ static const char * left_1_xpm[] = { "16 16 3 1", ". c None", "+ c #7F0000", "@ c #FF0000", "................", "................", ".......+........", "......++........", ".....+@+........", "....+@@+++++++..", "...+@@@@@@@@@+..", "..+@@@@@@@@@@+..", ".+@@@@@@@@@@@+..", "..+@@@@@@@@@@+..", "...+@@@@@@@@@+..", "....+@@+++++++..", ".....+@+........", "......++........", ".......+........", "................"}; mathgl-8.0.1/include/xpm/arrow_n.xpm0000664000175000017500000000063114167366472017226 0ustar balakinbalakin/* XPM */ static const char * arrow_n_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", " ", " ", " ", " ..............", " ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/barrow_n.xpm0000664000175000017500000000062314167366472017371 0ustar balakinbalakin/* XPM */ const char * barrow_n_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", " ", " ", " ", ".............. ", " ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/mask_t.xpm0000664000175000017500000000062514167366472017040 0ustar balakinbalakin/* XPM */ static const char *mask_t_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "................", "................", "..####..........", "..####..........", "##....##........", "##....##........", "........##....##", "........##....##", "..........####..", "..........####..", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/arrow_v.xpm0000664000175000017500000000063114167366472017236 0ustar balakinbalakin/* XPM */ static const char * arrow_v_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ... ", " .... ", " ..... ", " ...... ", " ...........", " ...... ", " ..... ", " .... ", " ... ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/mask_o_.xpm0000664000175000017500000000062514167366472017172 0ustar balakinbalakin/* XPM */ static const char *mask_O_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "................", "................", "......####......", "......####......", "....########....", "....########....", "....########....", "....########....", "......####......", "......####......", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/mark_of.xpm0000664000175000017500000000063114167366472017175 0ustar balakinbalakin/* XPM */ static const char * mark_of_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ...... ", " .......... ", " ............ ", " .............. ", " .............. ", "................", "................", "................", "................", "................", "................", " .............. ", " .............. ", " ............ ", " .......... ", " ...... "}; mathgl-8.0.1/include/xpm/arrow_a.xpm0000664000175000017500000000063114167366472017211 0ustar balakinbalakin/* XPM */ static const char * arrow_a_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ... ", " .... ", " ..... ", " ...... ", " ...............", " ...... ", " ..... ", " .... ", " ... ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/mask_o.xpm0000664000175000017500000000062514167366472017033 0ustar balakinbalakin/* XPM */ static const char *mask_o_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "................", "................", "......####......", "......####......", "....##....##....", "....##....##....", "....##....##....", "....##....##....", "......####......", "......####......", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/stop.xpm0000664000175000017500000000066414167366472016552 0ustar balakinbalakin/* XPM */ static const char * stop_xpm[] = { "16 16 4 1", " c None", ". c #770000", "+ c #FF0000", "@ c #FFFFFF", " ", " ...... ", " .++++++. ", " .++++++++. ", " .++++++++++. ", " .+++@@++@@+++. ", " .+++@@@@@@+++. ", " .++++@@@@++++. ", " .++++@@@@++++. ", " .+++@@@@@@+++. ", " .+++@@++@@+++. ", " .++++++++++. ", " .++++++++. ", " .++++++. ", " ...... ", " "}; mathgl-8.0.1/include/xpm/arrow_o.xpm0000664000175000017500000000063114167366472017227 0ustar balakinbalakin/* XPM */ static const char * arrow_o_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " .... ", " ...... ", " ........ ", " ........ ", " ..............", " ........ ", " ........ ", " ....... ", " .... ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/copy.xpm0000664000175000017500000000066414167366472016537 0ustar balakinbalakin/* XPM */ static const char * copy_xpm[] = { "16 16 4 1", " c None", ". c #000000", "+ c #FFFFFF", "@ c #808080", " ", " ", " ........ ", " .++++++.@ ", " .+@@@@+.@ ", " .++........ ", " .+@.++++++.@ ", " .++.+....+.@ ", " .+@.++++++.@ ", " .++.+....+.@ ", " ....++++++.@ ", " @.+....+.@ ", " .++++++.@ ", " ........@ ", " @@@@@@@@ ", " "}; mathgl-8.0.1/include/xpm/option.xpm0000664000175000017500000000064714167366472017076 0ustar balakinbalakin/* XPM */ static const char * option_xpm[] = { "16 16 3 1", " c None", ". c #7f0000", "+ c #FF0000", " ", " ", " ", " .. ", " .++. ", " .++. ", " .. ", " ", " ", " .. ", " .++. ", " .++. ", " .+. ++ ++ ++ ", " . ++ ++ ++ ", " . ", " "}; mathgl-8.0.1/include/xpm/oper_s.xpm0000664000175000017500000000063014167366472017045 0ustar balakinbalakin/* XPM */ static const char * oper_s_xpm[] = { "16 16 2 1", " c None", ". c #007f7f", " ", " ", " ", " ", " ", " ", " ...... ", " ....... ", " ...... ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/light.xpm0000664000175000017500000000132414167366472016666 0ustar balakinbalakin/* XPM */ static const char * light_xpm[] = { "16 16 23 1", " c None", "! c #000000", "# c #808080", "$ c #808000", "% c #606040", "& c #C0C0C0", "' c #808040", "( c #FFFF00", ") c #A0A000", "* c #202000", "+ c #404000", ", c #C0C000", "- c #E0E000", ". c #408040", "0 c #008080", "1 c #408080", "2 c #FFFFC0", "3 c #C0C080", "4 c #FFFFFF", "5 c #FFFF80", "6 c #FFFF40", "7 c #606000", "8 c #206040", " # # ", " #$%&&'$# ", " '()*+,-% ", " $.0000.+ ", " #'+01&223.0+'# ", "&$(.1455555..($#", " %)0&566((-$0)% ", " &*055((((-)0*& ", " &+056((((-)0+& ", " ',035(((-,70,' ", "&$-.8,---,,8.-$#", " #%*08$))780*%# ", " $.0000.+ ", " '()*+,-% ", " #$%&&'$# ", " # # "}; mathgl-8.0.1/include/xpm/hist.xpm0000664000175000017500000000062614167366472016532 0ustar balakinbalakin/* XPM */ static const char * hist_xpm[] = { "16 16 2 1", " c None", ". c #0000FF", " ", " ", " ... ", " ... ", " ... ", " ... ... ", " ... ... ", " ... ... ", " ... ... ", " ... ... ", " ... ... ... ", " ... ... ... ", "... ... ... ... ", "... ... ... ... ", "... ... ... ... ", " "}; mathgl-8.0.1/include/xpm/ok.xpm0000664000175000017500000000064414167366472016174 0ustar balakinbalakin/* XPM */ static const char * ok_xpm[] = { "16 16 3 1", " c None", "! c #000090", "# c #0000FF", " ", " # ", " ## ", " ##! ", " ##! ", " ##! ", " ##! ", " ##! ", " ##! ", " ### ###! ", " ### ##! ", " #####! ", " ###! ", " ##! ", " #! ", " ! "}; mathgl-8.0.1/include/xpm/mask_e.xpm0000664000175000017500000000062514167366472017021 0ustar balakinbalakin/* XPM */ static const char *mask_e_xpm[]={ "16 16 2 1", ". c None", "# c #007f00", "................", "................", "................", "................", "################", "################", "................", "................", "################", "################", "................", "................", "................", "................", "................", "................"}; mathgl-8.0.1/include/xpm/dash_e.xpm0000664000175000017500000000063014167366472017001 0ustar balakinbalakin/* XPM */ static const char * dash_e_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", " ", " ", " ", ". . . . . . . . ", " ", " ", " ", " ", " ", " ", " ", " "}; mathgl-8.0.1/include/xpm/next.xpm0000664000175000017500000000063114167366472016535 0ustar balakinbalakin/* XPM */ static const char * next_xpm[] = { "16 16 2 1", " c #E7E7E7", ". c #0000FF", " ", " ", " ", " . ", " ... ", " ..... ", " ....... ", " ......... ", " ........... ", " ........... ", " ......... ", " ....... ", " ..... ", " ... ", " . ", " "}; mathgl-8.0.1/include/xpm/mark_vf.xpm0000664000175000017500000000063114167366472017204 0ustar balakinbalakin/* XPM */ static const char * mark_vf_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ", "................", "................", " .............. ", " .............. ", " ............ ", " .......... ", " .......... ", " ........ ", " ...... ", " ...... ", " .... ", " .. "}; mathgl-8.0.1/include/xpm/mark_y.xpm0000664000175000017500000000063014167366472017040 0ustar balakinbalakin/* XPM */ static const char * mark_y_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " . . ", " . . ", " . . ", " . . ", " ... ", " . ", " . ", " . ", " . ", " . ", " . ", " ", " ", " "}; mathgl-8.0.1/include/xpm/arrow_s.xpm0000664000175000017500000000063114167366472017233 0ustar balakinbalakin/* XPM */ static const char * arrow_s_xpm[] = { "16 16 2 1", " c None", ". c #007f00", " ", " ", " ", " ........ ", " ........ ", " ........ ", " ........ ", " ..............", " ........ ", " ........ ", " ........ ", " ........ ", " ", " ", " ", " "}; mathgl-8.0.1/include/CMakeLists.txt0000664000175000017500000000304714167366473016772 0ustar balakinbalakinconfigure_file(${MathGL2_SOURCE_DIR}/include/config.h.in ${MathGL2_BINARY_DIR}/include/mgl2/config.h) configure_file(${MathGL2_SOURCE_DIR}/include/build.h.in ${MathGL2_BINARY_DIR}/include/mgl2/build.h) install(DIRECTORY mgl2/ DESTINATION ${MGL_INCLUDE_PATH} PATTERN ".svn" EXCLUDE PATTERN "fltk.h" EXCLUDE PATTERN "glut.h" EXCLUDE PATTERN "wx.h" EXCLUDE PATTERN "qt.h" EXCLUDE PATTERN "qmathgl.h" EXCLUDE PATTERN "window.h" EXCLUDE PATTERN "*old.h" EXCLUDE PATTERN "*~" EXCLUDE PATTERN "*.fs" PATTERN "*.pas" PATTERN "*.h") install(FILES ${MathGL2_BINARY_DIR}/include/mgl2/config.h DESTINATION ${MGL_INCLUDE_PATH}) if(MGL_HAVE_FLTK) install(FILES mgl2/fltk.h DESTINATION ${MGL_INCLUDE_PATH}) endif(MGL_HAVE_FLTK) if(MGL_HAVE_GLUT) install(FILES mgl2/glut.h DESTINATION ${MGL_INCLUDE_PATH}) endif(MGL_HAVE_GLUT) if(MGL_HAVE_WX) install(FILES mgl2/wx.h DESTINATION ${MGL_INCLUDE_PATH}) endif(MGL_HAVE_WX) if(MGL_HAVE_QT) install(FILES mgl2/qt.h mgl2/qmathgl.h DESTINATION ${MGL_INCLUDE_PATH}) endif(MGL_HAVE_QT) #if(MGL_HAVE_FLTK AND MGL_HAVE_WX AND MGL_HAVE_QT) if(MGL_HAVE_FLTK AND MGL_HAVE_QT AND MGL_HAVE_WX) install(FILES mgl2/window.h DESTINATION ${MGL_INCLUDE_PATH}) #endif(MGL_HAVE_FLTK AND MGL_HAVE_WX AND MGL_HAVE_QT) endif(MGL_HAVE_FLTK AND MGL_HAVE_QT AND MGL_HAVE_WX) mathgl-8.0.1/include/build.h.in0000664000175000017500000000013514167366473016102 0ustar balakinbalakin#ifndef _MGL_BUILD_H_ #define _MGL_BUILD_H_ #define MGL_BUILD_DATE "${MathGL_DATE}" #endif mathgl-8.0.1/mgltex/0000775000175000017500000000000014167366474014104 5ustar balakinbalakinmathgl-8.0.1/mgltex/mgltex.dtx0000664000175000017500000046427414167366474016146 0ustar balakinbalakin% \iffalse meta-comment % % Copyright (C) 2014--2016 by Diego Sejas Viscarra % Copyright (C) 2014--2016 by Alexey Balakin % % This program is free software: you can redistribute it and/or modify it % under the terms of the GNU General Public License as published by the % Free Software Foundation, either version 3 of the License, or (at your % option) any later version. % % This program is distributed in the hope that it will be useful, but % WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General % Public License for more details. % % You should have received a copy of the GNU General Public License along % with this program. If not, see . % % \fi % % \iffalse % % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{mgltex}[2016/04/26 v4.2 Embed MGL scripts into LaTeX documents] % % %<*driver> \documentclass[10pt]{ltxdoc} \usepackage{color} \usepackage{mgltex} \DeclareRobustCommand\mglTeX{mgl\kern-0.04em\TeX}% Otherwise, incompatibility with \CharacterTable \IfFileExists{hyperref.sty}{% \usepackage[hidelinks]{hyperref}% }{} \EnableCrossrefs \CodelineIndex \RecordChanges \widowpenalty=10000 \clubpenalty=10000 \begin{document} \DocInput{mgltex.dtx} \end{document} % % \fi % % \CheckSum{0} % % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % \bgroup% % \makeatletter% % \gdef\MGL@set@pseudo@verb@env{% % \if@minipage\else\vskip\parskip\fi% % \setlength{\labelsep}{1em}% % \@beginparpenalty\predisplaypenalty% % \leftskip\@totalleftmargin\rightskip\z@% % \parindent\z@\parfillskip\@flushglue\parskip\z@% % \itemsep\z@% % \@@par% % \def\par{% % \if@tempswa% % \leavevmode\null\@@par\penalty\interlinepenalty% % \else% % \@tempswatrue% % \ifhmode\@@par\penalty\interlinepenalty\fi% % \fi% % }% % \ttfamily% % \frenchspacing% % }% % \makeatother % \egroup % % \def\doccommand#1{\texttt{\textbackslash#1}} % % \changes{\textbf{v1.0 ------------}}{2014/09/27}{Initial version} % % % \changes{\textbf{v2.0 ------------}}{2014/11/23}{Possible bugfix by adding \doccommand{expandafter} to commands to ignore/write lines of MGL code} % \changes{\textbf{v2.0 ------------}}{2014/11/23}{Add environment \texttt{mglsignature} that adds a comment to every MGL script} % \changes{\textbf{v2.0 ------------}}{2014/11/23}{Eliminate line ignoring commands to create more elegant scripts, due to the a new command that adds comments to the scripts} % \changes{\textbf{v2.0 ------------}}{2014/11/23}{Move the MGL \emph{stop} command from the \texttt{\textbackslash{}AtEndDocument} command to the \doccommand{mgl@func} buffer} % % % \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add detection of changes in MGL scripts to speed up compilation time (only changed scripts are recompiled)} % \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add command \doccommand{mgldir}, \doccommand{mglscriptsdir}, \doccommand{mglgraphicsdir} and \doccommand{mglbackupsdir} to specify a main directory for \textsf{\mglTeX} and directories for the creation of scripts, graphics and backups} % \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add the \doccommand{mglquality} command to specify a default quality} % \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add the \doccommand{mglwidth} and \doccommand{mglheight} commands to specify the default size of the images produced} % \changes{\textbf{v3.0 ------------}}{2015/03/29}{Add the \doccommand{mglsettings} command to configure behavior of the package} % \changes{\textbf{v3.0 ------------}}{2015/03/29}{Improve environment \texttt{mglsignature} by adding the possibility of using \LaTeX{} commands inside it} % % % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Complete rewrite of \textsf{\mglTeX}} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{\textsf{\mglTeX} now depends of the \textsf{verbatim} package} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{All environments write their contents \emph{verbatim}} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add package options \texttt{0q}, \ldots, \texttt{8q} to specify quality} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the \doccommand{mglpaths} command to add directories to the search paths for MGL scripts} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the \doccommand{mglname} command to force clousure of the current main script, its compilation, and the opening of a new main script} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{label} to the \texttt{mgl} environment in order to override the automatic naming of the script and corresponding image} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{label} to the \texttt{mglverbatim} environment to name the verbatim code} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{separator} to the command \doccommand{mglplot} to brake the code into different physical text lines} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the option \texttt{path} to the commands \doccommand{mglgraphics} and \doccommand{mglinclude} to force a path to search MGL scripts} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Verbatim-like environments and \doccommand{mglinclude} command are more visually elegant now} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Numbering in verbatim-like environments is optional now} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the command \doccommand{listofmglscripts} to create a list of all MGL scripts included verbatim in the document} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Add the command \doccommand{mglTeXwVer} that prints the name of the package with its version in a coherent manner, and separated by an unbreakable space} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Verbatim-like environments and the \doccommand{mglinclude} command have starred versions wich prevent the command \doccommand{listofmglscripts} to list them} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Remove \texttt{mglsignature} environment for being considered useless, and to avoid interference with the detection of changes in MGL scripts, to speed up script writing and to make the package less resource-consuming} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Remove the \doccommand{mglwidth} and \doccommand{mglheight} commands for being considered useless} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Many improvements, including, but not limited to, speed up, increased coherence and cleanness of the code, less resource consumption} % \changes{\textbf{v4.0 ------------}}{2015/08/17}{Many bugfixes} % % % \changes{\textbf{v4.1 ------------}}{2016/01/28}{Add the command \doccommand{mglimgext} to specify locally the extension to save the generated graphics} % \changes{\textbf{v4.1 ------------}}{2016/01/28}{Add the command \doccommand{mglswitch}, which replaces \doccommand{mgltexon} and \doccommand{mgltexoff}} % \changes{\textbf{v4.1 ------------}}{2016/01/28}{Rename the commands \doccommand{mgltexon} as \doccommand{MGL@switch@on} and \doccommand{mgltexoff} as \doccommand{MGL@switch@off} in order to avoid the user from unpurposely overwriting them} % \changes{\textbf{v4.1 ------------}}{2016/01/28}{The command \doccommand{mglcomments} has been reimplemented to accept one mandatory argument: \doccommand{mglcomments\{on\}} replaces the old \doccommand{mglcomments}, while \doccommand{mglcomments\{off\}} replaces the old \doccommand{mglnocomments}} % \changes{\textbf{v4.1 ------------}}{2016/01/28}{Remove the command \doccommand{mglnocomments} (rendered useless by the new implementation of \doccommand{mglcomments})} % \changes{\textbf{v4.1 ------------}}{2016/01/28}{Remove the command \doccommand{mglTeXwVer} (rendered useless by the implementation of the starred version of \doccommand{mglTeX})} % \changes{\textbf{v4.1 ------------}}{2016/01/28}{Restore the command \doccommand{mglsettings}, which was unintentionally deleted in version~4.0} % \changes{\textbf{v4.1 ------------}}{2016/01/28}{Expand the key-val list family for the command \doccommand{mglsettings}} % \changes{\textbf{v4.1 ------------}}{2016/01/28}{Reimplement the \doccommand{@MGL@comments@} switch} % \changes{\textbf{v4.1 ------------}}{2016/01/28}{A starred version of the command \doccommand{mglTeX} has been implemented, which prints the version of the package besides its name} % % % \changes{\textbf{v4.2 ------------}}{2016/05/14}{New package options \texttt{gray}, \texttt{color} to activate/deactivate gray-scale mode for graphics} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{New package options \texttt{0v}, \texttt{1v}, \texttt{2v} to select variant of arguments in MGL scripts} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{New package option \texttt{9q} for setting quality to \texttt{9} (for testing purposes of the author)} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{New commands: \doccommand{mglgray} (to activate/deactivate) gray-scale mode locally, and \doccommand{mglvariant} (to set variant of arguments in MGL scripts locally)} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename environment \texttt{mglcommon} to \texttt{mglsetupscript} (\texttt{mglcommon} is still available, but deprecated)} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename command \doccommand{mglcommonscriptname} to \texttt{mglsetupscriptname}} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename command \doccommand{MGL@graph@ext} to \doccommand{MGL@imgext}} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename family \texttt{MGL@keys} as \texttt{MGL@gr@keys} for consistency} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Reorganize and update documentation} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{\mglTeX{} now depends on the \texttt{ifpdf} package} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{The MGL code line \texttt{setsize~600~400} is now automatically written to the main script in order for the scaling options and commands to work} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Remove the \doccommand{MGL@setkeys} command, since it isn't needed as first thought} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Some minor bugfixes} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Change definition of \doccommand{mglcommentname} from \emph{MGL comment} to \emph{\mglTeX{} comment}} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename \doccommand{MGL@document@scripts} to \doccommand{MGL@doc@scripts}} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Rename \doccommand{MGL@script@name} tp \doccommand{MGL@script}} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Introduce the concept of \emph{global}, \emph{local} and \emph{private} settings in the documentation} % % \GetFileInfo{mgltex.sty} % % \DoNotIndex{\def,\bgroup,\egroup,\newcommand,\newenvironment,\\,\@onlypreamble,\@undefined,\@vobeyspaces,\list} % \DoNotIndex{\if,\else,\fi,\begingroup,\endgroup,\end,\edef,\xdef,\gdef,\scapechar,\active,\arabic,\catcode,\bfseries} % \DoNotIndex{\@flushglue,\@for,\@ifnextchar,\@makeother,\{,\},\ ,\AtBeginDocument,\AtEndDocument,\centering} % \DoNotIndex{\closein,\closeout,\csname,\endcsname,\CurrentOption,\DeclareGraphicsExtensions,\define@key,\DeclareOption} % \DoNotIndex{\detokenize,\do,\dospecials,\endlinechar,\endlist,\escapechar,\ExecuteOptions,\expandafter,\footnotesize} % \DoNotIndex{\framebox,\Huge,\ifeof,\IfFileExists,\ifx,\immediate,\include,\includegraphics,\item,\itemsep} % \DoNotIndex{\itshape,\jobname,\labelsep,\leftskip,\let,\long,\mbox,\newcounter,\newread,\newtoks,\newwrite,\noexpand} % \DoNotIndex{\obeyspaces,\openin,\openout,\PackageError,\PackageWarning,\parfillskip,\parindent,\parskip} % \DoNotIndex{\PassOptionsToPackage,\ProcessOptions,\read,\relax,\RequirePackage,\rightskip,\setcounter,\setkeys,\setlength} % \DoNotIndex{\space,\stepcounter,\string,\TeX,\the,\vbox,\verbatim@font,\write,\z@,\z@skip,\newif,\PackageInfo,\today} % \DoNotIndex{\obeylines,\or,\ifcase,\small,\vskip,\section,\refstepcounter,\protect,\pretolerance,\penalty,\ttfamily} % \DoNotIndex{\@@par,\@@,\@M,\@addtofilelist,\@auxout,\@bsphack,\@dottedtocline,\@empty,\@esphack,\@fornoop,\@fortmp} % \DoNotIndex{\@gobble,\@ifundefined,\@mkboth,\@namedef,\@nil,\@nnil,\@noitemerr,\@plus,\@pnumwidth,\@secpenalty} % \DoNotIndex{\@startsection,\@starttoc,\@tempdima,\@tempswatrue,\@totalleftmargin,\@unknownoptionerror,\@xobeysp} % \DoNotIndex{\^,\addcontentsline,\addpenalty,\addvspace,\advance,\begin,\c@tocdepth,\center,\chapter,\cleaders} % \DoNotIndex{\endcenter,\everypar,\fbox,\fboxrule,\frenchspacing,\g@addto@macro,\global,\hb@xt@,\hbadness,\hfil,\hfill} % \DoNotIndex{\hrule,\hskip,\hss,\if@minipage,\if@tempswa,\ifhmode,\ifnum,\interlinepenalty,\itemindent,\kern,\l@chapter} % \DoNotIndex{\l@section,\large,\leavevmode,\MakeUppercase,\newdimen,\nobreak,\nopagebreak,\normalfont,\null,\numberline} % \DoNotIndex{\p@,\par,\unpenalty,\usecounter,\@ifstar,\^,\iffalse,\iftrue,\ifpdf} % % \title{The \textsf{\mglTeX} package\thanks{This document corresponds to \textsf{\mglTeX}~\fileversion, dated \filedate.}} % \author{Diego Sejas Viscarra\\\texttt{dsejas.mathematics@gmail.com}} % % \maketitle % % \begin{abstract} % \noindent MathGL is a fast and efficient library by Alexey Balakin for the creation of high-quality publication-ready scientific graphics. Although it defines interfaces for many programming languages, it also implements its own scripting language, called \emph{MGL}, which can be used independently. With the package \textsf{\mglTeX}, MGL scripts can be embedded within any \LaTeX{} document, and the corresponding images are automatically created and included. % % This manual documents the usage of the commands and environments of~\textsf{\mglTeX}. % \end{abstract} % % \tableofcontents % % \section{Introduction} % \noindent MathGL is a fast and efficient library by Alexey Balakin for the creation of high-quality publication-ready scientific graphics. It implements more than $50$ different types of graphics for 1d, 2d and 3d large sets of data. It supports exporting images to bitmap formats (PNG, JPEG, BMP, etc.), or vector formats (EPS, \TeX, SVG, etc.), or 3d image formats (STL, OBJ, XYZ, etc.), and even its own native 3d format, MGLD. MathGL also defines its own vector font specification format, and supports UTF-16 encoding with \TeX-like symbol parsing. It supports various kinds of transparency and lighting, textual formula evaluation, arbitrary curvilinear coordinate systems, loading of subroutines from .dll or .so libraries, and many other useful features. % % MathGL has interfaces for a wide variety of programming languages, such as C/C++, Fortran, Python, Octave, Pascal, Forth, and many others, but it also defines its own scripting language, called \emph{MGL}, which can be used to generate graphics independently of any programming language. The \textsf{\mglTeX} package adds support to embed MGL code inside \LaTeX{} documents, which is automatically extracted and executed, and the resulting images are included in the document. % % Besides the obvious advantage of having available all the useful features of MathGL, \textsf{\mglTeX} facilitates the maintenance of your document, since both code for text and code for graphics are contained in a single file. % % \subsection{Conventions and notations} % \noindent For what's left of this manual, the symbols ``$\langle$'' and ``$\rangle$'' will enclose the description of an object that should be placed in that location; this is called a \emph{meta-variable}. For example, $\meta{text}$ is a meta-variable that indicates that in that location should be placed any form of text. % % In order to save space and time, some special conventions should be applied to meta-variables: % \begin{enumerate} % \item Any meta-variable that contain the word \emph{directory} indicates the name of a directory, in the form of an absolute or relative path, ending with the slash (``/'') character. % \item Any meta-variable that contain the word \emph{subdirectory} indicates a relative path ending with the slash (``/'') character. % \item \meta{$x_1\vert x_2\vert\ldots\vert x_n$} indicates that any of the values $x_1$, $x_2$, \ldots, $x_n$ can be placed there. A special case is \meta{$x_1\vert x_2\vert\ldots$}, where no upper limit is set. % \item The possible values of a meta-variable could also be indicated by a property. For example \meta{$x:x>0$} indicates that any positive value can be used in that location. % \item A meta-variable of the form \meta{list of something} or \meta{something list} indicate a comma-separated list of values of type $\meta{something}$; if only one value is used, no comma is needed. % \item A meta-variable with underscores (``|_|'') in its description indicate that spaces should not be used in that location. % \item \meta{key-val list} refers to a list of \meta{key}=\meta{value} pairs of options, where \meta{key} is a keyword name for an option and \meta{value} is a value assigned to it. % \end{enumerate} % % As is conventional for \LaTeX{} packages, the environments and commands defined by \textsf{\mglTeX} accept optional commands inside brackets ("|[|" and "|]|"), and mandatory arguments inside curly braces ("|{|" and "|}|"). % % While reading the following, it must be noted that most of \textsf{\mglTeX} settings have three modes: global, local and private. A setting is \emph{global} if it applies to the whole document, it is \emph{local} if it applies to the document from one point onwards, and it is \emph{private} if it applies only to a particular MGL script. Global settings are set thorugh package options or with the command |\mglsettings| (explained later), local settings have associated commands (subsection \ref{local setts}), and private settings are specified as optional arguments for environments and commands. An example of this would be the package option |4q|, the command |\mglquality{4}|, and the optional argument for environments and commands |quality=4|, to set the quality for graphics to |4| in the three different modes, respectively. % % \section{Usage} % \noindent The simplest way to load \textsf{\mglTeX} to a \LaTeX{} document is to write the command % \begin{center} % |\usepackage{mgltex}| % \end{center} % in the preamble. Alternatively, one can pass a number of options to the package by means of the syntax % \begin{center} % |\usepackage|\oarg{options list}|{mgltex}|, % \end{center} % where \meta{options list} can contain one or more of the following options: % \begin{itemize} % \item \textbf{draft:} The generated images won't be included in the document. This option is useful when fast compilation of the document is needed. % \item \textbf{final:} Overrides the |draft| option. % \item \textbf{on:} To rewrite, recompile and include the changed MGL scripts and/or corresponding graphics. % \item \textbf{off:} To avoid creation, compilation and/or inclusion of the MGL scripts and corresponding images. % \item \textbf{comments:} To allow the contents of the |mglcomment| environments to be shown in the \LaTeX{} document. % \item \textbf{nocomments:} To avoid showing the contents of the |mglcomment| environments in the \LaTeX{} document. % \item \textbf{gray:} To create the MGL graphics in gray-scale mode. % \item \textbf{color:} To create the MGL graphics in color mode. % \item \textbf{1x, \ldots, 9x:} To specify the scale for the creation of graphics (|1x| is normal scaling, |2x| is twice as bigger, etc). % \item \textbf{0q, \ldots, 9q:} To specify the quality for the creation of graphics. An info message indicating the characteristics of the chosen quality is printed in the .log file according to the following table: % \begin{center} % \DeleteShortVerb{\|} % \begin{tabular}{|c|l|} % \hline % Quality & Description\\ % \hline % \hline % $0$ & No face drawing (fastest)\\ % \hline % $1$ & No color interpolation (fast)\\ % \hline % $2$ & High quality (normal)\\ % \hline % $3$ & High quality with 3d primitives (not implemented yet)\\ % \hline % $4$ & No face drawing, direct bitmap drawing (low memory usage)\\ % \hline % $5$ & No color interpolation, direct bitmap drawing (low memory usage)\\ % \hline % $6$ & High quality, direct bitmap drawing (low memory usage)\\ % \hline % $7$ & High quality with 3d primitives, direct bitmap drawing\\ % & (not implemented yet)\\ % \hline % $8$ & Draw dots instead of primitives (extremely fast)\\ % \hline % $9$ & No drawing (for testing purposes)\\ % \hline % \end{tabular} % \MakeShortVerb{\|} % \end{center} % \item \textbf{0v, 1v, 2v:} To set the default variant of arguments for the MGL commands. % \item \textbf{png, jpg, jpeg:} To export images to a bitmap format. % \item \textbf{eps, epsz:} To export to uncompressed/compressed vectorial EPS format. % \item \textbf{bps, bpsz:} To export to uncompressed/compressed bitmap EPS format. % \item \textbf{pdf:} To export to 3D PDF format. % \item \textbf{tex:} To export to \LaTeX{}/\emph{tikz} document. % \end{itemize} % If two or more mutually exclusive options are specified, only the last one will be used by \textsf{\mglTeX}. For example, if one specifies the options |0q|, |3q| and |8q|---in that order---, then the quality will be set to $8$. % % Observe the |off| option is similar to the |draft| option, with the exception that |draft| deactivates inclusion of graphics for the \textsf{\mglTeX} and \textsf{graphicx} packages simultaneously, while the |off| option only deactivates \textsf{\mglTeX} functionalities (creation and/or inclusion of scripts and graphics), not affecting \textsf{graphicx}. This could be useful to recognize which images are created with MGL, and which are only included. Another possible use for this option is to avoid recompilation of scripts when they must be constantly changed until their final version.\footnote{\textsf{\mglTeX} has a convinient recompilation-decision algorithm that enables recompilation for changed scripts only (see subsection \ref{subsection: recompilation decision}).} % % There are two ways to compile a document with \textsf{\mglTeX}: The first way is to run % \begin{center} % |latex --shell-escape |\meta{document}|.tex| % \end{center} % three times, since the first run will detect changes in the scripts; the second run will extract the MGL code, execute it and include some of the resulting graphics, while the third run will include the remaining graphics. The second way is to run % \begin{center} % |latex |\meta{document}|.tex| % \end{center} % twice to detect changes in MGL code and to extract it, then compile the generated scripts with the program |mglconv| (part of MathGL bundle), and execute |latex |\meta{document}|.tex| once more to include the graphics.\footnote{If no changes were made to scripts intended to create graphics, only one \LaTeX{} run is needed.} (More on the recompilation-decision mechanism of \textsf{\mglTeX} can be found in subsection~\ref{subsection: recompilation decision}.) % % \subsection{Warning for the user}\label{subsection: warning} % Before we continue the description of the package, it must be pointed out that \textsf{\mglTeX} assummes that the command |\end{|\meta{MGL environment}|}|, that ends the corresponding \meta{MGL environment}, occupies its own physical line of \LaTeX{} code. So the correct forms of use of environments are the following: % \begin{quote} %|\begin{|\meta{MGL environment}|}|\\ %\meta{contents of the environment}\\ %|\end{|\meta{environment}|}| % \end{quote} % and % \begin{quote} %|\begin{|\meta{MGL environment}|}|\meta{contents of the environment}\\ %|\end{|\meta{environment}|}| % \end{quote} % The following form will cause problems: % \begin{quote} %|\begin{|\meta{MGL environment}|}|\meta{contents of the environment}|\end{|\meta{MGL environment}|}| % \end{quote} % % \textsf{\mglTeX} depends on the \textsf{verbatim} package to define its environments. One of the characteristics of \textsf{verbatim} is that it transcripts everything contained between the begining and the end of an environment, including spaces before an |\end{|\meta{MGL environment}|}| command. This should not be a problem, except for the fact that \textsf{\mglTeX} has a mechanism to detect changes in MGL scripts in order to recompile them (see subsection \ref{subsection: recompilation decision}), and the mentioned spaces in the scripts and their counterparts in the \LaTeX{} document can't be recognized properly as identical when compared, causing the package to recompile the scripts even when they haven't changed, rendering the mechanism useless.\footnote{It is currently unknown for the author why this spaces aren't detected properly. Help would be appreciated.} In order to avoid this glitch, the facilities provided by \textsf{verbatim} have been adapted to ignore everything before |\end{|\meta{MGL environment}|}|, including spaces and, unfortunately, MGL code. % % It should also be pointed out that the default behavior of the |verbatim| package makes the following form to ignore the \meta{text} after the |\end|\meta{MGL environment}, issuing a warning. % \begin{quote} %|\begin{|\meta{MGL environment}|}|\\ %\meta{contents of the environment}\\ %|\end{|\meta{MGL environment}|}|\meta{text} % \end{quote} % % \subsection{Environments for MGL code embedding} % \DescribeEnv{mgl}\noindent The main environment defined by \textsf{\mglTeX} is |mgl|. It extracts its contents to a main script, called \meta{main\_script\_name}.mgl, where \meta{main\_script\_name} stands for a name specified by the user with the |\mglname| command (explained later), or the name of the \LaTeX{} document being executed otherwise; this script is compiled, and the corresponding image is included. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mgl}|\oarg{key-val list}\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] % |\end{mgl}|\\[0.25em] % \hline % \end{tabular} % \end{center} % Here, \meta{key-val list} can have the following optional arguments: % \begin{itemize} % \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, scale, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package. % \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic). % \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, i.g., |mglscale=2| will create an image file twice as bigger. % \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|. % \item \textbf{variant:} Sets the variant of argument for the commands in the current script. % \item \textbf{imgext:} Can be used to set the extension for the current image. % \item \textbf{label:} Can be used to indicate a name for the corresponding graphic (otherwise, an automatic naming will be applied) % \end{itemize} % % \DescribeEnv{mgladdon} This environment adds its contents to the document's main script, but it doesn't produce any image. It doesn't require any kind of arguments. It is useful to add ``complementary code'', like instructions to load dynamic libraries, set default size for the graphics, etc. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mgladdon}|\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] % |\end{mgladdon}|\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeEnv{mglfunc} Is used to define MGL functions within the document's main script. It takes one mandatory argument, which is the name of the function, plus one optional argument, which specifies the number of arguments of the function (the default is $0$). The environment needs to contain only the body of the function, since the lines ``func \meta{function\_name} \meta{number of arguments}'' and ``return'' are appended automatically at the beginning and the end, respectively. The resulting code is written at the end of the document's main script, after the |stop| command, which is also written automatically. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglfunc}|\oarg{number of arguments}\marg{function\_name}\\[0.5em] % \hss\meta{MGL function body}\hss\\[0.5em] % |\end{mglfunc}|\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeEnv{mglcode} It has the same function as the |mgl| environment, but the corresponding code is written to a separate script, whose name is specified as mandatory argument. It accepts the following optional arguments: % \begin{itemize} % \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, scale, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package. % \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic). % \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, i.g., |mglscale=2| will create an image file twice as bigger. % \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|. % \item \textbf{variant:} Sets the variant of argument for the commands in the current script. % \item \textbf{imgext:} Can be used to set the extension for the current image. % \end{itemize} % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglcode}|\oarg{key-val list}\marg{script\_name}\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] % |\end{mglcode}|\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeEnv{mglscript} The code within |mglscript| is written to a script whose name is specified as mandatory argument, but no image is produced. It is useful for creation of MGL scripts which can be later post-processed by another package, like \textsf{listings} or \textsf{pygments}. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglscript}|\marg{script\_name}\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] % |\end{mglscript}|\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeEnv{mglsetupscript} This is used to create a common ``setup'' script to define constants, parameters, etc. that will be available to the others. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglsetupscript}|\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] % |\end{mglsetupscript}|\\[0.25em] % \hline % \end{tabular} % \end{center} % If called more than once, it will overwrite the setup code. Also note that it should be used only to define constants, parameters and things like that, but not graphical objects like axis or grids, because the |mgl| environment clears every graphical object before creating the image.\footnote{This problem occurs only with the \texttt{mgl} environment, so you could use \texttt{mglcommon} to create many graphics with the same axis, grid, etc., with environments like \texttt{mglcode}, but in that case the best option is to use the \texttt{mglsetup} environment together with the \texttt{\textbackslash{}mglplot} command.} % % For example, one could write % \begin{quote} % |\begin{mglsetupscript}|\\ % |define gravity 9.81 # [m/s^2]|\\ % |\end{mglsetupscript}| % \end{quote} % to make the constant \emph{gravity} available to every script. % % \DescribeEnv{mglcommon} This is a synomyn for the |mglsetupscript| environment. It is and will always be kept in \textsf{\mglTeX} for backwards compatibility with older versions of the package, but its use is \emph{deprecated}. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglcommon}|\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] % |\end{mglcommon}|\\[0.25em] % \hline % \end{tabular} % \end{center} % % \subsection{Fast creation of graphics} % \noindent\textsf{\mglTeX} defines a convenient way to work with many graphics that have exactly the same settings (same rotation angles, same type of grid, same lighting, etc.): instead of writing repetitive code every time it's needed, it can be stored inside a |mglsetup| environment, and then can be used when needed with the |\mglplot| command. % % \DescribeEnv{mglsetup} This environment is defined as a special case of the |mglfunc| environment. It accepts one mandatory argument, which is a keyword (name) associated to the corresponding block of code (MGL function body). % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglsetup}|\marg{key\_word}\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] % |\end{mglsetup}|\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeMacro{\mglplot} This command is used for fast generation of graphics with default settings, and can be used in parallel with the |mglsetup| environment. It accepts one mandatory argument which consists of MGL instructions, separated by the symbol ``:'', and can span through various text lines. It accepts the following optional arguments: % \begin{itemize} % \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, scale, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package. % \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic). % \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, e.g., |mglscale=2| will create an image file twice as bigger. % \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|. % \item \textbf{variant:} Sets the variant of argument for the commands in the current script. % \item \textbf{imgext:} Can be used to set the extension for the current image. % \item \textbf{label:} Can be used to indicate a name for the corresponding graphic (otherwise, an automatic naming will be applied) % \item \textbf{setup:} Specifies a keyword associated to a |mglsetup| block, which will be executed before the code in the mandatory argument. % \item \textbf{separator:} Specifies a text symbol that will break the code in the mandatory argument into a new physical line in the main script every time is encountered. % \end{itemize} % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglplot|\oarg{key-val list}\marg{MGL code}\\[0.25em] % \hline % \end{tabular} % \end{center} % % \subsection{Verbatim-like environments} % \noindent The main purpose of these environments is to typeset their contents to the \LaTeX{} document, elegantly separated from the rest of the text. They have two versions: an unstarred version which can be listed later with the |\listofmglscripts| command (explained later), and a starred version which won't be listed. % % Although these environments are intended to mimic the behavior of the |verbatim| environment from \LaTeX{}, there is an important difference, namely, long lines will be broken when the page margin is reached. This intended behavior is set because a language like MGL can easily have very long lines of code, like textual formulas, vectors input as lists of values, etc. Of course, no hyphenation will be performed, but the code will be indented in the second, third, etc. continuation lines by an amount specified by |\mglbreakindent| (explained later). % % \DescribeEnv{mglblock}\DescribeEnv{mglblock*} Besides typesetting its contents to the document, |mglblock| creates a script whose name is specified as mandatory argument. It accepts one optional argument: % \begin{itemize} % \item \textbf{lineno:} Used to activate (|lineno=true| or simply |lineno|) or deactivate (|lineno=false|) line numbering inside the environment. % \end{itemize} % By default, each line of code is numbered. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglblock}|\oarg{key-val list}\marg{script\_name}\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] % |\end{mglblock}|\\[0.25em] % \hline % \end{tabular} % \end{center} % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglblock*}|\oarg{key-val list}\marg{script\_name}\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] % |\end{mglblock*}|\\[0.25em] % \hline % \end{tabular} % \end{center} % The ouput looks like this: % \begin{quote} % \makeatletter % \MGL@set@script@name{example_script}% % \refstepcounter{MGL@verb@no}% % \addcontentsline{lms}{MGL@script}{\protect\numberline{\theMGL@verb@no.}{\ttfamily\protect\detokenize{\MGL@script.mgl}}}% % \setcounter{MGL@line@no}{0}% % \list{\mgllinenostyle\arabic{MGL@line@no}.}{}% % \MGL@set@pseudo@verb@env % \fboxrule=\mgllinethickness% % \item[\MGL@line@sep]\fbox{\bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}}\hskip\labelsep\MGL@line@sep\par\par% % \stepcounter{MGL@line@no}% % \item new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)' % \stepcounter{MGL@line@no}% % \item new y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)' % \stepcounter{MGL@line@no}% % \item new z 50 40 '0.8*cos(pi*(y+1)/2)' % \stepcounter{MGL@line@no}% % \item title 'Parametric surface' : rotate 50 60 : box % \stepcounter{MGL@line@no}% % \item surf x y z 'BbwrR' % \item[\MGL@line@sep]\hskip-\labelsep\MGL@line@sep% % \endlist% % \end{quote} % % \DescribeEnv{mglverbatim}\DescribeEnv{mglverbatim*} This environment only typesets its contents to the \LaTeX{} document without creating any script. It accepts two optional arguments % \begin{itemize} % \item \textbf{lineno:} Used to activate (|lineno=true| or simply |lineno|) or deactivate (|lineno=false|) line numbering inside the environment. % \item \textbf{label:} Used to specify a name associated to the corresponding code. % \end{itemize} % The default behavior is to number each line of code. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglverbatim}|\oarg{key-val list}\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] % |\end{mglverbatim}|\\[0.25em] % \hline % \end{tabular} % \end{center} % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglverbatim*}|\oarg{key-val list}\\[0.5em] % \hss\meta{MGL code}\hss\\[0.5em] % |\end{mglverbatim*}|\\[0.25em] % \hline % \end{tabular} % \end{center} % The output looks like this without |label|: % \begin{quote} % \makeatletter % \setcounter{MGL@line@no}{0}% % \list{\mgllinenostyle\arabic{MGL@line@no}.}{}% % \MGL@set@pseudo@verb@env % \fboxrule=\mgllinethickness% % \MGL@set@script@name{\mglverbatimname}% % \item[\MGL@line@sep]\hskip-\labelsep\MGL@line@sep% % \refstepcounter{MGL@verb@no}% % \addcontentsline{lms}{MGL@script}{\protect\numberline{\theMGL@verb@no.}{\ttfamily\protect\detokenize{\MGL@script}}}% % \stepcounter{MGL@line@no}% % \item new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)' % \stepcounter{MGL@line@no}% % \item new y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)' % \stepcounter{MGL@line@no}% % \item new z 50 40 '0.8*cos(pi*(y+1)/2)' % \stepcounter{MGL@line@no}% % \item title 'Parametric surface' : rotate 50 60 : box % \stepcounter{MGL@line@no}% % \item surf x y z 'BbwrR' % \item[\MGL@line@sep]\hskip-\labelsep\MGL@line@sep% % \endlist% % \end{quote} % \noindent If a |label| is specified, the output will look exactly as that of the |mglblock| environment. % % \DescribeEnv{mglcomment} This environment is used to embed comments. The comment won't be visible in the case of the user passing the option |nocomments| to the package, but it will be typeset \emph{verbatim} to the document if the user passes the option |comments|. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\begin{mglcomment}|\\[0.5em] % \hss\meta{Comment}\hss\\[0.5em] % |\end{mglcomment}|\\[0.25em] % \hline % \end{tabular} % \end{center} % If the user requests visible comments, this will result in the appearance of something like the following in the \LaTeX{} document: % \begin{quote} % \makeatletter % \list{}{}% % \MGL@set@pseudo@verb@env % \item\hskip-\labelsep<\MGL@dash@sep\mglcommentname\MGL@dash@sep>% % \item This is a mglTeX comment % \item\hskip-\labelsep<\MGL@dash@sep\mglcommentname\MGL@dash@sep>% % \endlist% % \end{quote} % % \subsection{Working with external scripts} % \noindent \textsf{\mglTeX} provides convenient ways to deal with external scripts (scripts that exist in their own files, independently of the \LaTeX{} document, like scripts sent by a colleague or created before the actual writing of the \LaTeX{} document, etc). It must be noted, however, that the package works on the suposition that these scripts are in their final version, so no change detection is performed on them. If a external script is changed, the corresponding graphic must be manually deleted in oreder to force recompilation. % % \DescribeMacro{\mglgraphics} This command takes the name of an external MGL script as mandatory argument, which will be automatically executed, and the resulting image will be included. The same optional arguments accepted by this command are: % \begin{itemize} % \item \textbf{bb, bbllx, bblly, bburx, bbury, natwidth, natheight, hiresbb, viewport, trim, angle, origin, width, height, totalheight, keepaspectratio, clip, draft, type, ext, read, command:} These are the same options of the |\includegraphics| command from the \textsf{graphicx} package. % \item \textbf{gray:} Can be used to activate (|gray=on| or |gray=1|) or deactivate (|gray=off| or |gray=0|) gray-scale mode privately (only for the current graphic). % \item \textbf{mglscale:} Any positive value for this option is used to physically scale the resulting image file, i.g., |mglscale=2| will create an image file twice as bigger. % \item \textbf{quality:} Sets the quality of the current graphic. Valid values are integers between |0| and |9|. % \item \textbf{variant:} Sets the variant of argument for the commands in the current script. % \item \textbf{imgext:} Can be used to set the extension for the current image. % \item \textbf{path:} Can be used to specify the location of the script. % \end{itemize} % % \DescribeMacro{\mglinclude}\DescribeMacro{\mglinclude*} This command is the equivalent of the |mglverbatim| environment for external scripts. It takes one mandatory argument, which is the name of a MGL script, which will be automatically transcript \emph{verbatim} on the \LaTeX{} document. It accepts the following optional arguments: % \begin{itemize} % \item \textbf{lineno:} Used to activate (|lineno=true| or simply |lineno|) or deactivate (|lineno=false|) line numbering inside the environment. % \item \textbf{path:} Can be used to specify the location of the script. % \end{itemize} % The unstarred version of this command will be listed if |\listofmglscripts| is used (explained later), while the starred version won't. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglinclude|\oarg{key-val list}\marg{script\_name}\\[0.25em] % \hline % \end{tabular} % \end{center} % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglinclude*|\marg{script\_name}\oarg{key-val list}\\[0.25em] % \hline % \end{tabular} % \end{center} % % \subsection{Additional commands} % \DescribeMacro{\listofmglscripts}\noindent Opens a new section or chapter---depending on the \LaTeX{} class used---, where all the scripts that have been transcript in the document with the unstarred versions of the |mglblock| and |mglverbatim| environments, and the |\mglinclude| command, are listed. In case a |mglverbatim| is used, but no |label| is specified, the default name to display is specified by the |\mglverbatimname| macro (explained later), otherwise, the corresponding label is typeset. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\listofmglscripts|\\[0.25em] % \hline % \end{tabular} % \end{center} % The output is like this: % \begin{center} % \begin{minipage}{0.9\textwidth} % \listofmglscripts % \end{minipage} % \end{center} % % \DescribeMacro{\mglTeX}\DescribeMacro{\mglTeX*} This command just pretty-prints the name of the package, i.e., the logo: % \begin{center} % \Huge\mglTeX % \end{center} % The starred version will also print the version in a coherent manner. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglTeX|\\[0.25em] % \hline % \end{tabular} % \end{center} % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglTeX*|\\[0.25em] % \hline % \end{tabular} % \end{center} % % In an environment where the typesetting of the logo is impossible (a text editor, for instance), it can (and should) be replaced by ``mglTeX''. % % \subsection{Local settings commands}\label{local setts} % \noindent These commands are intended to be equivalent to the package options, but with a local-only effect, meaning that the new settings are applied from the point these commands are used onward. % % \DescribeMacro{\mglswitch} This command is equivalent to the package options |on| and |off|, depending on the argument passed. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglswitch{|\meta{off\,$\vert$on\,$\vert$0\,$\vert$1}|}|\\[0.25em] % \hline % \end{tabular} % \end{center} % % Observe that |\mglswitch{on}| and |\mglswitch{off}| can be used to save time when writing a document, wrapping a section with them, avoiding recompilation of the corresponding scripts. % % \DescribeMacro{\mglcomments} This command is equivalent to the package options |comments| and |nocomments|, depending on the argument passed. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglcomments{|\meta{off\,$\vert$on\,$\vert$0\,$\vert$1}|}|\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeMacro{\mglgray} It is equivalent to the package options |gray| and |color|, depending on the argument passed. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglgray{|\meta{off\,$\vert$on\,$\vert$0\,$\vert$1}|}|\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeMacro{\mglscale} Can be used to specify the default scaling for the creation of MGL graphics (1 is normal scaling, 2 is twice as bigger, etc.). % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglscale|\marg{$x:x>0$}\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeMacro{\mglquality} The default quality for the creation of MGL graphics can be specified locally with this command. An info message will be printed in the |.log| file indicating the characteristics of the chosen value, according to the following table: % \begin{center} % \DeleteShortVerb{\|} % \begin{tabular}{|c|l|} % \hline % Quality & Description\\ % \hline % \hline % $0$ & No face drawing (fastest)\\ % \hline % $1$ & No color interpolation (fast)\\ % \hline % $2$ & High quality (normal)\\ % \hline % $3$ & High quality with 3d primitives (not implemented yet)\\ % \hline % $4$ & No face drawing, direct bitmap drawing (low memory usage)\\ % \hline % $5$ & No color interpolation, direct bitmap drawing (low memory usage)\\ % \hline % $6$ & High quality, direct bitmap drawing (low memory usage)\\ % \hline % $7$ & High quality with 3d primitives, direct bitmap drawing\\ % & (not implemented yet)\\ % \hline % $8$ & Draw dots instead of primitives (extremely fast)\\ % \hline % $9$ & No drawing (for testing purposes)\\ % \hline % \end{tabular} % \MakeShortVerb{\|} % \end{center} % If a non available quality is chosen, it will be changed to $2$ (the default), and a warning message will be issued for the user. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglquality|\marg{0\,$\vert$1\,$\vert$\ldots\,$\vert$9}\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeMacro{\mglvariant} It is useful to set the default variant of arguments for MGL commands. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglvariant|\marg{0\,$\vert$1\,$\vert$\ldots}\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeMacro{\mglimgext} Can be used to specify the extension to save graphics. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglimgext|\marg{image extension}\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeMacro{\mglname}\noindent If used in the preamble of the document this commands just sets the name of the. If used after the |\begin{document}| command, it will force the closure of the current main script, create the corresponding graphics, and start a new main script with the specified name. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglname|\marg{main\_script\_name}\\[0.25em] % \hline % \end{tabular} % \end{center} % % The use of this command is encouraged when writing large documents, like books or thesis, to create a main script per document block (section, chapter, part, etc.). Since the |mgl| environment and the |\mglplot| command use an internal counter to automatically name scripts, unless the |label| option is used; if a new script is added this way to the document, it will alter the original numbering, causing \textsf{\mglTeX} to recompile the scripts from that point on (for more details, read subsection \ref{subsection: recompilation decision}). If the |\mglname| command is used, only the scripts of the current document block will be recompiled. % % \subsection{Advanced settings commands} % \noindent Although \textsf{\mglTeX} is completely functional without any further set up, there are some parameters of its behavior that could be useful to modify. The following commands must be used in the preamble of the document only, since the first MGL script is created at the moment of the |\begin{document}| command, and otherwise they could create weird errors during compilation; trying to use them somewhere else will produce an error. % % \DescribeMacro{\mgldir} This command can be used to specify the main working directory for \textsf{\mglTeX}. Inside it, the scripts, backup files and graphics will be created, or can be separated inside subdirectories. This is useful, for example, to avoid many scripts and graphics from polluting the directory where the \LaTeX{} document is. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mgldir|\marg{main\_directory}\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeMacro{\mglscriptsdir} It specifies the subdirectory inside \mglTeX's \meta{main\_directory} where the MGL scripts will be created. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglscriptsdir|\marg{scripts\_subdirectory}\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeMacro{\mglgraphicsdir} It specifies the subdirectory inside \mglTeX's \meta{main\_directory} where the MGL graphics will be created, including the ones from external scripts (not embedded inside the \LaTeX{} document). % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglgraphicsdir|\marg{graphics\_subdirectory}\\[0.25em] % \hline % \end{tabular} % \end{center} % % \DescribeMacro{\mglbackupsdir} It specifies the subdirectory inside \mglTeX's \meta{main\_directory} where backups for the MGL scripts will be created. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglbackupsdir|\marg{backups\_subdirectory}\\[0.25em] % \hline % \end{tabular} % \end{center} % % The above commands can be used in various combinations. For example, if none of them is used, the scripts, graphics and backups will be created inside the same path where the \LaTeX{} document is being compiled; if only |\mgldir| is used, they will be created inside \meta{main\_directory}; if only |\mgldir| and |\mglscriptsdir| are used, the scripts will be created inside \meta{main\_directory}\meta{scripts\_subdirectory}, while the graphics and backups will be inside \meta{main\_directory} only; if |\mgldir| isn't used, but the other commands are, the \meta{scripts\_subdirectory}, \meta{graphics\_subdirectory} and \meta{backups\_subdirectory} folders will be inside the folder where the \LaTeX{} document is being compiled. % % \DescribeMacro{\mglpaths} In case of having external MGL scripts, it is not recommended to place them inside the same location as where the embedded scripts are extracted, since they could be accidentally overwritten or deleted by the user; they should be separated in a folder which can be specified in the form of an absolute or relative path using this command. % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglpaths|\marg{directory list}\\[0.25em] % \hline % \end{tabular} % \end{center} % This command can be used many times or can be used to specify many paths at once. In the case of using it many times, each call will add the new directory or directories to the list of searching paths. % % \DescribeMacro{\mglsettings} This command has been added for the confort of the user, since it handles all of the basic and advanced settings of \textsf{\mglTeX}, as an alternative to some package options and commands. It takes one mandatory argument which should be a list of \meta{key}=\meta{value} pairs, according to the following table: % \begin{center} % \DeleteShortVerb{\|} % \begin{tabular}{|l|l|l|} % \hline % \textbf{Key} & \textbf{Value} & \textbf{Description}\\ % \hline % \hline % dir & \meta{main\_directory} & The main working directory\\ % \hline % scriptsdir & \meta{scripts\_subdirectory} & The subdirectory for scripts creation\\ % \hline % graphicsdir & \meta{graphics\_subdirectory} & The subdirectory for graphics creation\\ % \hline % backupsdir & \meta{backups\_subdirectory} & The subdirectory for backups creation\\ % \hline % paths & \meta{directory list} & Paths to external scripts\\ % \hline % switch & \meta{off\,$\vert$on\,$\vert$0\,$\vert$1} & Turn off/on \mglTeX\\ % \hline % comments & \meta{off\,$\vert$on\,$\vert$0\,$\vert$1} & Turn off/on comments\\ % \hline % gray & \meta{off\,$\vert$on\,$\vert$0\,$\vert$1} & Turn off/on gray-scale mode\\ % \hline % mglscale & \meta{$x:x>0$} & Scale for creation of graphics\\ % \hline % quality & \meta{0\,$\vert$1\,$\vert$\ldots\,$\vert$9} & Quality for creation of graphics\\ % \hline % variant & \meta{0\,$\vert$1\,$\vert$\ldots} & Variant of arguments for MGL commands\\ % \hline % imgext & \meta{image extension} & Extension for creation of graphics\\ % \hline % \end{tabular} % \MakeShortVerb{\|} % \end{center} % \begin{center} % \begin{tabular}{l} % \hline\\[-0.75em] % |\mglsettings|\marg{key-val list}\\[0.25em] % \hline % \end{tabular} % \end{center} % % \subsection{User-definable macros} % \noindent There are macros that the user is allowed to modify in order to customize some aspects of the behavior of \textsf{\mglTeX}. For example, if writing in spanish, french or russian, the user would like to modify the name of the common script, the words typeset in the separator lines of mglTeX comments, the name of the list of MGL scripts, etc. % % \DescribeMacro{\mglsetupscriptname} It is the name for the common setup script that takes the contents of the |mglseuptscipt| or |mglcommon| environments. The default name is defined by % \begin{quote} % |\def\mglsetupscriptname{MGL_setup_script}| % \end{quote} % % \DescribeMacro{\mglcommentname} This macro expands to the words typeset before and after a \textsf{\mglTeX} comment, in the middle of the separator lines. The default words are set by % \begin{quote} % |\def\mglcommentname{\mglTeX{} comment}| % \end{quote} % % \DescribeMacro{\listofmglscriptsname} This is the name of the section/chapter created by the command |\listofmglscripts|. The default is set by % \begin{quote} % |\def\listofmglscriptsname{List of MGL scripts}| % \end{quote} % % \DescribeMacro{\mglverbatimname} This is the default name to be printed in the list of MGL scripts for scripts created with the unstarred version of |mglverbatim|, for which a |label| hasn't been specified. The default is % \begin{quote} % |\def\mglverbatimname{(Unnamed MGL script)}| % \end{quote} % % \DescribeMacro{\mgllinenostyle} Indicates the style for typeseting the line numbers inside the |mglblock| and |mglverbatim| environments, and the |\mglinclude| command. The default is % \begin{quote} % |\def\mgllinenostyle{\footnotesize}| % \end{quote} % % \DescribeMacro{\mgldashwidth} The dashes of the separator lines for the |mglcomment| environment are contained inside boxes whose width is specified by this macro. For practical purposes, this dimension can be used to increase/decrease the space between the dashes. The default is % \begin{quote} % |\mgldashwidth=0.75em| % \end{quote} % It is recommended to use font-dependent units for this dimension, like |em|, just in case the font is changed later, so it adapts to the new metric.\footnote{A rule of thumb is to use \texttt{em} units for horizontal dimensions, and \texttt{ex} units for vertical dimensions.} % % \DescribeMacro{\mgllinethickness} It is the thickness of the separator lines for the |mglblock| and |mglverbatim| environments, and the |\mglinclude| command. The default is % \begin{quote} % |\mgllinethickness=0.25ex| % \end{quote} % It is also recommended to use font-dependent units for this dimension, like |ex|. % % \DescribeMacro{\mglbreakindent} \textsf{\mglTeX} allows line breaking inside verbatim-like environments and commands. When a line of code is broken, |\mglbreakindent| is the indentation of the second, third, etc. continuation lines. The default is % \begin{quote} % |\mglbreakindent=1em| % \end{quote} % Once more, font-dependent units are encourage. % % \section{Behavior of \textsf{\mglTeX}} % \noindent \textsf{\mglTeX} has many convenient features designed for the comfort of the user, and to reduce the possibility of unintentional malfunction. % \subsection{Creation and inclusion of MGL scripts and graphics} % \noindent All environments and commands for MGL code embedding check for multiple scripts with the same name. This detection is performed in order to avoid unintentionally overwriting scripts, or creating confusion with different verbatim chunks of code with the same name. If such multiple naming is found a warning will be issued. However, external scripts are supposed to be responsibility of the user, so no detection of multiple naming will be performed on them. % % When \textsf{\mglTeX} is unable to find a graphic that is supposed to include, instead of producing an error, it will warn the user about it, and will display a box in the corresponding position of the document like the one shown in figure~\ref{fig: MGL image not found box}. % \begin{figure}[!ht] % \centering % \fbox{% % \centering% % \bfseries\Huge% % \begin{tabular}{c}MGL\\image\\not\\found\end{tabular}% % } % \caption{This box is shown by \textsf{\mglTeX} instead of a graphic that should be included, but can't be found.}\label{fig: MGL image not found box} % \end{figure} % Notice that the first time or even the second time \LaTeX{} is executed, many of these boxes will appear in the document, because the first run detects changes on scripts, while the second run creates the graphics, but not all of them are included, until \LaTeX{} is run for the third time. % % Likewise, when a script isn't found, a warning will be issued for the user, and, if that script was meant to be included in the document by a |\mglinclude| command, the box shown in figure~\ref{fig: MGL script not found box} will be displayed instead. % \begin{figure}[!ht] % \centering % \fbox{% % \centering% % \bfseries\Huge% % \begin{tabular}{c}MGL\\script\\not\\found\end{tabular}% % } % \caption{This box is shown by \textsf{\mglTeX} instead of a script that should be included, but can't be found.}\label{fig: MGL script not found box} % \end{figure} % % When \textsf{\mglTeX} is |off| no MGL graphics will be generated nor will be included, but instead, a box like the one of figure~\ref{fig: mglTeX is off box} will be shown. % \begin{figure}[!ht] % \centering % \fbox{% % \centering% % \bfseries\Huge% % \begin{tabular}{c}\mglTeX\\is off;\\no image\\included\end{tabular}% % } % \caption{This box is shown instead of an image when \textsf{\mglTeX} is \texttt{off}.}\label{fig: mglTeX is off box} % \end{figure} % % \subsection{Recompilation-decision algorithm}\label{subsection: recompilation decision} % \noindent \textsf{\mglTeX} has the builtin capacity of detecting changes in MGL scripts, so that a script is recompiled only when it has changed, not every time \LaTeX{} is executed. This saves a lot of time, since most of the compilation time of a document is spent on the creation (and conversion to another format, if necessary) of the graphics. % % This is how the recompilation-decision is performed: When \textsf{\mglTeX} finds an environment or command meant to create a script/graphic, it checks if the command |\MGL@@@|\meta{script} is defined, where \meta{script} is the name of the script. If the command is undefined, this means the script has changed, so the corresponding code is transcript to the file \meta{script}.mgl, and the command |\MGL@@@|\meta{script} is defined. If the command is already defined, this means the script has been created on a previous \LaTeX{} run, so this time the embedded code is compared against the contents of the script; if they are equal, then |\MGL@@@|\meta{script} is defined again, otherwise, it is undefined, so the next \LaTeX{} run will rewrite/recompile the code. This process is schematically represented in figure~\ref{fig: recompilation decision}. % % \begin{figure}[ht!] % \centering % \includegraphics[scale=0.35]{Recompilation_decision} % \caption{The algorithm used by \textsf{\mglTeX} to decide which scripts recereate/recompile.}\label{fig: recompilation decision} % \end{figure} % % The recompilation-decision mechanism can be fooled, however. The |mgl| environment and |\mglplot| command have the ability to automatically name scripts by means of the use of an internal counter, unless the |label| option is specified. Suppose the user wants to add a new |mgl| environment or |\mglplot| command exactly after the $(n-1)$th script, so the $n$th script will be the newly added, while the old $n$th will be the new $(n+1)$th, and so on, altering the original numbering. This will cause \textsf{\mglTeX} to compare the old $n$th script with the old $(n+1)$th, and so on, deciding they are different, so they will be recompiled. % % There are two ways to avoid this problem: The first one is to use the |label| option on the newly arrived; the second is to wrap a complete block of the document with the |\mglswitch{off}| and |\mglswitch{on}| commands, avoiding recompilation and saving time. This last option will avoid the inclusion of the MGL graphics, so it is only recommended in case of the wrapped scripts being in their final version (not needing further modification), so there is no need of updating the corresponding graphics; then, when the document is compiled in its final version, the |\mglswitch{off}| and |\mglswitch{on}| can be removed. However, the most recommended way of proceeding is to use the |\mglname| command to create a separated main script per document block (section, chapter, part, etc.), so that, if a new script disrupts the original numbering, \textsf{\mglTeX} will recompile only the scripts of the current block. % % There are situations when recompilation of a script has to be forced. For example, if the default quality has changed, but the script hasn't, \textsf{\mglTeX} won't recreate the corresponding graphic by its own initiative, because it won't detect any changes in the code. In order to force recompilation, the image of the corresponding script can be deleted: \textsf{\mglTeX} will detect this abscence in the next \LaTeX{} run and recompile. % % \section{Acknowledgements} % \noindent \textsf{\mglTeX} was born as a small personal project. It has grown and mature under the constant suggestions and requests from Prof. Alexey Balakin. % % \section{Redistributing and modifying} % \noindent The \emph{source code} of \textsf{\mglTeX} (.sty, .dtx, and .ins files) can be redistributed and/or modified under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. The \emph{documentation} of \textsf{\mglTeX} (.dvi, .ps, .pdf and other files) is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. % % \StopEventually{\PrintChanges\PrintIndex} % % \section{Implementation} % \noindent This section documents the complete code of \textsf{\mglTeX}. It's main purpose is to facilitate the understanding and maintanance of the package's code. For the following, we use ``|@|'' in the name of macros the user should not modify; the prefix ``|MGL|'' is used to simulate a namespace, so the macros from \textsf{\mglTeX} won't interfere with the ones from other packages. % % \subsection{Initialization}\label{Init} % \noindent We first define some macros that will serve different purposes on different parts of the package. % \begin{macro}{\MGL@off}\begin{macro}{\MGL@on}\begin{macro}{\MGL@zero}\begin{macro}{\MGL@one} % These are used in the command |\MGL@test@switch| (explained later) to determine whether the user has passed one of the options |off|, |on|, |0| or |1| to a command. % \begin{macrocode} \def\MGL@off{off} \def\MGL@on{on} \def\MGL@zero{0} \def\MGL@one{1} % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro} % \begin{macro}{\MGL@test@switch} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{New command to verify and validate switching arguments} % It is called by a command to test whether the user has passed the option |off|, |on|, |0| (equivalent to |off|) or |1| (equivalent to |on|); if the option is correct, it is replaced by its equivalent, otherwise, a warning is issued. It takes two arguments: the first one is the option to test, the second one is the name of the command calling this macro. % \begin{macrocode} \def\MGL@test@switch#1#2{% \def\MGL@temp@a{#1}% \ifx\MGL@temp@a\MGL@on% \else\ifx\MGL@temp@a\MGL@off% \else\ifx\MGL@temp@a\MGL@one% \def\MGL@temp@a{on}% \else\ifx\MGL@temp@a\MGL@zero% \def\MGL@temp@a{off}% \else% \PackageWarning{mgltex}{% Unrecognizable option "#1" passed to command \protect#2% }% \fi\fi\fi\fi% } % \end{macrocode} % \end{macro} % % \begin{macro}{\MGL@TeX@ext} % Is used in the command |\MGL@includegraphics| (explained later) to determine whether the user has chosen to save graphics in \LaTeX/Tikz format. % \begin{macrocode} \def\MGL@TeX@ext{.tex} % \end{macrocode} % \end{macro} % % The macros |\MGL@switch@on| and |\MGL@switch@off| are called when the package options |on| and |off| are passed, respectively, or when the commands |\mglswitch{on}| and |\mglswitch{off}| are used, respectively. % \begin{macro}{\MGL@switch@on} % (Re)defines the commands to open, read, write and close scripts, and the command that includes MGL graphics. % \begin{macrocode} \def\MGL@switch@on{% % \end{macrocode} % \begin{macro}{\MGL@openout} % Opens a script for writing. It takes two arguments, the first being an output stream number, allocate by |\newwrite| (\TeX{} command), and the second being the path to the script. % \begin{macrocode} \def\MGL@openout##1##2{% \immediate\openout##1="##2"% }% % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@openin} % Opens a script for reading. It takes two arguments, the first being an input stream number, allocate by |\newread| (\TeX{} command), and the second being the path to the script. % \begin{macrocode} \def\MGL@openin##1##2{% \immediate\openin##1="##2"% }% % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@write} % Writes to a script opened with |\MGL@openout|. Its first argument is the output stream number of the script, and the second is the text to write. % \begin{macrocode} \def\MGL@write##1##2{% \immediate\write##1{##2}% }% % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@read} % Reads one line from a script opened with |\MGL@openin|. Its first argument is the input stream number of the script, and the second is a variable where the read text will be stored. The variable is first initialized as empty; if the end of the script has been reached, then there is nothing to read, so it remains empty; otherwise, one line is read and stored in the variable, locally supressing any end line character (|\endlinechar=-1|). % \begin{macrocode} \def\MGL@read##1##2{% \def##2{}% \ifeof##1\else% \bgroup% \endlinechar=-1% \immediate\global\read##1 to ##2% \egroup% \fi% }% % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@closeout} % Closes a script opened with |\MGL@openout|, whose stream number is passed as argument. % \begin{macrocode} \def\MGL@closeout##1{% \immediate\closeout##1% } % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@closein} % Closes a script opened with |\MGL@openin|, whose stream number is passed as argument. % \begin{macrocode} \def\MGL@closein##1{% \immediate\closein##1% } % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@includegraphics} % This is a quite sophisticated command. It is in charge of including the graphics created by \textsf{\mglTeX}. % \begin{macrocode} \def\MGL@includegraphics{% % \end{macrocode} % First checks if the image exists. Note the |\MGL@dir| and |\MGL@graphics@dir| macros are set by the user with the |\mgldir| and |\mglgraphicsdir| commands, respectively, while |\MGL@script| stores the name of the script ---and thus the image--- executed, and |\MGL@imgext| is the extension chosen by the user to save the graphics. % \begin{macrocode} \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}{% % \end{macrocode} % If the chosen extension is |.tex|, a \LaTeX/Tikz file has been created, which has to be simply included in the document; it will be automatically compiled by \LaTeX{}. (Observe we use the |\MGL@TeX@ext| macro defined above.) % \begin{macrocode} \ifx\MGL@imgext\MGL@TeX@ext% \include{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}% % \end{macrocode} % If the chosen extension is not |.tex|, a normal visual image has been created, so the |\includegraphics| command is invoked to deal with it. The options for this command (like |scale|, |angle|, etc.) are stored in the |\MGL@graph@keys| macro, which is defined by every environment or command that creates and compiles MGL scripts, according to the optional arguments the user has passed. % \begin{macrocode} \else% \expandafter\includegraphics\expandafter[\MGL@graph@keys]{% \MGL@dir\MGL@graphics@dir\MGL@script% }% \fi% }{% % \end{macrocode} % If the requested image doesn't exist, the issue a warning message for the user, and print a warning framed box (``\textbf{MGL image not found}'') in the place the image should occupy. % \begin{macrocode} \PackageWarning{mgltex}{MGL image "\MGL@script" not found}% \fbox{% \centering% \bfseries\Huge% \begin{tabular}{c}MGL\\image\\not\\found\end{tabular}% }% }% }% % \end{macrocode} % \end{macro} % And here ends the |\MGL@switch@on| command. % \begin{macrocode} } % \end{macrocode} % \end{macro} % % \begin{macro}{\MGL@switch@off} % (Re)defines the same commands as |\MGL@switch@on| in such a way they accept the same arguments, but do nothing. The exception is |\MGL@includegraphics| which, instead of doing nothing, prints a warning framed box (``\textbf{\mglTeX{} is off; no image included}''). % \begin{macrocode} \def\MGL@switch@off{% \PackageWarning{mgltex}{mglTeX is off}% \def\MGL@openout##1##2{}% \def\MGL@openin##1##2{}% \def\MGL@write##1##2{}% \def\MGL@read##1##2{}% \def\MGL@closeout##1{} \def\MGL@closein##1{} \def\MGL@includegraphics{% \fbox{% \centering% \bfseries\Huge% \begin{tabular}{c}\mglTeX\\is off;\\no image\\included\end{tabular}% }% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\@MGL@comments@off}\begin{macro}{\@MGL@comments@on} % We will need a boolean switch to activate/deactivate comments later. % \begin{macrocode} \def\@MGL@comments@off{\let\if@MGL@comments@\iffalse} \def\@MGL@comments@on{\let\if@MGL@comments@\iftrue} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\MGL@gray}\begin{macro}{\MGL@gray@off}\begin{macro}{\MGL@gray@on} % The commands |\MGL@gray@off| and |\MGL@gray@on| simply set the value of |\MGL@gray| to $0$ and $1$, respectively; this value will be used later through the |-g| command line option from |mglconv|. % \begin{macrocode} \def\MGL@gray@off{\def\MGL@gray{0}} \def\MGL@gray@on{\def\MGL@gray{1}} % \end{macrocode} % \end{macro}\end{macro}\end{macro} % \begin{macro}{\mglgray} % Depending on the option passed by the user, it calls |\@MGL@gray@on| or |\@MGL@gray@off|. % \begin{macrocode} \def\mglgray#1{% \MGL@test@switch{#1}{\mglgray}% \csname @MGL@gray@\MGL@temp@a\endcsname% } % \end{macrocode} % \end{macro} % % \begin{macro}{\mglscale}\begin{macro}{\MGL@scale} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now accepts any positive value} % |\mglscale| sets the value of the |\MGL@scale| macro, which is used later to specify the default scaling for graphics. It only accepts positive values, otherwise it issues a warning and restarts the scaling to $1$. In order to be able to check the validity of the value passed by the user, we first set the |\MGL@scale| macro to that value and test it with the |\ifdim| conditional.\footnote{We can't use \doccommand{ifnum} here because it only accepts integer values.} Since this conditional tests dimensions only, the value passed by the user is multiplied by |\p@| (value |1pt|), so it can be compared with |\z@| (value |0pt|). % \begin{macrocode} \def\mglscale#1{ \ifdim#1\p@>\z@% \def\MGL@scale{#1}% \else% \PackageWarning{mgltex}{% Scaling value of #1\space not allowed; using default (1)% }% \def\MGL@scale{1}% \fi% } % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\mglquality}\begin{macro}{\MGL@quality} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{\texttt{9} is accepted as quality value now} % |\mglquality| sets the value of the |\MGL@quality| macro, which is used later to specify the default quality for graphics. It only accepts integer values from $0$ to $8$ (the only ones defined by |MathGL|), otherwise it issues a warning and restarts to $2$ (the default for |MathGL|). In order to be able to check the validity of the value passed by the user, we first set the |\MGL@quality| macro to that value and test it with the |\ifcase| conditional; if the value is valid, we print an info message to the |.log| file about the characteristics of the chosen quality, but if it is invalid, we issue a warning and overwrite |\MGL@scale| to $2$. % \begin{macrocode} \def\mglquality#1{% \def\MGL@quality{#1}% \ifcase\MGL@quality% \PackageInfo{mgltex}{% Quality 0: No face drawing (fastest)% }% \or% \PackageInfo{mgltex}{% Quality 1: No color interpolation (fast)% }% \or% \PackageInfo{mgltex}{% Quality 2: High quality (normal)% }% \or% \PackageInfo{mgltex}{% Quality 3: High quality with 3d primitives (not implemented yet)% }% \or% \PackageInfo{mgltex}{% Quality 4: No face drawing, direct bitmap drawing (low memory usage)% }% \or% \PackageInfo{mgltex}{% Quality 5: No color interpolation, direct bitmap drawing (low memory usage)% }% \or% \PackageInfo{mgltex}{% Quality 6: High quality, direct bitmap drawing (low memory usage)% }% \or% \PackageInfo{mgltex}{% Quality 7: High quality with 3d primitives, direct bitmap drawing % (not implemented yet)% }% \or% \PackageInfo{mgltex}{% Quality 8: Draw dots instead of primitives (extremely fast)% }% \or% \PackageInfo{mgltex}{% Quality 9: No drawing (for testing purposes)% }% \else% \PackageWarning{mgltex}{% Quality #1 not available; using default (2)% }% \def\MGL@quality{2}% \fi% } % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\mglvariant}\begin{macro}{\MGL@variant} % |\mglvariant| sets the value of the |\MGL@variant| macro, which is passed later to |mglconv| thorugh its |-v| command line option. It only accepts non-negative integer, otherwise it issues a warning and restarts to $0$ (the default for |MathGL|). In order to be able to check the validity of the value passed by the user, we use the |\ifnum| conditional; if the value is invalid we issue a warning and overwrite |\MGL@variant| to $0$. % \begin{macrocode} \def\mglvariant#1{% \def\MGL@variant{#1}% \ifnum\MGL@variant<0% \PackageWarning{mgltex}{% Variant #1 not allowed; using default (0)% }% \def\MGL@variant{0}% \fi% } % \end{macrocode} % \end{macro}\end{macro} % % Now we declare the options |final| and |draft|, which are simply passed to the \textsf{graphicx} package. % \begin{macrocode} \DeclareOption{draft}{% \PassOptionsToPackage{\CurrentOption}{graphicx}% } \DeclareOption{final}{% \PassOptionsToPackage{\CurrentOption}{graphicx}% } % \end{macrocode} % % The rest of the package options just call an adequate command or set an adequate value for a macro. % \begin{macrocode} \DeclareOption{on}{\MGL@switch@on} \DeclareOption{off}{\MGL@switch@off} \DeclareOption{nocomments}{\@MGL@comments@off} \DeclareOption{comments}{\@MGL@comments@on} \DeclareOption{gray}{\MGL@gray@on} \DeclareOption{color}{\MGL@gray@off} \DeclareOption{1x}{\def\MGL@scale{1}} \DeclareOption{2x}{\def\MGL@scale{2}} \DeclareOption{3x}{\def\MGL@scale{3}} \DeclareOption{4x}{\def\MGL@scale{4}} \DeclareOption{5x}{\def\MGL@scale{5}} \DeclareOption{6x}{\def\MGL@scale{6}} \DeclareOption{7x}{\def\MGL@scale{7}} \DeclareOption{8x}{\def\MGL@scale{8}} \DeclareOption{9x}{\def\MGL@scale{9}} \DeclareOption{0q}{\def\MGL@quality{0}} \DeclareOption{1q}{\def\MGL@quality{1}} \DeclareOption{2q}{\def\MGL@quality{2}} \DeclareOption{3q}{\def\MGL@quality{3}} \DeclareOption{4q}{\def\MGL@quality{4}} \DeclareOption{5q}{\def\MGL@quality{5}} \DeclareOption{6q}{\def\MGL@quality{6}} \DeclareOption{7q}{\def\MGL@quality{7}} \DeclareOption{8q}{\def\MGL@quality{8}} \DeclareOption{9q}{\def\MGL@quality{9}} \DeclareOption{0v}{\def\MGL@variant{0}} \DeclareOption{1v}{\def\MGL@variant{1}} \DeclareOption{2v}{\def\MGL@variant{2}} % \end{macrocode} % % \begin{macro}{\MGL@imgext} % The following options set the default graphics extension, which is stored in the |\MGL@imgext| macro for later use. % \begin{macrocode} \DeclareOption{eps}{\def\MGL@imgext{.eps}} \DeclareOption{epsz}{\def\MGL@imgext{.epsz}} \DeclareOption{epsgz}{\def\MGL@imgext{.eps.gz}} \DeclareOption{bps}{\def\MGL@imgext{.bps}} \DeclareOption{bpsz}{\def\MGL@imgext{.bpsz}} \DeclareOption{bpsgz}{\def\MGL@imgext{.bps.gz}} \DeclareOption{pdf}{\def\MGL@imgext{.pdf}} \DeclareOption{png}{\def\MGL@imgext{.png}} \DeclareOption{jpg}{\def\MGL@imgext{.jpg}} \DeclareOption{jpeg}{\def\MGL@imgext{.jpeg}} \DeclareOption{gif}{\def\MGL@imgext{.gif}} \DeclareOption{tex}{\def\MGL@imgext{.tex}} % \end{macrocode} % \end{macro} % % Any other option passed by the user is invalid, so an error message is issued. % \begin{macrocode} \DeclareOption*{\@unknownoptionerror} % \end{macrocode} % % We now declare the default package options, and, finally, process the options the user specifies in the order they are introduced. % \begin{macrocode} \ExecuteOptions{final,on,nocomments,color,1x,2q,0v,eps} \ProcessOptions* % \end{macrocode} % % \begin{macro}{\MGL@dir} % This is the \textsf{\mglTeX} main working directory. By default, it is defined to empty, so it points to the path of the \LaTeX{} document. % \begin{macrocode} \def\MGL@dir{} % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@scripts@dir} % The subdirectory inside |\MGL@dir| where all MGL scripts will be created. % \begin{macrocode} \def\MGL@scripts@dir{} % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@graphics@dir} % The subdirectory inside |\MGL@dir| where all MGL graphics will be created. % \begin{macrocode} \def\MGL@graphics@dir{} % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@backups@dir} % The subdirectory inside |\MGL@dir| where all backups of scripts will be created. % \begin{macrocode} \def\MGL@backups@dir{} % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@paths} % This is a list of paths where extracted and external scripts will be searched for by the |\mglgraphics| and |\mglinclude| commands. Since extracted scripts are created inside |\MGL@dir\MGL@scripts@dir| and |\MGL@dir\MGL@backups@dir|, this directories are included. % \begin{macrocode} \def\MGL@paths{\MGL@dir\MGL@scripts@dir,\MGL@dir\MGL@backups@dir} % \end{macrocode} % \end{macro} % % \begin{macro}{\MGL@main@script@name} % \noindent This macro stores the name of the of the document's main script. It is initialized to the name of the \LaTeX{} document. % \begin{macrocode} \edef\MGL@main@script@name{\jobname} % \end{macrocode} % \end{macro} % % We set some additional staff that will be used later. % \begin{macro}{\MGL@main@stream} % The output stream for the document's main script. % \begin{macrocode} \newwrite\MGL@main@stream % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@out@stream} % The output stream for scripts other than the main one. % \begin{macrocode} \newwrite\MGL@out@stream % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@in@stream} % The input stream for scripts other than the main one. % \begin{macrocode} \newread\MGL@in@stream % \end{macrocode} % \end{macro} % \begin{macro}{MGL@script@no} % The internal counter used by environments like |mgl| and commands like |\mglplot| to automatically name scripts. % \begin{macrocode} \newcounter{MGL@script@no} % \end{macrocode} % \end{macro} % \begin{macro}{MGL@line@no} % The counter used for verbatim-like environments and commands to numerate the lines of code. % \begin{macrocode} \newcounter{MGL@line@no} % \end{macrocode} % \end{macro} % \begin{macro}{MGL@verb@no} % The counter used to numerate verbatim-written scripts with the |\listofmglscripts| command. % \begin{macrocode} \newcounter{MGL@verb@no} % \end{macrocode} % \end{macro} % \begin{macro}{\@MGL@list@script@} % The boolean switch used to determine whether to add a verbatim-written script to the \emph{list of MGL scripts}. % \begin{macrocode} \newif\if@MGL@list@script@ % \end{macrocode} % \end{macro} % \begin{macro}{\l@MGL@script} % The style for the leaders associating script name and page number in the \emph{list of MGL scripts}. % \begin{macrocode} \def\l@MGL@script{\@dottedtocline{1}{0em}{1.5em}} % \end{macrocode} % \end{macro} % % \textsf{\mglTeX} requires the \textsf{keyval} package to define \meta{key}=\meta{value} options for the environments and commands; the \textsf{graphicx} package apports the facilities for inclusion of graphics; the \textsf{ifpdf} package is used to determine whether the user is compiling to |pdf| or not when indicating the default graphics extensionsthe \textsf{verbatim} package is used as engine for the environments. % \begin{macrocode} \RequirePackage{keyval} \RequirePackage{graphicx} \RequirePackage{ifpdf} \RequirePackage{verbatim} % \end{macrocode} % % The supported graphic extensions are declared. These extensions depend on whether we are compiling to |pdf| or not, so the |\ifpdf| conditional from the homonym package is used. % \begin{macrocode} \ifpdf% \DeclareGraphicsExtensions{% .pdf,.png,.jpg,.jpeg,.gif% }% \else% \DeclareGraphicsExtensions{% .eps,.epsz,.eps.gz,.bps,.bpsz,.bps.gz% }% \fi% % \end{macrocode} % Finally, the |\verbatim@finish| command from the \textsf{verbatim} package is disabled to avoid it from writing a blank line at the end of every script (see subsection~\ref{subsection: warning}). % \begin{macrocode} \let\verbatim@finish\relax % \end{macrocode} % % \subsection{Anatomy of environments and commands}\label{subsection: anatomy} % \noindent Many of the environments and commands defined by \textsf{\mglTeX} are based on the same pieces of code. So, in order to avoid repetition of commands, we use the concept of \emph{anatomy of environments and commands}, which is basically the idea of taking repetitive pieces of code and enclose them into macros which can later be used. % % \begin{macro}{\MGL@setkeys} % This command receives two arguments: a family of \meta{key}=\meta{value} pairs, like |MGL@keys|, and a list of such pairs. It first cleans the |\MGL@graph@keys| macro, and the process the list of pairs. % \begin{macrocode} \def\MGL@setkeys#1#2{% \def\MGL@graph@keys{}% \setkeys{#1}{#2}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\MGL@graph@keys} % The main family of \meta{key}=\meta{value} pairs is defined. These pairs are common to every environment or command that produces graphics. Most of the \meta{key}'s are redefinitions of the optional arguments for the |\includegraphics| commands, so they are stored inside the |\MGL@graph@keys| macro, which is later passed to that command as optional argument by |\MGL@includegraphics|. % \begin{macrocode} \define@key{MGL@gr@keys}{bb}{% \g@addto@macro\MGL@graph@keys{bb=#1,}% } \define@key{MGL@gr@keys}{bbllx}{% \g@addto@macro\MGL@graph@keys{bbllx=#1,}% } \define@key{MGL@gr@keys}{bblly}{% \g@addto@macro\MGL@graph@keys{bblly=#1,}% } \define@key{MGL@gr@keys}{bburx}{% \g@addto@macro\MGL@graph@keys{bburx=#1,}% } \define@key{MGL@gr@keys}{bbury}{% \g@addto@macro\MGL@graph@keys{bbury=#1,}% } \define@key{MGL@gr@keys}{natwidth}{% \g@addto@macro\MGL@graph@keys{natwidth=#1,}% } \define@key{MGL@gr@keys}{natheight}{% \g@addto@macro\MGL@graph@keys{natheight=#1,}% } \define@key{MGL@gr@keys}{hiresbb}{% \g@addto@macro\MGL@graph@keys{hiresbb=#1,}% } \define@key{MGL@gr@keys}{viewport}{% \g@addto@macro\MGL@graph@keys{viewport=#1,}% } \define@key{MGL@gr@keys}{trim}{% \g@addto@macro\MGL@graph@keys{trim=#1,}% } \define@key{MGL@gr@keys}{angle}{% \g@addto@macro\MGL@graph@keys{angle=#1,}% } \define@key{MGL@gr@keys}{origin}{% \g@addto@macro\MGL@graph@keys{origin=#1,}% } \define@key{MGL@gr@keys}{width}{% \g@addto@macro\MGL@graph@keys{width=#1,}% } \define@key{MGL@gr@keys}{height}{% \g@addto@macro\MGL@graph@keys{height=#1,}% } \define@key{MGL@gr@keys}{totalheight}{% \g@addto@macro\MGL@graph@keys{totalheight=#1,}% } \define@key{MGL@gr@keys}{keepaspectratio}[true]{% \g@addto@macro\MGL@graph@keys{keepaspectratio=#1,}% } \define@key{MGL@gr@keys}{scale}{% \g@addto@macro\MGL@graph@keys{scale=#1,}% } \define@key{MGL@gr@keys}{clip}[true]{% \g@addto@macro\MGL@graph@keys{clip=#1,}% } \define@key{MGL@gr@keys}{draft}[true]{% \g@addto@macro\MGL@graph@keys{draft=#1,}% } \define@key{MGL@gr@keys}{type}{% \g@addto@macro\MGL@graph@keys{type=#1,}% } \define@key{MGL@gr@keys}{ext}{% \g@addto@macro\MGL@graph@keys{ext=#1,}% } \define@key{MGL@gr@keys}{read}{% \g@addto@macro\MGL@graph@keys{read=#1,}% } \define@key{MGL@gr@keys}{command}{% \g@addto@macro\MGL@graph@keys{command=#1,}% } % \end{macrocode} % \end{macro} % The following four \meta{key}=\meta{value} pairs call the adequate \textsf{\mglTeX} command. % \begin{macrocode} \define@key{MGL@gr@keys}{gray}[0]{\mglgray{#1}} \define@key{MGL@gr@keys}{mglscale}{\mglscale{#1}} \define@key{MGL@gr@keys}{quality}{\mglquality{#1}} \define@key{MGL@gr@keys}{variant}{\mglvariant{#1}} % \end{macrocode} % \begin{macro}{\MGL@imgext} % |\MGL@imgext| stores the default extension for the creation of the graphics. % \begin{macrocode} \define@key{MGL@gr@keys}{imgext}{\def\MGL@imgext{.#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\@MGL@lineno@} % The only \meta{key}=\meta{value} pair needed for verbatim-like environments and commands is the one for the |lineno| option, which sets the value of the |\@MGL@lineno@| boolean macro. % \begin{macrocode} \newif\if@MGL@lineno@ \define@key{MGL@verb@keys}{lineno}[true]{\csname @MGL@lineno@#1\endcsname} % \end{macrocode} % \end{macro} % % \begin{macro}{\MGL@codes} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Bugfix: category code for tabulators is changed too} % This macro changes the category codes of all special characters (like |\|, |$|, etc.) to $12$ (other), so they don't have any special meaning and can be processed as normal text. The exception is the new line character (|^^M|), which is kept active for compatibility with the \textsf{verbatim} package. % \begin{macrocode} \def\MGL@codes{% \let\do\@makeother\dospecials% \catcode`\^^I=12% \catcode`\^^M\active% } % \end{macrocode} % \end{macro} % % \begin{macro}{\MGL@doc@scripts} % A macro to store the names of the scripts created or compiled in the document. % \begin{macrocode} \def\MGL@doc@scripts{} % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@set@script@name}\begin{macro}{\MGL@script} % |\MGL@set@script@name| receives the name of a script without extension as argument, defines |\MGL@script| as that name, and checks if it has already been created or compiled, by comparing it with the names already stored in |\MGL@doc@scripts|; if it's there already, warns the user. Finally, adds the name of the script to |\MGL@doc@scripts|. % \begin{macrocode} \def\MGL@set@script@name#1{% \edef\MGL@script{#1}% \@for\MGL@temp@a:=\MGL@doc@scripts\do{% \ifx\MGL@temp@a\MGL@script% \PackageWarning{mgltex}{Multiple MGL scripts named "\MGL@script.mgl"}% \fi% }% \g@addto@macro\MGL@doc@scripts{\MGL@script,}% } % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\MGL@unchanged} % This command defines the ``switch'' |\MGL@@@|\meta{script}, where \meta{script} is passed as argument, which indicates the script \meta{script}|.mgl| has not changed. This command has to be written to the |.aux| file to be preserved from compilation to compilation. % \begin{macrocode} \def\MGL@unchanged#1{% \global\@namedef{MGL@@@#1}{}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\MGL@process@script} % It checks whether the ``switch'' |\MGL@@@\MGL@script| is undefined, in which case executes its first argument. If the switch is defined, it checks if the corresponding image has been created; if so, it executes its second argument; otherwise, the first one. % \begin{macrocode} \def\MGL@process@script#1#2{% \@ifundefined{MGL@@@\MGL@script}{% #1% }{% \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}{% #2% }{% #1% }% }% } % \end{macrocode} % \end{macro} % % \begin{macro}{\MGL@def@for@loop}\begin{macro}{\MGL@for} % |\MGL@def@for@loop| defines the command |\MGL@for| which is similar to the |\@for| command from the \LaTeX{} kernel, with the only exception that, instead of iterating over comma-separated lists, it can iterate over lists of items with any kind of separator, which is passed as argument of |\MGL@def@for@loop|. The body of this command is copied from the definition code of |\@for|, extracted from \emph{The \LaTeXe{} Sources} document, replacing the ``|,|'' by ``|#1|''. Note that |\MGL@for| is used only by the |\mglplot| command, but it has been included as part of the \emph{anatomy of environments and commands} to keep cleanness because it is quite long code. % \begin{macrocode} \def\MGL@def@for@loop#1{% \long\def\MGL@for##1:=##2\do##3{% \expandafter\def\expandafter\@fortmp\expandafter{##2}% \ifx\@fortmp\@empty\else% \expandafter\MGL@forloop##2#1\@nil#1\@nil\@@##1{##3}% \fi% }% \long\def\MGL@forloop##1#1##2#1##3\@@##4##5{% \def##4{##1}% \ifx##4\@nnil\else% ##5\def##4{##2}% \ifx##4\@nnil\else% ##5\MGL@iforloop##3\@@##4{##5}% \fi% \fi% }% \long\def\MGL@iforloop##1#1##2\@@##3##4{% \def##3{##1}% \ifx##3\@nnil% \expandafter\@fornoop% \else% ##4\relax\expandafter\MGL@iforloop% \fi% ##2\@@##3{##4}% }% } % \end{macrocode} % The default |\MGL@for| loop iterates over |^^J|-separated lists, i.e, \meta{new line}-character-lists. % \begin{macrocode} \MGL@def@for@loop{^^J} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\MGL@compare@code} % |\MGL@compare@code| is in charge of comparing the user's MGL code, embedded within \textsf{\mglTeX} environments, with its corresponding extracted script. For that purpose, the |\verbatim@processline| and |\verbatim@finish| commands from the \textsf{verbatim} package are redefined. % \begin{macrocode} \def\MGL@compare@code#1{% % \end{macrocode} % \begin{macro}{\MGL@next} % This macro is called at the end of environments that use the |\MGL@compare@code| macro, and performs the ending actions of the comparision process, which are closing the |\MGL@in@stream| and writing the |\MGL@unchanged{\MGL@script}| to the |.aux| file. If during the comparison process a difference in the code is found, |\MGL@next| is redefined to only close the |\MGL@in@stream|. % \begin{macrocode} \def\MGL@next{% \MGL@closein\MGL@in@stream% \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}% }% % \end{macrocode} % \end{macro} % The |\verbatim@processline| command is redefined to read from the input stream to a temporary variable (|\MGL@temp@a|), and compare it with one line of code in the \LaTeX{} document, which is stored in another temporary variable (|\MGL@temp@b|). In case they are not equal, the |\MGL@next| macro is redefined to only close the input stream, and |\verbatim@processline| is redefine again to do nothing (a little speed-up). % \begin{macrocode} \def\verbatim@processline{% \MGL@read\MGL@in@stream{\MGL@temp@a}% \edef\MGL@temp@b{\the\verbatim@line}% \ifx\MGL@temp@a\MGL@temp@b\else% \def\MGL@next{\MGL@closein\MGL@in@stream}% \def\verbatim@processline{}% \fi% }% % \end{macrocode} % The |\verbatim@finish| macro, which is called at the end of the environment, is also redefined to perform one last read of the input stream, and then check if the end of file has been reached; if it hasn't, then, despite the end of the environment has been reached ---thus the end of code---, there is still code inside the script, so there are differences between them, and |\MGL@next| has to be redefined to do nothing but close the input stream. % \begin{macrocode} \def\verbatim@finish{% \MGL@read\MGL@in@stream{\MGL@temp@a}% \ifeof\MGL@in@stream\else% \def\MGL@next{\MGL@closein\MGL@in@stream}% \fi% }% % \end{macrocode} % Finally, the input stream is opened, and the comparison is started by calling |\verbatim@start|. % \begin{macrocode} \MGL@openin\MGL@in@stream{#1}% \verbatim@start% } % \end{macrocode} % \end{macro} % % \begin{macro}{\MGL@write@funcs} % This macro is used only by the |mglfunc| environment. Its only purpose is to store the commands to insert MGL functions in the main script, and is called at the end of the document or when the |\mglname| command is used. For now, we only ask it to write the |stop| command\footnote{Note the |stop| command is unnecesary in newer versions of the MGL language, but it is kept in \textsf{\mglTeX} for compatibility and for elegance.} that separates the section of scripts from the section of functions in the main script. % \begin{macrocode} \def\MGL@write@funcs{\MGL@write\MGL@main@stream{stop^^J}} % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@func} % This is the command that writes the MGL functions. It is intended to be stored inside |\MGL@write@funcs|. It opens the backup file of the MGL function whose name is passed as argument (and has been created by a |mglfunc| environment), and then calls |\MGL@@func| to transcript from that file, line by line, to the main script. % \begin{macrocode} \def\MGL@func#1{% \MGL@openin\MGL@in@stream{\MGL@dir\MGL@backups@dir#1.mgl}% \MGL@@func% } % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@@func} % This command transcripts only one line from backup file of a MGL function to the main script. It calls itself recursively until the end of the backup. % \begin{macrocode} \def\MGL@@func{% % \end{macrocode} % It first reads from the input stream to the |\MGL@temp@a| temporary variable. % \begin{macrocode} \MGL@read\MGL@in@stream{\MGL@temp@a}% % \end{macrocode} % If the end of the file has been reached, the stream is closed. % \begin{macrocode} \ifeof\MGL@in@stream% \MGL@closein\MGL@in@stream% % \end{macrocode} % If the end of file hasn't been reached, |\MGL@temp@a| is written to the main script, and |\MGL@@func| is called recursively. % \begin{macrocode} \else% \MGL@write\MGL@main@stream{\MGL@temp@a}% \expandafter\MGL@@func% \fi% } % \end{macrocode} % \end{macro} % % \begin{macro}{\MGL@set@verbatim@code} % This command sets the parameters for verbatim-like environments and commands. % \begin{macrocode} \def\MGL@set@verbatim@code{% % \end{macrocode} % The following is standard stuff for verbatim-like environments and commands. % \begin{macrocode} \if@minipage\else\vskip\parskip\fi% \leftskip\@totalleftmargin\rightskip\z@skip% \parindent\z@\parfillskip\@flushglue\parskip\z@% \@@par% \def\par{% \if@tempswa% \leavevmode\null\@@par\penalty\interlinepenalty% \else% \@tempswatrue% \ifhmode\@@par\penalty\interlinepenalty\fi% \fi% }% \obeylines% \let\do\@makeother\dospecials% \verbatim@font% \frenchspacing% \everypar\expandafter{\the\everypar\unpenalty}% % \end{macrocode} % If there are no lines of MGL code, instead of issuing an error, we display a package warning. % \begin{macrocode} \def\@noitemerr{\PackageWarning{mglTeX}{Empty MGL script}}% % \end{macrocode} % The space between the end of the label box and the text of the first item (|\labelsep|) is set to |1em|, while the separation between items (|\itemsep|) is set to zero. % \begin{macrocode} \labelsep1em% \itemsep\z@% % \end{macrocode} % Since we want the lines of code to be broken between words, but verbatim spaces are unbreakable, we trick \LaTeX{} by inserting a breakable spaces (|\space|) instead. % \begin{macrocode} \def\@xobeysp{\space}\@vobeyspaces% % \end{macrocode} % However, \LaTeX{} still resists breaking lines as much as possible in order to preserve the shape of paragraphs, so we tell it it's OK not to do so by setting the badness tolerance before hyphenation (|\pretolerance|) and the badness above which bad hboxes will be shown (|\hbadness|) to the maximum value of $10000$ (|\@M|). % \begin{macrocode} \pretolerance\@M% \hbadness\@M% % \end{macrocode} % In order to achieve the desired indentation of broken lines, we use the following trick: We increase the |\leftskip| parameter by the amount specified by |\mglbreakindent|, so that lines will be indented; but then we decrease the |\itemindent| parameter by the same amount so the first line won't be indented. % \begin{macrocode} \advance\leftskip\mglbreakindent% \itemindent-\mglbreakindent% } % \end{macrocode} % \end{macro} % % \begin{macro}{\MGL@line@sep} % This is the separator displayed at the beginning and ending of the |mglblock| and |mglverbatim| environments, to distinguish the MGL code from the normal text. Its definition is similar to the one of the |\dotfill| command, which can be found in \emph{The \LaTeXe{} Sources} document, but |\nopagebreak| commands have been added to avoid unaesthetic page breaking before and after the separators. % \begin{macrocode} \def\MGL@line@sep{% \nopagebreak% \leavevmode\cleaders\hrule height\mgllinethickness\hfill\kern\z@% \nopagebreak% } % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@dash@sep} % This is the separator displayed at the beginning and ending of the |mglcomments| environment, when it is allowed to be displayed. % \begin{macrocode} \def\MGL@dash@sep{% \nopagebreak% \leavevmode\cleaders\hb@xt@\mgldashwidth{\hss-\hss}\hfill\kern\z@% \nopagebreak% } % \end{macrocode} % \end{macro} % % \subsection{Environments for MGL code embedding} % \noindent For the following, we agree that if a macro is required by an environment, and it hasn't been already defined, it will be defined between the commands that start and end such environment; also the command's name will have the environment's name as prefix. % % \begin{environment}{mgl} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{New environment options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}} % This environment has to transcript its contents to the document's main script, and create a backup of the code simultaneously; the backup is used to detect changes in following compilations. % \begin{macro}{\mgl} % The command that starts the |mgl| environment. It is called by the |\begin{mgl}| command. % \begin{macrocode} \newcommand\mgl[1][]{% % \end{macrocode} % We define an additional \meta{key}=\meta{value} pair in the main family of pairs, corresponding to the |label| option for this environment. This definition is local because we don't want to be valid outside the environment. % \begin{macrocode} \define@key{MGL@gr@keys}{label}{\def\MGL@script{##1}}% % \end{macrocode} % The list of comma-separated options is processed. % \begin{macrocode} \MGL@setkeys{MGL@gr@keys}{#1}% % \end{macrocode} % If the user hasn't used the |label| option, the automatic naming mechanism is called. Note that |\MGL@main@script@name| is set using the |\mglname| command. % \begin{macrocode} \@ifundefined{MGL@script}{% \stepcounter{MGL@script@no}% \edef\MGL@script{\MGL@main@script@name-MGL-\arabic{MGL@script@no}}% }{}% % \end{macrocode} % We use the |\MGL@set@script@name| to test whether the given name has already been used. % \begin{macrocode} \MGL@set@script@name{\MGL@script}% % \end{macrocode} % |\MGL@codes| is used to change the codes of special characters. % \begin{macrocode} \MGL@codes% % \end{macrocode} % |\MGL@process@script| is used to test whether the code has changed or not the last time \LaTeX{} has been executed. If it has changed, we call the |\MGL@write@script| command to (re)write the code; otherwise, the code is scanned again by asking |\MGL@compare@code| to perform a comparison on the backup file, in order to determine whether the code has changed now. % \begin{macrocode} \MGL@process@script{% \MGL@write@script% }{% \MGL@compare@code{\MGL@dir\MGL@backups@dir\MGL@script.mgl}% }% } % \end{macrocode} % \end{macro} % \begin{macro}{\MGL@write@script} % (Re)writes the contents of the |mgl| environment. % \begin{macrocode} \def\MGL@write@script{% % \end{macrocode} % \begin{macro}{\MGL@next} % It contains the actions to perform immediately after the end of |\MGL@write@script|. They are close the output stream; write in the main script the commands to save the image, and to reset the initial values for all MGL parameters and clear the image; finally, write |\MGL@unchanged{\MGL@script}| in the |.aux| file. % \begin{macrocode} \def\MGL@next{% \MGL@closeout\MGL@out@stream% \MGL@write\MGL@main@stream{% write '\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext'^^J% ^^Jreset^^J% }% \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}% }% % \end{macrocode} % \end{macro} % Now we redefine the |\verbatim@processline| macro to write |\the\verbatim@line| to the main script and to the backup file. % \begin{macrocode} \def\verbatim@processline{% \MGL@write\MGL@main@stream{\the\verbatim@line}% \MGL@write\MGL@out@stream{\the\verbatim@line}% }% % \end{macrocode} % Before writing the MGL code of the environment, we set the default gray/color mode, mglscale, quality and variant. % \begin{macrocode} \MGL@write\MGL@main@stream{% gray \MGL@gray^^J% setsizescl \MGL@scale^^J% quality \MGL@quality^^J% variant \MGL@variant% }% % \end{macrocode} % We open the backup file in the output stream. % \begin{macrocode} \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}% % \end{macrocode} % The transcription process starts by calling the |\verbatim@start| command. % \begin{macrocode} \verbatim@start% } % \end{macrocode} % \end{macro} % \begin{macro}{\endmgl} % The command that ends the |mgl| evironment. It is called by the |\end{mgl}| command. It simply calls |\MGL@next| to execute the final actions, and |\MGL@includegraphics| to insert the corresponding image. Note that |\MGL@next| performs different actions depending on whether |\MGL@process@script| calls |\MGL@write@script| or |\MGL@compare@code|, both of which define |\MGL@next| differently. % \begin{macrocode} \def\endmgl{% \MGL@next% \MGL@includegraphics% } % \end{macrocode} % \end{macro} % \end{environment} % % \begin{environment}{mgladdon} % This environment only writes its contents to the document's main script, so no backup is created, nor compilation or inclusion of graphics. % \begin{macro}{\mgladdon} % Since this environment doesn't produce any output in the \LaTeX{} document, we start a \emph{space hack} by calling |\@bsphack|. We set the appropiate category codes with |\MGL@codes|; the |\verbatim@processline| is redefined to transcript |\the\verbatim@line| to the main script; finally, the |\verbatim@start| command starts the transcription process. % \begin{macrocode} \def\mgladdon{% \@bsphack% \MGL@codes% \def\verbatim@processline{% \MGL@write\MGL@main@stream{\the\verbatim@line}% }% \verbatim@start% } % \end{macrocode} % \end{macro} % \begin{macro}{\endmgladdon} % The environment ends by closing the \emph{space hack} with |\@esphack|. % \begin{macrocode} \def\endmgladdon{\@esphack} % \end{macrocode} % \end{macro} % \end{environment} % % \begin{environment}{mglfunc} % This environment is used to define MGL functions inside the document's main script. Instead of writing directly to the main script, which would cause the MGL parser to end the execution of that script, it writes to a backup file which is later transcript before closing the main script. % \begin{macro}{\mglfunc} % It starts the |mglfunc| environment. % \begin{macrocode} \newcommand\mglfunc[2][0]{% % \end{macrocode} % Once again, since this command doesn't produce any output in the \LaTeX{} document, we use a \emph{space hack}. % \begin{macrocode} \@bsphack% % \end{macrocode} % Although MGL functions and normal scripts are diferent in nature, in the sense that the first don't produce graphics by themselves, we have to check whether the function is being named as another script, because otherwise we run the risk of overwriting a backup file or confusing the parser. % \begin{macrocode} \MGL@set@script@name{#2}% % \end{macrocode} % The instruction to transcript from the backup file to the main stream is stored in |\MGL@write@funcs| (see subsection \ref{subsection: anatomy}). % \begin{macrocode} \g@addto@macro\MGL@write@funcs{\MGL@func{#2}}% % \end{macrocode} % The codes for special characters are set. % \begin{macrocode} \MGL@codes% % \end{macrocode} % The |\verbatim@processline| command is redefined to write |\the\verbatim@line| to the backup file. % \begin{macrocode} \def\verbatim@processline{\MGL@write\MGL@out@stream{\the\verbatim@line}}% % \end{macrocode} % The backup file is opened for writing. % \begin{macrocode} \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}% % \end{macrocode} % The head of the function is written. % \begin{macrocode} \MGL@write\MGL@out@stream{func '\MGL@script' #1}% % \end{macrocode} % The writing process is started. % \begin{macrocode} \verbatim@start% } % \end{macrocode} % \end{macro} % \begin{macro}{\endmglfunc} % It ends the |mglfunc| environment. % \begin{macrocode} \def\endmglfunc{% % \end{macrocode} % The end of the function is written. % \begin{macrocode} \MGL@write\MGL@out@stream{return^^J}% % \end{macrocode} % The output stream is closed. % \begin{macrocode} \MGL@closeout\MGL@out@stream% % \end{macrocode} % The \emph{space hack} is terminated. % \begin{macrocode} \@esphack% }% % \end{macrocode} % \end{macro} % \end{environment} % % \begin{environment}{mglcode} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{New environment options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}} % This environment also checks for changes on the code, but, since it writes to its own script, there is no need to create a backup file (the check is performed using the script itself). % \begin{macro}{\mglcode} % It starts the |mglcode| environment. Its anatomy is similar to that of the |\mgl| command. % \begin{macrocode} \newcommand\mglcode[2][]{% \MGL@setkeys{MGL@gr@keys}{#1}% \MGL@set@script@name{#2}% \MGL@codes% \MGL@process@script{% \mglcode@write@script% }{% \MGL@compare@code{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}% }% } % \end{macrocode} % \end{macro} % \begin{macro}{\mglcode@write@script} % This command takes care of creating the script for the |mglcode| environment. % \begin{macrocode} \def\mglcode@write@script{% % \end{macrocode} % \begin{macro}{\MGL@next} % It performs the actions immediately following the end of |\mglcode@write@script|. % \begin{macrocode} \def\MGL@next{% % \end{macrocode} % The output stream is closed. % \begin{macrocode} \MGL@closeout\MGL@out@stream% % \end{macrocode} % The |\MGL@unchanged{\MGL@script}| command is written to the |.aux| file. % \begin{macrocode} \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}% % \end{macrocode} % The script compilation instruction is written to the terminal. % \begin{macrocode} \MGL@write{18}{% mglconv -q \MGL@quality\space -g \MGL@gray\space% -S \MGL@scale\space -v \MGL@variant\space% -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space% -o "\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext"\space% "\MGL@dir\MGL@scripts@dir\MGL@script.mgl"% }% }% % \end{macrocode} % \end{macro} % The |\verbatim@processline| command is redefined so it writes |\the\verbatim@line| to the output stream. % \begin{macrocode} \def\verbatim@processline{\MGL@write\MGL@out@stream{\the\verbatim@line}}% % \end{macrocode} % The script is opened for writing in the output stream. % \begin{macrocode} \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}% % \end{macrocode} % The writing process is started by calling the |\verbatim@start| command. % \begin{macrocode} \verbatim@start% } % \end{macrocode} % \end{macro} % \begin{macro}{\endmglcode} % It ends the |mglcode| environment. |\MGL@next| is called to perform the final actions and |\MGL@includegraphics| is called to insert the corresponding image. Once more, |\MGL@next| has different meanings depending on whether |\MGL@process@script| branches to |\MGL@compare@code| or |\mglcode@write@script|. % \begin{macrocode} \def\endmglcode{% \MGL@next% \MGL@includegraphics% } % \end{macrocode} % \end{macro} % \end{environment} % \begin{environment}{mglscript} % The only function of this environment is to write its contents to a script; no image is created. It has been considered that scanning the code looking for changes is as much operation-expensive as simply writing the code, so it has been decided that this environment (over)writes the script everytime it's executed, without performing any check. % \begin{macro}{\mglscript} % Starts the environment. Its anatomy is similar to the previous environments. Since no output is written to the \LaTeX{} document, a \emph{space hack} is used. % \begin{macrocode} \def\mglscript#1{% \@bsphack% \MGL@set@script@name{#1}% \MGL@codes% \def\verbatim@processline{\MGL@write\MGL@out@stream{\the\verbatim@line}}% \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}% \verbatim@start% } % \end{macrocode} % \end{macro} % \begin{macro}{\endmglscript} % It ends the |mglscript| environment. The \emph{space hack} ends here, too. % \begin{macrocode} \def\endmglscript{% \MGL@closeout\MGL@out@stream% \@esphack% } % \end{macrocode} % \end{macro} % \end{environment} % % \begin{environment}{mglsetupscript}\begin{environment}{mglcommon} % This environment doesn't require any backup file nor any scanning for changes. Although the user sets the name of the script by redifining |\mglsetupscriptname|, it is necessary to perform a check of the name, just in case a name has been inadvertedly repeated. % \begin{macro}{\mglsetupscript} % Starts the |mglsetupscript| environment. % \begin{macrocode} \def\mglsetupscript{% \@bsphack% \MGL@set@script@name{\mglsetupscriptname}% \MGL@codes% \def\verbatim@processline{\MGL@write\MGL@out@stream{\the\verbatim@line}}% \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}% \verbatim@start% } % \end{macrocode} % It is declared to be an only-preamble command, so it can't be used after the |\begin{document}| instruction. % \begin{macrocode} \@onlypreamble\mglsetupscript % \end{macrocode} % \end{macro} % \begin{macro}{\mglcommon} % This macro is defined to be a synonym for |\mglcommon| (to keep backwards compatibility). % \begin{macrocode} \let\mglcommon\mglsetupscript \@onlypreamble\mglcommon % \end{macrocode} % \end{macro} % \begin{macro}{\endmglsetupscript} % It ends the |mglsetupscript| environment. % \begin{macrocode} \def\endmglsetupscript{% \MGL@closeout\MGL@out@stream% \@esphack% } % \end{macrocode} % \end{macro} % \begin{macro}{\endmglcommon} % It is defined to be a synonym for |\endmglsetupscript|. % \begin{macrocode} \let\endmglcommon\endmglsetupscript % \end{macrocode} % \end{macro} % \end{environment}\end{environment} % % \subsection{Fast creation of graphics} % \begin{environment}{mglsetup} % This environment is meant to contain code that is executed just before the instruction of a |\mglplot| command, producing always the same ouput. Instead of writing a new chunk of code for that purpose, |mglsetup| is defined as a special case of the |mglfunc| environment, with the exception that the MGL function obtained this way doesn't accept any argument ---thus producing always the same output. % \begin{macro}{\mglsetup} % It is defined as an alias for |\mglfunc|, but only the name of the MGL function is passed to it, forcing the assumption that its number of arguments is zero. % \begin{macrocode} \def\mglsetup#1{\mglfunc{#1}}% % \end{macrocode} % \end{macro} % \begin{macro}{\endmglsetup} % Likewise, it is defined as an alias for |\endmglfunc|. % \begin{macrocode} \let\endmglsetup\endmglfunc % \end{macrocode} % \end{macro} % \end{environment} % % \begin{macro}{\mglplot} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Added \doccommand{bgroup} and \doccommand{egroup} in order to keep changes private} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{New command options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}} % Although the function of this command is quite simple and straightforward, it requires many lines of code and some tricks in order to reach the desired functionality. % \begin{macrocode} \newcommand\mglplot[2][]{% % \end{macrocode} % Since this is a command, we need to explicitly create a local group so that all changes keep private to the command.\footnote{In contrast, environments keep changes private by default.} % \begin{macrocode} \bgroup% % \end{macrocode} % We add some \meta{key}=\meta{value} pairs locally. The |label| key works exactly as the one of the |mgl| environment. % \begin{macrocode} \define@key{MGL@gr@keys}{label}{\edef\MGL@script{##1}}% % \end{macrocode} % The |setup| key defines the variable |\MGL@mglplot@setup| which is later used to call a setup function for the corresponding image. % \begin{macrocode} \define@key{MGL@gr@keys}{setup}{\def\MGL@mglplot@setup{##1}}% % \end{macrocode} % The |separator| key uses the |\MGL@def@for@loop| to define |\MGL@for| so that it iterates over lists separated by the indicated separator symbol. % \begin{macrocode} \define@key{MGL@gr@keys}{separator}{\MGL@def@for@loop{##1}}% % \end{macrocode} % Now, we process the keys passed by the user. % \begin{macrocode} \MGL@setkeys{MGL@gr@keys}{#1}% % \end{macrocode} % If the user hasn't specified a name using the |label| option, then a name is autogenerated following the same naming mechanism of the |mgl| environment. % \begin{macrocode} \@ifundefined{MGL@script}{% \stepcounter{MGL@script@no} \edef\MGL@script{\MGL@main@script@name-MGL-\arabic{MGL@script@no}} }{}% % \end{macrocode} % The name of the script is checked. % \begin{macrocode} \MGL@set@script@name{\MGL@script}% % \end{macrocode} % If the user hasn't specified a setup, then the only code that has to be written is the non-optional argument of |\mglplot|; it is stored in the temporary variable |\MGL@temp@a|. % \begin{macrocode} \@ifundefined{MGL@mglplot@setup}{% \edef\MGL@temp@a{#2}% }{% % \end{macrocode} % If the user has specified a setup, we store the code to call the setup and the code passed by the user in the temporary variable |\MGL@temp@a|. % \begin{macrocode} \edef\MGL@temp@a{call '\MGL@mglplot@setup'^^J#2}% } % \end{macrocode} % If the code has changed the last time \LaTeX{} has been run, we call |\mglplot@write@script| to (re)write and (re)compile the script; otherwise, we call |\mglplot@compare@code| to check if it has changed this time. % \begin{macrocode} \MGL@process@script{% \mglplot@write@script% }{% \mglplot@compare@code% }% % \end{macrocode} % The corresponding image is included in the document. % \begin{macrocode} \MGL@includegraphics% % \end{macrocode} % Finally, the local group is closed. % \begin{macrocode} \egroup% } % \end{macrocode} % \begin{macro}{\mglplot@write@script} % This command takes the code stored in the |\MGL@temp@a| variable by the |\mglplot| command and writes it to the document's main script and to a backup file, so changes in the code can be detected. % \begin{macrocode} \def\mglplot@write@script{% % \end{macrocode} % The default quality is written to the main script. % \begin{macrocode} \MGL@write\MGL@main@stream{% gray \MGL@gray^^J% setsizescl \MGL@scale^^J% quality \MGL@quality^^J% variant \MGL@variant% }% % \end{macrocode} % The backup file is opened to write in the output stream. % \begin{macrocode} \MGL@openout\MGL@out@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}% % \end{macrocode} % Now we use the |\MGL@for| command to iterate over |\MGL@temp@a|. It takes a piece of code up to the separator symbol indicated by the user, and stores it in the temporary variable |\MGL@temp@b|, which is then written to the main script and backup file. % \begin{macrocode} \MGL@for\MGL@temp@b:=\MGL@temp@a\do{% \MGL@write\MGL@main@stream{\MGL@temp@b}% \MGL@write\MGL@out@stream{\MGL@temp@b}% }% % \end{macrocode} % The output stream is closed. % \begin{macrocode} \MGL@closeout\MGL@out@stream% % \end{macrocode} % The instructions to save the image and reset the MGL parameters are written to the main script. % \begin{macrocode} \MGL@write\MGL@main@stream{% write '\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext'^^J% ^^Jreset^^J% }% % \end{macrocode} % Finally, |\MGL@unchanged{\MGL@script}| is written to the |.aux| file. % \begin{macrocode} \MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}% } % \end{macrocode} % \end{macro} % \begin{macro}{\mglplot@compare@code} % This macro is in charge of comparing the code from a |\mglplot| command to detect changes. % \begin{macrocode} \def\mglplot@compare@code{% % \end{macrocode} % The action that will finish this command is, for now, to write |\MGL@unchanged{\MGL@script}| in the |.aux| file; it is stored in the |\MGL@next| variable. If no changes in the code are found, this will remain as the last action; otherwise, it will be overwritten to do nothing. % \begin{macrocode} \def\MGL@next{\MGL@write\@auxout{\string\MGL@unchanged{\MGL@script}}}% % \end{macrocode} % The backup file is opened for reading in the input stream. % \begin{macrocode} \MGL@openin\MGL@in@stream{\MGL@dir\MGL@backups@dir\MGL@script.mgl}% % \end{macrocode} % Once again, the |\MGL@for| command is used to iterate over the |\MGL@temp@a| variable defined by |\mglplot|. Pieces of code are taken up to the appearance of the separator symbol indicated by the user. In every iteration, the corresponding piece of code is stored in the |\MGL@temp@b| variable, one line of code is read from the input stream to the variable |\MGL@temp@c|, and these two are compared; if they are different, we redefined |\MGL@next| to do nothing. % \begin{macrocode} \MGL@for\MGL@temp@b:=\MGL@temp@a\do{% \MGL@read\MGL@in@stream{\MGL@temp@c}% \ifx\MGL@temp@b\MGL@temp@c\else% \let\MGL@next\relax% \fi% }% % \end{macrocode} % The input stream is closed. % \begin{macrocode} \MGL@closein\MGL@in@stream% % \end{macrocode} % |\MGL@next| is executed. % \begin{macrocode} \MGL@next% } % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{Verbatim-like environments} % \begin{environment}{mglblock} % \begin{environment}{mglblock*} % The main body of these environments is the same; the only difference is that the unstarred version creates an entry in the |\listofmglscripts|, while the starred version doesn't. % \begin{macro}{\mglblock} % This command defines the switch |\@MGL@list@script@| as true, so a |\listofmglscripts| entry for the code is created, then calls the main body of the environment (|\mglblock@|). % \begin{macrocode} \def\mglblock{\@MGL@list@script@true\mglblock@} % \end{macrocode} % \end{macro} % \begin{macro}{\mglblock*} % This command defines the switch |\@MGL@list@script@| as false, so no |\listofmglscripts| entry is created, then calls the main body of the environment (|\mglblock@|). % \begin{macrocode} \@namedef{mglblock*}{\@MGL@list@script@false\mglblock@} % \end{macrocode} % \end{macro} % \begin{macro}{\mglblock@} % This macro contains the real functionality of the |mglblock| and |mglblock*| environments. It is the common code they both have. % \begin{macrocode} \newcommand\mglblock@[2][]{% % \end{macrocode} % First, the switch |\@MGL@lineno@| is set to true, so the lines of code will be numbered by default. % \begin{macrocode} \@MGL@lineno@true% % \end{macrocode} % Now we process the decision of the user of keeping the line numbering or not. % \begin{macrocode} \setkeys{MGL@verb@keys}{#1}% % \end{macrocode} % The name of the script is checked for repetition. % \begin{macrocode} \MGL@set@script@name{#2}% % \end{macrocode} % If the switch |\@MGL@list@script@| is true, we increase the counter for verbatim code (|MGL@verb@no|), and add a contents line to the |.lms| file, using the style set by |\l@MGL@script|. In order to be able to use special characters in the name of the script, we use the |\detokenize| primitive. % \begin{macrocode} \if@MGL@list@script@% \refstepcounter{MGL@verb@no}% \addcontentsline{lms}{MGL@script}{% \protect\numberline{\theMGL@verb@no.}% {\ttfamily\protect\detokenize{\MGL@script.mgl}}% }% \fi% % \end{macrocode} % If the switch |\@MGL@lineno@| is true, we create a list such that each item will be labeled or numbered by the |MGL@lineno| counter. The style for the label is set by |\mgllinenostyle|. % \begin{macrocode} \if@MGL@lineno@% \list{\mgllinenostyle\arabic{MGL@line@no}.}{\usecounter{MGL@line@no}}% % \end{macrocode} % Otherwise, we create a list without labeling for the items. % \begin{macrocode} \else% \list{}{}% \fi% % \end{macrocode} % The parameters for the environment are set. % \begin{macrocode} \MGL@set@verbatim@code% % \end{macrocode} % The thickness of the box that will contain the name of the script has to be the same as the thickness for the separation line at the begining of the verbatim code. % \begin{macrocode} \fboxrule=\mgllinethickness% % \end{macrocode} % The separator to indicate the begining of the verbatim code is positioned; we use the |\MGL@line@sep| command to draw it. % \begin{macrocode} \item[\MGL@line@sep]\fbox{% \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}% }\hskip\labelsep\MGL@line@sep\par\par% % \end{macrocode} % The |\verbatim@processline| is redefined to put |\the\verbatim@line| in an item of the list, and to to also write it to the script file. % \begin{macrocode} \def\verbatim@processline{% \item\the\verbatim@line% \MGL@write\MGL@out@stream{\the\verbatim@line}% }% % \end{macrocode} % The script file is opened for writing. % \begin{macrocode} \MGL@openout\MGL@out@stream{\MGL@dir\MGL@scripts@dir\MGL@script.mgl}% % \end{macrocode} % The writing process starts. % \begin{macrocode} \verbatim@start% } % \end{macrocode} % \end{macro} % \begin{macro}{\endmglblock} % To finish the environment's work, the script file is closed, the separator indicating the end of the verbatim code is placed, and the list is ended. % \begin{macrocode} \def\endmglblock{% \MGL@closeout\MGL@out@stream% \item[\MGL@line@sep]\hskip-\labelsep\MGL@line@sep% \endlist% } % \end{macrocode} % \end{macro} % \begin{macro}{\endmglblock*} % It is defined as an alias for |\endmglblock|. % \begin{macrocode} \expandafter\let\csname endmglblock*\endcsname\endmglblock % \end{macrocode} % \end{macro} % \end{environment} % \end{environment} % % \begin{environment}{mglverbatim} % \begin{environment}{mglverbatim*} % These two environments have the same main body. They difference in that the unstarred version creates an entry for the |\listofmglscripts|, while the starred version doesn't. We will apply a similar approach to the used for the |mglblock| and |mglblock*| environments. % \begin{macro}{\mglverbatim} % Similar in function to |\mglblock|. % \begin{macrocode} \def\mglverbatim{\@MGL@list@script@true\mglverbatim@} % \end{macrocode} % \end{macro} % \begin{macro}{\mglverbatim} % Similar in function to |\mglblock*|. % \begin{macrocode} \@namedef{mglverbatim*}{\@MGL@list@script@false\mglverbatim@} % \end{macrocode} % \end{macro} % \begin{macro}{\mglverbatim@} % The main body of these environments; it's similar to |\mglblock@|. To explain each line of this command would be repetitive, so we explain only the different parts. % \begin{macrocode} \newcommand\mglverbatim@[1][]{% \@MGL@lineno@true% \define@key{MGL@verb@keys}{label}{\edef\MGL@script{##1}}% \setkeys{MGL@verb@keys}{#1}% \if@MGL@lineno@% \list{\mgllinenostyle\arabic{MGL@line@no}.}{\usecounter{MGL@line@no}}% \else% \list{}{}% \fi% \MGL@set@verbatim@code% \fboxrule=\mgllinethickness% % \end{macrocode} % The separator that indicates the begining of the verbatim code is different depending on whether the user has specified a name associated to the code or not. If no name has been indicated, i.e., |\MGL@script| is undefined, the separator is just a line; otherwise, i.e., |\MGL@script| is defined, the separator is similar to the one of the |mglblock| environment. % \begin{macrocode} \@ifundefined{MGL@script}{% \edef\MGL@script{\mglverbatimname}% \item[\MGL@line@sep]\hskip-\labelsep\MGL@line@sep% }{% \item[\MGL@line@sep]\fbox{% \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}% }\hskip\labelsep\MGL@line@sep\par\par% }% % \end{macrocode} % Note that, if the user requests an entry in the |\listofmglscripts|, the contents line is added to the same |.lms| file. So here start the similitudes again. % \begin{macrocode} \if@MGL@list@script@% \refstepcounter{MGL@verb@no}% \addcontentsline{lms}{MGL@script}{% \protect\numberline{\theMGL@verb@no.}% {\ttfamily\protect\detokenize{\MGL@script}}% }% \fi% \def\verbatim@processline{% \item\the\verbatim@line% }% \verbatim@start% } % \end{macrocode} % \end{macro} % \begin{macro}{\endmglverbatim} % This command could be defined as an alias for |\endmglblock|, for they execute the same instructions. But, for the sake of congruence, we rewrite the code. % \begin{macrocode} \def\endmglverbatim{% \MGL@closeout\MGL@out@stream% \item[\MGL@line@sep]\hskip-\labelsep\MGL@line@sep% \endlist% } % \end{macrocode} % \end{macro} % \begin{macro}{\endmglverbatim*} % It is an alias for |\endmglverbatim|. % \begin{macrocode} \expandafter\let\csname endmglverbatim*\endcsname\endmglverbatim % \end{macrocode} % \end{macro} % \end{environment} % \end{environment} % % \begin{environment}{mglcomment} % This environment has two different behaviors: When comments are allowed by the user, it behaves similarly to the |mglverbatim| environment; if comments are not allowed, it behaves as the |comment| environment from the \textsf{verbatim} package. So it is natural that we borrow code from them and adapt it to the corresponding situation. % \begin{macro}{\mglcomment} % The switch |\@MGL@comments@| governs the behavior of this command. % \begin{macrocode} \def\mglcomment{% % \end{macrocode} % If the switch is true, i.e., the user requests displaying of comments, we start a list without labels, and set the parameters for verbatim text. % \begin{macrocode} \if@MGL@comments@% \list{}{}% \MGL@set@verbatim@code% % \end{macrocode} % The separator indicating the begining of the comment is similar to the one used by the |mglblock| and |mglverbatim| environments; the differences are that, instead of using a solid line, we use a dashed line (|\MGL@dash@sep|), and instead of displaying the name of a script, we display |\mglcommentname|. % \begin{macrocode} \item\hskip-\labelsep<\MGL@dash@sep\mglcommentname\MGL@dash@sep>% % \end{macrocode} % The two following lines redefine the |\verbatim@processline| command to display the comment text line by line as items of the list, and start the process of writing the text. % \begin{macrocode} \def\verbatim@processline{\item\the\verbatim@line}% \verbatim@start% % \end{macrocode} % If the switch is false, i.e., the user requests no to display comments, we start a \emph{space hack}, since no text output will be produced. Then, the category codes are changed with |\MGL@codes|, and the macros |\verbatim@startline|, |\verbatim@addtoline|, |\verbatim@processline| and |\verbatim@finish| are disabled, as done in the |comment| environment of the \textsf{verbatim} package. Finally, we call the |\verbatim@| command to start reading the text in the environment. % \begin{macrocode} \else% \@bsphack% \MGL@codes% \let\verbatim@startline\relax% \let\verbatim@addtoline\@gobble% \let\verbatim@processline\relax% \let\verbatim@finish\relax% \verbatim@% \fi% } % \end{macrocode} % \end{macro} % \begin{macro}{\endmglcomment} % The |\@MGL@comments@| switch also governs the behavior of this command. If it's true, then the separator that ends the comment ---which is the same as the one that starts it--- is displayed, and the list is ended; otherwise, simply the \emph{space hack} is ended. % \begin{macrocode} \def\endmglcomment{% \if@MGL@comments@% \item\hskip-\labelsep<\MGL@dash@sep\mglcommentname\MGL@dash@sep>% \endlist% \else% \@esphack% \fi% } % \end{macrocode} % \end{macro} % \end{environment} % % \subsection{Commands for external scripts} % \noindent Since external scripts exist independently of the \LaTeX{} document, there is no need of environments to process them, just commands. Remember these commands work on the suposition that the scripts don't change. % % \begin{macro}{\mglgraphics} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{New command options: \texttt{gray}, \texttt{mglscale}, \texttt{quality}, \texttt{variant}} % This command compiles the external script and includes it in the document. Although that process is simple, the code to execute it is relatively large due to the possibility of the user specifying an optional path, so many parameters have to be checked. % \begin{macrocode} \newcommand\mglgraphics[2][]{% % \end{macrocode} % In order to keep all definitions and changes local, we start a local group inside which all \LaTeX{} code will be contained. % \begin{macrocode} \bgroup% % \end{macrocode} % We add the option |path| for the user to be able to specify the location of the script, which is stored in the variable |\MGL@force@path|. % \begin{macrocode} \define@key{MGL@gr@keys}{path}{\def\MGL@forced@path{##1}}% % \end{macrocode} % The optional arguments are processed. % \begin{macrocode} \MGL@setkeys{MGL@gr@keys}{#1}% % \end{macrocode} % The name of the script is set, though it is not check for multiple naming. This is necessary, since |\MGL@includegraphics| uses this macro. % \begin{macrocode} \edef\MGL@script{#2}% % \end{macrocode} % If the corresponding image exists, then this script has been compiled in a previous \LaTeX{} run, so nothing is done, but the inclusion of the image. % \begin{macrocode} \IfFileExists{\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext}{}{% % \end{macrocode} % If the image doesn't exist, we check if the user has specified a custom location. % \begin{macrocode} \@ifundefined{MGL@forced@path}{% % \end{macrocode} % If no custom location has been used, we iterate over the list of search paths (|\MGL@paths|): If we find the requested script, then we store its location in |\MGL@temp@b|. % \begin{macrocode} \@for\MGL@temp@a:=\MGL@paths\do{% \IfFileExists{\MGL@temp@a\MGL@script.mgl}{% \edef\MGL@temp@b{\MGL@temp@a}% }{}% }% }{% % \end{macrocode} % If the user has specified a path for the script, we check if the script actually exists. If it does, we store its location inside |\MGL@temp@b|. % \begin{macrocode} \IfFileExists{\MGL@forced@path\MGL@script.mgl}{% \edef\MGL@temp@b{\MGL@forced@path}% }{}% }% % \end{macrocode} % If |\MGL@temp@b| is not defined, the script has not been found, so a warning is issued. % \begin{macrocode} \@ifundefined{MGL@temp@b}{% \PackageWarning{mgltex}{% MGL script "\MGL@script.mgl" not found% }% }{% % \end{macrocode} % If |\MGL@temp@b| is defined, the script has been found, so we compile it. % \begin{macrocode} \MGL@write{18}{% mglconv -q \MGL@quality\space -g \MGL@gray\space% -S \MGL@scale\space -v \MGL@variant\space% -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space% -o "\MGL@dir\MGL@graphics@dir\MGL@script\MGL@imgext"\space% "\MGL@temp@b\MGL@script.mgl"% }% }% }% % \end{macrocode} % The image is included. % \begin{macrocode} \MGL@includegraphics% % \end{macrocode} % The local group ends here. % \begin{macrocode} \egroup% } % \end{macrocode} % \end{macro} % % \begin{macro}{\mglinclude}\begin{macro}{\mglinclude*} % The purpose of these commands is to transcript the MGL code from a script. Once again, this is a straightforward functionality, but the code is quite large, so it has been separated in various macros. % % The unstarred version defines the |\@MGL@list@script@| switch to be true, so the script is listed with the |\listofmglscripts| command, and then it calls the main body of code (|\mglinclude@|), just like the |mglblock| environment does. The starred version defines the switch as false and calls the main body, too. % \begin{macrocode} \def\mglinclude{\@MGL@list@script@true\mglinclude@} \@namedef{mglinclude*}{\@MGL@list@script@false\mglinclude@} % \end{macrocode} % \begin{macro}{\mglinclude@} % \begin{macrocode} \newcommand\mglinclude@[2][]{% % \end{macrocode} % We start a local group to keep definitions and changes local. % \begin{macrocode} \bgroup% % \end{macrocode} % The default behavior is to number lines of MGL code, so the switch |\@MGL@lineno@| is set to true. % \begin{macrocode} \@MGL@lineno@true% % \end{macrocode} % We add the option |path| for the user to be able to specify the location of the script, which is stored in |\MGL@forced@path|. % \begin{macrocode} \define@key{MGL@verb@keys}{path}{\def\MGL@forced@path{##1}}% % \end{macrocode} % The options are processed. % \begin{macrocode} \setkeys{MGL@verb@keys}{#1}% % \end{macrocode} % We don't need to check if there are multiple scripts with the same name, so we namually set |\MGL@script|, instead of using |\MGL@set@script@name|. % \begin{macrocode} \edef\MGL@script{#2}% % \end{macrocode} % We check if the user has specified a custom location for the script. % \begin{macrocode} \@ifundefined{MGL@forced@path}{% % \end{macrocode} % If no custom location has been used, we iterate over the list |\MGL@paths| to find the script. % \begin{macrocode} \@for\MGL@temp@b:=\MGL@paths\do{% % \end{macrocode} % If the script exists, we store its location in |\MGL@temp@a|% % \begin{macrocode} \IfFileExists{\MGL@temp@b\MGL@script.mgl}{% \edef\MGL@temp@a{\MGL@temp@b}% }{}% }% }{% % \end{macrocode} % If the user specified the location of the script, we check if it exists, in which case we store its location in |\MGL@temp@a|. % \begin{macrocode} \IfFileExists{\MGL@script.mgl}{% \edef\MGL@temp@a{\MGL@forced@path}% }{}% }% % \end{macrocode} % If |\MGL@temp@a| is not defined, the script has not been found, so we issue a warning, and display a box in the document with the words \emph{MGL script not found}. % \begin{macrocode} \@ifundefined{MGL@temp@a}{% \PackageWarning{mgltex}{% MGL script "\MGL@forced@path\MGL@script.mgl" not found% }% \center% \fbox{% \centering% \bfseries\Huge% \begin{tabular}{c}MGL\\script\\not\\found\end{tabular}% }% \endcenter% }{% % \end{macrocode} % If |\MGL@temp@a| is defined, the script has been found, so we call |\mglinclude@@| to set up the inclusion of the script. % \begin{macrocode} \mglinclude@@% }% \egroup% } % \end{macrocode} % \end{macro} % \begin{macro}{\mglinclude@@} % This macro sets the parameters for the inclusion of the script, and calls the command in charge of the transcription. % \begin{macrocode} \def\mglinclude@@{% % \end{macrocode} % We first add the script to the \LaTeX{} list of included files. % \begin{macrocode} \@addtofilelist{\MGL@script.mgl}% % \end{macrocode} % If the user has used the unstarred version of |\mglinclude|, we add a contents line to the |.lms| file. % \begin{macrocode} \if@MGL@list@script@% \refstepcounter{MGL@verb@no}% \addcontentsline{lms}{MGL@script}{% \protect\numberline{\theMGL@verb@no.}% {\ttfamily\protect\detokenize{\MGL@script.mgl}}% }% \fi% % \end{macrocode} % We start a |\list| in which each line of code will be an item. If the lines have to be numbered, we use the |MGL@line@no| counter. % \begin{macrocode} \if@MGL@lineno@% \list{\mgllinenostyle\arabic{MGL@line@no}.}{\usecounter{MGL@line@no}}% \else% \list{}{}% \fi% % \end{macrocode} % We set the parameters for a verbatim code. % \begin{macrocode} \MGL@set@verbatim@code% % \end{macrocode} % The heading of the environment is set. It is similar to that of the |mglblock| environment. % \begin{macrocode} \fboxrule=\mgllinethickness% \item[\MGL@line@sep]\fbox{% \bfseries\ttfamily\expandafter\detokenize\expandafter{\MGL@script.mgl}% }\hskip\labelsep\MGL@line@sep\par\par% % \end{macrocode} % We redefine the |\verbatim@processline| macro from the \textsf{verbatim} package to put |\the\verbatim@line| on an item. % \begin{macrocode} \def\verbatim@processline{% \item\the\verbatim@line% }% % \end{macrocode} % The script is opened for reading. % \begin{macrocode} \immediate\openin\MGL@in@stream="\MGL@temp@a\MGL@script.mgl"% % \end{macrocode} % We call |\mglinclude@@@| to start the transcription. % \begin{macrocode} \mglinclude@@@% } % \end{macrocode} % \end{macro} % \begin{macro}{\mglinclude@@@} % This command transcripts the MGL code of the script and closes the list started in |\mglinclude@@|, adding the corresponding separation line to separate the code from normal text. % \begin{macrocode} \def\mglinclude@@@{% % \end{macrocode} % Since the transcription has to be done even when \textsf{\mglTeX} is off, instead of using the |\MGL@read| command ---which is inactive when the package is off---, we use the usual commands from \LaTeX{} to read from the file. % \begin{macrocode} \immediate\read\MGL@in@stream to \MGL@temp@b% % \end{macrocode} % If the end of file has been reached, we close the input stream, add the separation line, and end the |\list|. % \begin{macrocode} \ifeof\MGL@in@stream% \immediate\closein\MGL@in@stream% \item[\MGL@line@sep]\hskip-\labelsep\MGL@line@sep% \endlist% % \end{macrocode} % Otherwise, we use |\verbatim@startline| to clean the |\verbatim@line| buffer, then we add the just read line to the buffer, and call |\verbatim@processline| to include it as an item of the list. Finally, we recursively call |\mglinclude@@@| to read the next line. % \begin{macrocode} \else% \verbatim@startline% \expandafter\verbatim@addtoline\expandafter{\MGL@temp@b}% \verbatim@processline% \expandafter\mglinclude@@@% \fi% } % \end{macrocode} % \end{macro} % \end{macro}\end{macro} % % \subsection{Additional commands} % \begin{macro}{\listofmglscripts} % \noindent This command creates the \emph{list of MGL scripts} section. It has to be defined differently depending on whether the used document class defines the |\l@chapter| command or it only the |\l@section| command, which set the style for making a table of contents entry for the |\chapter| command and the |\section| command, respectively. If none of them are defined, we define our own style based on the latter. % \begin{macrocode} \ifx\l@chapter\@undefined% % \end{macrocode} % If |\l@chapter| is not defined, we check if |\l@section| is. % \begin{macrocode} \ifx\l@section\@undefined% % \end{macrocode} % If |\l@section| is not defined, we set the |\lisofmglscripts| command to perform exactly as the |\section*{\listofmglscriptsname}| would do in the usual \textsf{book} and \textsf{article} \LaTeX{} classes, except that the type of section is |MGL@list|. % \begin{macrocode} \def\listofmglscripts{% \@startsection{MGL@list}% {1}{0em}{-3.5ex plus -1ex minus -0.2ex}% {2.5ex plus 0.2ex}% {\centering\normalfont\bfseries\large}*% {\listofmglscriptsname}% % \end{macrocode} % We use the |\@mkboth| command to set the page marks according to the current page style. % \begin{macrocode} \@mkboth{% \MakeUppercase\listofmglscriptsname% }{% \MakeUppercase\listofmglscriptsname% }% % \end{macrocode} % The \emph{list of MGL scripts} is created by reading the document's |.lms| file. % \begin{macrocode} \@starttoc{lms}% }% % \end{macrocode} % The |\l@MGL@list| style has the same code as the |\l@section| style. % \begin{macrocode} \newcommand*\l@MGL@list[2]{% \ifnum \c@tocdepth >\z@ \addpenalty\@secpenalty \addvspace{1.0em \@plus\p@}% \setlength\@tempdima{1.5em}% \begingroup \parindent \z@ \rightskip \@pnumwidth \parfillskip -\@pnumwidth \leavevmode \bfseries \advance\leftskip\@tempdima \hskip -\leftskip #1\nobreak\hfil \nobreak\hb@xt@\@pnumwidth{\hss #2}\par \endgroup \fi% }% \else% % \end{macrocode} % If the |\l@section| style is defined, the \emph{list of MGL scripts} is just an unumbered section. % \begin{macrocode} \def\listofmglscripts{% \section*{\listofmglscriptsname}% \@mkboth{% \MakeUppercase\listofmglscriptsname% }{% \MakeUppercase\listofmglscriptsname% }% \@starttoc{lms}% }% \fi% \else% % \end{macrocode} % If the |\l@chapter| style is defined, the \emph{list of MGL scripts} is just an unumbered chapter. % \begin{macrocode} \def\listofmglscripts{% \chapter*{\listofmglscriptsname}% \@mkboth{% \MakeUppercase\listofmglscriptsname% }{% \MakeUppercase\listofmglscriptsname% }% \@starttoc{lms}% }% \fi% % \end{macrocode} % \end{macro} % % \begin{macro}{\mglTeX} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Add a small negative space in the logo, between the ``mgl'' and ``\TeX''} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Declared now as robust command} % This macro pretty-prints the name of the package. It has a starred version, which also prints the version. % \begin{macrocode} \DeclareRobustCommand\mglTeX{% mgl\TeX\@ifstar{~v4.2}{}% } % \end{macrocode} % \end{macro} % % \subsection{Local settings commands} % \begin{macro}{\mglswitch} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now accepts arguments \texttt{0} (equivalent to \texttt{off}) and \texttt{1} (equivalent to \texttt{on}), besides the usual \texttt{off} and \texttt{on}} % \noindent This command turns |on| and |off| the package according to its argument; it is just a call to the commands |\MGL@switch@on| or |\MGL@switch@off|. % \begin{macrocode} \def\mglswitch#1{% \MGL@test@switch{#1}{\mglswitch}% \csname MGL@switch@\MGL@temp@a\endcsname% } % \end{macrocode} % \end{macro} % % \begin{macro}{\mglcomments} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now accepts arguments \texttt{0} (equivalent to \texttt{off}) and \texttt{1} (equivalent to \texttt{on}), besides the usual \texttt{off} and \texttt{on}} % Depending on the option passed by the user, it calls |\@MGL@comments@on| or |\@MGL@comments@off|. % \begin{macrocode} \def\mglcomments#1{% \MGL@test@switch{#1}{\mglcomments}% \csname @MGL@comments@\MGL@temp@a\endcsname% } % \end{macrocode} % \end{macro} % % \begin{macro}{\mglquality} % See under the title \emph{Initialization}, subsection \ref{Init}. % \end{macro} % % \begin{macro}{\mglscale} % See under the title \emph{Initialization}, subsection \ref{Init}. % \end{macro} % % \begin{macro}{\mglvariant} % See under the title \emph{Initialization}, subsection \ref{Init}. % \end{macro} % % \begin{macro}{\mglimgext} % This command changes the value of |\MGL@imgext|. % \begin{macrocode} \def\mglimgext#1{\def\MGL@imgext{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\mglname} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now writes the MGL code line \texttt{setsize~600~400} to the main script} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{The MGL code line \texttt{setsize~600~400} is now written to the main script} % \noindent The purpose of this command is to force the closure of the current main script, compile the corresponding figures, and open a new main script. At first, it is defined to only change the value of |\MGL@main@script@name| because the main script is not opened until the call of |\begin{document}|; but at that point, it is redefined to perform the described actions. % \begin{macrocode} \def\mglname#1{\edef\MGL@main@script@name{#1}} % \end{macrocode} % Here is the redefinition of |\mglname| after the |\begin{document}| command. % \begin{macrocode} \AtBeginDocument{% \def\mglname#1{% % \end{macrocode} % We start a space hack, ince this function has no real effect on the document. % \begin{macrocode} \@bsphack% % \end{macrocode} % The MGL functions created throughout the document are written. % \begin{macrocode} \MGL@write@funcs% % \end{macrocode} % We force the closure of the main script. We use |\immediate\closeout| instead of |\MGL@closeout| in case \textsf{\mglTeX} is off. % \begin{macrocode} \immediate\closeout{\MGL@main@stream}% % \end{macrocode} % The closed script is compiled. % \begin{macrocode} \MGL@write{18}{% mglconv -q \MGL@quality\space -g \MGL@gray\space% -S \MGL@scale\space -v \MGL@variant\space% -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space% -n "\MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl"% }% % \end{macrocode} % The name of the new main script is updated, and it is check for overwriting, using |\MGL@set@script@name| inside a local group, since this command defines |\MGL@script|, which we need undefined in some parts of the code of the package. % \begin{macrocode} \edef\MGL@main@script@name{#1}% \bgroup\MGL@set@script@name{\MGL@main@script@name}\egroup% \MGL@openout\MGL@main@stream{% \MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl% }% % \end{macrocode} % We set the default size for the graphics that the main script will generate; without this line the |setsizescl| commands written automatically by \textsf{\mglTeX} wouldn't work. % \begin{macrocode} \MGL@write\MGL@main@script@name{setsize 600 400} % \end{macrocode} % The space hack is ended. % \begin{macrocode} \@esphack% }% } % \end{macrocode} % \end{macro} % % \subsection{Advanced settings commands} % \begin{macro}{\mgldir} % \noindent This command is the interface for the user to change the value of |\MGL@dir|. It is an only-preamble macro, since using it elsewhere would cause faulty behavior. % \begin{macrocode} \def\mgldir#1{\def\MGL@dir{#1}}\@onlypreamble\mgldir % \end{macrocode} % \end{macro} % \begin{macro}{\mglscriptsdir} % This command modifies the value of |\MGL@scripts@dir|. It is also an only-preamble macro. % \begin{macrocode} \def\mglscriptsdir#1{\def\MGL@scripts@dir{#1}}\@onlypreamble\mglscriptsdir % \end{macrocode} % \end{macro} % \begin{macro}{\mglgraphicsdir} % Modifies the value of |\MGL@graphics@dir|. It is an only-preamble macro. % \begin{macrocode} \def\mglgraphicsdir#1{\def\MGL@graphics@dir{#1}}\@onlypreamble\mglgraphicsdir % \end{macrocode} % \end{macro} % \begin{macro}{\mglbackupsdir} % Modifies the value of |\MGL@backups@dir|. It is an only-preamble macro. % \begin{macrocode} \def\mglbackupsdir#1{\def\MGL@backups@dir{#1}}\@onlypreamble\mglbackupsdir % \end{macrocode} % \end{macro} % \begin{macro}{\mglpaths} % This command adds a list of search paths for scripts to the existing one (|\MGL@paths|). % \begin{macrocode} \def\mglpaths#1{\g@addto@macro\MGL@paths{,#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\mglsettings} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Now calls the \doccommand{mglswitch} and \doccommand{mglcomments} commands for the \texttt{switch} and \texttt{comments} options, respectively} % \changes{\textbf{v4.2 ------------}}{2016/05/14}{Added options \texttt{gray} and \texttt{variant}} % First, we define a \meta{key}=\meta{value} family, |MGL@sett@keys|, for this command. % \begin{macrocode} \define@key{MGL@sett@keys}{dir}{\def\MGL@dir{#1}} \define@key{MGL@sett@keys}{scriptsdir}{\def\MGL@scripts@dir{#1}} \define@key{MGL@sett@keys}{graphicsdir}{\def\MGL@graphics@dir{#1}} \define@key{MGL@sett@keys}{backupsdir}{\def\MGL@backups@dir{#1}} \define@key{MGL@sett@keys}{paths}{\g@addto@macro\MGL@paths{,#1}} \define@key{MGL@sett@keys}{switch}{\mglswitch{#1}} \define@key{MGL@sett@keys}{comments}{\mglcomments{#1}} \define@key{MGL@sett@keys}{gray}{\mglgray{#1}} \define@key{MGL@sett@keys}{mglscale}{\mglscale{#1}} \define@key{MGL@sett@keys}{quality}{\mglquality{#1}} \define@key{MGL@sett@keys}{variant}{\mglvariant{#1}} \define@key{MGL@sett@keys}{imgext}{\def\MGL@imgext{.#1}} % \end{macrocode} % The command receives and executes the \meta{key}=\meta{value} pairs for |MGL@sett@keys|. This is an only-preamble command. % \begin{macrocode} \def\mglsettings#1{\setkeys{MGL@sett@keys}{#1}} \@onlypreamble\mglsettings % \end{macrocode} % \end{macro} % % \subsection{User-definable macros} % \begin{macro}{\mglsetupscriptname}\begin{macro}{\mglcommentname}\begin{macro}{\listofmglscriptsname}\begin{macro}{\mglverbatimname}\begin{macro}{\mgllinenostyle}\begin{macro}{\mgldashwidth}\begin{macro}{\mgllinethickness}\begin{macro}{\mglbreakindent} % The user is allowed to modifu these commands, so no |@| symbol is used on them. % \begin{macrocode} \def\mglsetupscriptname{MGL_setup_script} \def\mglcommentname{\mglTeX{} comment} \def\listofmglscriptsname{List of MGL scripts} \def\mglverbatimname{(Unnamed MGL verbatim script)} \def\mgllinenostyle{\footnotesize} \newdimen\mgldashwidth\mgldashwidth=0.75em \newdimen\mgllinethickness\mgllinethickness=0.25ex \newdimen\mglbreakindent\mglbreakindent=1em % \end{macrocode} % \end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro}\end{macro} % % \subsection{Final adjustments} % To finish the code of \textsf{\mglTeX}, we set the behavior of the package at the call of the |\begin{document}| and |\end{document}| commands. % % We tell \LaTeX{} to check the name of the document's main script for overwriting. We do this by calling |\MGL@set@script@name| inside a local group, because it defines |\MGL@script|, which we need undefined in certain parts of the code. Then the script is opened. We use |\immediate\openout| instead of |\MGL@openout| for this purpose, since, otherwise, we run the risk of the main script not being created when needed, if the user turns off \textsf{\mglTeX} before the |\begin{document}| command, and turns it on immediately after. Finally, we set the default size for the graphics the main script will generate; without this line the |setsizescl| commands written automatically by \textsf{\mglTeX} wouldn't work. % \begin{macrocode} \AtBeginDocument{% \bgroup\MGL@set@script@name{\MGL@main@script@name}\egroup% \immediate\openout\MGL@main@stream=% \MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl% \MGL@write\MGL@main@stream{setsize 600 400}% } % \end{macrocode} % % We also set the actions for the call of |\end{document}| % \begin{macrocode} \AtEndDocument{% % \end{macrocode} % |\MGL@write@funcs| will simply write the MGL functions throughout the \LaTeX{} document. % \begin{macrocode} \MGL@write@funcs% % \end{macrocode} % The main script is closed. We use the |\immediate\closeout| construction instead of |\MGL@closeout|, since the script must be closed even when \textsf{\mglTeX} is off. % \begin{macrocode} \immediate\closeout\MGL@main@stream% % \end{macrocode} % The main script is compiled. % \begin{macrocode} \MGL@write{18}{% mglconv -q \MGL@quality\space -g \MGL@gray\space% -S \MGL@scale\space -v \MGL@variant\space% -s "\MGL@dir\MGL@scripts@dir\mglsetupscriptname.mgl"\space% -n "\MGL@dir\MGL@scripts@dir\MGL@main@script@name.mgl"% }% } % \end{macrocode} % % \Finalemathgl-8.0.1/mgltex/sample.tex0000664000175000017500000003160014167366474016107 0ustar balakinbalakin\documentclass{article} \usepackage[png,comments]{mgltex} \usepackage{hyperref} \title{\mglTeX*{} usage sample} \author{Diego Sejas Viscarra \and Alexey Balakin} \date{\today} \mglsettings{ dir=MGL/, scriptsdir=scripts/, graphicsdir=graphics/, backupsdir=backups/ } \begin{mglsetupscript} define gravity 9.81 # [m/s^2] \end{mglsetupscript} \begin{document} \maketitle \begin{abstract} \noindent \mglTeX{} is a \LaTeX{} package that allows the creation of graphics directly from MGL scripts of the MathGL library (by Alexey Balakin) inside documents. The MGL code is extracted, executed (if shell escape is activated), and the resulting graphics are automatically included. This document is intended as a sample of the capabilities of \mglTeX{}, as well as a brief introduction to the package, for those who want to start right away to use it, without diving into the a little bit more technical documentation. \end{abstract} \section{Basics on environments} \begin{description} \item[mgl] The easiest way to embed MGL code is the \verb|mgl| environment. It extracts its contents to a main script associated to the document.\footnote{Generally, the main script has the same name as the document being compiled. In order to rename it or create a new one, the \texttt{\textbackslash mglname} command can be used.} If shell escape is activated, \LaTeX{} will take care of calling \verb|mglconv| (the MathGL compiler) with the appropriate settings, and the resulting image will be automatically included. For example, you could write: \begin{verbatim} \begin{figure}[!ht] \centering \begin{mgl}[width=0.85\textwidth,height=6cm] call 'prepare1d' subplot 2 1 0 '<_' : title 'Standard data plot' box : axis : grid 'xy' ';k' plot y ’rGb’ subplot 2 1 1 '<_' : title 'Region plot' ranges -1 1 -1 1 : origin 0 0 new y1 200 'x^3-x' : new y2 200 'x' axis : grid 'xy' 'W' region y1 y2 'ry' plot y1 '2k' : plot y2 '2k' text -0.75 -0.35 '\i{A}_1' 'k' : text 0.75 0.25 '\i{A}_2' 'k' \end{mgl} \caption{A simple plot create by \mglTeX's \texttt{mgl} environment} \end{figure} \end{verbatim} This will produce the following image: \begin{figure}[!ht] \centering \begin{mgl}[width=0.85\textwidth,height=5.5cm] call 'prepare1d' subplot 2 1 0 '<_' : title 'Standard data plot' box : axis : grid 'xy' ';k' plot y '2' subplot 2 1 1 '<_' : title 'Region plot' ranges -1 1 -1 1 : origin 0 0 new y1 200 'x^3-x' : new y2 200 'x' axis 'AKDTVISO' : grid 'xy' ';W' region y1 y2 'ry' plot y1 '2k' : plot y2 '2k' text -0.75 -0.35 '\i{A}_1' 'k' -2 : text 0.75 0.25 '\i{A}_2' 'k' -2 \end{mgl} \caption{A simple plot create by \mglTeX's \texttt{mgl} environment} \end{figure} Two important aspects of \mglTeX{} can be noted from this example: First, the \verb|mgl| environment accepts the same optional argument as the \verb|\includegraphics| command from the \verb|graphicx| package. Actually, it also accepts other optional arguments, called \verb|gray| (to activate/deactivate gray-scale mode), \verb|mglscale| (to set the factor for scaling the image file), \verb|quality| (to set the quality of the image), \verb|variant| (to chose the variant of the arguments of MGL commands in the script), \verb|imgext| (to specify the extension of the resulting graphic file), and \verb|label| (to specify a name to save the image). Most of these options are available to every \mglTeX{} environment or command to create graphics. The second aspect to be noted about the example is that this script calls a MGL function, \verb|prepare1d|, which hasn't been defined yet. \mglTeX{} provides the \verb|mglfunc| environment for this purpose (see below). \item[mglfunc] This environment can be used in any part of the \LaTeX{} document; \mglTeX{} takes care of placing the corresponding code at the end of the main script, as has to be done in the MGL language. For example, the function \verb|prepare1d| that is called in the script above is defined like this \begin{verbatim} \begin{mglfunc}{prepare1d} new y 50 3 modify y '0.7*sin(2*pi*x)+0.5*cos(3*pi*x)+0.2*sin(pi*x)' modify y 'sin(2*pi*x)' 1 modify y 'cos(2*pi*x)' 2 \end{mglfunc} \end{verbatim} \begin{mglfunc}{prepare1d} new y 50 3 modify y '0.7*sin(2*pi*x)+0.5*cos(3*pi*x)+0.2*sin(pi*x)' modify y 'sin(2*pi*x)' 1 modify y 'cos(2*pi*x)' 2 \end{mglfunc} As you can see, only the body of the function has to be written. The number of arguments of the function can be passed to \verb|mglfunc| as optional argument, like in the code \verb|\begin{mglfunc}[3]{func_with_three_args}|. \item[mgladdon] This environment just adds its contents to the main script, without producing any image. It is useful to load dynamic libraries, define constants, etc. \item[mglcode] The \verb|mglcode| environment is similar to \verb|mgl|, but it creates its own script, whose name is passed as mandatory argument. The same optional arguments are accepted, except \verb|label| (for obvious reasons). \begin{verbatim} \begin{figure}[!ht] \begin{mglcode}[scale=0.5]{vectorial_flow} new a 20 30 'sin(pi*x)*sin(pi*y)+cos(2*pi*x*y)' new b 20 30 'cos(pi*x)*cos(pi*y)+cos(2*pi*x*y)' subplot 1 1 0 '' : title 'Flow of vector field' : box flow a b 'v'; value 20 \end{mglcode} \end{figure} \end{verbatim} \begin{figure}[!ht] \centering \begin{mglcode}[scale=0.5]{vectorial_flow} new a 20 30 'sin(pi*x)*sin(pi*y)+cos(2*pi*x*y)' new b 20 30 'cos(pi*x)*cos(pi*y)+cos(2*pi*x*y)' subplot 1 1 0 '' : title 'Flow of a vector field' : box flow a b '2v'; value 10 \end{mglcode} \end{figure} \item[mglscript] This environment just creates a script, whose name is specified as mandatory argument. It is useful, for example, to create MGL scripts which can later be post-processed by another package, like \verb|listings| or \verb|pygments|. For example, the following won't produce any image, just a script: \begin{verbatim} \begin{mglscript}{Gaston_surface} subplot 1 1 0 '' : title 'Gaston\'s surface' ranges -13 13 -40 40 new a 200 200 '-x+(2*0.84*cosh(0.4*x)*sinh(0.4*x))/' \ '(0.4*((sqrt(0.84)*cosh(0.4*x))^2+(0.4*sin(sqrt(0.84)*y))))+' \ '0.5*sin(pi/2*x)' new b 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*sin(y)*' \ 'cos(sqrt(0.84)*y))+cos(y)*sin(sqrt(0.84)*y)))/' \ '(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))' new c 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*cos(y)*' \ 'cos(sqrt(0.84)*y))-sin(y)*sin(sqrt(0.84)*y)))/' \ '(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))' rotate 60 60 light on xrange c : yrange b : zrange a : crange c surf c b a '#'; meshnum 100 \end{mglscript} \end{verbatim} \begin{mglscript}{Gaston_surface} subplot 1 1 0 '' ranges -13 13 -40 40 new a 200 200 '-x+(2*0.84*cosh(0.4*x)*sinh(0.4*x))/(0.4*((sqrt(0.84)*cosh(0.4*x))^2+(0.4*sin(sqrt(0.84)*y))))+0.5*sin(pi/2*x)' new b 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*sin(y)*cos(sqrt(0.84)*y))+cos(y)*sin(sqrt(0.84)*y)))/(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))' new c 200 200 '(2*sqrt(0.84)*cosh(0.45*x)*(-(sqrt(0.84)*cos(y)*cos(sqrt(0.84)*y))-sin(y)*sin(sqrt(0.84)*y)))/(0.4*((sqrt(0.84)*cosh(0.4*x))^2+2*(0.4*sin(sqrt(0.84)*x))^2))' rotate 60 60 light on xrange c : yrange b : zrange a : crange c surf c b a '#'; meshnum 100 title 'Gaston surface' \end{mglscript} \item[mglblock] It writes its contents verbatim to a file, specified as mandatory argument, and to the \LaTeX{} document. For example: \begin{verbatim} \begin{mglblock}{fractal} list A [0,0,0,.16,0,0,.01] [.85,.04,-.04,.85,0,1.6,.85] [.2,-.26,.23,.22,0,1.6,.07] [-.15,.28,.26,.24,0,.44,.07] ifs2d f A 100000 subplot 2 1 0 '<_' : title 'A fractal fern' ranges f(0) f(1) : axis plot f(0) f(1) 'G#o '; size 0.05 subplot 2 1 1 '<_' : title 'Bifurcation plot' ranges 0 4 0 1 : axis bifurcation 0.005 'x*y*(1-y)' 'R' \end{mglblock} \end{verbatim} \begin{mglblock}{fractal} list A [0,0,0,.16,0,0,.01] [.85,.04,-.04,.85,0,1.6,.85] [.2,-.26,.23,.22,0,1.6,.07] [-.15,.28,.26,.24,0,.44,.07] ifs2d f A 100000 subplot 2 1 0 '<_' : title 'A fractal fern' ranges f(0) f(1) : axis plot f(0) f(1) 'G#o '; size 0.05 subplot 2 1 1 '<_' : title 'Bifurcation plot' ranges 0 4 0 1 : axis bifurcation 0.005 'x*y*(1-y)' 'R' \end{mglblock} As you can see, although this is a verbatim-like environment, very long lines of code are split to fit the paragraph. Each line of code is numbered, this can be disabled with the \verb|lineno| option, like \verb|\begin{mglblock}[lineno=false]{fractal}|. \item[mglverbatim] This is like \verb|mglblock| environment, but it doesn't produce any script, just typesets the code to the \LaTeX{} document. It accepts the \verb|lineno| option, plus the \verb|label| option, in case you want to associate a name to the code. \item[mglcomment] This environment is used to embed comments in the document. You can control whether the contents of this environment are displayed or not, using the \verb|comments| and \verb|nocomments| package options, or the \verb|\mglcomments{on}| and \verb|mglcomments{off}| commands. An example of this would be: \begin{verbatim} \begin{mglcomments} This comment will be shown because we used the "comments" package option for mglTeX \end{mglcomments} \end{verbatim} \begin{mglcomment} This comment will be shown because we used the "comments" package option for mglTeX \end{mglcomment} Once again, long lines are broke down to fit the paragraph. \end{description} \section{Basics on commands} \begin{description} \item[\textbackslash mglgraphics] This command takes the name of an external MGL script, compiles it, and includes the resulting image. It accespt the same optional arguments as the \verb|mgl| environment, except for \verb|label|, plus a \verb|path| option, which can be used to specify the location of the script. This is useful when you have a script outside of the \LaTeX{} document (sent by a colleague for example), but you don't want to transcript it to your document. For example, in order to display the image of the script we created with \verb|mglscript| environment, we write: \begin{verbatim} \begin{figure}[!ht] \centering \mglgraphics[height=9cm,width=9cm]{Gaston_surface} \caption{Gaston's surface} \end{figure} \end{verbatim} \begin{figure}[!ht] \centering \mglgraphics[height=9cm,width=9cm]{Gaston_surface} \caption{Gaston's surface: Three-dimensional parametric surface} \end{figure} We could also could compile the script we created with the \verb|mglblock| environment: \begin{verbatim} \begin{figure}[!ht] \centering \mglgraphics[height=7cm,width=10cm]{fractal} \caption{Examples of fractal behavior} \end{figure} \end{verbatim} \begin{figure}[!ht] \centering \mglgraphics[height=7cm,width=10cm]{fractal} \caption{Examples of fractal behavior} \end{figure} \item[\textbackslash mglinclude] This is equivalent to the \verb|mglblock| environment, but works for external scripts. \item[\textbackslash mglplot] This command allows the fast creation of plots. It takes one mandatory argument, which is a block of MGL code to produce the plot. Accepts the same optional arguments as the \verb|mgl| environment, plus an additional one, \verb|setup|, that can be used to specify a block of code to append, defined inside a \verb|mglsetup| environment (see the example below). The \verb|mglsetup| environment can be used if many plots will have the same settings (background color, etc.). Instead of writing the same code over and over again, it can be introduced in that environment, and used with the \verb|\mglplot| command. An example of use of the \verb|mglsetup| environment and the \verb|\mglplot| command would be: \begin{verbatim} \begin{mglsetup}{3d} clf 'W' rotate 50 60 light on box : axis : grid 'xyz' ';k' \end{mglsetup} \begin{figure}[!ht] \centering \mglplot[setup=3d,scale=0.5]{fsurf 'cos(4*pi*hypot(x,y))*exp(-abs(x+y))'} \end{figure} \begin{figure}[!ht] \centering \mglplot[setup=3d,scale=0.5]{fsurf 'sin(pi*(x+y))'} \end{figure} \end{verbatim} \begin{mglsetup}{3d} clf 'W' rotate 50 60 light on : light 0 0 1 0 'w' 0.25 box : axis : grid 'xyz' ';k' \end{mglsetup} \begin{figure}[!ht] \centering \mglplot[setup=3d,scale=0.5]{fsurf 'cos(4*pi*hypot(x,y))*exp(-abs(x+y))'} \end{figure} \begin{figure}[!ht] \centering \mglplot[setup=3d,scale=0.5]{fsurf 'sin(pi*(x+y))'} \end{figure} \end{description} There are more environments and commands defined by \mglTeX{}. The ones presented here are the most basic. More on this topic can be found in the documentation. \end{document}mathgl-8.0.1/mgltex/Recompilation_decision.svg0000664000175000017500000016227414167366474021323 0ustar balakinbalakin Terminal/Interrupt A terminal point in a flowchart: start, stop, halt, etc. Auxiliary Operation Offline operation. Decision A decision or switching type operation. Input/Output General input/output functions. Buffer Small image/svg+xml Start Find\MGL@@@<script> Is itdefined? Comparescript vs. code Rewrite/recompilescript Undefine\MGL@@@<script> Define\MGL@@@<script> End Aretheyequal? Yes Yes No No mathgl-8.0.1/mgltex/mgltex.pdf0000664000175000017500000205241214167366474016105 0ustar balakinbalakin%PDF-1.5 % 139 0 obj << /Length 1752 /Filter /FlateDecode >> stream xXKs6 W(D4_[648gdIUF/@Pk=IzYq! >~`s"eR$:8dD S N}x/aYUi ܜvDʆ8ѽQ&KyB)3* 3xX;ѼɋH2Jd%RB,I$~( ʫN3c!3Zm *ٿժb˼Gz,avO%SPNK9ⷬͧu?u1jaE%$"%xG5"H. jϕ,ˌ!4< bfo8 y1}{CW 춷iZ ,Gz GYw%`lQW]$p"YSpM#iC?>i/?͛(a?P_8Nq~/jM=N97.1()xC#vhT庠+f "SӺָ߮#YXO4DwuW&!>dE^B7y7 6C򶭻 [m#2AXZy3"avTmE.x5 A^u$LmBa7MUk\PĤ94_-hʒER0<+(yَUI+ 9\Gքn;L*ώD$ {K e(2si &t̄('#Qg?Zȋ@Zyx c0ɸ䀥,w{Hhwև%tsK!!_P0,Z41+?N˭ku>uDWpd -NטҴH(m.I(lG$B6r;ڝU8 2korH0-&1"w–(,SX>OHdQg 0<g?#~d>xH|h 4KGL,` řL_a-(˔$f ɀޱ;G\Jg%0)02J#Kߌ[w#j..t (0^Y\=@-R C7e)ޡGI܏m =0$$$qEu.o$j(=T xN 1O?p>t 쎊ԃ𛯛fj¾'HŽ vGQ_QwqXR$;O;ʀwy㏺6/@g?zW`FQZX~]ar4eP/{{Йr:4B|v*efޭTﭺGk5q'K_,^!~S!>ؿڕmT[*qWͪ u Qg|ՇQO e㪩ʕC-JAbbOӣOG<H32E{#Jx2LAkzfT MwthP;R@Z$=L.z`/LWvͺYD%zmQ:^{.tVqwTwP j?k&x ciWnjouji4gB 2j endstream endobj 174 0 obj << /Length 2502 /Filter /FlateDecode >> stream xYI۸Wr UӢ[rr;.LWr2"! c..V~}PSIœ|63og勗a:,r=Ѝ31 h,f?9|7Uoju/4td]`E8UezF?B ?`E໙|1ڕRM=_"찗G;n&lDQl&r}X m{-K/3O;_DT!7] O ?bc3։ucWj Yc:`|붩+`B*q%^{Bx*eU>youHKBqEYL/D7:'O,ηs<]oj7mu߷:(,"',Q Q-JH"q6E3ė0alzy;HuXNh]b2^pQֹ6k1{CLzqv1iĻu/.uYv LA'/<}LK0@OsqcAj`%#wn(ayc^JoNM7}r՜ hJ,bg'#lI^ ȅt%pؑnd;}DQ-Auˀr{nhJ G ;t#BR!F;C)ybTdz ¡·^V6ݴ`f+vWU'6Jl".êm- 붩ei:E\ :pЪxg `w4tj=b ЪX0E'i.츢9U22M$cBNU=fϽțиk@5 4RmU蹴/_[0 0 VnoH^edTa}-~m;3jYMIhqQ@;;D v7T8h 8%{b*›> ,>љ p4]x-rͳei.v+8*2H6V-sa1/>08*P*)b3|F8;hA=gUTxզ o?7SnD“fvޝHBxB_؍K*1Me~&w(umݸ:]0 SfA2X}u 4FC<@A\hECQ%n8;.74Fޜ4r49@V潽C&WGd7䖗Qu^8aJI/qмV菎&JZJn",SI3tJBOuɷ[SeAǩEP GH Ef^H'X{"R1>^$0;5>kpcK3u+btL8OVlGNY' ḡٟuw†v7o>C41QeŖ6KiB@WZ^j_7tЛ!LS7Sw ffziG[z=X[mL(vɟB[SPNi0Cڞo6td?d$?:k軐D }yd]\Y6*SʤlA؛D6$xQp[7mԺm3w3ɀv4O{t8 +#((_ \A"mT^.+JCep\wNX QJ|88q\DBngąh;ޕ56ռ&Y .Du EsR@LNR`*`SqJ%No!&x-/Xvr=%@ljz YhQn净o\8`=ؾ&a o>jK+vVŸGsu A}KdB?@I ӀG}n/ @ endstream endobj 182 0 obj << /Length 2905 /Filter /FlateDecode >> stream xڭZmoF_! D -7@hxDA _4_Lrڝg:YݭWWo޹UgVJXteMKeVՇHW9fam$z{.zZ+DWFyS7UAJDyG -nNd6Z^m\g#dz-cö].<[qZJĭBę1ömT$ /nt痄kS򛶮Nϫ6Ew=yǼ0"ho[hu_[U\?!~ ͕L]䛮h&]  .Gkͮ\hm~<$7 Z[0>L3͵SmB4)8Pe#(6jт3oi{5Ӱ?cH b:AL?3MT9fc3QNfXɜvIlNzƝ`vkSX/)T,_*HȀ\j*|yq!PJ2% Tx(h ~w~\ Uͦgy RD}sN|#8bbBH'7&S16A7Wk@.V7Ŗfq-HMjVٔyerD楰be͍Tp/o"ElFi5i D94t:z} !V[+Rs5FtiDm[)`6~ F;gV3fVԧj:=³n0>Ζ>6uH硉c÷HY9" #^HVNB& @tu) d3"IjT8۷lLd/01N{[z*A9CpH^4sJ>T,>rW1Ai s4-ФNj\C"Gfs}2?lCrh#-B#i:)Ă}46vhF=Rςz~ o~;)FG%/z2KGƅf~j2; }@}cߓeS|>! Ymf@Uʷ=9fR3`Jbxo]u>JADJ.PpRda QɆŒpA@tyo5#$C$ã@|aBk`Q3#ΘO:L 1J3RFj@LRSi'-1t\Ш=ͲDJ: !ma͞LFcyʫ{y8UfvFZ%"ی1$4B5gM o D?~ڝɈTo!Q⽔"U 4\ =kIɏrG6vh3;"4N-F tЭ(}zMkRFHNS';bejR$qm.ML|HJ<*j%T˝4ypRUu *A*rR_ Ux7C/r(̅l );z?Bٿ,rm2w)M'wW|ZW:IY_k|vS!o4Foa搟9\<8rxT< ӑ:t^JL\u_6$> stream xڵY]6}Cd~^@P`tRHౕ64_Td,g:2lPsϽ$eM;1#L&rv Pg D7B``f jeal rO9hי$S9ˈc."`!OxAJ$P"-vB=;xcnJ 9"!r$$48Hv1>d8(mpRsNp^q~ _MGö^#/]߭ޣۍ=uǺ{[Z+j"99vqU ۦw]O5u?ҳ Sv_Ҳ[To. VG كvG˾QfUyn>`/P SŚ˾5gV߲levè^}w4dI?^vqiXݑ*zZ_|lnjs~S~t49K*7rߖpKÓo4|UfÝe.W]nvCWW]YS:aU^Xϐ7ݪy_:Ty^q t )]$~9%2ړ҄y<~yϊه4c#6_n/m_0O? ~ \`G_l>"i)-+/%22_̡,lg=[ك W3r/lWu]R_̟չ"$,w`c$WFaU踴x*++U@m52SDצTyFkģ Qr8F XYc)\yYzRr~28 x>/LrM'b'rg͈ҝ@Ob X8@L''R8xơPB>FbbhSW&blpV>88 (8WJ$PHXIe [Q .]m':`es,q59)V[i"B;:Ʊ 0YxW%PaGAJ16eS<1 J0=נә![*F x'1eh[8 {ݻx@yz ]|: 7Pn PlO%MEKT>x+B)R8V˭m *hxpܺ[|0/g1h::QWZFlpOtצ(]}N0 endstream endobj 197 0 obj << /Length 2209 /Filter /FlateDecode >> stream xڵZK6`7RvI&SSG*L\L 9zvy|%$FI]?<}IEiAD0Hh .C]c?MXFe|l2)M&>ݚƷWDigEyUiv䕛hVJ٢Ekc9"UU4^l;F7)Ƴj(v#VKc@ 4 WɬLweu ;|& >|rm&鹛ˉiQARIrJHf"I\hjoM2`kś42Ǵܚ0?MVWl.0rftYUצ98ʼms-tBeTReD8!IU䶋Ymp ;T>wl!-jNv"V+[]"{R(WGDM< mr4Uڤ:S:x!h@f|a#.c6y۝gm=úSQW~HV-QXH#2[j4|fYB ˺ҝ*E'ln慤:PJ.7HoTX[&$fE糕Ɋ˩܂{`p?wdi|P q! %kׁj4gB $(.hN84r=Rz8ArDP+0 nI IN1"/NbS=0Mkc W8XNl(.u_${l$;l .Fao;> stream xZK8QlL2EE lFGݙU,e!'SE[W7o_iCcx2XmկGG߶yCƏl ^z֗W͛@1÷kYRzވث::XuyhLۮ73Mh2pwer_ScW7eұg݄P6\@]\Txna~>O_~zs$,#ۂ [ÒIKKDփYBp%$MJ8\m&8h~JQI?v;|~I?E`*߿* ~LVmTkhAAbjpwPxZD=nD֍`ı;&EH=!-mwCUK }*mLjh&P~=7HMV(&a;\)A УSh*@1ZGh*gR,TCs#,uܴlQAYNJ4)A<暞@zP uz=)~uF|/^# bpʖLSb j3h>։b17kdڹT_F(`24^!^~\kN=&iܲ!-4l \zaAx<_-D!I=ve^$[[гh0g$|Q8/ * tS;tCkxTN HBDn ήW6&9ޝu,_4c(zg|]p++N FX;$)uxɝi{ .L}l!BnCܻO`C^cZ_-?g9]І܄"|€![|rwV|$~s#u9rw,m^cʿ!bѶ)'Xx>ڍ E I*?3ݦ~eMsm[ p`Cx5w p m.s/Aԥ3BMWUo.Sܻd#er֥UමpW|eTw}1p>ߙ@As*"HPr'.?Gi x" "WClA(s٠a@ö*[7Ľ!U/t r~IqpR~0rDjl6.@ILrp54:Ґƪ޻DU IJm,6-ut6߰EZptu܊kŮIRi 0b:3.;rIG|K)uZ}oL 3,\/ M(o2z"={+hL?kL- oapʙK"Z|ȃ9pα*99/A |?b<))^r%5{ ƾ1ԁ AaHmn MdhF=;Kl]T%0 eyHZ9qhj@KD78 gC38;KU oW W Nkk G 1uZX/](eSr }|=Uq[+@׷{}E*AE8剅t ;6|7,oޱ( >ɝSL;*\4}ےRI9m-*Nj꣍@r=޶&mH&bPG6p3C'"iq@3DHkt̅(pp9/@Nܜ 3nn0}Drs<Jf(9vw2⤒`\h6%|6@o}?mZBv ?I߮>8IҒHґ4!'('N$8>rL0@\L8L D9 p&xJ Z[efzOcay`9JiTP L BG'Zw PrKzSI@~_-5kow!&;h2z/y(HWG>@5wy_@RdRWp_1dáM,HIjIZk/}.W A¹x.=/$0h xF90/Zcm̟)=¢&0`TT^}BW:M+("F*-~_eJ.&uCK$^/Wrn`#Eۂ\q/LOU=$AńɞA1#?s5 uūy@y>*ЯaS~Z T%= ·Jn .LB]HmR&\ :IJ2eʖ*=ag ]e47XA\Yi4r|*_ܣ$34g>V{atTO;A_ȻH+ivaxe73vrYߞ%ϢGW$=Br{5",]xN} u endstream endobj 213 0 obj << /Length 2939 /Filter /FlateDecode >> stream xZK-0jlrHq 2=pXT(j竮&%JY 2ri_U+gQ|2Yeg3ka33q"g-Z}SUBDz^SAWDz{ûv_c|oʈ,̄>έߴ7+y@[aV~gtHO?-*~(E,Muu7s ~av/eb iq?atfO4ysϴv|D`Bp(g2WOŔRVYly̎H2Vf-6Vecٮ淞4 dY ǿ8<2yS_ +HV6Yȹ &BwyWn/ѩH _pFCꐁ4u-@*? n/K]./8"#7y:ז\-d($AuJ%yǛ]izj]k {e ctQB8"ֽ7.P{+ =AyA F,SCQ֐6!Yut*HuÆE"k-W'zhR3fɕv9_.AFBfq\f:E!0Y:oCUpn:nG2Ϲ/D>=0,;0?,e{x4>S ڮ1Ҭ'zWՀ>|#o[l.["@ ׹U~څ>߇@j u:ڴkǻnɬ (ڕq1j˭Q `KbՕM8N |f[a&l;rA:7(¾hb%5F ѹ\t{=|kwyKBiߘ&'X2"K@|"b:$֕~(~iSU~JCLIx_z΄Bs0 uf]z߈AXG^m]y"2H\LDҞ܃01Yj = }{d\GĆhj#gg~  G?u"_#fSNS h1U&`!έT(G6d Teک c3R&waRmes er6Z>BHNd循KA~0 A*ec˧>$֫ܗ^oDByc]%Rap Ҝ/#LX 4ޜ*2iW*)uUڡB4m'HUD2O~HNF@oP*#Dȸ2 Rh{rg#t >{{|g2d4دBQ2MD*W,Cj`mWdu1P\r9WLC W`YzfM㜉}H`<Ës2z쨂]|PD!g x:9[9zBNϋ·Ct>nRtcƕ woSa =q9UXw&ܿ- +hLK4]^]~vt+`1AA Z|WU ͢x[>j]^9};k xcpvهIWxJܰbᡧC2ը4"n݆H/Eyd 6Fۊ(04r,YUVKvATyaN(9妯Ecm=H>Ѕ9`QBԓuh2\ftqvQ{8'W'qv6Tc/ԹNh~;* .Y0o0A6 Itt e(c:{؇3I Zd4R_= 1hJ&H4%9F),$Q*/ vc[+vFv? <_0Tԓ;h~Jhsۄ2=:VJEၷCx%~~a%} *}~K۵H^ k$;Pc_^ endstream endobj 219 0 obj << /Length 2528 /Filter /FlateDecode >> stream xڥYK6ϯPʂ  TlS=lej/XC2Iy2Yw rZ0A‡]Y~/޾T$ב lp\ote_~a_YuZM~_vj}N+\wv] U~WRtXΡ«Wr#H7@S՗CsʽN"R>VSFDѵVeU>yOPԍrs"ϧ*%+Y6$S%0l/$S: vmvܗXo5VAO7ZLK8HκcұA)*ak*+t m1rb)DRьB`uxދV cwx:` 7o0+l$ :WçpU("`IVϪ7e9Kz@I(yve`qy*2*MHU_}̆S 6!? g|mH-,(5"BZaϚl<(6j<@UHGPZQ[8S=tJ`յrA'D5$ڍQ)_)\ '-Aš)#FMc*!҃oawݠ!~@,w̓ଂ-b&RJ&8VK#b4oX| 9%ijSwx? ²xhX<F_ [5pcKu: k=Pv2 L45P3yAOҩF!Xh{QYjUY;xI\|H/ezX$37\tH'"L-eQGZ3#/O;DC2gG)natPڧQ^uJ1q'p(2ude!&j ePjl$*̤`'Q\C-ֆg%DlG?~2) `wL-@|hyF!Chx !' "ȩ۞|Ika|}o2I`@K8?6/kc 3_ҦB@&}6R"!Jd,⁔>,U@]^D xÌk Hu3|"(N u arAS|rXG[|] VQcFO{qTc}Gz?*JQ<)DbQfɈz/\%"J"?/#5ѴKKIat\,+;jAwߌo[n|hug6*On:̝Up8?{lG);|uҿc~OÌi !k-8EM endstream endobj 225 0 obj << /Length 2511 /Filter /FlateDecode >> stream xY]o}ϯ+HJd>l.ڇbt (#K^KN6Xﹼ,ي'3ڗ_&/ǹ2q ld$ (&Hu%RwCXdw?}%&ݶ.@}?]lezX]JLZKijNU}D%?+nUǭvWmaؕ'< T']Ik/ZjCjU|[rQuLU񵕜*5Qs 1TVQ窮P?3o^=*\7 | & bL-IFI*ѮocI"8&#k!/Uh7)R {AO-2وʗSxڄu [*$1s2Rb>_j܂])}dHj HXuM"T<=O*Rw N˾QX*4a+M6K"n$$ |l6G]|)~mh26Jb! >W&K"3vFo9{`)Ӹ}U}sV#ѤKõ:&\eQu(l c;["/>7#!O޷?k{kZАCW(7~rX :(aT^w,HGyY;q fnRqBׯac&7-}YN"u)ͤŎu3*OU,@Pe@|'9@HDq*~kJ"VRD xOLY*޽:IgG1%{*Tɦ'a?-4=q> stream xڽYKo6W{fć(@L`sXX,Anj#i[ŢԒ[LfRWE:vQp $0 K4Z<ϣpoITǟDϞ$a&ÅuͿoqw{%Z6,dSre*5;qe{8͟~೵#AC;}1ܰѡ;i6)gþ;ˡDr^7&4: X{#8{08C&#Kw0f w_ֿlU" ?nA*8;>:WxvkvAv(o.I" !-*Y9;Y mU^%ugMOʒD,'EmgA;֗+ jXcNXL|0{r]BȁR'""`(ht& ߟ *$"H3t!?p-VKk 􀸌UnjpwT_#ØM@.AY&JYP^Rf柇SS'a\٦\?〦jE֑0LsL,quOⶱ9HU@H^t,N8Ўύ@br}l`C(ۮ!mSQJה^GyHEQ <菀P K~FI}x]5 R*$y2ʹxAKzWHaltdi ޻R %>%:,b b$Z|V9X XI}QPTr,mM 1KOCb:3o8<.am7rPfX%{;ƏJ1쀺<2pZ0ޏ'eg|+zoa+.GaCе'4`\{8ТAÌSNCqSIh/0]+KI5=^hà?Mi~>o 4R*հ]wP Þ}.\%,j;@x &<7>B,t-خ]Bv0acos2 >zո:;J4[߽Iп=QF~㪅SXX5e}*:dPq>E׀TSI G|>OB.A^,{++6+\sQOOZ\JE)pguCn ȡL9:ЮI (+[A䋝FIs)gEJAt]&^\H􇇕[>3c`~tPD7U}D?n0=von!dw FT(FepBW<ĦڎĦ}+>=H{HOot9&TAQ, #pF6l7νpd?LWmpx( Ђb(xʣ e;n5c4K|'c9]]ӑ!.z.b*w9rrv;۽yq𯁥OEאIA}ub}aA, j5X5BXl '#O8j ma$};ɶ{xinmv2LԬd?N:9Ҵ/b$g2̘Dn4F~E?m t" 70'UO*- _!\)>%lNJ;,$}ٹH/xwA f"Ό2|y ~wЗTI]O,\EƧkPYf={&բji,0ïk*!|/觡gj53$d)T}Fۆyq5{vo.Zihpm/ Lw#BidZ,x|D9;? endstream endobj 236 0 obj << /Length 2423 /Filter /FlateDecode >> stream xYY~_7SIyXE `g^#P1g& jR9$ E죺ZƿpV.<{7L]pE0kE?WkE^m]tJ8vSw+݄k" Ͱ&&eM9;gLeWU8y}Zk.m鿷t]YUԻ[ h-5g (` +@*5ntoW"Na~՛oڛîhg5g-R&O^Ъ@TZY rdkL`rNL4RG橩;xه̳.Ɲ`g C]ޖp@ٛA_瘟Q7h\Cſ.P<T`D&,I.>~&:SiH$qʮ.F0$5KSX\ 4Ծjd3ӎqS<ZfXp[l7&ip !MU20uUޮAs6}wh 0E/ C.Zƒ Kk`O x2zGkˎVxǽmQ ovp~ȲdoB`*Ei iq\G*1O`iψHo틪h  [f72n!/`sF+cSX} 4+{UWugm}4?0?  \ {~K=Ϲa$bG*\caxSP( eؓ7<@̞F$_'MfѼ[ f]YP("f";7~K HZ(AD8q?LyO>.0c\Skݕ;7&aMKhúsg7tQ$# !nނ'߻G^?fhB}xp[?~b}6~ mu^*u+ odVLq97LR4 1,F?F˶C;$x@{S2Ѕl Mqd/4'Ofr6:oƄyvCKJ1/Y_%](C:E֕L\#1EPSqУ*RRR ?8"=@np(vPeM!=C{pCO_YE]υC $amO cUװɶ+uCAfvHŝ zt[Mdm|EwH p Le3в@Ȃe@eK}7ԉ1(=F xp:nȻiۓB};\(A1f _?D02,0!;f+7x1-YBKS& /f,_ x @yoWA*rFM( %j!@L%;=$ZCI ^/TrtɪT,$H7/o74ujRY}h?2s)*`2co(f 5fD?wxam1Zw/w,;8&`a#طX !3k4 ڂӗ>+A,| )7?`J@pʦ݈< rM kʼpꖯ鬞B\|>@lz BP"h37!١C:93CqJsuxyCKt5̓"w T $Gн* Uu/K /~W+^r˹5W!qO)ƍ91a2IeyPp/@b-@¥Ёl]Ѩ =ƒN0lr_a٧3% o(U%ɲH&r,u\xk |6\Te6/#M|O d~ա}Y+k {&> stream xXKoFWfʭ6ޥhH}@$ZZY%R)J)ThrR73,#|{ٳ\D % h2kIe"̢1G.¢%JqF[[eҌƂtLɦ~nԜ~UZQΒ⾯@[q`LJDY4HaTkQBZtc`]~=3)x\N7ٺB!OөY[+wouy 69)iÃNm$+pO)Ynro1YGZ}LUv;2vmgapv0ڔDW1x^7q[l\j >%RLu% @͑AIխL(4Quq| e9|>b=nwy$8oWGAY-†~̠S+$4AIIA1Fc5WI7N2i6!J",m 3; 0I[g7=3ȻXH#d<.C^fTyk5бoK]1;jw}~ N9dJ${6ѝ[% u逗rp"FАƯuJzww3怦&.Bxcqcv[3ՀLdّk1ƥF_Oj׈7^HX ih;!(  W{|ֱw%Q%%P 9+}RM4d "T$H3NQHj.`S{Yԣ=an d|k qsjqS։ƦFea46zTYV* 5L';@~{mf >u11-A#:uaw4W?.o}O!++$u^5ʹkY]:o@̮۬fhUw ^puhGtѮ2:xexrksۖ'%!YC] Ara4[Oä*.w34| iwZK62B&-`ao~Cّa>|=̛aw]ӿ>a1`k*;x <$VTlজyYܲ|Y7A06T>1s ˵NIGc$DE@kTҧʭ endstream endobj 246 0 obj << /Length 2750 /Filter /FlateDecode >> stream xڭZKsWjTaZ'٪9$LJO7|I;e 44Q ͻR4Ep x,Y 52Px\ !/q;eVЬYm_AD$xB,aҤ{-* pga[`+Z-(#ȿg3b#Xm8B1_*enݬ'gn+kµu"ȋ k#Qމ>Gq4"ʛI ɒOR)ؼơO%M>G\Yb`K'ڋRg~%e a)&AՂEJ~T;9sN1B:WLHw)t::lEAzIo:8#T3˩WUQl{襁Yk/MUۉ=UqT킇lRp &WZj:^] 9[,u_<:>;6dY( 8Ɯ;3OWݸC-8'o!n44ʳ#j6VG䈼 0at%$xW{ceh[m++De|m[`R w3Bl&"xdOqLYP6`CH:yZtKU]k\S|E9>s@P׶83vJkZ&V]UC^d=FQ:CS=4i3 ~2KwУD%2o𘬭'KT`[޺twi3 Rhs݉fJp۩;5@O`&$;T" >Ց|YN@X` !hUq\5V)0%6NDmxje.⬋8nqԛyg5=^/P}ҡNxc'8>FFePxO4 ~k%D$)@v7 lwHo=msS }j0붰\6/?6MEUX{:"Y-|"d"?6;Oh(d6tnduLJQ̣3͝ Kq {iD 5YO5,EoxF(JOF8WW{ƀ5 #/\ KRc|"wuD)Hn+5 sHUTJ.`Q=.=q1fsy$r9FgefcN"ۗ%Yĵ6.KNU>uWG*fBS8UlBmPl"D0ᨔ|I^P$ ;<]RFZ)t XN"(7 @8] eFԹz>KĊ̏P+Dcsנq|妉+|o~\G,oW(BZ`REw߬+v}tdYm퇫Mq4yH2Mǭ>NҠ'`5jܑ{&dwЂ{ 9]v+1JvT`VIftM@P ]fm V(2̼EBhrO5OxӍ{躶X@a:6UQs#=_sο71 w%@-CG/W"BvG%Y +W#ƅ vƇ@톏 wRhq8ui\i*䴩@t#?b\SBP9rͼ:Q ~Ep7JPTɭkux?_f:aɛחYl>ݙ\,y2s/qx,6C9 \^la2ʸcLgyC?|30͢ryj㚜яK7ya0"+uPd(P]#ni DEN13g5я[?|AI @M|kX 9On>I*nIN'8r-LZD }l,5{Z>v?{3J31OWA(ֵԴp (X3pJI^0lwr -UguEb\SRx YOoc 9E/ ơ (=,~+iz]0,;>Uo+HA-2Mvۑs^_I2IuL8w4w> endstream endobj 252 0 obj << /Length 2121 /Filter /FlateDecode >> stream xYK6rcO- `{flȒ#$[ŢdYV.Ţ(VXh%<77_~l"ˍ>F,If,$}*YZ !MnWeSjIPԻn%93!#cj-]Ul-٦v%mz_H=H!oWw&V$M2[P*)s&THƵ$ɾ]6YO04 58o(Ut u74~m*^}JWe7]m/h<,w I UxF  qi[DK0?05`{: ⺇<]_+mv`p1ћ=0x'aejT)5J Uxf>vS]ƙrXJ'TM={~iNO;݅}a۲Vnso@9-x_V5~VkbI4,/ӆ`RgҲ#NSO[NYd>WW{@:] m S`'I)fQX5Unfr |fAA:Wm3XփUEtm0ڇ|) n֌0\7t܊ރʑ07x{dx~{{ OD"g<7,&_xL.yK9U򟛟)5]F*1F\dO##rhtj1܅M)?%tOVx /5GR([96 Q7z GċKGIA,[TP.X25WvmDևWLu_̦_B8f%"hH 5q*J?Y*\?0 ;A}p=Oc{Ž-cE7!Ob$W݀b%lhUs|TMf355;w%z$T{@P I0#dzsU<jɵ aR: 'w׾P/8HC$s.@ >UErnc6U2>!o`:%׾}A> @Wד@ @ԉ3N--ijWl>?Ӕ'd%.)7l8(҆!8;Q]%x+w@ k`(6y EԲD[*w ;/~c_Ma$*Aw@R?0 .)JrSyD-"%Н6m,"F_DZKtjz|y[D[A wsvQPm} D2qt}Se덉c`M[XrŦ *^ق^`/ Mx " @SgBzO+dJ̰&chiuc_o R-5U6j*׀XPZe&=v`@0VRXo)~29#(1gmm`^`Rܰ1J1IR46h i22 Niv23c _0F|ӆόk~zlќZ3L;]A h"\_Ɉ"|Ю׭8o'O!<77[y\8|f8 ^_ҡM6z@$P1 %፺Xo? endstream endobj 259 0 obj << /Length 2457 /Filter /FlateDecode >> stream xڽZKϯځ&C8vʕy}H%ΒԮ\i(J(q͉$vnMWJi_q?&1϶6!LL0<𷧇o,HK*5H2H*yZ%Mb׵,~})|'3AxЃ!B}~(K`WEdMe QС%Si:<)(ϐdDR* 2}x e L}i!DWnAUڹvݼK !|׮wmd$0i7k8B*Po|)c:[< "UxU۸I'tDɍGFҤ_s-Q#!H lފ10Z v&iBS*cDH$VHq6puYL(dXs8cט,n`.+\VKDf:P4N4FfQ$z5:ÂfXnb ͵TX7p7b}.ʒżYՎ."7|wO]_kXV/u$2dFsq2Ecem^{ν:r"s,\sͦh'ED0brM!R1p(=NSB \,3x*\vUa~  ƙ\ZT"H$FIM!Zj(C.oT{XQv弹G#,7:ιw*< [BkUVz1\TAnH%с/={]l,MxQRuZ݂Ʋ4|.ݙievZ^I9A^aR#|78!8gXUr `W#հ<Ⱦ4{ !)uES [(?|^ع>a{eݸ4~W{ 0^?Wŷ׽ fB!6@-񛱬_!leAwgAirvy@sbj3ővٔ6 =W-0w@urLÀ)?0?=p\Hby_nʀPkώ|yjc$b]v&:`|ڡѐUKsmבBc[lͽܛ$ ˸/Q/3; Tz|4Ff2 6?>8TX΄?5w[o{ p5=bӠ<8,ll@F-wl 5Ί$@˨NY_{ Oq2=L4M {>xS2gC+1=3Ma 0mI*2Cy[~p ?Isi]Vo!7}>q0POJ ErʀPcHI~ܾQ,ڮHE{㎛[)(,5O ߛ5En7g'[.+ꚏ==4mw|pma7NpZv}}Y۸Mlvvj*LmB/c[Ėpͮ4>ك7̛]K :4Q l]݇ay-U, ?v1RAXTzQq 9%'GL \oZU$E .> stream xZKoFW40tƜ@&H=,CLDP1G"%Jꪯ*6- Jϕ_PZᲅsN ~^H_"-n׋) ,f/nWߓJ}7_'XɄ ,J,aHB e~Bk+T p -Gg즽P )w̾ Ph_4ڌR-K{f>U:Xe^ipZ 31iب=-foW7*oTRдK- <6eWnS}\U_ߤ>Y7 V&UF#,nU"?H;z5"&u-ڒ6j\6E,"XeVGlBwUch:,%]W4aM' HB$ʸcYU+)?]7}aZ`w1. g-F9v}1NLni R!T&Ȥ];uF6 G3%MەU]:6"n H\OS!<@}skdl&.*jR@A`ى][,#lKH>iͣgÁQQ6UYGy*F*a^.MHj M|GxX պ&2ڸ3t%ty @L3}R`*.Yb&ma*jҞ μl+9|(+O'%q'ĝ5+rRD3=ļ6&=o)8C"Q 5nuB*rTkIy:EDv(E*J<ጼ*O^'9Y˺XHF'<;莨mFjPdH#A3)V=mc(1j'I9~gLvs_InH:+w8ɱJt5 9T*!!G殀תuBCafGCRT`pPz=M~5DB1'8FxPSEÔY EԈFZ*>qi$ǐȊu0KuȊ97`<ƈz"U6k2aXU?YUC=11H_B,BUh H@fgiP:1|-kǕDZU%Mf, '7wyQoBTdK/N!&\ItG|N a߷\ Gȶ/ԈӃh?~[NSZO]hŜq!툔HGK#q(xxthO6Y=TwA> D@~boF45=H{6RY09/AMVo3Pi^9IQ0?4i<2G.;⑾0%uaJ$Ju&֏LHge_q}vQo 6 k2ƛX:tk[wQn|H73gJ6*bbKTl*6y{eL 4O/!/.0X>s]_N`s*%5۸?zo7zG^YUNF(gHZHy{ZazFxb۸i|lwLX{½`+z{z1G /.=yc| #]a@.Q‹@K՝Fj6 O'8[ݹÊ ;j)m%^PNZycR(u >L?\]SlG:[ezm]7eoepѻrK7x_Ox1hG!9/^.k-زtt}Jsx#\|8|sPP"=H69R]Dݙfҧ l[gl&r3 1\:3NL 0 \:ѡZGOïgƁ<~6%} `^r Sj'k> ;[ebg诹5ϤwG7?&ȸ$~or af90^zw )UQ{)o endstream endobj 267 0 obj << /Length 3446 /Filter /FlateDecode >> stream x]~*NHhM) @]'K$޶35)_E 0=͢Wo"Û_J1K4qb&% gOLS*/߼R;HH4;2V8dPIՏ!h)]M>_$6_}6_Xݚ ><ewY6y+|(X划38LU 1M}MӉ"Jm2c|7 1JTly/l/EHErH".6EȄ54<L~]ݼx#tYSY@*i?gTxQ#O'̢tޙi\2aJj3 hq.4EYSmŲ'd9W־ ߒVZ @]r9V#:PeDu+>[iJga $ SaA.uBIǃWţ?{A!OZVnkhU~¼`߲l@-bv-$Ibv[8jNLk5K8! -(n33 ]O"C/G= TlѡA嬙bI˖0F2 _` 80`c]E %t26!ruBt"4l?!~-RV\hLdd(#9a$9b'{ V3bgNHsX6y5FhEV!E5euce,R~ĞufP|@hJ|Wb],h L8 CMnb^Ldt5olS:ߐ2Kw$ҺD6!c48Մ1glCuEm͠B}0WÔ)|4kMlRC9[cٍijw424ldeɛ:/LPJyҗR6DE&ٮ۬Y°01k]tP|YeVyhesĤe2큣0,f]V ^krp7y bFf8JnL[Fݚְ17Y kXSA$sqT2vGZ¿x8qUPmxY ?ܳC~ S=ڳAf\Qy@I5 vH%4\zȳiG_zBffOj|jz8%턴>NIwmzaxL|kbnIWoљyK. wr7!Z7K̒&~0$ W  3Wkufu6" Iq0İ#qfe,cp4zX#v(r5~]}[F{ OS#r^nD1 c壷/΁?:+ӰӧAdY{2 a>8G5zErk6> |T.+׿W]g'rJ0(xn/'@bX,I-,wpԯS\1؍2ϴ{>MQ=q۹؎ԗht9{nQ;2 AB+(mjzӉɻ9)) \gmؘ2Q»06QzNgࠅDN@'>x]G䆁` 'y&s+d\haUh'*LSy݁9{.U5VM3 l#wK͢3hfMe*t-SjJ$a1Z@>m{#3aM#Ml4.mVXmnV= ]՛_4l3íTȭkhPhZ O\ku|iTOM1lKsQܿ &i6vMCP<`ML]B@}H{Q ^V1/}_6 /G(JTU B2ݝSϰԗF7Gl K_Wjt(/rEײb#ӇA#]r^#;M!N6kMմL'oa mjݖxf}k_ r`?ff0O=kOﶈݒ}8Yo4w4d0P׍,g{%m3臁8ESW*vp]I)d{w"h݇˙ZpHu4ѳd4*R endstream endobj 272 0 obj << /Length 2213 /Filter /FlateDecode >> stream xڭYKFϯm)`f8b# b'XqpֈkTH =hJDN.V?& (xs]~{wA&X&I* Pwes^jS ~vuþ/j?4=+w_^= 2Vin[p]Mi7%;Jaە~݀?_@ߛs l#fpoFNTYZH>D $L˒`ǿ#wD-5(p0A scCҙY$^缊}*3.oc^W5pQ wUY+f6C) .ڎqX1`-pgL ?Obc@=E@씁ksq7sX^O)_RR:$Sh2ZPͫbp N8Pt.\?绢xD `$SU?t5r~k 12{ne8(TOvTG; { {/:hBᆟEY_h? 4G*d4=֜V"oiΆ<3+#): ]wJJ]OMbBCu㌏x]׺Hj;`BAڌSoQ^$Ѷ*H/VpEd0{W_@sTyc-A!$c8`Dds%>HW.D-}dl؇qBߔUfs6(pV}Y&%۪y6.ÿ^?jtK0)lpy1vy:evMQҦtj_8=BǪk1 f"e>^֪)C鮜j6[ k%BC3(Rm@U`2ﷄDhc0! " B_4)<]XG?>cLXziܚxǪ0{qp`7h :FJ4A%˶S^<{ymXqN\o^:Aˁy7{p5mg Ep1b'٠.~ OUᇷ~E 7ۉSG ңo'5aqApk1}jo"XGKDTTv[P`E`l  *8ż& E+@\p. |QEHt3 Iw n6qh ={leB<8ekHqݭgO~Q^Lp_?v| 5;ZUxJj )ˋkjMmɓ]MQ<PßPæ]Ȯ 2/ɮVBvmUJx!XB$/^z_u$X FǍt Џ~؍_a*ItJ>7B ZyjFnL0^풷i-~xT c,`c>xʛyLJPKc'ad2"ǧ= $kY۶~GFb1i"=[3 Cfs|ģ]8iD3N"+mI\ ᔷ9HL endstream endobj 281 0 obj << /Length 2345 /Filter /FlateDecode >> stream xXK ϯj`Z[=s$:6 ^4ia[DRw}*=58KwbHU;%x{fQ$&xx tb4"c ~ mw{MwXwno$,ۊu{8=_ȃ/ps_ð>AIQ uټ:qVݙ<qP\!88tM$*|z&*ۃʉ%>UU>  ?~f4/'dBVw:IRGGǃld(|Q8B׃dMxrIŸs[F=a7 pG2 .a{(2<ϡk|@`p'{LyG'{|alR%3#m`?q&&Ot~/"lG *?e ư\(ۉRc"זa8 c 6X/986$a0 WT+sYZb˰6fA@^]L.Pgaͱ4lQ&"EtqG,'^$SDFg:15ϧ]\E pļ--Q`A6Qiic\ -9xh1E K^!@a=#3xAgY{v!2oC0"Yy6yE{Ihe;rpG'Xa3`01<E}1 Tb'"p/"eF~֜MBoZ)&ӒP)#[t XJŰ~~>3@66k7, Gw0TL K r'Tlbm M$)߮IB1M&Mn"C 4!o DJɝJf#7ny.ס)[:ԮWn/۫5ήhQlTeyn-Bׅ\[@H+A+j? wPjr_ݑX_Y3RVe:k7Ifid&K<4N[rZpSQ VK+tbU"(D¤`lTh-x;(Er!t-+`jH#. ҨlNKHe1XXFP뭅!31 RmtkHGMX:G$bk% Iөe(1,]JBD 8)? 7s;>g ?DOB'\3/z 1pv񦑭H,aۄO,Q FLi#K'Ź!gI}b(VEYQE:8eid/#[G^~PNl1^JϜ 3xEiJ%>q=m+LW%G~Q5ȳM >s!Kզе`1+3qEsJ&V!t0.M>k6 [^دW~ŤTJNk <<(6+/uqICILR,aUytQUA5; iEƭLMO6`r!KUrEP׆{vO|M(3F)V,دNm݊j&,|HƛD}z*O]_f#HJ^p%׸l]e|)ӛ\M ܂^z ². #^zT4t؋]i3']>s`E1Ƿ1^y* m?o^Vul@sd]N:u9]dR'4 xr0)+M7_:eiⳄLk󳂔&k[*./?DQygi.P ?R+@JTZB;a(W-)v9\^Qpaœo> fo+5Wsj V3$$5kC\w>`x&. LyCPi%8OOHϷI>0JovI 8)f ۽96R=ގ"K-9<@d[9&L2W[`ԫ_8Ƒs$݆tHjIV/7K%|?҃ <Mܹt >V59y>W> stream xYKFϯm5XOvw|.`d@GFRBRjR$EOYeԬ*VWW}hO|{? HL9iʼxO<Ɂ],K=&s&uplb`ҾaFw+Hͬ"y'kLR-s>yȓ7KVz9u<-4^uW5S ޾99r=LΣR͹ʧN(]u΋U w [ych3hQJmvY$%!BlX@2of(ʼ`đkrA AIvf8g3q7 $+0^PoHN2HUcvqk5u ,Ƭn[%@z%[LS &$]<Rf6}"n&Q𩫂L&[FDDA=f=5# $(/5V`&_f}JC_|]*ev>χ 4QbKUA)cP"g[r ȥ3 fU Ly5g cUc3!XwR'ݠؚԂqUs=9Ȃ[R!!3#vEM٫P(t4iI;?Fo, QWpU G@Xkrʠs xʰd5Bˀ8~@>8h(Jo|OD>\|gP"]$A4itpu3:62ЗVrI8q{)#u 󌏽o`fHL(_ZA[_  RVU$m+ba}89Pݵ ZBb81y(Y_z&v[\ ~ѿC͆YȎt#Șpثy+2 $TMTS*MOo0/xy%-`jMS7ng\0&|*.Y mSԄ.w9dƫiJWeMUx S܄:,QcYA: q84c|`q̯J&cMj61䝻b QFaYE\8" C9mEWq\XeJ`rSO84C=v<}A ;Dēj-.-41|Eq@,~6x0q 7nV0#~ S&% )-)s]}1Y ]ĴqB+2+Ɣ9_ֵ'2;@À`\’.hȸb7tX΁9^gG4SE;/*>^$i0UAfUhX]q++,R 6`‰BǖWl<¦-J*+h!tWF Np[t(Vۋf 8v~4~ϼEf9q$bRa+ ƫ返uS}!ΊrukBET_ WLI6! dž @9~*&*X_AP af >b7  ṋ"M|'jӔ9RXUSءڮK*j|IyEy4N=9HU:8 !V7em[~BO,}*Ձmo8 viQ2"@dBbB b> stream xڵnF-`g#LO-)z)CID$RR%(}ːͼe޾2E2N:HEZK"2ijxNIE@>Ke~h2m72z_`S2{V# a@{R,Pdw7rΉA\1#,U~` }N7 WYA5A:0#NA6n@dh,>1WlPЃ*ùv k!_m";so+B]&rQpf\=}$5icv&\ĭá׌̱(毻gXd!>dm)L NxNJ a=ZBi*6my_GŦBz XV~:y?`-OxΚcI5%5t3 ۸ߨ{*/C#EU\d4rfd `cXнRq_JM7 2*|f#f'Tj<=kw1z47L{Pʄ/O E W,r.K-)K]JK_1\Ɔjٵi$GXQW)ҴQCJ.Dw`Bs@m'* FE Fn!]OUMkqs=sa]O{\8`am9F~NzDYxv eoD] 7jF\Ecsmh59.D)ё\r|Xn ̳Blی d'2vvV%Hz`k?jyT]e`ʹToR:|H%p5t9o<_omOY$8pNF[÷2sT>bk@o>o3-)0"S iSbqPoZRT͟Y2Q8?[ZZ]Yz0O+^{x?NRꄩY.P+} _}+$$z+ؤ ϻ}r endstream endobj 286 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./Recompilation_decision.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 298 0 R /BBox [0 0 630.457764 790.399963] /Group 297 0 R /Resources << /ExtGState << /a0 << /CA 1 /ca 1 >> >>/XObject << /x5 299 0 R /x7 300 0 R /x8 301 0 R /x10 302 0 R /x11 303 0 R /x12 304 0 R /x13 305 0 R /x14 306 0 R /x15 307 0 R >>/Font << /f-0-0 308 0 R/f-0-1 309 0 R>> >> /Length 4589 /Filter /FlateDecode >> stream xZku޿?.lǎ# A Wd>%>[=C.!Qu}ϭ7%5ݖ^ضaOY+V5ӛW|8y>,~  oZKj.߻{˷wݻ/o_e_V\Xk8Զ\XP[ӑ\vXK,[ xzsKke˥Ү9+1^cqW?w_}{?\ΐ{_s[E|1oCN}Ͼ''k*ys-'O[(w~Ë[Rq= !^=&9~|xscYSh;R/=@.n9E2)ruBdnPkcWkOoݻ=}]%v?Ѥ+mӫK 8 mNt_O7>bϥJoڢ1KA "sM芋גEJw?W= & |4R/$a9QυjOBk[upNcZqS5WɇҤav*cO)!ޠph .i%P -i7'QkPC6JGT f %Sv !zo*}{ۑ;{ԺvMuC_#Oq:|"n ͇;?eddz:{ե7 G{ۿ%X߮&="ي$l3"9#OY'O 㸷8B#dެS8BDӆdm!+e=~Rv邌}Vt~&G-y= EQM]$j#-:հ 2i"O2 Ah?M1t&q'Qx@PD\FM[EqbavV!Ǭ"$vGRztt}P. n<*PR !sNNJ,=Iգfܢ'u W:$$e # BJŭW[5==o%BKa+ 2)ϺSn-ϫ y1 -Tԡa^,F\ F[ b ozt}&4>)MóÛ"<&X y @!@Mlh/OcVbmHM2ټ)㮶,}uMa&&4 l2S_NNAK|K ܢiSZJvXSKNjJjR~j1頉ezyә"-jBq FP5bJJ|>>mP*2O?b4*T ,'yj$D% 5KŢ(Q5oh Hhr*Jfz w)k P:1~XF<}k <R~Sy#@Aa}Y Pۤ<zvETm~ N8S1w4a1Ƨ ,S0<=~N p˶Ca{?uw{V;- sL t; Tv3 2xT;x|21" 3BGiz}E _j3F3ZzxRTbKuDͻR [ @ac/~F]:CKC@;8 1STzP mWc,rQ}h8%g82Pmi&Di]t(+ ]-=PR&x嘘cIjZg"sP)]𓺠`AyC2/*uxxz9Ǥ9dFPA;ltM`c%W[:Ԗ][=aP5X?Cӗ];5p1;AaU-ѠkW <0e(/ 5HGb Uֻ݉sngHGY*6q8[y1r4h`eɾe#Q04y/$2W>AhnCB@ \Rmš%wC>-%*ȣ̉sPKbhiR|)p=+*B&KY܆H@*i9(H̗ru(9O | #9`eOO컨==23>\58+hIqlSf|NgKŏƥF2vjL] /"hSGl܈r@4c%jjHP[o3 L}^Ji~Xia#dRx[ DNyIɴbw_,kݦ@QckC@!e;QFߛDaG>&K C%z&MPΙ jB8HC#D$zshEWG:fp1rLODKhL$T Ա xɢ} TǹDRŖjp~Cc6  jc[cDOkNɄ~L=%?V]YE+rF`k$8NmP!s0|Z2,WzZ:(M>l/p ofbX_1hEHzֺ`>4_ b>ڡeDf@RI% /"TM9h򲳮R\9K<0$`m+k[#2 }D=yһ+ qs`KDyqL P< bO}b|f92Rۓ!A1Ûc ̢ǶJfj2lєNg2sHA0R`%ɍ h1o3F,.Qh17vx#R 㖤k0l0RQab?S<P#<Cc3a€!Q;A{q S =̵{7u,OEICM#Az':*N5gJʠ<)VzPl?(>%7$؂?1>H>y"Iqk| 'gIя>Ln Կ}AJF`+:" ? g3srMªjX(8I%-NY.& w0*69%*C_vMWXSR8vzkmֳZD _qtFal"u?* ޝ$ * Rү%)I5ɶH[3C-+:[rFE)maz?l,Cy2zK(v7څLUvVɂ;טwY;MBJa.m9mȇZc 1'z3U Cr,qmŊ Bd?tYpȱSE.L!U fԙ'RФ$,]t⌷F^6aPIVJqYue9>dF-ѣu*L.5LN?d㓬 G;'Vݟ`xI"pj2[LE3U˙2噲/q1Y){8 endstream endobj 299 0 obj << /Length 310 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 121 /Height 48 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 /SMask 311 0 R >> stream xyTTwRTW=j(b*(( (DD0n }hܢѐؘ9,&md{:3'';ICb5IsxD_K,ɩxK*K}U]Ơݽf6R?57"'e;2i l" ?ypsiE]5ގ=3^ƥ/m_yjz!Y7ptzFooJ͔IJt{I<'~VmikEqBI# d|`Ccsdvd2WT4֔w4 dLc;̮-󾸽hvxۛGwul;w|0x>:8:!<º G#<74')&T8DcLߏƹE[^^P[Y=c{׮?2Aln;#,)gg=YߚktꛒBgww,j[R^s%EeDyZSc Lskͭ(.X{k( uom |yGzjkL?Ԕq5dtw`G`g9gf u= OgC'SG-G/0--IWw:qXyym-JIȷ[cR䳥A,`*Q++=.Wϝb\eTΆ6+:^ZPʦ M?M+˳ᝥ\[?Ld1+#PQIa D(Pcy,)ɾ./lƴdڿ9?|y&p1*t)37IgtT1ZkB# 3`ogAaK=7Y^MN5iaXT%dl.19J$ET*A)to,^މ ms_6N7VgKI?/x=m^F&~>S!\Q̇:8 |Xa"m,(H$"b- GѾ(99D$Kj_ahzgah0i\n"!ӄ۷p˾w'-[|9 gTx*N-.RIAYhVJ8J>+źs?Bth 2_jn;^Z`q^(C>q|M*mQ1iioQ9WpSnULD)&UP X>;'6h XR4+\S.ܙiYar>&_o S>_E  8y} ЛQ7ٓ`&ʼnFyh0Ge9QiiirGϛ^m-ypfuQ'*.g33F/Ƙ{6/xa :#G|SN,N U#b ??*mZ' ~5uwM:Z[Qog'nEͯx+2uR^:AVdäTl1eZ17CI7"nx]ڨ\XW* tbDF 6A8?JX f{]CIeAy-y%3mt{Yɔ>G5oSrzRaMYoW'7UV(Ƒk5\.6 )]sy"y)23 :ovryR6:1|0ꌇ m'j6$!D;d2Ij^)*Hq'GfTX*Oa䛂Pͨ1|p7ZUA$vL(~296r@j'wCdPM+Vs385NRBsՇ5jB5ؖ #hĖAQOVF#lxGA QcS- b%,)kIVLGr7d .p)_! HҹFWub?'Ñzr?^,sac̳ZB=^Y%d0p*Iy̔pMftGNVX͖GɁ5q0;|DP͞J` mnjK5Ya|;s߭1B_**WF`,v7#YڕGz$N^YnTD8oV_؞G d`["Xb|M69g Rf0??)_! a5VTG0K=9p,nzn:  G$u&ƪaq&R@ʈL0orHjB$n $5J:#am <_Pobt ,zmD5?F3z\xL NԊ]za]tUGYi*|[F~o٬@ :{ J3 B!`|놆hYR"I']Tb,3e;͖br~XuqJiVRzw5!r6C̙S+ kt1:"avQcܳE$Xҁ(8 jE 1ԃ^X4I>S%`EqBɱ i&ªQ{9\NxNĹuFD.SfGJGP4B6![7őRX6ibmF( `N –D8' ̓e7_An_*AO8rFFWn,bcSpH1+7ߛ7'6 R6szqNib?3Ѯ)ZE0艂uN؝J>q~d7=ET&#Cd 2慣n|BqHtk%^.KH)699 JFBUllm.56$k h5AWExҟ}d"}r=rn$}!$'6:HK"˂uzucz$Yɏ%aHݒ&R&_+`Ũx$A#@(A>ƞĀoH|b?3 &&Co4]h3b,ƥ_QDVLl2BYVǦū@nc⋭6oUzE-0;yV<6a.cX-8wch8`l_.FX Hl%En~Z'ӢR:>+LhW 5<,Xvt*WdчBJ:m6~l6y|(W/n&C@0 >b8A3[cc 5Gi,mscB;6n%K*dbv_Qy * >p7UtTp0( 01XА3J+b9gG _#PI`J:7ŕX)\X/zSOfWg׸\ o0cAah0 .h PqgR7"R8QJB$4?<@LH0F%!p5?]2o{"eVXi],+m>rF1 04 0!+x*CQ *)%ySpX8{&[h5yPq\|(ea2j o7\=0j?(FʼnTre#DAwbQ pŒp(S{u@*Q C#i6(tCWat;Vɵ)DT3tQ8OB`3P0Bc'\?2D@h$"ޤH9,)D1-Q/`t۩crr0щ6ar1p _ݤd endstream endobj 300 0 obj << /Length 312 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 349 /Height 90 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 /SMask 313 0 R >> stream x{xU6/_. %IiHԒii͔ZJ\*7ЩEpggPDe 2,"̸<;e/=I]GX[)9'<ǿ[y*M;wn<ommD"p8`ᆆ_uuכ2*+=)+ՕUSiӦ+NksjUVdwNLb1{b59 ̅o55jU,ENL&#/9Mh4mawDzeK6}dxên߸fۼf: '-R7l͠T ,'/[$%]/=n~*tv;0jۦǞݶ{3^ڳоm{y߶WP<ފg{˦UzUrDBwTpnVKKKܴvO {x'P- _:/jOu}QR>6鍐V"{©eIqq{CjެPMyRW-vp67WKiz4Bsss;+Mػ}&V/y8wxW\:z )얍KfUtZ=v٬뷷W+T4. O&ԧ cˉX}bi@X13S%fmɔ<#+F-UVTTpd2 CoyY}oҫ'·|G]̨v8^ezT"f09N;l~2c ӹ %IOݦ#!H0:Xt%`0HJYp::(//Jy+~9RnF8|:ѕuts֧[5iGÍ 2.BA>Y9b{&`)ZiiTurr\. #π Ҳc7UT66_\:D}tmݍNvqt-^nJdzgq:C{ѠGC>!|v#hJZ3+3r(#f UB-z='Oћ :BB]ԻO.A;BgCX@{}qo9OF w-ޮn֖ -_ab$,MO IEA~s_>w[./Foc!t>(Egm"`RIGA|rqRpOekjtl-WP WǜCdWS%?'ÉGCnF$?q3? rNFɡI})Wba/GGY8сFЕdnu۝cp10Q\>F?YGw97ٖH,,az.`93S\G_p_$7J CsЈ,88@|!~-Y_˓/ H`fiC*zL, m_B@I y, m=@-mCfr>Hw3[hyY8=Y~چo,@ , Y 1<I4+WB `L LE}U }A,d Pn,A,d PnA,dWlA,;WP57@oB:"~1L(7!A, PnY(7A,Ќ}OM,PeA,ІeA,ЃeKM ~Rq\Y j dD  @ SY z@eIi_6@?,@=,l~'YHY_6,l~ė>ɲ/% Џ! Y8ge#nBʲ@5d!eY ~/Y83Y ~o,l -2d!5Y ~@Z >aBj@@|dMil! BR7 S,& oH G YHM4./,i -&d!5Y ~@Z J&Ini -#%2% 3L{Y836t=nЭX |ӟKat2AÉ,\rO,{=Mk}dх0IF,ݮEЕ0:Bǂ8 njcm7 2(Z[(=z{*A/7GAt.(ޕEע>9p5ل !t6 АӥK½dh͂&#Rjrq=n~{l̅3E:DgC|8l} @һ.> XiB{jw[<|]7ݬ0|,if4W4:]ܐOx}_ D^mFo.)Nw_t,Nx{mv]c#l q73ASbԚYUY\>Oj4Ju%V_>\6h^r2"wUhwzf&zv&<4TV~Wx9fn-4iTur1ҐRV-3IXm 3F|+ fA>8 -wEhm ~%<<yU)s ^'S  $AWKr;sn3b i_8o-u?]~>^“) vU^S1iTYy&^RB"F)=آ/0n_tr{͵s7¶ch٨0Fx2x8x>? ZkG8* I̗UF i1zbVs9&w-WdPz΄]^7 ˆ߲o̰߂Gǃ³ (ԩ, ju F\$2H$j,_m*<2yMESogNYrs= <`8<GBM SY5O+dy,<@]Nt x .~02A-ʪ|.TZP/q16ۤ³rzMUb\& |=Og2 #U.NUdTWnz- p'dW8*rA#W1?%" G*(# 'UR >0p%\!##3#3(su UA*iEjY+ 6hr^aɭy x>xDxJxPxVKs<7<: welHҨX8_-3&H@gDž'M-8HF.2E pĢ4x!|YS6_ݦ endstream endobj 301 0 obj << /Length 314 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 185 /Height 170 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 /SMask 315 0 R >> stream xyX[epG[-[ @BB/BK R-Qij-Ъ]ֶZ{h;38*{ߓNNNg|}**** bcPekedd憇s\6ƙ2G]Ly jnndg̘swf;M,XTZaNJ ғ"Roܛ?#:$X <}n"Mrbx]<.B&SJ)-P' ZmiVVArb4;&oº%99~Q`1[!pW$lEbWWS)-N*+ii鑑~a1Vߺj\M69"'V!O xaެ`O*eH841kJ.̉&55-&&JLn^Vٲ|ǚOU?Y4&=*'LH$8ex</EsLԂN`s:I ԤٰtlK[йtAFhmgQ O) 2V#atN`4JD*'3t=ںr׷y[+L4%EK՞c듽yst9/N aQ->t7J(tS dDGlYZݵb;{[vyO i_5MV-ʞY$jg(x2v=,UC.sN܄:?EZJ~kځWGi cb|o%Y0ֳ@TRR'918y ur_߳m;v | RY ևdu}gr|7/T{jT,T4h9SZW 8' {;>۾Oξt`۹M/5Y৿"H6Rd)y*t%2C'wu V<KГj7h2(-\x'Xcݑ]ۛ6/8gգ;Ooʂ6o.lpy(h-sӒײ+\&s̄jCǪ-*Nn~xKXW|" Dr>E3݃jޢغZ2|J}IQ۾yI ڽޭ^M}1J˚A'j!=Zk kA"RZ0'QQfBG]ضŹ_{>-u}irJaY aaa9'Gs5\=M1_k ~ur!8kԠ#S-ț6qPZƼ91ton" <~7l1Ҝ'hE-*$ tQ,,dC;z'}/;is|` 7Z`j:Kw*‡Nٻ 2l~}Q ew;/wN@NZ`E.P[-kCmT\/M҃H@Gi2nv0'n;RC:2<|T9,'Z괠y-r 脔P :ɚ-Kk'p~滛Ꝝ?":=$'i}1E-(x rNkqshYvҵC'VנC@$d~{wIɧp-Hb^K˹b^ ]N*"ugZa{rA'hȆ _WG Bk^K?7RVԨhD45ur핮/9\ͭSZdZtTV6t%O G8ACCo_|j'o v_ ̅#lO:*Q)Ýurɂݝ^EN@'ڛ:f-X@R`1^VC{ڡn@y__yjԊ8 l Q'=wEBϗ؇XbsOV'~% .?! G > iRVC{l=9V'#)|@w\ ,-T/BVɉ' z6U wLh\֍HNB\'$3N4E#9yZbΠ,+2:M(]+Lt'#Ǝ1Fjbs8.Ҳ%ׅHf6'p8Zj-Ϛh:J މ^;>YDsgIbm'غ\6ldDqC0^԰}͡VA';zBkLl$i :&2>~ONZܴpIʝ+f#Û߱6'V"[O(-Qѷ &q^ +H̴sJM:]" |KXO&R-hn.x3ҨHE.'ӂF.vR![lp]# ⦞m z!Оɤ1Ғׂth"-$} ؟X Ofw?YVaɉ>-o',ZГֿ$ jAD=CcckϠa&ތIK'NwcЍIqF$48E/>B =IJ=c-3ċ >$2Vfg>vFTDqV:|bKNLXS',??Z0'3gjSRRQH־,%QN=%r,$//#&&)"(+}wCdN>9$Dῑغ<<-X:I MkucUZО|RK9yP-fb-NϮغn K/>wC߁6r'?U-ր|- lNHظPNlH .E,Tz>E 0 )äKNU:9 G%##Z)++,K/MYP57.[XyQyѮZ׳NO.5r2B2-5qn~ ?CKBJK0, mNBCC j"M6gI}5Kw,[U}cO=i*A~Kdߠa,Ee8g+j =4>VʚcljI*<Sm(5r[sӞ- no/;Va˜;]MОr2L'QTi1Ĺ. RY(kJQK2c$݇v3cC[R3fT./[Se{lxn[KW/lK/jߛ wSkarZ/$MM!/)̓O. e*f7_&b9 .\e(T EqqqiqamU'V/jizmQgx㝟??? N.WKSNF ALp4,NcmeqY N/+҇'.^L'>ۙ Vh5EsjKҲmƊû|՟ow/ԯޟ%b9Ղp6Z6 )*#脰m|;`{ h\e_lX`ڇ4B|!T4Gp*5fՕjKW/]ٺinچ}wgmk푺W|p,'r2L*tWzst%eaY9^/;R _@>l3}>T2= ;u禵͋>ґΓn?8WRp&٬ito'a:/,spU8r;7+s%+<+Cq>p]vd8N,Gh mmYYYvjrD<5.㩅 m k-Z;3b̠[~#S-A|P" 'gԩ`1Koa2 /UDw2ip]DlL.ƇkE fKkt&8TBvhOa<|gFGUcZ,* pS#Xwi^tWOiӆ#YX"#%~~LOO$ #$M\PZYώ^ݒ">V|{~Gy'L8!,dZִ Z.ԁ_Yph8 1 lbQ'2d3NЂe-u1EȞ {"noX|Vd6GNNU\rB[Zcq.Z.N3f6ň}9>Ow1tbN l]P- r~S-(ź0VDڜ CA'hx~خ 茴t F-Nn 4<9%sb?F.XkA ^tD-RZL%p7ŖbrغZNx-MԣARZh0s&*u4X{vX0'TVkǹ?67Rϧ8'Aih Q'N9P?;T & jۓoy18N=*Ȝr;"Rj1 IM4rC;^F2qr*lD7Gj9/NkQ /BQDЂtZ.#.e2ĹYqbH>W63Qb^ l]ZJ@bΉ>ᗵQ}--X@7!NnYvvڏTYI"L j"2\ۜ$ڋ"dSh?Re!%hǴ2QR'&(#U%EdtW܉ ٮ3Nuw'E-rC@W N2~[;8'ڏTY 1-h{b68o{-N^69i ONx GlY20I lN*NO'h\#-x_¨i]iGT8 $?1C*RX=]r Z-X;^'C'~T. 07*´GE7v'h Z87F**ejQl]qeÝZYꀲ{"óCX Q'5" Ce*L=u_he}.dX(87`e0΅}j\hȘ a$P-$DZ`r>r㝘 NF}Io.;hx-ݳZ伥m^=Ȱ"sɴA6uD-wlN&g;"h{ ;{-"Bw;x'覘r2"ĹC@geGEB{(Dz9B>D&qnҺE-}QBQ-WOg Z.={"{C ]xO9y8E8ӂ qZgр-#{jhߠ$ w9I,"dYD wАӹ-)[3bغ< -Vodqŀ] cfjsrk2RDNT\(_mrODe!:'9XR'T< (S tp@ NԀ:-}OFrĉ GLJEʲx=iD-C'bۍ B 7;^`1c}ű^iE->pSaqT$Ip[dQK 87G|#g_J򯎗.iAK8^ X謅pn䞈 *t' ZtbKho O'RBݛ{V.[ndB{ L4rBۊ4{NJ9" D*dZkElCX13HP-BFvԂ2U$'jܫm-= _Z+^/B 1-RsI`a,5eiT-^uZ׀\18 Dwst/Ǝ2;*WVEx-?oM/jjp*f73+i`g4Zȝ=dzs\+G\ x& la`MUՠ|S+C`al.< 5qBx,B hd(S.W6'Z(k [Z*şkOמxU8XvuK~Nowd] 'p 'yYejeZ^-Yf|s%n~ ^9U/vfIB6Ʉ,+TU JoCxώWNi{fˎ>%>JXŸ;:u#cbĠ8H9Q+D[S|vw7[WyU 4n/ T;qTKV F&,( Ԇ =FxE< T,n/'NŽNܔr2 p;ZOVI2B|C*t ]ggd~?V%f{14 &M\X0Q)JUe|. ho3¼!^?&r2 ?zYv sa>(n73T Y*f:K>\*غYS\GIaHnI8REra:t'ԩ,'ɤ+́͞*:{2\=]nBw'/sEr=N|4)1WG7Gy,G.qc> stream x}TSgO]!$|oM1P|"ZAEڵiU:ZZul;SV;3jjcv:;Lٝsv̜9=svo=1gMy~'"ѴghticEwdkQG9*k~ _$k >Gx^iiinzVT*=u!wt tEu? UbGeAa.,dG *\TT8>w7COo>-o7^\VGB̑ z]X7'Vjŋj;*Uy:6*)%9Ȑ Y"QXhwȿ{CߍS)%uتw5]_'&7Buw]o,:pg8M uas.ZUYAe2D$T`X4JЊjmYGSWwā|G~88I߽F'}զ"UUWsZVje(LHWaBAӴΨ)pĂeMU/m[3-Y6.|AFP)Z֓CeSf4G&!VҴNSe m kσ_G_g੖O_wLKJƑ,W%#$|y@B洴<27G*E*a_h;\/ioO7OOXpeNܓ1mfRdcY K:ĩ6u&USvNbt8wAcE}C%!˥D-&B.4pMOтL_2 WJ*ha-יNv$`.dZګ)W+ȟ.- Y8`4+>WԿVnG!vpkʨS!D|Us]ZK̫wj 'si]q/}V;\qA>Ba;2 >Lt`nn4h靪ΑKm7{9Vo,wR\ķ]?E,S,o ~?<^AnnGT .wTXF _`+HMx7JX|X(aW,aL>%, (aqc F o?VjnHXAQ"cF "Ij]~[^F ) )ˌ6/E+/ x7JX̰XR?V<ûXc(??VXc??VXc??VX xIpl`6R OWpe7wfb wNb w6bwbwߎ xwI^ xwIn]! xwI[j" >['i*x; 6 + +@gc+ +@xQx ~S.Frhۿ avAI0w"pD3/s94&c WÙ^Xfw"H/p^Ax77:pzEc)*TW\`C sxs>CB7k THЅ0<|X+ݯw[k-1/S Yhl.!.3>}K]kWLJ'#ciedT`8XGӬ:>?gS3 Dwz/`0R#"؊ D. w3o=0zʥ&CId&333xD"E1 c)*Ү!ͬ,$~J׿r nB6.W?_d w=l''E)6[+5+)LV˥Ri+ C҉F؜MV+Xewa<yt~]q7{[ ND+x'{"j;rm235(3L ^&H$d4 )D Lf팴Ԣͮ2$BfT?Tm5 YB} FI qam߫RSVdiA͍d1MOiHQdﰌȢ,*r<h!j{~ϰ܏ g R`F&gՔIWEIwIDT ]Cց$/;ӓ#/ʭt&naiv1nI$D0&pЦ$ʕ9| e$'^̺ϐ!'-#HkjL]AqZ(Yvy*BUײ $"Q+Y^S[`2l*I:$H)XL%9A#(Xrk2 s2> stream xipSq}lvVkGlٖx7Y^=6qH05fsI[$ew$А)@0!@I t;io%L_is_+{;&܂_Z$NMMMoookkkoK"\PZ[_Y*+r99YD=|ek4g{j͙Nr"̒K$/s`OOπX653:481:fthӊeώ/ٰr W#6~jl?ղcQgCC"ϝHh-ey$Bьc?kK幪mi&U+%bbvb"oVgerAikܻeê%mW>1uWWډOO쾱wUӻ.\HGwV +%ه{}^:>3knܞu#PW6q3 {z}Muˬyv]1ДAOk\\S%a4N7qWXk{ocw/ p~ \6MvvC;l>N=&ck?{&pvyKS5MNBڒsMdTi\wqTz}N)%+i-4Jˊm:2ԳbAUonmbopo>\5"H.Oɍ'p ^[?tX77ZTUyST˰\.r;5Y^s :| ¹:JL9cLn >Ϗ]vGtM.ܦ*0Z0sxզL**UKwdkpfG4818 }p7҈bݴ/ [Spdl̆owb+2]|;oQy +|jWQ.9w^W{a|ϓ;.sCpNPf3i?lN}irqgΣ-yVbʭG@x^oyH7 a20Svx.7F>nE1꣖hv+, ^m^X!}M+  k-hd M~wڪ[.=wZ &x |F%_ ~OjZOB̋#K>iwBz\*ᥙZGj+3vc(֊{8X+֊ ޫZVxkZ⽔H Z_nZDE,4X+@wVQx/"a(rCZ/,ZZɜ_hZxO@@>nVއ_@6ZQ>UX+ ?އ_@S/,*֊ƒ)֊€)֊)އ_@Sab;JX+N*֊SAt"T(bSJX+N)֊St"T@b;DX+Ni4:Ձb)֊St"LU(b;PB5? kNcSaUZӘkYO)x|a=O56>{Xkl}$֘ =bKZ'X+vbчZX+/,wPj}A4Yt>? ¹+ pn3qPJ&jnzyau\'2cWW9UԞ\Hng;0tNT\ כ {;jBA&.7;uz9l¸A[2cEJN9?-7+Ǹ$GA6Uz_gC?UFTCZz%4,0iHu`+mt~jfNYhMm2s4۫r4χUZ!KQ=ċCNR}vDQ'Z4ע-q*\֐zg~٠NqkZ Óy3V;<2]+sqVĤf%&*9벬r$UFkRJܑ[1ٳ"xɌUEF #`/kql<2KV1N"&M,VHdLYIXҴ'E BK֡9Y\W2.g583䭚mUY*EJiR&SST?HĊJT' YlB6> stream xWwq~4~7! !BHBB!B ""ǪʱQ:TTjmNTEcjvzΞΞ=;3ٞnwy'auT~Cޟ~ #궶 bx|ζYEEENgUϢ Rd2ٲVSXZt8yylH$E1 V҈kIAkkxm% "`uﯩ*5s)VskUlo4)8mbaIԋf|̙Blڴ4a޼ydv-^0Eot˓m}j`uu[7f!vȈ6 XVLLIx.]OCCi*EW>9ض]ϼ{ѫ{x#o;o^^phϖp٧'+#'˻0^48^ܹ!{׍n}̇LdVO*hd'|+\cX8\G>3ٺe–*OyUڒHŲ`ñl^GNK[jѝzk&'Z.0#o*/yjmheY,'ҥ\jkksa, Mس}kG(XY ye⏟c_;Ր)۴zUgS0.#c5*QR%elgم cMzLk+x~+?+'ԓIU" :_"a9 $ Y:nԖJG4%)N/wťpy)\INLz'bbxc!;sj{ywi*,rQng&V A~zQ)(4i>[v:9f×g28Qxi18g]›Q8*XSق5n/]sB2Cj&@s""/5`WÛp D΄l΅B*;߀i=`-('lm(`1AԤ(VhTNr)ˬ-i.E]L4_vH PPbSE\KMWjWq e8V{g(K,,/3X>83rOk§\\Y\n p xaM] J[v^,`Jfz.1 n&,` A,`uG0  fֽY 4Y 2 `0(M? &McMK钅<[]=x0 4m< `0hzxA,`P{A,`Pꚤ `0(Mj0 Z  JSqA@J, /UN,kWXY`MG^ Bzf7{aita>N^zz0 a8gN7`zfq{,`wtfq,`>pfq,`w>jfqs,`w>dfq,`w>^\ fM.gY, `}֧Y, `}Y, `}BIY@dfX#G`A, -o0 (m>,48.e`Qbı0]_f‘v8b#|CP:$(\0+as" 7죩>?3qdFzx$𳹉8aM i{a8AOG ntGCBmi*m,A aw p~R瓏WjS(hO6\hT._ Y,lEY |{Z8Y kEN. A p"/]\60UUjRg+rbDz`T r20>_7_o|io6}LĮE:IVĨxjPI~Ϡ 52V0R&'[QiNja{ QKqt[>W},Gu_/wɐ]Lh20>7t8j fvFjZy" @*e; #eP^7kvU-W}ATrz.n#ƉL PԼ/d&p境6g5%q bx JE+ZS$><`bMYUƐ 5-`=`Ȧ̖huCEfE78O)1)D:@%ʒ21vD:>_&j3h8O+WH,Z]E):ݚ./(AMCwi$T[0J L2@̙k#gR RD hE.Z3H+JKX)p22j Uaz R2+JDɫw 0hT'R2iФUK #ukJM }zYq Ns"1E>*AQ"Qc|ZKFD!agĎ#&BJcO ʨq$Ydn,ф, pC d(fdȄ3,1ӊ:yVFlшsT!41*U~AL0̍?;d32L4S)ieB}!dJdPdVd\dbR_ER (C'"/#nIB@1! endstream endobj 305 0 obj << /Length 322 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 349 /Height 90 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 /SMask 323 0 R >> stream xsqز+YeY,_%l] Y6acs!$@ 0LdiH4 )wc:vLm'Gri4`~%?lӟ|J$`O7⫪w:++b\6NbOܹJVhhJ^iZR҈gL7g0K7芵[ M 憖z׹3^Smqg׽歾-rQqyjKI@2<+MI ,퟿ho֭Y|kDoo/PsފW1eE_='{C22Eơh@2. y쁚`[frO,ti WϧW*0i-Xߗ-:S/LiWB3622"2w?p"W %zRIsD"sinn QA-_`͉aWgx~|;`U}ʾ,wY7vvX۲8a0`[{|Q_pLrƨi9RÒ| EL&)klA8w? Sώ:gL&q>gЗ3jޗpMTm=s^p\\5feejPj[)FHYi LfALGQHh͟Z\ ps)N/pi{wձ qeY<ȻpnN0qUޢCazCB]o9 v@)*dlxGA5*|USPrg{'W/p Nt[p·\B7w ot±ǃ;,O6\& 6PeIH PpBġ[袷M*|o H+LT΄\\H#1t ns1/ǺoZ[-JO<_nֈ dŽZk[vM?j4耝$qxލ(\MWbޥdH`#sy~9aFMYSp"YWcufKOM$?. $w>!Œe8!xflp ~ہyk۔uBg]qC3Zkl3p"o;&|7!v3YF#YUatXa_,18z>{t>cO;b:Z i7C,l c360 ({0>tY@ـlO,aPFb|Yi 2 1_SȔ,&MghG\lbA_ˀ2Ս4w(\h;>ؐہtˆ-*=,Cp6Re֙<;#Mx ΄a*ϒ,8az@\DBE$fZE?<] Tnv&n7 VS 2Rf,|ZRWo*뛌::\k=.Y9M!8J)P{-=yW OZ,!BUKeY*I-q[sKU]ea~epjၝ5i‹2./lw&<^vz5a~p!^n0*6ZTj|; Y94SH_e֔ 3nj2~7j`AѯCXSk+C ro_0mo26kE!䪤G&!_N'PKj)HU|ye|6dboFl~c[X) ,dJG~^CL3SUĮ)F̂Z͗HBJya3P| [ J7ϸt$j2c9B3D&CCbԴ/h"p wBjM-(Vr-Q.^Ӈ90O-3ke6rnoJՋ]Zo2n7Mf l|ȈɠȬȸFYVdUJ BIs>BGI(G+YELV )ɛJ=.LB3%!WJrIe@P"H!TCJE. W'Z(U+kZ 7JBB趐TY2HȬlJE-* i W)*RW 0*)sbA> stream xyTTw'(}yUEQE{kY%KJM(BH\0ɨ[\15Ǝӧc2[O:Nt{=ܹ=$F%Kw{QQ7+++TU5DՆO3}ʒͫ[~ʂ,ޛ %4%Am&,\Q8E.4K :N<%rF$NgV溬YIYiN !)x,!/ZG۽h̙5/hn_{P_wϲ|τtĔ<@ºH -;.ױȶ'?+0_>>mm&BYRoBX4 azmq^n dB17gl`0X_?Ʃ fyt;6n[qzx˃Oڮyo~i/ձU\3T1aLGV{Rmv]y3sUaϔ111P$nl4M{|['gN8s/Wdžsf8xv36͚D}~O],ΐoEJ]UFgw"i|{4,Zdpc~wYmઅ-S}ג|ÔJcxߍsGG3r MR1zղE{V>g ULJ6}~/_ٹC>Ut5oj}~*GϺw}oE ?- ZPrl̲Ig&prwi_ך#">]Ȯql&#QkQT<TGqgH$6Ԅ״/5aMSUѡ~8 WN~ν)`ZU]VmҀMJ\&ib7V!i1Y\\s0*vWw/޷ejk}| zhݽca?yZw=tbK:)QTfWS~.F$*2n MvFP$#Ö~FLjܱ#;.swb3cd go? '//\xoSp(l'~h'Sa")irY2lRҁ0\^1ӼΥ-檲;6x`O\࿟lxNOjppNτpx gÍp f}ܚ{ d-`{G ..(WbS`nG:&tJ^1kj ~g|Y&cv0KB8Hb8XLA'I-%?Cp53ayca@fIE1J2Mr^F(`q9(Y4"imU*+nr |ٱ9o$\";Py)D1>-=0Xwtu¦RIvqQme&1@3eLrƭPd,N- - v?\|i7w~i*7y:&ěwH&LO?CT"(Og;I)JutܡL kUb0h8 .e-=OnZrpgj[A:p!y} "hbR 5X IzQ^b .S̉FffIcb11\\UԜ|ûU^!84ggwQ22mú|bi=1! /[4x\cORZ/̳WOjȼT8M-paj %ƛf+mVpHp'WCMrEKm+vnl,! XQyW\6q]mD}TKL'V p!k%^ / {fžJ@ZJX>Bths|2| CPUvi! K%Qpȵ4(X9rs]2i[qIWkj`x졄$귩],%׈?9~hFˇhhx(|{ Ca0dVɴ2;˯9YkuWî9NGMlD!&>ˊK:B\ګX<yZ`\[NI8ɦ*Q2Ag}Էڣ0>-Qo# %xG}qK3a[},_% ho, lʁX$q><'IJQQQ4akʿ?Gp.`U b "z%`hAi# ,]̿7ڠ3[= eC&2{*Y7ѐ(} a#iFYI>*Fg) ,0\tYafCg2X^aTUc0[$QE^oipjȆ9Y|/\̋q7X̣(k-b A\Fa8QC̴ؐ ;M'MY _P #3ѭXl%Xh2.a2e$ ^IN'VpO?D4谣z>D XK5nJV!ۥk%aK' bc9ɇ)#w1Vcr` X{&&)8zA#[yYC]#N5IUJ5X`Ƌw |#zܰ,&N&DD!玪X/F5DɊs .$e{4T vS0+\䢄׸I7<ҁ(_~7}nck7}K_84%|ZLT<:!6v&mNU IX} w^q8a< fD4PN$fk,VOkTFQS-Hp(#Ħͩ*oDH>l˂#7hM'\4gh0r&&18Jԑ wi:,D?;ѳe:Cdo?%1N:.%: x*V;ԍ_SGNpK'2~;KH)69 XZJFR45$wIf+J4hH.N5h q&g0}rƏoA$& `!;cTayIMr FBf3b}*@H!e$(u[~|Hm8|꠱|+B%,#I  L{SppO2N?Be#D0QYI)6ASWt4-L VyW-@iAcM΂tb_9^2SoI̗fl6Ռ=*UL,,b4p,!~<o 5GӴ_kQpjWAǎf2h㢄kiG.[+h82 ^14b:Wc:A &@Ȁ`9XbX,6 gl?Bs_;6*APPqwx.%?EnGō9\8/V]~EM_߯/'Sń1mLKB, KChHJnܾ$qjRI@8FXR"%Ġ4㱽8>11*UvT#7Ae8J,4,УLďGN.Szݓ.Ch) [T=JY>hWF> stream x TSg?piIHH $@d K! ԊVں!nuZk&.Vm.`Nߙbv鴝V?$d7A@=s<==ss?>|Ã,",",","˪ƎDT*\srzW###E"LJ=jǣdC\rƌEE99Q*k2=f 6ua( 0YɬYœ AQ Sf=Æ~|y" EPǓdrQ~i~fj|BSI9)Ab?R!_ "SiE`|}RJC^ޤe\,%Z<ܪjmF^:92(6D)a~J>5E2)L_1& =2 s2`VǏ+ߺtef2iyhEZ꟨E0#`E dJ~"*E4jeى!++79!1R]8!y]kT1xMΟ?N>1?UIVpY1bF?5XHirMMjs21&f|LTIĭO,{vm.֝O]3%ZX% +-,cIbҟ32Iinƶ[ִ̭X3/n>a˴ICxapJ@(Ypx$P!ex}[ִW=xʛZ.p_V] /)6dJW,H 7Qb?LF% &IAr͏M=ڱW߲O۪oM٭\7MWg˃?%mL ,%7)-Çcw9ٳn)@g^tɩߝm xgs^OSͺO(5(:re$ⅺ0^;1Cj.e6'gڌN`srw6~W {WbE|;=RrG|ɼaQ/H  MZ|I-Ca,lNk޵veO¦vtl1|wf+} ;wk˹ `D4DWo1-! 7FFB._DN߼v%kKܲ:`u}{~?:8Fp ׂ#`6xq"FiaתTZrT0x2 6)Nmm۵aem]zq<ڂ} &p) Bp^ϦMco/nǴ`hL йsYNҶcMÊڲ7R -*Nzۈ߬Us]-x_ >Ђ\!8 Zڬ̓cZ` 8jRP(\'V>'Uю'g7,x} e8gZpI\Wts^ .T"-Zhev-ϝk3mΎw7->N>.@Wu\GvZcZ93^ |F7sݲpC{ɖݭ5پC;^Väݧ8Hn|^j %[#gmpR|}gۮh:Xv=ur}m"D腫hPK-Hb]Rىϯ︺қמ+N~ҹ>hP*c-drչ׶uY97ccv?H9fz8mIݝq'/tn`nC=|'ɝfpc.ҜX:O.dˀ ?prg~u/^'?n.uI rb X l]0-E@ŏsd.h׿ Q'?;=N''Z`b\&-cYf*Jn.A:R("'pcvrq?x`~ɖΚ~nA0'ZߎZKu%Eƴ:>Qh:iZ.Y\;d]ϯ6."NN[P'zF8QEq.iAMVznBHs"ZNSSmbɩ9-ЙB{lkߣN>49K-fr"Ӣ +I Z0jISEV6N'Xktcgo1"3(NpĹZC812V%K',،IvNnڽxS7޷ /MLN'b엊86GDI-Osk]^Q15/C'9t; O0]*KERNC1' ?\ϑɯ_!йw-RaOj{X؜9`7Dr_[Zk'щn'Z\rh E&Nm5 '&RoC'MN"-}ɥ؜8vƚC{'`TiH yN/e:rZfC_ HE 2#bہu,"'褸 ` dͽa"W:r]*M<'l`b~ǚ&'g"͉M&GN\B^ jsK{m.q}p;lNN.wrg<Nl\XUGJw\غZp Iod1c'p^l6'=zS>vZ*ZѲN9#X: Il'[Dq΢nk-uDh1O64fhCg[;q?'dbh-Хg0-!pͥ9-X6`rS25eyYN&еɩÉhb-ŽXĹZ<-طDkcu: y*tP'K4]{~>ɉغ`Zh9'>C( 34MuMۅt<1?mq2Ɠ>k m{NW6)]zzF8s:S,d'NÕJ^XsZ~襤L5CYrk}zp+Ӟ NWˇ&-/rA f-X&eٴ_ݴ`Eh?zg6_ޱܦ3M{dP 3*f0Z-A\:(@M;1&F3 -wN,/?y&O= N,:w/Z=QpNE.<4|0ڣ['9|ND.% CLTB'bj0trZ,ωXk1o oL G˃0'p3$++;%,?~chI?HRy/?r-f'tʼ4dkm)dtBFK+K'c [vҍ.xI'f-/ւVZZ`rwN41y[m\T{^YAa,IFy/799Cf@egnkkNV*۰pOl $Z`brjukǧkqunٛ+_py NC~,Tpt;[Z`i8)3rrVdMZ@'?Fda,ıho<-c%~PK .<-z~ƌS*&e!?mڥ;Xz9eW_>v~~ƓNŁ8Rc2/t%w\ ]-S 2]ʠFVyy F%++P\RSZxf+,Z^W6չ-GطŝLI'D`,ab:'jsj^;>)SZ!`2(p2vXN7EZ^Ze-~iUN+>yō|{ӫjo\ۇ~KewH*Ђt+ŌD.Z }4lpR?="cU\ c{1|G1K>uefuSo㠆{Ղ-C`kˆKUʃ bCȈӤ\J˛g#oHOP]Zi}mwn?[*7MR|'2H*ż;p.xu"S x"!3劽iel%+.16"^|C2(T*KKKKT/3}mͫZ2>W}]'7Оt-]&- |b:ؙVDwQͺW2%9Jv#a}%cyz}ue겹3tW3etx_ ._;E@J`{,rTLե şrƋ )c*tO_w*)))5&M//Tظp5KNjVz`k˭K}oH+.p/F~׊dT%T.j<}e"X746/I{׌r |i^\1\({򂌔肬-jfO|nSW]xg<#T>2!OOH'}^-Bξ"X"Vkbo~Dae$/Q'S,o!݋Kb<{ 9QꒂU kLXYgPW4;b]nյ? D 8G[.鐁| |]"|Й$=?R) \$.PqRe̘G(b'ϋ;@8\1P6d%/*h)(kL ؞'!ߛ2p +'KBx^eY`/G?CU* ڐ.ؚFʣ0(75RȈH|wR[M/I XNv2?kBp 4SvZnNN^HO#>trEk>޿"LdD dl@ɥϠ|EDDT6S5B%F'UIj5MY5_Zn- NV ZNY;_Nv!NZ" o*C6gKESCةrV|4o}4~BAK )E̤H)WQ+K4AU1ŽC-n仁ᶗNS] iy<IWE>5G|E41c")شD Wp|B~QR^A8.xR|J>I*]zrM7 iܓ )#'m \9A\[0D[#aDByAo8y{/ҷ)XLRy1|V hR~F4^aH `bXnr}vejK'Ux:5;SJ0eeCsY^"ѼC1qj>M#C*&Kiy[hqMq'N%WEd C#}J0"a{ Xi 'в=_i5ݨpZw8TbvR9!NOs>k6Np}_&pl1_]6NI1tirĜIӚD s9[L˕ouvZ3%}ָe9) M,$KJ1\R l]k˷ Q-{tZ6.5s} lNP'i+0 غ`Z`LK q>nhBq&sw\+__'Z`ҫ-6g GD`N:؜-uq.HMOm.NI1d{|et؜ >-^ŴT:L bRo˯>ʴ0t' lNIߵ:B-6qo˯% (XNܧ?8ׁlmr.7urW'98 b{'NI[9 W}-ok{:|9 NE4q8^Q17+b- 8GˇZӵyh 5whN"pR{-8[*:Z.Pق^-7FB:N&OFm<0ve4J^˅BD0Shȓlr, nYkƇڅ -g y#@ː 0-87B@ύlF-Hj9G"'0ֹwc^Zl\Q}p{~#-uZN3Y*"rmRwN`sb$ND)rhlԢى "'U9eU؉غ -}f^7`e9Ղt ^w&[;q~aiY'јC^K_Ndyq'dU}\*='be(tBpK'ؤ~qMk%`?!DʼnM ;iD{]k''+&:Z*:iž@̱pVZr#%!1B祢kEn='r蝇# V6qF*Zܖq!e;)xh ӲՁD0-1?zغ''2 ~ao}NdA/mIdMZhF:qPq. 'x2؁=F l].\j?q$;'2ܳ;9f%-C{Mhѻ8qYDZ, juNV˃`! c^6Z h˽ܫh9DTlq9c%@&UwC-;LC{k'kJqlNQD;_)?0-DN(a R%Q*KlDX'\Ӊv WĹPK.*T^ ^n׵*ŝL5 #R@WYvDhy&-Ub9"'0I'd{?vg/w#}N7%vR!Q"]?z\\'0\h(F:5VTh(@98VcDr?CCB r;-i`WxY ^ׂ2Ag&x)lO`=d9l/>6,^aJ* Tk8Q?e!M?ׇVuP91hx2 YCl\t/7r qyįޯR~57NK5IwwE _U_NW.O0.{-d`i,NnI5*S\ ag~7CiʫU!uM9Ҧ4"d# gj$ ^, >3)DiKZ@g "yX䉌Y;#eMP񸀩qӥ3$3%%R$Ejn^('Y2lJ2%+\V(Ej!?%J(A83z6V pR@VLtBU}P6qn fGd!L;+fMb1eX s Rd6bRK0GT N| @qFB#EP>5 e8"NFT["L?s#aGBZ@Uz#axRddl]xQ?[),@EƢ(ٔ 6E¤HR%"R=#P=~^"?cczhB90:JÃMK'0ɡ=ʦ>¥>ʢf=¡?~1c<|\kr}ԃOyzb>|YW?> stream xڽZms6_t  ,^n2yM2iW7utב<|{Rc]Ͼ69eM^yq:<7Eqrc QAqT`,YEƫdYedRP`nF&$$,<$eb`sDSr!< 3CI0)`df$WJ'x\'PQ 6s"+>a~G!a)MSW@'7`e! LS00(SS< ˓ Qԇ턄mH"PH@*w h$E1,z$C>@#)?&QpgET1ℰk"Q j ĂLA@!`2òfO̪g& SAU@Mہ~7=І0b :A郈[PI`:}da>hKD rc?I9 G\83LB©O=Q4ERQ',,H!H>"H]FZWoL3jۮT x3\MZhRBi-Mi!r"OFd68֧ȱS]?,aHw8lQS:>)Yj5^v:eu4R"8\D^V:%%L[ gyy-5KҺH+hlRR#:HF^[\tiDy֦'k e!DlryMJ~t> 'R7KSi Y~z H^_K)4iQCˤDU A'Póg7 /׫⧙<]j]땂sڪ}noQUz~qqѫ \^f'Bo|}[ `oFo˯tn@Uf|ͪݩY\/nd?nfjVϋr0ÅGW>]WZ]5JH'sgk"UF1\> stream xŘkA0,Ca K eC\H 9.$HAdbN"i 'Pb^C%- IMu6ɮie70I)Lk2l-ݺ*pP(:i>zA&' NTJ'la$N.r]bX|z C$k''|,ײNvƼ ŵiuFYf 7Ws-&h*Qc:Ф%>'wFխ")J'hWM=q"7V{FKv&<{%e}ץpʐO> stream xgqz#*QQ9xv(;&PKzؔɘ.NC=mf,:rYؔSYEL[3Fɡ!ݞ-ݒ6|/x{|;440"v&[(_Yypt g'Ǔ#a!7aDSRчi0(y]{4;k\򏶖o+"su=xvj Wvy[nMlcVHKuգuqq ϪGkS/-"4:V'l]a&n?ij!.}kՋ5r&]I}zFz1k gޫ^QJM^@q皪k\d\b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\  wGb{kYU/Hrfrz>:nolTOGw"zk٘ 'C"2Vv}6[z|QAVʭx_Tց\-:Яsf~ufxMW\a\kNKr:=n,=OaFSYwquZmZu}uͦfCwݐK8|@ 'BA5̰۶zaQ+l'T۝ endstream endobj 315 0 obj << /Length 335 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 185 /Height 170 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 >> stream xouFѹ y$dP HЌ PxRLe&.o!@$2CLGp4.(O ..! &c kb?+'kԤ6mp D,=/Y̜,Wn116G%͛=~)r# ^7m2̌!Wт{R OqG\rϬtp__rNțlݡPX`υo-.b^.g w\r:x>NgZ-\y%헒pYIϮ<Jvl#;*pU{] ʵe[-eM.D=$gp,w[c(Er. Gݚ#?8zrtݠ3 f,DTrӗú#)'Sݠy-9rV17;hqjcגWN#,GV5ed7.Q7;>=g|D/.\Zw?:7Y9<Ԓ(j7)%@oa1:r|ǢS+n1C#<9̃\v%Hco2zrt J43OF#@9½kɑDcr)EX3!-o5{'\+NW(y%lD7J&w ȡ+GGa/6\sr%i>W[5!da[E^\Sfm!̏_NQ]} wTn,ER.=nr9ʎ˿'ѸG{R.gmo@8ILבK5;t+iIo+w1֖2V}x6S73t9\L>oiBw19蝻\/ni6x"SL~c7h&۹oaOsbVN6 ^9X7#$dqҖ7&ᜳds<WDkb)Vw}[ZIzeoҖ̽?'#{I!?mnt4IrruާӚk_WMs&$:p9<|[z'zhst y°['sm>u31|3Y*xgܒm-hU'sSrD~[ cQ.ʋ_s=nٓKˋЏc_hCf |P`OsZE^\qrV>聁&#n¸;XO݁{uϦRr>rDn<9x? vu6l2y,O_v?}W]0ecޭfUo,/}$[1Kx8iƋ_[=wq#-?9$y8p3oep4ֿIMjR_Zv endstream endobj 317 0 obj << /Length 336 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 258 /Height 85 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 >> stream xk`J0:$H)eC)RR2""/BP" j(Ke؋Dw'A٥E% `t2WP] (ҷ_v3"*팵OgFaލܬ$=T;oڝvoϦQ]qUB@ȲU;ɺodT"|yPHp!L2" ׬LkS zz{$ӾUM]& F9d?:,3;yNPb9DQ@!s-@ #&] @ @ @ @ @ @ @{'2n=qE(6>ȸ>D^xp{"(҅lD* "wI;ճ Ivm􆼗k)P<]}z(w_4tE#=e+Uᴼ4ڊ|cAT#c ET͌òNA (jTӗբEUY~F= endstream endobj 319 0 obj << /Length 337 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 314 /Height 78 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 >> stream xgaz*^PZLm&ꔙ7vrBH=N=dme)S:Ce^&J[jaO~!_yLr"0/|VZMRt4 Nl@bmHLHW1<(UGϏK:an*)gnUՉmI\W1ZD93tZićNκziS:aޫު&uSU//#Y.z^*9rza9ˡ)\/CP,b9ˡXr(CP,b9ˡXr(CP,b9ˡXr(CP,b9ˡXr(CP,b9ˡXr(CP,b9KG9WVQnW=V+_ݸTXS2󯾫vҖ)gXwZ GE+úK~+jM^K^nFMk%gR]\!S*(ï%sY/K|ۭYsWlSȕיd=7k6NLܖ{N"ERn;mT91{DM7bGN2fs)MɰJ@ endstream endobj 321 0 obj << /Length 338 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 349 /Height 90 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 >> stream xka """HƐav" b,`c0֥bv.!QbD!@eRrzWWWs_Kx'NOL_+ܾ{s)wcKaչɠ%7<6\|ji~m!gsىaպ*n~??^:? ?2{ . z W8Sb[9[喯+óu6Ew(<ۺG;2qcL>F)>twhiQCWb^^lFv'Ͼҽ L\:*d2{AEa\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ RFb0.1.)}{A> stream xgaz""5Pv&Ly/Y2zZDU(!M1Te6b:9ltIڴ͖lo[<ߞ=?_}OדFnL=:?_8O>z?s}d07 ⶍ&6{{?e;/OL*5L{vs[{3712u:V3C^[nޭڊ3dy̺Ѻ~'%]3tuz6Z%-՛Q͍ ֋C‡NVX#kND5MՋ5H_ 5-Ջ5.ߏŏKʪkgyZ*TEbt*3rqߩ^b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ Vbƽju#q7_=]Փ!wOyZAj> UEsc:.~7FOPZ{|ZQP=T[v1d.Jt_itRot;F":NTީ7VNq4;Y'KAy\׎&RTZJRnIDmݴG8J%G㑠{nO^epzpÄl>g U# endstream endobj 325 0 obj << /Length 340 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 121 /Height 48 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 >> stream xŘKpˏB($HPʊ"&cTFI2ccFJzI<.0Q("nR. ZAoZo>{E"m&ۇj|}JN .~X_{K³+w !&.yxHg/E:eLϗqr!_lui5#>\'5pP\'VOI)BgH[SĤ]\2AtHu >nE4es+ t:>N(!W\"'e2 =tz7/"Q^r S/ ʲfWLE;)ͪb"nRѫclՋyA3*cx^62<}rޮctE\Y`>>(VU^13Ui` kT,=#0=$ܪ~ږ95‡r0|Z1riԮS+[#E91-vzv](r4 endstream endobj 327 0 obj << /Length 341 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 185 /Height 170 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 >> stream xoSeuH& L@T؄0$EQ,EcbBi@D ~ Id!9 26*9F^>}nIOzox BD1$x丝pe*)/Y>r-rŬ{U^~L58H݇=VHpڰ ob |IVbވ9vC{gx?HF<Q._*p_&0x(f݂fE%W:nEʯ&Ӿӈ[Y¹}pq72c;o`O Q%%V>{Dw)7 ynYuk/Ѡ~qEnx%w̼GD g7DSb.r5yqݶ}e$y9Z<^*}nB 矶Fut.2Xi m!,i-R[N'$27* y]9Vo!,ˉlٸ#zº{h* A9Sw_Dmn!NfqCboM"d6otm-m!ɕZI-K9屽U7?gmoA~ a]n=4ނ¢ނK.F^|2{ [c/1vpy[Bw3 F{on a~@2LqӷHBwow_ܱ;xc;u~YrzNxzp(Vj0nU{Ë>?~_ڶ..8 )+6|5 f rz;ząW>?}uAV -i> stream x]Sn0+|LR^rCM^R zTvX,Rmwϻ8̲zO,!D<(VJϷrnUN؏idsS [ xe~Dqh[^;x |,c|^'<`ɏS)uHV6} ߙIh:S:8]psyXۂsȜ 8LQrQ߳6@;`]85p5|:im +|xX o)ps0g>jRyy ϖ=;ww)~| ǡ/})Qz܋4fyVy]Gh>rܗǕoc0Gg k{7I)ZYc]C0 cК endstream endobj 331 0 obj << /Length 345 0 R /Filter /FlateDecode >> stream x]j0 ~ Cqslrfhd8d7t0-$}?Yڿ2Ov >c\a)j.{Uo;öd{Q- ^\@C4:> stream xzy|Uԭ^ӝ},$ Y, aQ$ 0BDDD61 ,p2#*RB(,6kN3 {oڃ [ ~B"L:nXk:Vتel+YP_WgODXBH|ǬI Ʒ§F ETwl-$ܰI׉|*I$||ƴ =V걅i -_J %em_H;xI"6氲hEeDhKyφ ] OkDk֘ sty⺸.546,Nzch4zظĤh+gb*A3{&dK瞹Wݵ??+3--n|ڲşGC|绽{Ο25&,⑋IKpPZ}'qHoVDa8aiRYqQ\nGҿ6^_טgezŋSz7VL=>3Cbbc.(+[k[߼#}+Fwi~Rk$XCT"8tʘ5 PXc@ Jt49ߘnN'SpZUU=KrgEEŤbⲓ(#ڈ1|Fˋ͋K*JZU]S+].i{RSRt竝/uˏ-.)ŖFƔJcC';t wPS={e^Z27._:U[S#1XFa'Ѻto;.YݣޤsCQV:I34R 5OWTf)vuLIeJA2^m(Sp3&vӯHpQw~5%v&HՋW쯩yulg}l붭ol-CL-1q;"ք+kt#ΰuuP| jJUw5H~tih0 ]#vTW=/>z򥧟޽_#lύ &сTs$᭿r ʃCg@N&mwPH kvcqqA4e֟g;_lM'tyj*5M,  (V*(Hi[7E3U:9"BTeK->KzZ2l1+,J22m hntQ{0FNUfRTg3 *UqLڝ.%^ - ԜcZD? `n|5(eQx+O)k{JaVWΆ7AjFRƦK!]%#0;2{{Bw)/uΚ\\ĺE ײNOMo/fŅ;8w yn/7Ոҕ[J>v>P<.+ ['׼S sϧN5cy/j󖯾(8M1{ҴK!ǎСKJlUY|({xLJL4- Bd^PdNCd}Ѓdݭdmo$Q+~³v[#ևy Q#2*o2c4GvӗP$b*D_)D&rTh$CK:m)]=^#0.Lrjl >`gZ4jӸx>_˷q9@NN<9tpD"#xRYŽ{(Ckն5^x2"4 .䲮k-M3G}ųI6f͒&l6;;BE#Tbx$kpo,XC<9yʇk$MnZً68o@n&\暐@C dʒ$ʠUrnWES{d) iQAmo^|ӳpm^YmGE>GM&zD<[eg꤉ǧU_<~lj"BЧ6O]6f\ߍ{(ڬ>oo|̘0o7|+ cyBϓ.T0;IMEh1K;쌈`:&O*&dٕ™^,ѕto O''89smtNN:141d%!d$׸Iڽ&Tu;G;(4ZVLKRh%b[Q,qaMaMQ3M%햄ݰ_7Qw-ӧɯSQ|B\xh-Q882HjQ,a.P"3/2T ύ7҂0&u |3rB[3nY?Ao-{博UO쪩ɮZh/&y~IϾBO܂DG[sH]B7`2$8yrX\Ui7lI`Uy`E‹]j<9dŬd))@*m4¥DH!Y)$RKr"!c8')΀4>]WGh1K"yYAˡ\*+JRI7ͰI7ʻKrrYiS8C4wD:q_2 _ѧq}5TsFB.ި;'b'3A#SU,ɺiu49D y+TO}U2* vp-,Lҳ=ZM xdHH ;Gc٧촽;Ǥyg€>EP[i꯾՗Ӌ"jV%4P21; G@_bv@Ⱦ׌/FF{CW &.'UWW˞w/Ly0[ pQRA:t:d%!j:Aۂ3Dx;oWKqyM5%d]Zؐ*axI.4$Rϧf)P~P zk2!ۋzES?JCw!FQ*78#TH/k={u$b7'Z,S32?#y۸|zk͢sI6+U4l!`ThWekVU7oNĴk!-`4ɜf…%IYCT UЄR0 ccXgCFl1<,=RFWR& TJ!tƚ(Xg*/YGZ_u;Z@s -Kɍ\b3un?5vov=[T11}6n(LՉSӭ!N$NnⰣQhsVE 9.ݦh䴺:N`~@ʫC/_9XZMHicdY{bw!]pxu6S+I:e.C4c w;HF>Ǔ._K&ؒ]]>7L&>Z/k/[{#˙J j0 谮9 v"#6<>Fmܣރvmc3O/l61Ù+  quu^(w>VX+l;;mUeMh#)5[?|1*#Vk'"O-6~F/(_ZO 1Gz f*i޷̴t~90rum?E?GٮI۶_߾pJF] FrZ(&PLN,İ - \ʹ90DKJ6P߳$6F3)lo ,"mfǍD.ҭًMBfVZ̓o hnD]9s :/ zY:~hil%MV䥎$ءg #cn`RfA-#זSбT:C^(t d}l ebuufp=F9EzL``zpb#h@ёt]@O/їfIӻi>/h8%nAm;xoލ ́MYqG=#eXF; q% }]V1_O$q$p-$դd/Bw]!VYAa;X4sdCIr3r",ܳ;itX[HgIoitVʗ ]X]F!2Kא@A.YKQ$쿞%;I1Cg kƚ,ٌll?(=;J dHl0J/d9b% V?}7FK:=59لZVLF2RXKK-wᘇݸBRQمkGW@9l"g-CT|{,U22LVLC;TS`roE ׼>~ ga Vtem*0r,sU1*cXߩqݻH^}-oU*+U?YnZ uP@9wXAWL=z<㮩}5`h'_y~gIqh5i;Q^?~ 9-g n8@|\Rlg>|o5zF2G&y%>%c>k-)_&c>c|J4w`YH\E[ o1Uꏥn@\‚N~QЧ)fg,RƳ'!BݰAcִ{>>X>DV߇h7!^}/wc1CvIH_ _߆CqRsK!ѮQ3H^Wm4{g??V^5Jh÷ʿpf[3_sˆJhF/TL_\N+ᒀOK Kp~NGG @V™h~F@}4Xn0 xG xKpL@աf~ w_{^+ϏL0!Z P% e `^7燽n؃ $`ݰS ;t `;> o <Ʒ]0g4$`coPi |6w ]`nֽΟnuXW*}NfuF8.[|{`ʰVVa|Η XRJm-Yd ,.Q^^E XGm0_yip3i"<$Xx@L= 3L_PT,`R_o6 ^q0V{=0FhytH#CnGȳ]; ÖaqA0$·`n[ *aXw~[3C@oqC~vhsB?;%Oo {xoʴ^.ȴBhȰC<]﬐jivHB**tK~R]ݼ%ϻ I~H[yVH/ X7 q eH`fρ0 Z!(Rpxx pn:UpCl-4|L`\6J/`-B.κu@i'h={Dߴ endstream endobj 347 0 obj << /Length 348 0 R /Filter /FlateDecode /Length1 2600 >> stream xTktT~$0 !Gyv ڦ d"4` iJPIBZc-AV@`WZ߮sϽۏo?94"K҃)#GeqpѼ.OoނƊ}7dCesgD`Dl)\&βK6 ^'8fAyl(x/2-7N]T1wh맲5^%ReSCFPo$M-F pH cqИn44ܨ4ڍR.#k$.zPv*0." G]$ov&\NdwX[E }:6FP%7]QAC#`ٚNAWhD.ݖfۚ.Qۣ.Y6RķkF1ow%T/ۢ>BjΪ((Qb#ǣĨt(HGd-Rhk%Ө6ڭF Z&*G6͗] SWx0Jz#Qи,&7QjQta;1O+JլSMkj+R;;5+z Iy6cऩEulI dE"ؼ.]4hXyXN--K3GՙsGeq=:; 9WO EWۖ{;O=օBd?wtd+.'4kE1㡐Pm6ikHԓk45Λ7‡!\s*ś߽OC'uc'!-K50.ǹ !\ s83r! {xqZOWxQSq:xǃ2~x[m[o2^u{x12~x*W?ga2;ѲګZMtX58W*wxًB8xf<ϫ `_KхeSv3Pˁ & !xtTmSLd07 )c 3mj6 ʈULdb{Հs^s^w .Mݕ w2w$ MLs!5>zbG/`/'H@wTwF8%%#ftcpJ\H');#^`cęeĈY %CD,QSLCk ב%(ǭ endstream endobj 351 0 obj << /Length 2164 /Filter /FlateDecode >> stream xڵXo6߿¸EQE}Ww=(娑EW7IoCV,'}5"3|f(6[+]z^ObbvY͸q'TXH5,gsw˹Mkqۘre֦KnyYHQ-3Iz]"[!24ZNˢ%W{Kw 2@Qq03q w`/e:pUƣ@Ȩ7o<_iiMف/?ozIҴ.A 7Iy o!# hTG1|S, Hz ¦{H6{idY5E﷓@6\Hf.J-iOzyi3=^Wb 0(*2 E>68 s>!cضO4jc%0F| ;"^h; swf]d[d 茠D]4_!5gemm7PrPs6 HzP)*ZG*rP|KIȗ-Ң~F 8GS(Œ%گÎEδ٢]pҳ*u$X8 ku19ΡbAR>nmYE 2VdX"\A\ Y0EtMC E\z`lg.LasKu:ao$ OJLEmZL1ؙ“o<ϓ(q1~R#@ޞH)(~=N՞3V7 nk@a Q<&j }jYdz*'Y:FD) VOOW̛q 0~2hēeqߢETWAiHЄv\߰d(@Y2|j="pf9vDpBEP>OoON>$7<֔hJY}q"CsMmj[KήաܷP :(2lղveLҡdRw桪^P:Páj֛kyJ)(}Q8SMv8󴺪:S_efJT7B&4 蹟*&uұV&l%>'j0W)>Zɦ endstream endobj 355 0 obj << /Length 1978 /Filter /FlateDecode >> stream xڭXmF_ard.%ВR\hAg[2.w͑ޙ,tw_˼>3.g,~X>{tꌰfƔH3Lʅ-׳?/zFʙMWrJᔰ/&owZ?o7wd.X:"1$K3ɆLGJ:#Yr>.vk͗۳W\M^~U]:EU{NC4~M㶢2QC]~^) X@9K^X @ޠ_pEħf"8?_vt‹7vK딙4?6d< Q1gIIvi9$cvh(WöX5q(lj2To(;9vyk3B y큼ex& GD_o=^BRB*F6ohslƗqmE&ljOsnO^(wwΙHx]e*0A*!duOWe3I}ަSƂuD꤉|61 3p\u}f"pK-q\j R.ƥq;,"sfsT+Su;ث|@,h*DQ01C€8W* upF ->1;,e_3"TD( tԾ9%;̭H2T5$xJ@0E=)!E9[ 5|t[NA?h dZo2GcK HɏqE-5TjJpt]I'}qgI_P@ZXmZ@Z|G>Hi@ecD)rwX  }45Sj& C$8EA-N!3X4V-wLS<6Յ9F綢\u({.sΚGu!c+Bx(jȵE$C"7C`$J. `h vc;!,&Ka"z ΒE($w 8B&Pd Qh&QhKt'D'Z=ZɞAuAeAŒS4Tv+F-% *m}=kpXO:FOD(U*g?+EuH}BC(|H$-pƵQ$8K6.4]tr5yT9<IZ[bNP6'W2ķD%'e5' ڰqhSA~*1Fg@\۝ y`7XΒЙ,i]A#ljO 4\pS(&ʄ2 jWm@MWޔQꩂFrGTp;8h94W.'>['Nu!^TT_~AC.z@ R7XBӟW{p=Ic˸#Xn7Hħ ULk=el. n\Ka4| ba̸7T>/ʸtA7ayR!qs_NPq/ G&a@ވJRftf 0]tաMCڅ |( Y.U ;q!ƶi"f g+8MXojЌ7@S8 Ԥ{,!Z;;^/ kt endstream endobj 359 0 obj << /Length 1923 /Filter /FlateDecode >> stream xڥYK6W @il"m/>hzʲ--6 %U˒"<>~3F"Zy7zD Xo,JB:"^7?yy#„RW$)v&&>?}VŮ$NX1Kl+̰IƉ„F|ɤc9"rs(<ۧ+6W#8M9~mz^r8h+j!sֳ*OYFa$Y'c{.V 1ǖ]ͻW١j܎D1v wQhv,WRA Y],hi:-Wyohc%b qa2t *U4VEP^ Z4r#X.Aޒ25MNS4 7',T('wcnu"X-DjZ-'#Xc'/.#\H6Dg\I4@Q!gڡ{W>BfA44F <:@;RfXbz.=@?`E,Q&t3&8_:R/,u :lߌ9P(yEXbD(ttmJ_ͩTd { .0AVvM`29նGrGm)B6d9ww`UΎvB:%|8LdkA=m&dKi|S \ܺ.MDcc}Ѵ @ <S|ܘg6H<70M|#5%!;#&!:-{Q $#c cU}LEs~%t1t;qiH}V2ERظ2OsKq;O@xFBUe#Aڷ5ݞ: 4j'm_Q2 $15NB5PܡV>W$}^irOK?TGf[c*>JO[goũMWnr&$AʽQ)9$'h9S}.*\BQ5x\O*BەŠTI* %h^8̲vWSP):>,DaxLVB>駸8㺇pc6p0ݶy9\OLOC|s4v{'eY.'~Jwc/>.dI%Kh endstream endobj 363 0 obj << /Length 1596 /Filter /FlateDecode >> stream xڵXK6WY"%H-PA+ӶPYrE) 3"lՖ+yrfa୽{"p/^ĒIohȉ'CEi58+wMv>&k,vQ?fqGN3SQLÌ)?Xۉ6*$]9ISJ b"8s9C>QWUE}pա-vS(;>g3l[vD3 _[HKF$ z˿'vy9n AV0ɗuQ6;i+$B9Ed n‹@p)pH:>%_kvo3 _~Xxc*/lk*:|s.2pjpq?b4BQDE1T #[ItWp3mpcW;e0^gžN<~yk]wt!8Ų?:Y.zAS]-%ʋܖ!->F+ u7fnpѵUCPH ~i!͛8g$ Eȴn!獄p)i+FsHc4`84VPCDaqԛSQhԦJAo )g=c3R-RP xw72MUmc%c ?2Qv +nU dRB9[7[] @QMmaa/DͥS%كR#+ҼYu6Yj(+`YH0~Hm ww@j7$Ȱ|_a+z0s3P*l&hhF]~KTMD?Qc%MCrzRBy<ĔP XJp5]W3fWA9ZHaW߅_>]ZpWXtQ6c錢/a7oPe neSAN.rIha.싸΄$o'F\E@R}`55guLjOgH'mRsZy{~S@\U<^OQɅ@W9 G&Zps x0rQSHsw[Z|uyv?Ci7ZۇcV]o#ڿb;R̾\\.۹U}X#ׅF_s+ >ߴ9W;uF^R?;Q[-C܈nh$N' aI4Hc&'+ѵԝc5 &/<m$ CPDASh B6;%װ"A an'.ʊTltcҎzSrtǺz|=ljz~p&<+[B3TYnUJGJZqI$>۩'yI楛[Gar _ƸK K%%A&B1g&'.^ endstream endobj 368 0 obj << /Length 2161 /Filter /FlateDecode >> stream xڵYo_!PT d~[06+ C.Vk ٕ6|t-Io$Eޭ/{x~0|U슮Ώ`D&YgAWNu-_U̩c5L㭔 y,{$s^--1,52ZN9Ν-uemJ$=J&1q~xf~Ld/Nc^Wx#xU~pqOy_^^v>m%PM4IYf1ApiRMN I6[TonEQPcqU}y3g_I܀cՕDVS=Nr>9$Q#y[;9A^6ny, x)QejZ7ir]kL_,eeu4%r$ ~ϕ/?qۮw/3U( kfu L~\P2Z.IvS1IU~y߽_]wRd R!PLLN"R/<2 Uq;r(&7@̲]3":]he*Ff)μi:Cq^GO9yJii处[!ӡKOq9KiKnj'',UPoλũˊɁkmzK\g]38ڥl&[FƿB8r7|̅X1fioDC.DCV'.< r6W#b+Ȃ(,U(zdVIC^ߕ?QA{?V *cgq~ ?S)()/iAXLnT`pE]ӶHm48&=;@CWD)N0+A"]rbCX_6R,7ftkA`ZTR9b-I] x!m LUV؉XqƗv8NDsCݙ|D`A Mb71rً~rtȹbH i9V7XvG~H˯[aRo=!SZs6'xs^桧5ݔq$ު뫢_ MWִR+z*qHHܷ 8Bb)똔 މZ4g6 dD"%yۋel۪*v}nEt{Q1 u WɼUҷS\Ыy&/ JVq]0zɨ~>NjབE~ҁq'oh܏~#;*rLd^y*#5j oXXh ϝ0oUݭ7o~²#xA1c5KT~G;x)HJa#L d#E~dvD\Ӭ'7K\d@1WKwZ~oA}x> stream xڽXKo6WXR{)6iݢk6zmo/)RKBɉfo`h| IM8LLX8b4J@9u[) VM珍̴yLf1η9\,*oC+AAXA8iڧ,lʒVQ)>"B˪Ocwb^r C+}3{Jt6tfOr}jE%r*/`ꦶ^6&X|hsod feVV!&Ijk{6^,uqEovNg0LwYݺio\ix]brWTΝHsiVI mB µ w}vTs˖뭴ɴY3pxO5/]Ppznfm `K`^.tsIx|(D$OA(6y+ 9YXJh]CG[a^VΓq]饛j ZzNUsj/'`ұA 6LmHi`CjUS;9(mp0NAaS'Ϳ` endstream endobj 378 0 obj << /Length 950 /Filter /FlateDecode >> stream xŘMo0H$"-CVCRV)U>6Ma5Rc2 b , aDl Q&fN( 8qLPLDD-ӎD.T7_?U&f{v}Ν"D$: wdiYp) !bOkL~ȪȊv̛nO7 ŀSai(m6Y1wZ0*rQ0PA},@zq;]b`$!NyfΙӞx==@҆JQ_ D G,L"粲7͕(MV&aӬsXn,}+ YT2mz։۫lwse>:7kY4 bDTq""Բk{.pDh-[%דH2ON;HTwq`[{H6to@E `r0!0q>`)b,F}E yGYs>8 F#wo>ނxĮ}܅ G:amaas>G؛q6v78 }|=#'X7|89=qvR endstream endobj 382 0 obj << /Length 1538 /Filter /FlateDecode >> stream xXُF_#ɜoiM*U+R#5}0{98bM>|3|q 7>Br"R>L8ӥZ#NB(aloeJ[Qy?5kw6a PhNC2{]TQV qbhz\45t,|p(@qw*()F>} 4#{aZpwo}m )צTfQڼ`ZZꦌ4AULx_YL,-w* ;fFog XYnZ$-CFK',9b #w~Ӥ?tpIDViҟNz:Mg dh(Q2ls\:/}ʀ8.]/ݛ$]//?mW{KjpT{~9Q8b??ej=y3d$+fz"*5jF}3 ;lTTs |KZ9e,K [YUƲ4j' GcD ׀N8:.~n>3}{9Z)2s3LܡAMhDQHÍ=jL7LxmJ-`8Q jh7)C8 jUhn:=T ]T&D-.jS8<.1W21)r ]mc\)nH/Vfu5m^Ü~㻹33=o^*4V?|O'iyLs1w`Zn,}%0"kf;]ꠀ a@ 5781wz/L,B_aNm8s{@ ]t_IMwڈN"8lyh7 WJg O*.Ӣ^I@ QOJ;K)ת4!M FkYZЭM>V cYܧjn}P@|VZPB_ JS_iTJYEͮ_VB"Pӵ&:ePۄF]0-4J=$nIMDx| f6!ncVyӞ"Ԍ!'X5Npq(CQ1Ȓ.KGfյ(XX/[euFFSfQw}q=fћx*}h 3x !%#,Cao2FFA>S %<&$p ;DpDq bQNNb3~BĠ DP(* `*]lՆ3 _Oգi-isn &<~B">A| 9qR endstream endobj 386 0 obj << /Length 1736 /Filter /FlateDecode >> stream xڭXn6}߯[m7DQ -h"@Ad,4 dɖKL:Q}zo߽()Aet0SH%\ BytEQ?o~H"$E\Iƞ)]n-uX6ZƈپK~1:;K? DB! s6եuS|p2RwqFCn7/(m+lڪνff^+VAr˹SKc9_Y=30O &R:-yf^6 HqOTk̥ԫ,"kQ볣O(fID/qb$ZZS89fޚG=g "Ԡgxx=7=vUwf2v|p%yjQN ʴ;m54pأ.;pvUm^q9+b,::OCr!.'UUXwz8a’OƉ/Zk(4(cDLgKw`;r6`jG!}xOƕ]'냣MDIDt=m񩰁qC.#)^6KG1-}#>&A>ʍ)+Ab('b.N*$'y8^v s vE՞[Pjzq45a(ܾ(69Gk$D ]#Gw|82PDEG: ߎSYa۞PC}s#yYoehK6=^5xL{3%!%nļ3gdl ͗GnUG EOH^ÑՑ!=)D7 !x.PZ0n+BzڪmqhRn,/oG`.@-?nr_`ϝͤ8V}k#:DVxNs?pa :<==>Ǽk۽e&S7ƒ*!ZSῺ\)o,`u㾤M km׾6qbKO ^m_$>+̎0!,&X$p`+ _bK$gh7Ygۗg>V]L;b?†R ʐY9@!E0kSFp7W2G@ Skti9])0Jw V7c|>ؑ;3 &[xCJ]|Ov ߞ 8'6}¹\C?3Ҷ34|gzuiL^n'gyw;Tu0ž,VRչ߰4 ].}Gb&.`yMؓFjgP]H.贿j_ yžcYŋE@03ڽuٰ#ie؋[  X$҉tqLIӪ}VoU3J}쏸|֗\7MA톗1qar>nMLm=sAo..i6u_k~UMvl5]FGpKlB h Щ|}q: endstream endobj 391 0 obj << /Length 1956 /Filter /FlateDecode >> stream xXK6WX5˷ҢIТ9udյ-Cw] Iɖ-gHK/"9"9O~3$-Ft7 1|tFFZ 5)F%7K;Cn%UhIu]0~jƕƅq^Ǖ`PD3;:;Pm60I2bT~iEir?e4&0FZoUYaSf߿Pi`綘9vhSqS5Г,qU 0І0|D(NUl4*>u#Mf~Ͳ`5LB&1K٘X$_@/B$;#ML !Lt9 \ꨡe ބ(hz`8u(lMӁM$M a>Ĝ{S6I"y'>ɯv&lwQ&̳<],ܮފ}+{+]_% hHzԓ}P|Mˋl?/_f -rJ8ͫq&I3$L4oy)_Xbu0Gޞ/TtBR@!(Gh$Rg},`]SE Mhػ  LW6mWs vy$xv~C7m\*l\vSgga RTYfH*(bO> s` h(RnxWf}XN w} l3"Q,g)rBp'ދ 2q48 Y.9RqX%Mn|1fR0p$)UZv__HxArʄрpE?]ƥ$ά }o'hg>A[Rʓ?Q)7q~]`}]Iy.1 F0?#{9i@]ճSGwN~!% W;; 1} /k ߧ9|\ֿGe#<<ˈXh X&1n60TQbD)"UAdeoB8_Z+ uvzR|@CSp+P8CF3P(2Z1}6—BʠD um۷-u)<\46 s G'vmM:xGf;2f@!S| šDMMpi1d~MUgP_}DhkDiT%"__q[Bw;(/1e Fq߾@~c:pR(S<C*+pD.R#lCnL[\gQspoV|4ǼEk&/z:* SgU|XZ>b+Y ؾhW4ZF{xW3hgJ0/ 1 hoۛW endstream endobj 395 0 obj << /Length 549 /Filter /FlateDecode >> stream xڭOk0{>` 6X,av˭A[4 }wzO Ay燜 %jBϏߖ٢ *3d!Lȸɲ$ןxA?.R4ˍ~ӯSF3q{s ts;w89;VOwV+q\f˸jn26{!Զu;~t%M&ށh HBXC4ۘ 3xtWuie7DoO$>j(t`خ9"JcЦ+Pd F3It1{(lTad-oxU[1(f},M3'5W~QS(jC.@dIls1(jCxMAд=S!@dK v i }zÝsݷncxpJ2x]B._[`8=1v8,CoH;ġg M,Ye24ZrVF endstream endobj 400 0 obj << /Length 1812 /Filter /FlateDecode >> stream xڵXY6~ϯ5#^:Pp $Em $YTJn 3$%Kc83㛡=gxo<ջ(s{P1Ǘa\:̛|G!D/ Ql4|i]VqR?g2^/fj[ZMoo e7d# 2 ^ ^$/9UYPQ_ߩ~攰Vq"L\o`K,濈P& ^dU&K*/Z"V/35\D@|s, #anj2圻rYLX>eYڔ >!'Fªu(8 5Ga(X#l-Fpa l=G@h깎2IG­ƩgV]c5\VDx-9"t agAox,upDƢ( aI\(?{_wHw5ݟ"+7 e4o/z*`痩 R1.8[Um8N}iރ*b!;S"sAlӪRټ$\qYfʊAr{ /qKu%xhؑq!=v ,Af^ [d Ec.),g ]3zyh D!R31F{U7t=R9NWf\W4!\iL (`38#BiU&eV͖G7BIxVb#v f2OXFn*./}W[ZO1[ 䅬 x$ }s|Åna~*9; MUuO 68+s?}a?FTyR4vUzMqW!8*~ZT}NTU@I訥/fhb)0hE3ܴ!Q_R UIەkqRIh^D 8%<&A7?O UЍ^ބokmȥ I*r45"FS?Z(XÏ/rWG7a`r9j㉪*:ڤk^+}PD)Dmi)&m!Cڌz%-4?TO.1Q#kac/Dj tԁ<6Fj u[}!OY87#1:٣6#Xy:?LtG*>M4 ;zqYгKUk9 OeCUkٯe ww| $|.u3dzD wi̪sJm/l,~c=v~hÝneK,?摚lT$I_3N'q@?ftcvG-}-rFKJێTP%sMKUP/!Hlt|Hn9|3mZi#w7(sH`GՃޫoԆ/q jae 2kٽ9滈FOfVc&XK9a,@t"d(ρ%a+.u7Sm7t݃S;cCW8<϶{^oЊ"BVfAa(gb聸fT J"cC 9ltHoG`cXO BziT'#p_]Ŀ& endstream endobj 404 0 obj << /Length 2052 /Filter /FlateDecode >> stream xڵYm۸_aq]@r(ZL{Ȓ*ɗ r(YMX"E33W:\V7ͻzHyzدfl&n }_}bX)K# Nؙ}ƴ&Ѭ$1xXX4 )!C:ߋ(Q/B˺Ciͱ&?ԍwe'}y(tΉ`#f1X98OdGg#`C%`EVCޚoͪo$wz7fs LXe4ϖ oMv.ge´TIqx!ZŀƔEh piy<&t3Tk [ /Y޳(xU!B Ujnq-p}YQGO-  & 3\D-HUf'IR߇'8Drʮ1n6 ֤pCRNGSchA"&#(c8Ȋ]&=F;tD2G$8F62"c̵v']Fztɤ'8 /tݴ8F5 g)yB#.ǵ=c6dvgq=c Bv 6P!Ӱ]/0 ݟ(FmJl(vʀƤKt pfKO ٧%\f. @̇Vl8P` kfˣb˪lo syyIuMvL䢢COY3PwYomsn˩nv&kyP-][|Ŭ;4~̶ۼ,Y:V` ڴ ;'yp&JSIPP+ zsePNcUC 1l "dɎPz1 )55.$%ؤ4E_Ndzm71ƒ G3Rn`у-r[ r5'vEk]ܶ$4YY8,fRSu]~[V4IgvE$Yt6e; %CnaRG18;%~Ov2qUW$i_Y%r`3aI%~AiM h;+le+\gk15xԂCiYey,kݻzAx`^tYv:tpOT VIڎn5P/.+wH.a٢CA؁\u)8Ec:6 pD}f8p# /Og?i$vx:aP*ORՄ}q7L3,J^ V;ɻ74/5]/{G<@F4kٚ!BBÅ F[{.{B77.5"2~)pq9*/YVt/.^70O,G^i縇U"n~ #nFY.I1hc(]=¦d2l͵SБ╦mM% P<$, fpιfp&)hpN8*;#P3Ù}电S!k2n|OlckaU^vwr&^ZӲ^坙~ѣ?*8d{?j \)?j?ϟ7(TF_ֿx_@ endstream endobj 409 0 obj << /Length 1838 /Filter /FlateDecode >> stream xڭXKo8W0Soڢ--Xt,-y%I Iɒ4J }3.>ELt"v& X% G"IV\z^EJtK<*9I%1&?fem[SϿ>y}UKdwU>K\9kd(Jws CsEH?$D%Lt#cR04o_"Z 0d.FrTm`BA2Dx2Vh>Kt.>fߘjē!Y~a5*FqU2q_?gRAx[af=H^k7տʵbB.>gx43Ctx+5KT Q-fyҠ`Y[}vHk0Tg'yCe([ÝH1"%OYUB# Evڷ^|R'rT/UȄ(۰VkF4:* YkZo+D(MIbIӥ2HYwdݘcs'_4mf9h^,zp6ISyc 9C 4& NhB>ť#ik|Qyfg?m0D;pj[[Hod%5m8hIT_m,[wԿy q IrJ&k6{ޒQv, =ѵ0*ƸIm\)GF}>;8KS @D 1wT!-j/S5Oki 䏚lV oCO Ip(q:1 T!!!@UAumm{.%;n2w;X%]op*YLZ1Tϫan;H`x-{L S/xg:&ƽU|Rt寁#^lj˫zz2NJE?FeӈU& @>RJ U RSeW0E|ctZ&%/8L`@-U\FJGu'wE6f͝#/@0)7ņ8囚lS :,G!vS I A/rݭTƿ co)A߆#WO#uA˪ŒQ) g}$S]r.䚱puj-s@]?eՏסqUv2#_9b1RX s@d";0H=+uΈE10 )r9n"{T#4EC!1zq{H 9q:U W˨6hE5UO؀%'/EVDu`@wQ%^ & )kѺ?fnNJgr4rZ ?CYP`}=us6M*MٚϦj[R_a/++v?I=Hj쒊ŝG2FP3zHF0r '`’+[٬\q )c,< c w95p|4VB%cE~?YV0 endstream endobj 414 0 obj << /Length 2092 /Filter /FlateDecode >> stream xYݏ߿B! )~ }Y E@.6Ζ\Ir{3lڜ 'Q|q7CgOϾo޺d)LɄ̔*3ڲBa8,:_^,5Wyլ?=|[%D8͜5 R}c5C׮|Ɖj.DXk [z&,E>DZgۺyw\*hɖL6[ JðRʼ?,˽_/(g3J+]0o)aY $Cq28 ŸXKqՌ(a)8[&]vFL\?=:S ~>).5[?=8 M/S閭yQjQ T1sAQvmfb~ fʊo>6!XɼsJe\ PPFa[?2iAl@÷V] @&͟j 'uw4qabB-D&nB_/vs;jvux,&n}\8HFPK%5@kcӀ>|"j"$8`z >.h(as^_o73|s&uSgo>7a9p7̖fF*(svzج֋J3Ǜ&i%4Fo 1RB0; icS?I$Kfx 3-AJ}/8;* g&х~h;6kv:>BKZAh#L -Gi{®⨆{4j8 yq4Ӓ" 4fLD|=X :j5_i&cF1.$ .\2CBS$!  ptDֲTSǫ>̮J4-cGҬg)l:{`ۇޅx&ƿ%tL9w?ij5|܂gd݃L.ݿ/Bf 4,i9iE: $ L"rٴvH cX& @ 4~ CO^?K3PyBD "eW5O GѨ@?-1(!*Sy4H[BEY+Ψ \ ͘4muHAՉSլ<>IcZp\H}d endstream endobj 419 0 obj << /Length 1587 /Filter /FlateDecode >> stream xڥXK6WT ĊfH-ЃhzڔMD f3Jki1=p<`]pόrHSږ"8ZIGqWx˜ͦ<Ϳ?F)MR?K#0G߬Yx$tUdna$77Lʮinܻ;-Y)$ @j-E˺A @uEbUG`DZWsp<҇Syii_^T%-wbwzyF'S-+4l(T룜?g+H:a×$9 "1d~R)Ѐ{QN]p>p~:DNQ-hpꁤ5}4v# (.%G )q9R#@o:=Ѝ$xI~[%T$j#5p\:DcK!?-~ M/_1 (V[Pw_mVwUӋšLMK֠ER D ıϢ|n #T5ſY.e?#h 0Wh#{na OOS? xz dܻtafׅ`&4# (e~8 $-8 炎`xKTNb?Ďico24t>D wbξpao}x#=8-`^jMzϨc[)QˮIpyYD4ЛnfO |*bŴRX\8e"y-x-w)MGib];(-`jsj`K!E~΢g8RqNU5cWȠ }TR $?1sKR$ńr'twNey`s(D8qzxr71ǎđ}ch vַb'yKFiw[ ;-Aڻ|x[a&@Š;9IY}Seb2hh' vۋ{T6j'SE5=uo=eVZo_ oNJ6SpkdoI@#P|Vn5ȞD b$M=t,;}Ƃw4Q'Գ B?٩;P=3 !l2⻾dw5 bw[0F˾y6 HAlb:N *, e+ "ɐжcI( 8_6 а@~!\A1tIIXL_kDɭVZE ZC:!33?1O|ھք endstream endobj 423 0 obj << /Length 2367 /Filter /FlateDecode >> stream xڽYo߿(pHQR%-{p@EGBlɕd'apd+n<_#r8"Z&o~yX/7 Pj4e/~굽]XOqi`ji/yi[նnv.`vfyr6zWM[t8 Vfڕt{fyWR0O^sE%V5jkq_ T}[GFynCaIOPb?X*^,GD$L@0/3~4?;B^_՝m~ah$"؀LiT˛HW(75Ex)!Xa - )P v icFB(fe_k]2#̒Ks#*׶(SJXWh7}EJƹ nڮNN8bGîv8JteܩʙNU5J.zcmK8](LdC2_{h5ٗUvp-MG_FmRtp qe  4ߣΉ#ϦiytK[45M@2vY.t…4suGu߀Kg੬_Ea5U3;eW|ꚳغ&)>&YǡRCB6Ǚx'Ãf|VŒ–G_]z,F,Ǫm;K!sN 2pb1Pu%-hZN4)@a~6;ZHݙ-O:y?ö}/q7]V.qWD+]˭#ԖQ1~e& / Q%3HGq.įa)K|9-{Gym2R0]gߒBgax vy)4#QCh ЬF!n#ډD/-WbbZ!¸֫u_/`bYZ]=wxKYvݒO_ɷ΁~,2&]EB QPBf[D{>Z2M =iCt0|lG0dU|b{`NnZ]*WmhCÝY tԶ_zA7}YxBIg=JQ񩇜RР9eT |]'k?#_6NRܴ޴sgȿVNќXJsɼ7[GM=~Q~79fݘ4Qs:I= [gy$gQ 38sS_pUu[{W=~ಋ>s t.~g УHc_(z/DN& &ÞJs$? o{Sm_ޝ}GG:I\^!.loM0Sb!t*@ M,D* ߵN7e:!z?x3f endstream endobj 428 0 obj << /Length 2045 /Filter /FlateDecode >> stream xڽm6@)Elm--a+xmmb.;;z<$Ѽz.~}^?ݾ%Q .4qt̄ԋ|)̥ڭ/W,&"& ;˕&Ȫ.-s\$AI[7mZ [8 x 9ǥdQ;&OxwĖKa[\iyEC|dvks9Q :2(;.#tfj%,^~^ Nj%40*CUA! Ƴ7җb:IܕjĿ|r~W@Fkid2 r9䀐Vi|,xWORZL&&mqxh~>8!I!_q Q2NƮΪKxC[ҶȈb ~[;5mҲhv*b}[G, /LzR֛ˡ!ERt;v"ݾ?1K GI<$ gK)14h}i]|u,?%lQ 5gաlm=sSV)J%9 ixncoL*qv%b|8&KF%`%pC('U˪6r Bu(sk}X]q@^| GQxP3%2@i]h,}dLCm*2P`T $ĥ-mvv]u^jtևb PtQ6mZoǑn.?] rtlj>Э \yZ?p&]\|-e=i\Gp^\˰#|@HLUfNMc~i-ugb6}R݉P5;~Դ^ZcX,*_mR8SCpei=t: v7_1s_>g_AYh\>L(F 9- EXŗhPj\--G\DOx=CgA*Q':s2Mw%r— iKUbK%&K58yrvgBAaGIQ؟OӦ!pyeFI1pc~vn1ʗ‚0,6mR1qTILE7jЁߐf^n -z[i0FpM:J0sֆD-t~"t)ޭ~ɥ`QK34 endstream endobj 432 0 obj << /Length 1850 /Filter /FlateDecode >> stream xڭXo6_ᗢ P(/YXe6`]EbaJr,;-/6E}~wEx,vo.z ъ(Tq(GBg\|xNEJt\*Ic5?hLk:nt4&Zj9,~ RP>Q.~{);kqvMY]_g~͛r}; рBL҅,c1bvK۳%c 70b**]'3pcˬ+7ۦMۮkB)#6n2 /$^#aKp")\Rdb4y7ФugUa_O2|vlmHȑ0($C`~ī!އbƝ0 b 9D6 +O H|(7n0YHt|!gKax0vQ}e_ 0nʦ6w/ϖ"Vi r8*ۭpݫ^ ^6 ®67ugk(/3eCHnΤ̬z]y'<P#$Xyg¡jLǢzc?IiNCM&"fX/L,呃zǶBp<\sv\V.͎zk*TQ6~ᔥ);P]UvYW[HRlZgU<31]Xv U:`'dycdj{>c-f W W e_,%',IETDHذP($$s92E8WpV$_bFFф~uJ' C8e.y\ԡ_A{LcmdLxjٳ"v)\O"cf) Zdsh^_&uƊg:<[ۇ,|mX}LB*RVzW u!P)܀ B2T0v 4hr ʾ*7 e5ta E}>n>I :o۴VFQѸi\Yu9ɔXL4+[J* RX#8nym`n$lwHwC1 \U\zd K:\t^r!c!YYcV) !> L,!_YʸC R 3cR[0<,AH&"OBASfQ7X=6/I>wE?}] e ̗$#\#Ԟ-q/HUDepˮ.=*=uqpdfg $w@UOyPEAיMyQ r+4b ^E`BxdbՑt'1$ez%3\:ڀѤBƋZw|jꅛٺclgyg|%.-ӭq2Iq : e.zI"y*=?kt}t%T!շ"uu5v?uJhs:!j_<_6}T;l!c5` P;{ {+i?L8G0ȶmuљUY3Q L8 m Lr7(i ǃ`Pa⻾kpJSjjž Q2} T֗R}鄑U5>b&M|*4I)}b'4x&a94G+@3ST4Rx<]x*et[,Ml>I?+q ףo/glO endstream endobj 437 0 obj << /Length 1715 /Filter /FlateDecode >> stream xn8ޯPQZzڢ{aFc!dlwCʒ$ ^lr8лBӫycAl=& ܋$"6͏G)4X"*A18ߙO\!BQ,jB[;{J- z+ lj%6FEXJ6nWX$s5"|wJ(`MJu}ibX,!VUݎe@ {Mkq/,~rݨ#Ɩ]`bVUސN#~'Tg nw6'9gqFZȆK:PEQUmg3$k/ǵ)%,Z\h;<7}E 2.6e{cimԨOfi&MYCdܤ`?4)@O_:\@n$> stream xYmOH_[j웄*R^N++C.^98ƄVݝݙycR;N(ßFOkaGp ^d 0ƠYCh#Z+ } y6 [QƤІXG'zVx y$*Y1YuTCa^ D2~%Z~w'xȚJ9*dvҥ|0Rdv8jR>SІxʇPZ{Ġm0-#;VV> x\`Ӫe[VTVK'o?8 >YdoNUacrOqHQ kbZ(R-zp8Nx(JS1Y&ķϖ5YIȬe].Ө֠n::ެ.O"S`E.lEAsYg7q]g7OndW9|vM;\+L3,'C욽Cd҈ۿ*5j<߹I=ϰvXSQjRR֥z[&^.s 5glWsW>>G3YY|y{^lIyٓzhx7MlB;C~$4O?I5E=.P>HdՎD?B0FUiR~%޶I.{[:icI}Tc&OsīGG(AnMvMۇK]vQ#h#qŤ6MNUq M]gexM i܆7]o}M|^: m8zF"(jCKQ`Ôr? endstream endobj 442 0 obj << /Length 1348 /Filter /FlateDecode >> stream xXKo8W)_u3[ַ$XqX+I})-[r"̓Coޗ_|Yx J"yGsy[,;fWRO_>څyijKZeM 4{X|9"Th”x3l H1MI 1i =/5g~f^7RͶ*}$D!À)\6 n~.kEɺƀ~5:XG ,-ZqTjd|ckoTgl-3I&z%'-_6NY ,H'[|N˥:@:2%A ]:2F3"*!uigJ;XVݦv^Rn65 E6nVgE2jbqjvz`{ J6/cRvݨ cQQ5n%8jF~߇}C>kW¢Py WCt˪aVkmqA1: X(I/{aO'3! nMѴw 'Q{s>4 6.sf2QgyleFb[KK(%XRŜ8D<-\ɵwN>ѹ\*ԫ9<=ҒcpOj[U5#OOBj\L/b`z2cNfTյa7bɈ8ZtP8! wc﯐NZ;JeVuN7zԧKݏVp/ •arً/2&[ Sj)pה1]^0jH l4SRz1xApLwe<uR=3vM=6K5,KP{v {mDw^eP3-ov\mbtpҼf90Jrũp A>X8C"ǞV@gZcӳu1h> stream xYKo6WȀŇ$H-zdޕ6awCJ27VX\>3C7QpDg|4Xc\^\ 3hX /_^b<5c" ȅdګ)Lm-lcxXX4m^g8êokJ16v@]&V|ZI"f_UH&e8gr"ؐaw:5$,KDje h$ʔ$):ue®ZXbmiO~{녵~]&}xx38b䠥-ɶv=ٌ}ƞ v\7-5Pqτgg+>d[o;Sf'<]eM{Ŷ7owph$ēwus]䛍[OE7*%1ΌٕMEj'֬x ҹG:Ve}*g1?Zl.Iєf3PRACVv 8M3槪m-{摭"9|\3y<#7P4-C J'Bƈl^US["&6mk.ml"1 -Nt{](ͣp۴cYAM`\nw$´xIػL^36}M_~^0(3q :C^y]\,N孹A}M|bW,Xz<oҀ[f$I}pv3"ޥ,˝E-)0?Xi:&xؼ "as-^k FڒR, ebލ 0H}9YÜ~?`+ui21ACJre+ NJAO.(MO{r]Y=;Mha!tsWϐ0TpngÎ_LӔ $k>)@:s@GY{lV])lO%uA#Ȏ~nGhJ^}ucG6yK6ƒwT5{7׳Og7 S؏. r7C-4#}<'p 2C`2KbJHCiЯQIIPcIt4it8%Dqÿh)n=f,K1Y'y$y2&>秳l:bY~q)py=ۙ:ߚa6ixdSx;-j@=_V֩n 'a=Xq鋑O/̉7bdYWߕpME߉f-$wd4^x=/T} R 6Mg%`|#libL/5JB^VbnaX .-K%& sRn6]}@Ԑ斪w\6nbmtE6{G9#| X%DAyK-c7Ĭʩ@n}5P7hCARg#1F I ?*9,JfmM5~kY+o'F7/97SnZ^2AGB,w=IWs+ D"[DBqҪK*0y|;<Q8O8KaN dқg7 endstream endobj 451 0 obj << /Length 1796 /Filter /FlateDecode >> stream xڵXK6 W PǒeYm 4AԽ%9xl펻3G6({Yo,QIxWo Qn$mB#Ar?ܦOgM[I=&\"f9 ?VYIтJ'ǃ_p`R HJwqE=''W߾]=4}&>fC }D(oc\gDow&qN"?~ەhHL]N)7]S[͙i1mk ]p9a a`A,J,]AJD6i"_J`:TgmnRZ L&j0G\W*C PNz9IUа#Dic{$O-@vBBՂ\,3yjkg/: YZV8#ʏ& 9ig LVcd @[CnvnV=T8g-@b)}cJ#衅)``Zq!nH?K?\8tVV.3߭ocQŪ Ho]p_HO.W@K{6s?Wf5LVKNbjd IZ Y 3@E ׇ6Ac24pC+}BN%n 'ѮPVBw%UGO.5mjU4+FJӠ 'S.)-$'&`j6xH:/@G[u *M|׿g+4)b:M6X4 攕\dwi_h:̰ڵe it'T|H)M-e^|RK7 0G rf$c(yGe[f)N#P͑5'n&aTI/{$_'Y|$J׺)8ɉow6W.U> stream xڭYm4"t]jⷼ!$@ @BR֦II[VwfvmXW&k.U,YNmUZUv|[rR__@XJG1lš^8P^ΐ?&"2qъ0J*%΅%9a/LG"i B@(r ^;\[7۷_Y8X$}u"1f/ 7">LZ[;MӐ,upo'IZ{`/&FY{1ˏS%i ?"?d)8\1 "7;o s9aRwγ[_qEl>` lsCAY4+t|a~;&OqU1VefK͙JDb7fp:mɅ*t zzq5jԦDkx/Mr1B $l hU6ͧ0!/3~ qE]ȁ*z=֎WCEh֎ty';ƖoUbca[lkpID'8 &= %9UY1B (\X.mh$#f`o\K$Svvf4Kn6e^C蒀!, YpJL]<׀{4pػgOGy'z~*qi.)%QT<¼5HM0X͎ʦ s;0mc'vY]kӍY[ķ(fYd{Co:*N0i2vb)dC\w)1lؔKϽwe$ck Ӄ]QhmD`w޴իBWqn=A[YH46s:2D/yq dJ 8na] UQ>Mm djKK-:ðK.H֮G~w,}1OW%@]WHe=FeYiVD8 +i< #*Q*epPJiq )gpuoΞNLrZwM|!MJ$-5*4'Oo3U9tA ҌM4~4g06P+/I=4# `<;~:S"GŔM.\ :y%fW>p_[SO%)TO$D2U|咓_WxeÙ?`GуS݃ g*B鿊8&`D2? @Q1(kp+0AQ. x=-d;AoM=A?9 #n$.iZˎ9дE }Ap endstream endobj 461 0 obj << /Length 1458 /Filter /FlateDecode >> stream xX[6~ϯ(uTD>[H,xgQg7h{1 ̰IoR>쯶+m^y"\mnW\,L*TZm/N it__ث_ҭ"u]UVrw-j.vZËa_7߼V!K F_x+O+ai%<W_ 0 *YݰXz( 9@C u}D,:m]]r '? [a8K)#nꉑhHM[۬j@EY[9u^d*5uR)׹؎g i)cEn! "6Ak/"mrq[w'rɝ;SA.=rdC}`^!ZvC 8y?${f(NsR(Ȝ6kƸ@SZ-6S ԜDRAٍf@ ~0 $)9/tfC1}ԷH.bHش$9IAސ.YA rjv=ZvA^ Gj֭Y4rǹCt"Mڠy1\_3 -=G+9D~x/ ,m&VqjUCqpD'X,>p9qeZf fy9=-iu'pb#KcnM.< uRX赈sM?I5p @]C~,H/X;6n@&Z&_2EXN!y5E9!7l^]p͒eԪQ~.L #_ /Uf/T=T!)RE2!{s#̳ bba*~y^6~(֢iq5+1^uW4W4 ~4> stream xXK8Wzs7 fCc/IjY"K$Ow*d:q`/6IWVyؤ_ߤowo~m2a6w גLmLHm'wVP |L)WM?;FE{8͎&UJ'.y CKO]57/JX1 ׯ=5c| ۢLq 0wgc(<01 `cB1ރfzu_HR95m@HSI@Pu`0䟼:Qm.E6.zȒ<¡N?С0ؤ0$~ͮ7[v5hȏFde0iJ&(>OGʞivDɌ'ڃ)}p  unVE_jJ]51^hC˘lnJ1:bco QыHLK5q@d_O`cqg ~Lki?S&MeفO;)pcJ˫M!RfU!cD+D Rn(D_ u>_FЖ)a״%F8\""\ퟗ/ᬬzY(>'[8: tLzxj &JV5EyT-K58#j#EۈwF%)4+4jiNgSqn( )3 as#LCB'{Ȥm]}?ZU6=RJح"R!!@t_ŧ(_pt?. Xf~99=S܇`&5b t_JM~XE9FxU95wTXS I{Y ޲J.>NB]@rڃyџr3cKi;*X oݺa )懁̽DV08"+٢"?W+hCg,$zj cj0DK*2b@'N"'恙;wԇQHgφ*WmRz)K ׯ8Ew"6H y]+8Z{"'.ʇTHZ=<4"&@5Sc(CO<-f5SF־D!XXՠBuOj$5Ѵ1]L&E-"V= _= 4B< 0,1~Eدӷi{$ю V3PKəz]ګ}@~78ay ^EK{c﷤O`wuƖ,{3MwnY*&#֪h񩌙1Z+1H 3uoUe'~ endstream endobj 469 0 obj << /Length 1830 /Filter /FlateDecode >> stream xڭYK6W(@"Mޒd+KH&5;CR$k2˚kpŷE& ޿y!_Xf4[$eq&"KELY.>Gtc4 GY͒?pֻFX2$/??qWJU?'+R&P,Q>L;a;?=y ? k7+ǿaQ[dq"$`AkcbջXK$Y,Q!s2d_ {q'qBKB^+lE8Y?W=#k ҋl28ᶭhOG㒊H z S*ᾪ~Um"M$~jI5;:~" oE}eM/Mjytz]+m^V[\d(1HyCO?bB 2v*c*bt \ӕ"TfI"Lҋ+40LocJ+a+<ͺz!,!AKy%I %-?U`@$ec$)AiR(no klԃΠ׬Dʖ`\5S! S*u4>70AZ~: 4X7YLS9F+&3p Q\DD(H,z nE1[>0aBmtQ%ESl}U8n SN 9Fn4Bwא`/Qf}]mUQJ(݇FDO Hr1: J*NW$Ȗ Xi'Ѩꀱ 8]|O0 AfLk:תqd'i<)joD9{'`w^?Fl\ԥ '|Vo`C9c>wf-m ),ӌPB@19^HW,#ȇiL\6 :ܗ}(ߡoݗjGfQ{>$& y"[+?hwuK]5KKRWD2L㔒vO9&k@wIR?жLm|'v:ǃfwED m 7)_[]`v Y!p*թ X<tak!6ZoN-qBpz;w oX H{ː*nڇ6p1|\ݵ rTAaYF7oi~. ]sUv@];)UZIc!^W{Wp vkBGnr~SMU(C0Z6svF. WχpCphGW] v'C6n*Oph.qk͇Y1 f;̸U zj_/aH< a"WM'Fy>hH:t; B(TXV[VTp ' O{4uhsѕH> stream xX[F~ϯ@(0`PUɪDڧԇ>0bmT}˜K}ӫ~{#D$)Ea ܻ6b2k]%4zXJfb]7fsSE-~1"Ĕ+K [bj62q-bj'a({`މ޷p߮dۈt{pSyѸ_#دߊBoY~VyzCݱc^} ֳ"N-]ڤ8ʋ, BKK΄AxcLt+̖~WU>,d?MvGz)߰GFIQ㳨;2eQ<ȧbTe(Jo ,^@^o1 U_}wYq#˅vYRkieM,ܔ_F8A8!# 1dQ͔ce.]BRhdnC}Yn5P$> uid(}z݆IRJ'@X0LsgdAoR6mӢ2sL4_ң2bDQ1[LFT==ј}"wc/q0+2I+vRmpbfljՑ(Go'ʅ5fAp(Dg)L?R6Q()AY:say 㡟 YmA`_JbybQfcە/f25 ZMLQ٘]mmV 0Z0eTL *Se^wUoD;ߝ_&HL29BxKN~C7Xfep_e5Ssih:.k(UTdk8 W b<]'LVm[1Rx)#ԃ i,]Tx:DG~!I_q+IT:qHWq@4Y&)_  :W{O}xeӭ.<]{PU0ͯ;F8H(Jmq ~Vo]^o"C#{B]lԶ88T+ S:U4ex"??.$ N\^g p9U"d=z_Af[ֳ:che&e>n;o.sf`is:u~7R3@R^l!H_C"l`;7B{Bע=Gfq{izMf \ص/*Tmc tBN o󗍫eLqLDtLjri8 Ѕk*#Tm Vu ܫBliǛQOQ!< ֯XWؒ/@~H)g6j{-hutvUתlUC>NuMM:$By8:L4R<[Hh &I %!%LjR;CVn[9VhX}^(!E2J_Ȇ4Vٌ6z؁Q endstream endobj 477 0 obj << /Length 1721 /Filter /FlateDecode >> stream xڭXKo6\\W{1.Z4@=%7I%ElO(rf8ofnWӻЍn޽b%4]T+2n ͯ?2JQLo% oLVThxyoۮ⨞cFw|CEY(Y`D)b$3Dgyr˕84?-u,۴gz>|k/za݉F|kXo*ˠ쪮ߠP~ͪ]pv1]q)xJUAԏƮǼ)Jq?K;ވyj|_4<\U`Ltu;b*$ Q0c(M?Z@s%3HωwycWy&i]nYґ$P9kѩ#XstυO89^>a}3 09(ҺCB_ /K^%պ0&e' "EkCjXgktt*j\[ u*yg䷹hЂ`8զ(H' tEN)[tASXFfqv۴O^{k7'N yJ&^PtBtqi`M&Lm5:xmeWXo7w$ P| tKi sBfIWjSOXiwv漉Whh,I0HHuOO_N(D--؃-QٛUUOg6C_X`_gY lrwT3 endstream endobj 482 0 obj << /Length 1939 /Filter /FlateDecode >> stream xڵXϳ4ȅ![220pw`rЋԱSٕdvּ)HWjVJVUYo=WiJ*W,)_Ib>[zC{2i(/|kڼm'>/oeh5ȵA[ɏya꠲L976TG{"`KΆ{ @CQm_{/83e6+T]ol.9^I,E';ћʣ͋oe0[rk?d= J8&fÆp+qnq<,5J]=X/MLs|_yJD24+t: fܤ4'B؅ .9En92k_Ć1zܩf['\Ìs4f 7 ࣼu]mU阋~P+O4 l(&\{9UX4Eyki<J|ٵ G+$XGXY W]U Q\Qm3 n| 󑏻|;ITBh;I]aL) "z^8ڷ3{&-O$!qiMN``pCU"z˃FsA4֡$0C>/!`LȘ^s8ivGyOA3KMDylcץ0pM刜_g۴ajY5B; >70&,#2c&"1S3WsZ -Zܝ(0fu1:N L I 4}nOKZas2._0BHF/Żf#`ñ!#rejf%b'xJNKk P!<ѧޢLR%rtp %VDs$#-9!d45KQibHqay V1o_=@/_Sb1Xh*o=*b&)AP[Spc0`EE("Fzr$c 8zv 1n0>ͯUu܎ΰo4 wS8F'Iw?Eagjɢ?^ AMbGT!~:pn҈gux4TXԜaVM旯hOUy"+xTsW*wuɼ1r }w_u endstream endobj 486 0 obj << /Length 1913 /Filter /FlateDecode >> stream xڭYo6_a(f H4E؃hXMT<}4 㑲(2%:wtv>r/|_z{L81lD䄞0r 7/`m-N7bnn/0vZ,~,޼›gfUDZyѨZPmaѤ2|2b|evK&} Ksܹv[}DJ#EVqVjbsS3 {njTu_R)V?.{ ^[d$J3L&1w~glU5 x[́VR\xA{1'w\k-Ŝ@ٲh =fNw"ᝲY@U_n<@Og]jwziǗ4y8O n"8bؠ#K/=Cq~ٚ%^UuuMNuE"]b&klF3L9Z&9*/9i6R&2  yM)vY4KoQ1*qVw=<"MBʧ XB&U%-V{v.+;CHP)X:d4 $> e*1^l4;wGDlv[!}ۄ/3{X }XvH>%4mߴ ۔6;$"t$&Ij\FtboG.A 둸焮-##z⯧AuTXd5ssQ~]LB@?8;o#ǃx=U-%No r'/ r{oŤ̫FD8v94E/yLxÉsuZo9n]7J~)X?h5*lvF~T3~:wnaf{6ٳ/#?t!O 딢18`R x&Eqzˑs;*q.lS^2뉅Vأ6,p6 n Xp)51M MHH\w0e8AJUU39+kT4&__G~-_~q>t ~غ_/4vxJS+@l:>0> ގW&j endstream endobj 490 0 obj << /Length 1858 /Filter /FlateDecode >> stream xXK6W E(-ZzHr-VW=v0wCʒ{4$gy- og?߽z>Zn`q[0A, ]][~{v7`w|bFO <7}'U<& o4E N V7 ܕmAaI%Exr0k\.7ABQX1 ED˜e"uf ̊yn,c˝Op2܏|[˕Y}MylٵWe6#qͿmPPMr50TYR4߁GSVXUlD%Ykմ'"Q@zmXaoNl[_C_qmYpah̗Lye]4]-#d3.\cf" ̠.SlMʎޔ[bJj|XZ"ϻbmP !={_Ы"5R;]iAS2{r v5wXjwܿXr g`O9uQC\a;B V'=em(厞Р- rŜcRKH:1<ܜqFKJ }W![d&(gIIV( 8 Tzz ?k8!4ңBRkmu 2f;!^4n[_Z'^0tc©)Fa橲5i|LUY wbHՕc;-WMRU'PTը&ؑ YL{=1ҏyƢgucZ`š.P5[~ 2(qj7UMDք+0@^Ti!*W1-Q1ZA_ARpbB?Jsч, z L(y=J2F\<&\z&NL> S:0CɓބIR6&\p7l{^<ں!Ayvoo6kpٛs7y'w]|,n$d,aNփ;LC]^AeNE ,\; -i䵙 @~ƅH0\hJO;/]i4VqS:<̘ ygYH8s=O֞R \0K]v=} 'ǖf)VGS F>?&;&PX6#)j̸'.OK[N(ϰ(D.<$e=醳MZ7r..i>L<$!++$'xq9QCr3KWL܉@gL-^.w> stream xۊF=_! ֊& n!ISRB M%#-fg.%yB^`<9s׉m^W@D"Ip_(4HXa‚";|_$aݨ槮ofo{yWMmvYgvi>ԁzf40 }ښ~gUׯ[J&G, "w6Ǭu|*cH7ƧѺP`1F(j0AHmu#8 FB&p )78"ap`! b>wS6w/O?PEsZ5e Х@NZl'cwg>˪EmZ_Na (li -S(OZKQ(8S˷^}tb03y# NBsL<(Z< M7Ή̂,q2 oNnj"c!N *ivG,J,47%2cm ]< s\kʽv3:D<c>SvG}u Go,=f3WVB e^^yabE8 o\:ގANnG?0 /k(No -0%P{a!uU%'ȄҥzrLk,Sm0k Au'7O0kkU,) HpՅL!DPf +:xcF帰qu:ð5w$aSݴm h<"0R:]~\D$QoE#*<&zM]BUYYV`1Qh/zY9ʏ`D"O/ vv3ص~f~G_g 6ZhcxF|ڈS/}沆+ʕC`V޽ ?P+;N[y /U}>k38W?;8ΰԮN]w%Ƿ6oI}7}7WQ]XLIŬXc+\FtR cC<]JŒNRTƥ΢$ѰM9gӗZ'\l$S;Kܮ6$*kr6?VWveE }YsMwIjݢ:fmvlŻ̳l; %9]a5~fڭ0շYmcQ%n~1T .q֢]n5+fudcRõ`bZp`H7ML#jufܧd/;V]?OhV%EĽC)/R)a0UF¾F *Ejkl>ka߾W@+N 6IIlbKYm3I3@X1<#wR9J}ap3Vw]Cll^ecepkwث^zy̡/}ԍdWBvOdƛWq endstream endobj 498 0 obj << /Length 1764 /Filter /FlateDecode >> stream xXY8~Bj- t<50ܘ%No;iȎ K"KG:w9x1oz/<HD6,ҿQ$. ݴޚaL591X@<}"s#((R RuU #ÆjKn|ѥpH QK]6=j 뉙~H G;[#sxȜ.6+,d_hۿ)f) bX \vZEPN5L^5|X]NI%ԌxNGR|{jJ!bHehdEf\i=rti)͜;=#w  "@ԁvi|YB.̨eppq+eVKk]j|[6\쿂6d- ,9`\uk\ؗ"\GTIs\ 9|lz.RHVm2:n:%iq*?@eՄԸVe1) @A@VR Q+Qg>uX8mee|?\K9?c ۋK7){l RC!ҟ+xk+ٞgݾU*qߏQD{a-N>Ğ v(>=T$:M 2O? %$*š0$E1x21(J䳯|̑9:1ZfSDGw~p<,t^(:au J>fC!!h˻j/O:mi+DU*d2\Q2IFu%&:r!YY=ʙrQ&1|zs1 V|9F$eUIJ@W5~aQɁ.Qhh0YNeGn]y⦓os((;C!Z>0[%6~=d1T^rM hC@p\wћ4Sr8_c`jD.;Te_ GOr}C_}cE*l3̥zc* J?{O [wQܤ퓄Z#``0)z'P'(.8"ԂzBTY`qjc:2, CK!qitO&3(`w:iUͶp/}zOj2WK6g+50w0J? T_`Up6lLTŬP0 u$P/DyO_e!MAurnv(}8z/`O־LJ3)';L/nz{bk[}r Fx/=fpJW endstream endobj 502 0 obj << /Length 1899 /Filter /FlateDecode >> stream xڽX͏4D3mA!"CaۤJR>U38iҺ4 833E]_?^bS͂JN %3¸\<%?uOX"xtba-yrhA-RX\eUޕ˛n[V mdYW;")6&5ZGeɀB`u=6_%g )6(dG57uae)'[UhU=iepUoumyGN-(+PӝdΎY484m7-t@` BGJ5K4΃:\$}p˙ lɸv Sh4.Q‹.x{,ݶpsIS4i&D0ϙ;fq/{|fҡóKG?CWoxy$nBΊM9?&T"D -0ҙTˀjF m)Wuٕ5,~Xv~H _gR/!WЕss2ǶlzowS!HJ_h/{I(^9 RꫝHYь#.D+:KPnWE-:%."4mv \.Gܫ]6bOց:nvOP-xe 2 tB6=8Qxo|tie=šIVII|瓒'U-)Yބ!\3詙' ܕ.rhYoW(j;&"hLjY$Z H ) )m_sU`ha]{ƭ2&v+&N(ւ)zÛk͢"6MN$\}7þ\ yZ _EPKa]?V | [1NX-X*>K|w(:hN!:+:5Q@=qc` rՍa36&#}=vz\!C%ve5lٗ7obG{([Ac^*(YvSW{[mZ8wo> stream xX[F}_EU̍Ke(URRcljn4o`l]Q΀g.gXz[PZ%!)񨢙6-Brɪi4?gO~GLx!o^<  T.~~,i6ijs;0B*Rx6R^/+k+<(+~ TIF~U8+UX&]!27Yu4VFsb+D.O&Ĉq%ys\jt?dF>s8$l6)HOa6l.V-KC:/3_mq̂oa`ⴀQn NmEnYff:!v s$gӸkMZɜS4}̛5wxd|3{Kdz^J )%;v;hsrmwطse?jTif^<`y"WzDxB-Hp8smb+4!ԋkw6˺7=ڟxHo1 yLVdJ1{9:.a<þV x1Ϗ2D--HsQVMH KU?h~*M|Rp0-Ni/ endstream endobj 514 0 obj << /Length 1830 /Filter /FlateDecode >> stream xXIoFW P@43D/NЦ S @M%ä7 Wm9'{ j«|s[&WL^PU*$L._*wzHR7"i1ekWQym׿]80Y>_|P2܈ɔ6D!2ai?ϨzV\br_ZA($1]S93\RR'` 2S!B T#dR@k?"M]X̋n` {Ku]LvI^8޵ & OߠbzкqV\vkťX J^릟{wt3LÅb͘AB|9*Ed,c:CTs4G"SS[}=EE!,DT-oϻ@g1=cV, `&9/r?{I=V倌YѨ+>zE,|)b8l[Wpku^rXK>1PQ־Qd%Ȇq1X#ch"D-K/Ypɾ.=ـK0[/ E83j?4 A*C`^U[݄ЗS J aCU;` B!T{)U D`2[Ag$'Z~Us5㿢1(,̛2)t-*a2vcSEp}>v><蚱.X+Z>v E[H$`fb$9Wy~'ˣ`6i>R@T*jx 6;q9O5ˤn X=30\$;7oLy]7['\mhNw=2 [[4Ѽt1SX6\؈X$CGwu*Lh!ҹn@prZOKc4hQ&=50s]]-ۘ[mOWv,JzٯvZpN?2vיE[.}l,U 0&)]۶'y.vT>6dTuXLmշ {y?}LȬxzHMD++m]؁Px8m0qL.H^B7U7,!`@^z٥g,OT7"o5]0|LW:o9;3PHOR2Zd47m!9m}mX9 bޓF{>'6Igאт[7&m{̋G^7Pկ]CTu?0a@'ZmT WNHlgMW4#j q>?^^پ̐ MugAqv=>51:UmyOj OHP ^/4X(3}l|sJ%X V[#߯v".UktMk]:7Ì$AO;oЇL3$`uqr S#Jmpg|5Y%KF]C@c(f(J{:)P8ܝ,G-C17S[i9ܙemUN[Gb,?r;5x$&[ฐ<)ח| >-Oy}3ۖ(_?~V;K_.V =-VuX vAgqͲ̡L^>ո endstream endobj 518 0 obj << /Length 1786 /Filter /FlateDecode >> stream xX[6~_(L[} '$f;ΦӐޣq.ðЗD>sw' |z/w?I"Id4!!!LL`y;bA$u;nfU2nVnvΨ t&pyZ,r߳=Fr_u/~fHxw̘9ICD@ݪ/ϟ~W;T^=8B48 vYa \ƙ{^n reWkk% ƹ u50 gZC,ke#~:G4 Z'nmּ]xuf҂f>BJ#z8( K62q,ýoD!NU7:Oo ,=|Gߏw ]=`_&G}~»2[z]xsy\o5rHq:<.I>hh;ڬ1-F7!F#ą8@L3p(74M˼Jb>2BU扁x B1a7,pn1"P(dwU;*pwbu`0H+'@-.iws#R0a4m 6c#sDԆ߻+J$5 Rd8 L?'_B뱴-&GLQ6`YbHF3Nǜ{ 7XXq{hrAnWAެhWFTMm+=Xu*Dg;4 #mT\jH 9䚫_ p>ƹK"^f[S*ڏϽM,3bj|ݿ*_үh.cprCŁ&>IcEy7qv2I$N29|Gl27\2S8rpp Lx5Z[+ƿDX;ai6J0aVv93> lvyٮyWC Mdb}UzUfjِ+#{y`;]]g"{GX%uJDEX %(&NU2H*EsH̳^-^@mط,R!¨5bO  SZİMsm;t=m1t[ܐQSsܭ}Nr}Y֊QS9ު4wߨ%ݤwM⭈ڧr2i_FL*뼮Z%l j.x@4wܾa? { endstream endobj 522 0 obj << /Length 2105 /Filter /FlateDecode >> stream xڥY[oF~ϯPh:WEؤ"blG%); ibyp.|s]o~0ɘh҄ NYZ\G[ q{0!S {ugOUm_m<>p6Ǘ_kFI▽N$ YL!N ;&y;Z -7~f+n3ݒj75[[Z Pr<91eGvⴷEU7EEcd';MPD%$?N݆sb8!ɪ mY"T>9H8Dpb-E2/4sl?%hϿE>T6٣nor망BɄ r`O:sMp`j96Wy / ^xp FFAHﵭ֩B,/BdS^^z04D=T١)䲀cF !G׶7!γ).#2 .${[$M|XM`Qc~hL$kGiR]3ʋ6lsWغWMSˊ$>8:fC ;5D&b\gW6Ep , 9`);5Ǫ9I(#$(_cBYÂz3 +h1_NDJr`GɇR 0z)oHI_x[e]^܎Jmr̛ vqQAKK)wa: RηT¨%tYxTS̘"RQSASܕrVO?.n.\&O> stream xY]6}ϯ0 1#~SiE ,l>h,--9{Idz<Τ[XqxyRl5g_/^/,%bjv{? a\nٿ)Z{=5iӚ!f3_.6,"3m&8oWUkvޯ ɮIqm&IX:c$oO µ-nL ;v*ml4/Pt( ~[Tsx)EBRXzA9|k;1=a X0;Z [0ߢXmVVF)wm-[m0SѿGnؾ-(9⋂p:ZnE^f]?̼x'hiMK88hPd9Szl>8P`fgeδ9vugNuc2`yXÓLSJlW3)tK&#j HMtgiD1ɡ91Fr&Y yo|d8"^ZciZ4nvWn5qF߾ ,h |L20=OOd2Z|٦gːjkd.!pn)8ue)h>)@e@]~lmmnU-4}%e\ճq=Ȯ^d$>@lT>-K,#E8[0c<-61r ւD a0%Jte[xaE M +Itfޭ幅1Z*l]dKe,=@LilI,GYd*ll`f}ݯ+& /7ARt:ٸྃ &"8^,\G>y WWtCv&3F%&@<T^~s O #n:\Pb~S/ܒ{xe] DcLg7(3$pWnіLEc'Fp8pri) ^n0xKQĩ&b:;bs/ZWZ+IJK4O76$Oy %0ﯰ0mkoJn<678:VVR8gK?yY$ҋm]uH IJcde޽M9<}`pXk1 4l]d~N)dמTC>ViJ2/\ۃЍ4aE`s}sdb &of`J(A_ڷ#lv:MۑS{Ye96'xo#^OĈX)}FMg)S>/r6Z@Mtbch¦H7h@9lCPD=MN1t'6t4yi\ =T]\zg_zVD_FşvT_iB'_7;W(`*#(L|~ңǞJzWxfN|,/䦨n} g1V^J,M31f24TMvZ_M nB nN$+y4toΪl~qdޤgkQfuN S&2_A]ij4_ZE,E(t*/C:3{*nC,Eţn_.; endstream endobj 532 0 obj << /Length 2370 /Filter /FlateDecode >> stream xZo6_ ĬHItAQAh[%L% e[M\~`_+RJn "a/V(6u YMUeu?=G(edJTmղ(r cͮ-O}\S!K͆Q-uso&6465cO2 ȧeRɎLyeeV+ZG&aQ~D^o[ I, kd0j$t@]A2w,_~G$AIWLRM䯳PգS u۞h$Z]Ԯ36zx+4A]5okڎ|Ppf"s4Z)^: daQyK}9B/F(t=NC_&^'0$ pG_/b11䕉˶!Ф/6Jbq㞖Ǿ \0[UߢdX/]Pr i+YSI֦x_c`7 kY:a+|$ v-ڳsT\=ÔKg7qR50YmywɷZe% %[DMn^ k?4!1~\eB}(*Mb9޾N2ﮆc1x!ƀu= S6禼'R̒dZ@Va/5>fҐ<]<W KKBNJuzhV2<` >@ G/sWƓ=8@`$`oFiNA=e?&RFm)WQj!T;"("PNGnm u(.xDu^ 8T'f=#6Ypkϟ2igy}UFKܔթ fwvnG,Uqw(51]͹ӝf9gS~)t2ԼRy(>ݹRyw.g(Et 1eОBcz2c(uPDe7a/iY|3+[<?!ؕ:ϭ`(B$-ɧpi+GsDž €cF,ިhpljA$T9̫EVyZ[РKH\3ޫv\}B~z3'WgbFM)yM^?W))]S %`RYkh@ (&h Whf2  '0fatc窰HEh|KP5y,ǣ}fϩjObvDt0 1hI,U/ %!qgmkR5*4з]÷\mpG#dj-/ۣq*49k1R^ bIfN! ;h?g(r7}5oH? 6ci~$rK#^8Mur0Y^k_\Dn*E;cb>J{Π&c0g-lkٕ Ø8CMj3^^tޣ4VN;]*1 yƁI/g{.%<13mo0r~ݍ}s@SW h78]2W3L[ p@Q> stream x[KsϯP%RCkO&SImrH|تLˬH IT~|/@IW6s^ Џ1l3Kf?$~L"y:aIdƙ@zC^?o Yo0IQdGnDF'2 nUm"1D7\}d"LH#-B lrk+nKy:ud?+OK-zRHDur!X 9[d$lrN(" @meSDQ "" </YUk,(4HK_c|zSUX9_[e-)Tój7EU_W Yk? !∜S~gE>GDeRD=!N;T)BAl d6Y:m|\01ϊv]V i*yj )$= ׬ΉՒVF'/3 8Jdԑ;&oG#-D3:u,#ju4Oyz)C18 dJV'bDxFgxJ&;H{gqҝ@UFP(ŬްAG}g#nnFo&0]8UI:^|LRXѴNSi#Qt!_]jU(eE-Ę[IA')Aə8wcUg٭=fumAD p_"Ieԡv.yʙ=y{4q@8]lK 04m9O&M~".;0 2#w 6ݬ|E$Y$X{S#m(E" Fv~Ȁ3om!^|#IHJz ]Q)0:$y`q.(eG{192}r*VZΧG )2rɇ؟$<#ZS:>PF!{"jaB:Nυywa#(;_k]qY[1&@ : U gzP*JT AefʍۻR:YH0>q(x9@:Kmr.X9Q`w.'DXrȌ+Ok\?)!yQ_0M"Tll.Ye/i%(o2ğu"s_1Wש|*R 喝Z?`I 6eӌ9[n~0\j r9M! JG)gt[yzluء2_SL9)|[`#{]E|D[,z^v\ono%;aZ2H"J^6'yh ƥLmu qP:y⥝'1>M+2*6&Vhc m IC33 *)ʫ7hPr g'h8e{l\w7&|pa)ˮT^ruJH<`ڛ#<̆zu}>˘P6]s>0iH~- rP2~캲 Fq8F1gcL X[($ 4aJJr2L$Q.&/\Ls0#0<47(k BO1並L&oyNbGG- w'VOSA&Ӗʔ:Ϧ&b:#̛VC%˞ "+cza1#y=uj4R+ ͝wnrI諴GѰl26$]E;pjo-u޵[7fb^!er_~ewuhlV{\KW]q­S0=#*}dď ;+ endstream endobj 541 0 obj << /Length 3023 /Filter /FlateDecode >> stream x[K6WIyxe/<*[Iv[H%q"iupD Fa,J_ ^<  ˜X/L-2L*͋w{K )>a77PR}7ҖznDE5-8[Sf9'.I6s/E`Z v6]V;aZN~kt<k #ڠ#ؑD`< jIǙ.n̨Wm‘4R'ł.U<ҿfK3Yv"HUzSWrWW^惧CXmezOyzX?4GS|̫`}$ W"<-mxΣ1i 4Y.ܿ$%A<wǷ[͊>~1~0swC: I(m+ZQ('=[/ӶYL((^՜E9"F_?n w{e)~k ?4+"vRg\’=*xq/2eExܕVݛ?x(@c(l1[w^?ik8[| KW/R(ZW;$*ܑ# #qxR_뿜P1K**˜T=Pwu=(JfAPR@g+A VF3b2uw j͜1y s%v:Qj o@o``d.ijn Yr%~");rym6e֥iu.UEӭhЊ|zƍ/%E\0@31怐!Q =m5[N7տīJ ;AG]teI&Uy*\ ׉A(&髝bJ!| Z2<p8z 8!SN¹[ֳgJr1Wk*0RܑqN21s||vLgdz?>7@zhɉEl~PF0iaPvIcP!2@ShAr.!ȳ¹y?ItA,@׳˓B>@ `B GRrgMSv`ӤafM$!j4bH:(p8 pz7狖l7d#ŎS:cu6wbOCE^40MrhV1u7nZ.t[dHsd!Jc>* h`q]9~W-9q&N-hQh( g_ qpg2Kq 㐖YaA6%tq|gK<1`U@͞71Zd`I*F+cɭ/(HJIBwº> tHO~|]4(wV n7I.Xʄ8@|b{@z2Kqh>÷a wWϪAO{P+JWj@.^D:)Ǘ U;#THExJL:>Jzoz@CR9%BLb45c1ۓgɘJ5%8eP*7Fs:Qis=d&Wm,xDgœC'upHp02 #F%f}kg6W&T8[q@turi[ٍ㥵*mrykxL=08i@W·환R m \ZgԆ P羏H\R5mΔF}jȷHډfbpg6 Ex4S=8To4-Α Feb^eqS̍Q8 [~xUcT=ӽqަ)@#H]Y%Q-P%vRvMcэdS@ZYT =ԉdy"Bf{HNJ}HN.)BI !Fi|g' ɚИҋ#kj8y,sitc*"2639#ޝлMW'xigg̠Oj{>RF T]dH8ҫա#t 㠯]wm}TFjׂv'5 ]Ԛz]wP_5Y,y̧ɶz<_i 8J# x@hR)Uz3Y0ѩz(:^$2)Q1l.*:o(BiSsC6'~zsL; =$/~I<)VMx_!)[J}G l4/}Ү v=uim 6W6F&E ++co+RpvZך!E霉WK{2r@= 1NU YK%CQhR=MRY{8L$yAwRjw6Aclʘ,w12Vs(j4_S,#OLRz"1QH)(RPJM9wǜa3}z|>o yg)6$HCԙCJ)'hϮ܁0'!l \ ߸qHgM_o.> stream x[Ko$,Y*udldivW^f8)̴ZFN"FTOJwvF<㐻ݏ÷ߡF,Hʻ~|;mְD}*H]ݽg]/A]'/eΊ0zopVlC9y&Fy`=zVA\>JKN8F} P3>5ドv~rm]q#X+bCٸ"J+% j^%3h2+sMDudz؞AN:ͧۇp#{ I=p(Ëc|r+j`0 >iބV^Hj<1;-  Gq&QukGL  Y8ZkūF[%jv7rHε/Y$ p?wCH7|$?O Ig7ϛ]J`DQؕkLcMËtG{K{$#GڇK#}"E=|+B2+fd4.*3%0ߔW_ךk\=7 Z|V59M ŀؒ)83˚`uIѨw_> ME7 @t3ʔOW<87V ȢC60Uc6ȷgs5~zy{cRYXc[)IT0jP6[gl IDh&eHH*.xnR)AqrZ緦q |pYt⋭,!%ds4_9L Ghk75;=_]޶P 몊T$Ey."M`GcbwmDP wֻLwj}##GJV!MW銢@&5<5]"qT("SjIm,ml) < fn\I}3f.Lݰ9:rhAnDzYo}Zŀ!N=B%u#KD7-k!RI#}<*ӵ96&T LSDzy dL(*S/ӟ>Hp~IJ}&MRIR}d~{fF&OjXԶF(qwԟ|Y.Hjguþļ hy A@NЁqڹvU{tΏ jaqG2sTPR3);To_.77wWד ǓvԦN1a< w(yM;T9G[齡Pj.f|FyFշ"%H'BxS(<,7[/lLLD3E5[Hsqkw ~շI?Kgl^\6Nj˥$wq_[I1_ #6 vlnU^'M%-9pҿ˲[PcBZX6ٓф 'NXQ(=c,{`(hhKS+GM/Ye'ƫ)5N31Þ&1a͐9^wa_ӇaJQЩy(8Pp%iesZ9`(o64qy'y!-[i_Lk/wyX }  x$&ъ> *l tð17|߼5N;܊J&BmY:-2>I`O2<4 GփfXnu$:#,30@\J$4jc٬ YҸ+R0>+FDϋ򓆱Lk^Vy)*86`Nuq8[<ĐÁpC޼9`>&fFMRh}WRYmmNs.>iAy-NKZY4cNhدJ R4E-1G29^e]N|MV= N'2I U']?=f)tZKg afSϷF};5v6oK|OC>R&\8=Q_rϣ endstream endobj 550 0 obj << /Length 2317 /Filter /FlateDecode >> stream x[Ko#7WQ9|T  H5Ic cK$gv[ݴZ"iɢgcvw}_zds ~ws@Y F6L_Gt9$(~X{7r4kZ. ͕Bi=r{lw+$+cTGR0BE\y-hTBu3ywLo?6RC}80(4eyc8`N$"`@o0#2 ɞñZA/sVJ6%@;(y ~9=>ͥϓ`H3:x#Fx}y>ܥ ov7.cjv8Pd3 L2LGtF4$Y7? Oɹ\PjAcc37qO-tKucHpv5~ON %#mKBOeAXA֋ ͼ rBҾ_Np!% |J\eg_BbUe}۹ XtYzp;TT/MȬXg p4_L]ߙ4YP@(uaIzW1<odcA u8}EV^j w:$S|qp)`{=-(L"5oXΦN keߵcT%-'%,l\omH=wU"~CpS5ŝym1Wa,O =>زmF+Vc6weUg#_%vh5Bluge `MFdדx5΍+ΊCŒV_D؉E +ȭk+S E6vb3~Rm#޶ͩd7 |R`'X7: °aBeGl֓q8;n(1l{.%J8!:-vDm飴k+!921ѵ`QaNJ֥'k8.PaYH^LT0u4082{9lНVȴE<*R՛VTIy[!Zg>W$%XDdCp"k╋d@Gamf -w*mi8xjZ&tz%zVTD&6;3)RF?°tɀ0@E*7F45{?j$L`P2nɒfrwz} zC{ |{3kNq}EFrr2[*y@EIs6du{xL}fSwL3_g^7ex]['hܐF T9I#% _8Uo |UնXIvz8Uowy? endstream endobj 439 0 obj << /Type /ObjStm /N 100 /First 881 /Length 1713 /Filter /FlateDecode >> stream xZK6W^hÙ!E<@ Mm=A~Cۻj]Ȳ7M$Ԑ!eb\xKdG⩸*e+ᙜ _).CT̮j u @v1% EHrn%Z,⢠ -LV@P[K1+.4"&,.VIj0`2 Y 4p%5: d3FQ"ahJdQ2hZj  H"+k+$S@Llrr)zHqxeε^1g-Y4кZ(hbpu@H (`StrKq"Zf cQX'\Xch5$)#a((:I"'` N21e2w QOd3HpͰd[e04`p0Rdt1%i34ge tU-T,u%[RLEQ\M5vggjy칚Aڤț 욷i0M˱̣Gݫŕgӕ;:z x碛=E%LUf,.W[ϋs8b8\aa,5Y[OG~,՜N(8DrBS6י.wl٫W-Ӈ_5g/f?Ξc˘2bӎ x@q#zrVWnIDJEcVqiLqsC6EY^@Ddyn*'pvCt2Ag005NK5w!LS sܺ?̶Z+=sJ.+vXO>Ȃg8%O^axaLYWfMSaV* 1d5<gc0sw0Q؀wGv+sԚfL}h8 vu.vb~Ɠn}W;ì w{wy?^|N tHv^E'Gbz cˁFkQޭ̮|qje2@ˬ>titϪpTpIgt̓y2{8NzŞpx;.'!Eǎ9 ԩ n&<ݼ'}wôof5GLg}ve_KC-nm\zm JDY\{5fa=ynG +JksqU$K kg)ldxr\2K1 .!8*f2˩LE,M섭m#(9ƍTS6`soۏm~}1d4IlsF߼J!tD/7`{|h j endstream endobj 581 0 obj << /Length1 2216 /Length2 18036 /Length3 0 /Length 19349 /Filter /FlateDecode >> stream xڌP  }p nap]wwB wwrNrY-k<92 (ucg k01YaU,Ò-@D8 lNor [5`fdO ȁ jbaHl" ;w 3ss@eL `; dt06:mN46(-NCAkdJohHr0㧦Z8@ /yCa*8AN@hlktP|,O-Ko_D'l m-l@'qYz'7'Z_֎|CC kCK7 ) ɑ/ ѼYDdcur>Q [\+[_2LTm-읁RƼ`̀N6FFFvNt36gw;No=@v7@o SXOGC , `4f 6~Lƿ~ImL@bi) Q͏JSXcc11YoG:ȕ5)O)wA%z\ 01b<X_V$lmꟀor]VWdm}RNo dkf6Z8[M,--Phף@|oelp|ɿ]#lA&m :8þ]bx2 )0ۂRo ؿn `8 A쿈 ~7NS70q2~#VoƢFoiqqFo>j"71e-0ߔo%oN?_NDZ]~g9;Ab|+wqo-0w3f ?^?[3lMofT۷&dvbϠ?Z~dC:ӛǿ;m,z7Ƿgo~jv2w7N?ބ:z| }07z?[ <~Qo謹o+t.̂y,kZ\GȷS<~:? B%RWf9%t"/oQ] .={6AWl~zҏUn+8!SzRz&Mc̉v-VS4yv[q]t.R5Bǿh<(s4 j+tGXHBOurfv2-lwר{IXs_#8¢fdpH|Jdڳ]ՌDОH3-|I 4M> l?:Qmf!C՚tpBB2ltQrҀcd]vk.[:w!^_ltV8FO bЯ1Ǒ[B7ǝ_X8΃h29SgmU!L4'z3[KOPXJᒑpS_S|G28OA܍Z6z S;Wq3N>Di宲\f ~i9.&OuH+Ib'ϐZ2 g鼷by5i%~jSUв'-~:h,8Cʞ)GI s@RR6rI5 X}pN/Q֦gΓ%_ I zDRhuV,+?(ifb;Ԛ N\AX})X^'F k2\ARyWڮea(v p&J[WM$_)18!LpM #/jG ƒ%05?"A%B1p*P=bY۸2769lyNB%{i>K$5o-y)1 -׹^YWe˗ZDX|d?*#4؉F_=9NƙCUVBdڜXNAYl[cPȽkǖш볍n9!bq&;GU/#r?Q!Ћ>mV*ֹ`,J159y×6rȏTWiV~5آk/ 5VTqQV)vN7z]!ؿfu$}4oJ^0ьۑ|Љa]Sg]w=7s?~uG JP إ *GQQ҄䤵^ǁ׋-Q;ImMk%RoUhhTD-m쥩DŽأ֟mC7$n֜7HfaLbh`hm;;=.NnM%0qVby_MBp}"1P_Jd61E,m+H5BE(ZrC,2[:ܪ";~Ц59fz'>m #6#HN[5z(H6,f4N;om6nU&{kHNk9QP- (?~5LFfK VBIM W .Ҽ =O.%[N|/6<ͶSĞT=ŝù6M@Vn73ޫh[l Ry`YJӒ%Gm8.]'K8h__vh7w-/ O\BgṱA) ב38}H}zJ󡭗 L^ Wѥ£5u `IM yf۷{:Je}=JU`99{Èqn[EʳN_4&\/Df-Brky0`!]Ģ?NF>v\Ez- `^[ y Fu:cG5ڂ3=V1R笗RF5?T$ZPiC57swM+!o!Rpw**+۠(o&Rw|Sr^Si&w:Je~H&Tkћ=I0utqށ 9\Զ|ohmܮ|:U/9] YF~Mr%U?"*P~ZES9l0]uEAVMnf*ۍ{}jQQEo!k Ȕl2G4i]%QhCАUق6Xdםjdy)<8/5Y8,.jc|0k!2K^.#⢷4/SMgk۪hu??akƍD; 34Eד(Wجt~NvS.Я15J(Gsߜ [r*h1&-`_Hd՛6!݀oY}ܳb(LN߀az!< ;k \'"fܶF0?qv-ޕ+J#Vp1/blkȏ6ƪ4{f}އb~'Qw*}χ$3puwDޝ%N1d)"[&;y;҂>/Cv !&bC( .ƀ!Nq8gG= `:ڄ@8_Jq-xϖ$e"ٰ2K->P U"D~w_qy"âg=rX 3Ʌ(Tֵ{tCVsb%Nh${pz7Ʌl6DmPA,i3< %QlܒA@U.J}[bO(.oHῺQE)dg^s\ ֕y8Tɇxm 8YxÈun#J*!􎐈k Wx-:l+YAMcʨuŠ _AoE^a3;T%nC=s^N$Zr5n_y^/b>+wK/ ^V7/Gi4eZ^r nt4[6m3g'sqȏyuv|ෑ풕u;| 00FD-J/02 6ՒYiʪt\z54JJ5Lm x@Af1T>ZKUXGs@ =u O>ܹ; 65Mو.]V.J:##70iq{@͛MG4.߄"\"}N..t0ZwcՍ2 p,j'1=%vpzl /g,u kIv{fϾ?Fڎ HB Yas99jOo0qlyЈ`` (1;BK5ԓEJFF2JL)hugO/yu40*@c']/~9O6g7GTS IJӢ3-Yt![ ԔG.O_:Ĥ|Gl y Bb #G#GLA% V]ޒ*RW~#PoA2(Qr((v6+Kt. }LVvT(V7GNE|'*6mG(0ƸWH([(EikfsXPbwU툁)ÔNcƐp]Q~ @׶O0~Vw)_p%sE,lKL ggXQ"rnqrѪP\&biځ+ cٝ`sU&#Φ,@*M?WseyÛnDfWG|NAwwECAӄ1 ,0  G8>lj Ka5_u%6iډ=CÉ;8+2M[1 Jq뭿m8UxrKyP^fkRbi* /;ra"- 5%d`̢:>H~ VÉLR8c ֎R4&38}hŚ ›t0X{ PVՃ ]!׽ ٣ߴҨ}&pZU>3Ӈ׭a NbPcΣvWt~DҚRFYL ̌nmk2 Uh CբQ~ɯ %tC.5wF|4-戽Ppq-!idEx{[U ԋ舁JHK%嫾)乃A 旈x9Q^H1g`U%<;Wt C6R{Djٳֵ~'_#ۣso܍j1Ÿ:T=% %*E%+Xd[+a[N䥰Ef3 eRQh{+Da9(lL(@L=%;/%(56+@1?TA&ƉU4K;8iA镍6xoYFh{Іq jtukEMDXؿDvmQJypSkU~jVBv73ιse.EԞ6nIEjC,Xiwxݓ$]Qjg|'m>B\U8M1t]*8j9G |%ª>u)"%M"IުðMƏ3*+*}WXK'en>M8vy^?Np^ɴMx3I*U䦩8S%Q? ;wvelme1ht`1)sfFm_h&K ii!4 Z!&#/q6q`1hRTq7gr;&GHxoW}(SDN u{m1}37=tia_ie ι9w@tuI+saS&fSnEigHFt!h+"hքԔGj 0FPPmB, E4F~{C|tzp2ƁQ(Oebz *86U3QK\~${7X3C xlV!?&xř"P.W!,.F# iJK''ctyPG1[j]<\$J:xϨ]>5m 8gpO=unw3nQe-a4)k -%^wWWM(DD@R-#uViy)6?[9?[tᨬ} zlp|X3!S;QI⤞[[15znAPr!{*cŴ*cIuYE5 @ɱ98T)tCb,P>4qN`Ĩ%:IeTQ8E|PR(}|z}~0?9{Y6-〧D´4 v> Nm`޻ nJM1~xIƤC+~ @H嬮n=&ŘӅ JU\>(UЋ{[i]Rϗ=R^B87W9ϙi5z^ݨn:-kĂ5jBEbdx *;5=5ܛQjԳkx!|ݼATg6fw#gIc2W )ʻDoWmE7Ws7@9;ZkqY('= [nUЛCwTtQ=vآCz6 PU0vƢI#nDKF$sQa]-[O4wZ899uwflP]`QN5Fg o<)YN9XPM?^ώA|y7J7Q,4@. r6K$zOl\ /S7O r->E2L|^Kȕn YcW5&ixе+zPx 6e}Hf2+Se+m+B( rRB}" L՚p:ᴆN({&'?Eu- u)Z'Pud!+'r\hvVR?u:o,JAT$~'L$5;ds-'BO侄>y M+@)&C|W2 L^_AeyAV XW7ݣyв@'*^TVѧ:h@/qyi1sx2۲r9V5m-ze0 -Deg)gj*!Jv v,:"ΌEKY N(1OiS=zd1ϵT:/Gy9cQj-.7)$9F<٢=E|4 lh?A'_\N( -Q^L17p@`w"lKZkLϝuݸLϖMe'Fjmȑ/@m,/T`imQ fYtan&|&(CV# CcK>=f͇S 7dž°DL'r(~ p1Xb^٭ @Ii0ݸ&/4 ?.+GB:z1os{լN4Ш9v\l0A:nQy2S`^IJ-'mcXbvp ΪG!t0lo gYVT? CN"JWNQJ"@3*Fz_j)c*n m:hB&,デ]O֩/ sS]}„w {4cM7|O&v/:?F zSYwlP8Ex k)4P6a ?H|\L}EH<@L|+Yp%cDG"Q:^K WWs쨾/nJ3w`ғ-s ]LL,|^nvWrk5ؠFV,yvzBFamH({HD g%gu\}K/$S#s^] ⽘$c4bOAWeP<W{ϷߏĶ/)_vPX8C#G1\aپcMrÎeո}R==ݘq./ PBvu& #=m8vpdM tc'?yu-> aQ4=?/t%hw^&봝U> ^pKBtk18^ .4r&4YN<_~uX,>G1Pvp5fUS~`RA;^&pgD=p\ $_(s-=C4;dBj#nhI5 '4#Rj콥n,fέ$h; )_!GrXTn!CPe2x;?S0,.^VKn _8 ȿLoX&8s F8i\4̙KL $I,}cJ@DZLy# Ue'#(rW:9e54 Wn(/dLʞNt<=C+:()P6xZ RR9߸2Z}W$gmר܌֡s&)|C j)v1dC6Lpı2"@`) -ۛ * Q2Af-+>=R#m|𼳀1*K"`RʒdVs_"z|M}q^LiL cF}O<ȫFWA[̪$zku$Ur+YQE2Z)i>.1W.Zި'jwդcZ's|Bnȵ4җĦn-)κP%)WU}!*\C6KhU iY>;nk;nm.Lqe ؎RbVA>*70>K fТXܒi?;rP=مcfPٵ ^ SfY9B[!mqz@Gup>=.o&EED S7J|5v<8lKЪreBS_m:Uɮ_a12C/'l3y%tt2^ؕ5:sPW$Za Vʺyę u ~C2&ʺ#^<`:5.BoKܼ&UUBf֕ J8k_ !މCJ ywѯc^5UA6ޓj3_:] H{}d\R^)7{N`D8ZXcE;͍T,l1MR˃/RPZ%g@Г'"?#^j?ǝ8[Rs6T@~m6NZEDԋs܊JU۠ Yc~r]Eqvx~( ¤[*VvN|".=inHzNc &ܠ>fn.d&`eZ݈F rn uՉѝ-z09!KW D ^/?@nc]7O,;!Gﻘr9a]`/td/ ?0p[-ۅ'h:M Nb(~ؾu0^f4j1S*k;gnCI*@>xRw *)H203zm}`}[YՅ C9d%:ӊؔ02PڗєJNw>@yu,sځU)a_ gֶ͛N Tۄ 2dSO1qcS|,Z-u&/|mn3a~)SbHmC‚uFSpmfsޯp x, ?oArJ\i|!qtK*]VlViuW]^_r8~-+9jkE3Vna25!1lX#ۯVf ,1ª-r>S, QEɻ! p4l~/3e"Tg$ ulդrSy4E;Ik(6RmL:$Bl* c??+f"FZol &GAn.ĉyl6:wGi2H'3V%3BCʏM-8tictݲD-|`K0 u!/g_/?Q#:SZqG w"1;A 'Y(|uYɰy (A7MO*AD‚z9BH^Zd!R&hȩ*|xGoxsN$)M_qR[k`dMy^~؇3_q=ߣ|Qw Tr(+ՉPVf xͧ.E>JBӈX=6,5qu' Ee_)4$vռ>H4D"""!g 'o0A18,vr]E_ mRs;]J9YI%KT*cBAzz5Acŀz~ߵC-ĴBؽVlWTKɶ? L7H3_VXYG쇏az3:zjh*XF|/1)|JVM~| [/@݉ bKcɺHKxB04];Xd7tܟƘeո_CϖE^H%A*<FO.QsG+l)b &}_bt2H?J#PX>(aػT;Ua[x9>yQ4m#g%$"WN[|cPl:}]¨ג[ 4t񁨆j=1p2`ij CSSn}YKkA"Io_ɀ1IڗkuꟉu&;Ř54hx_$L  -]Xt;NQ -;o[*!Sgӎc(~c+%}O;D.sXz $uFTs>UM3n90v% ,y=n@諢,fhgҔ=/iktԌhΕʦaNkҮ_U1cvM_ܱbXmS0rYLN=.*-Ot6@P=>[hBCyְ9t";Bh.x6/ u ~:k8C6n-;sĸj}쥰ʯ^ 27)lgu^W ͩCs[<+^/ޚtZ{JT(6~U4.w-~sqe'K.L\7CaRP(a?f>FՔ3Uy;0v $,&vR}zgN9sN-H];CB1V2:W&:Ac|U#RAN[2Ӎ$K cGCWX)d_ohO,/q rKbkQ|qBDW/*sQjP>^,-2)TXRExsnj+a'lcw4>X,}ɗUqb{;WB^2Z:Tt5@:q'CB{H2C4"XynG LpPN<+?^5rto#P9'ZGW2D;_VГŒqq=:#(K=G_-}{sR>K Bx0-LүJGb@VմC]9r~q\sHt溋|"i4S4 1PZD0;*3gXq-}t>5Iq.WTw=XCc@H'GU(e{S&3Rs!#w I+2PC埔0{I]i?[=XTz( . +}kyQ-~n3 5kRp/II2 ([Ft[L4K[6}U2lXK\Y50WEm:ҳb[H9n GAghgYޠfL'I~C_paa sﮥGqI{f >O_dc^'q^l13G]^:fz=!j2K 4uQQw7 woeqfC"IΣWvgh^Kd'T+XWqS/<9+CҊ6KW OA?kȴaµ#ۺfb© Wui_EʍT/?Kћvc&3/jbuBD 4 1ƅORòWy#lT5RLt*b>q/f zbEnYcEbL<o\ԝF\Zܶ&cU+D0Qުg(P*HջQYTnLv;,|p-R|4ҭ' m5tT3HUN`>YbĚ[/r(N>1nI.br?g HS= mI|e";ZQ/ch~d/+ϐ.SyO ֏Cnm%ɇ7c?w :HWe8GUB BP2Fؔ̒{M7㳂xŋ:a GT&gYff/朣R[7)Ҷ˾+:X zoOR=2$K1]f4`d*q(cFGWX*`yGӏF;u!j=[;N8LLl]]HX컉oItZE.m:ڥ)ant-gIX۠H^P.,u' H2l|8@멶Rj_C+9O1rs%՜!'GéLu>q#պ\` Yj)͋e8&o@@c=}D3*&Mw S#L)3Mts787l~y=i~&N%=Ā&ckа9biP>ckbfO%b>Rmi4N$Q  -'C~ռmJ&%7E%ӃV¶ $QBvZ"lf[&连.4bi/»28EXuhhPR yϒZsak_\`ȍ;LirN?haJJ-jI~.S UUq!ђjCv{iq`Vڍ?_.CFqUnf[{@'لr RCk͊wT\b.?h3<ދWs3g 4z]=`YfR<΄ XDT1PY\=7܁hczpv1 ȃ)̷*n^c҄Cpz)|{fib+)BxsjL?[׻ڢ^?5w xrWEoMG ~L'wH i"`g͟y Os$Q|,6!Ruɤ^#n$.l(؈/E5'>Xiχ#enT}%j Kd J#Txa-efJ9Eޟ3D+'Ag`c~{Kq>oh0\u/ъg$Kƒ2MUн;?;-Q{r4X"bp$#A$0:f Ë.USHdb{O^0'v5gń;<$~R̢m+ @ewQRǥWLJ(kYJF:ͨwt3GYZVb\g+f 9i3W=iAv"XȃٓpB15>fՓ6s!uޞ)I+cjP]UdKǸ P+ ɓyr"cꃲӡ%$8DYp{2nV䄛!r]W c,u\q\Y723 nm.$V{gb;aUh,Q+{tD~&CeL: JDWKSv4YPUN%Q;<˰ '49ʾC8'q{` pht@nm˶N˛pCyicr_QP٨Ri<CRv9Rf}=aBߤ<%P}w" ß,vᓨYvA[ta'슬ev?5I=jc1t~Nv:Uf&+leI*-G 10lqV嶚wf!]Q> t1&|L̤9$t᤹ͱ~&&4 ,HCb;r |C#}yaQlf:"5iЬ:% Xi,gkC$]Wӆ׊$]GT}&ݜELe;|<:t[G/.hOG Տ/c z&}.$ 痲0 endstream endobj 583 0 obj << /Length1 2211 /Length2 16083 /Length3 0 /Length 17401 /Filter /FlateDecode >> stream xڌP[ - 7иw-xpww ̙Y~XAN$ncHD `b02322Ó9Z#'W;XsBt| lN&;77##?6Q@ mc r'u731u|G!_!+! t4Yg4Zm @nіŅh@ocoOE p1s4(@ #_@+пÓTLV(;Aw!dxP|Ym,-037ܿ df/g-`lf |wtu2Z:ؼf@w ) с/ yoDA}wcZX۸X{YEɖA $%ow @ %PqK-t@^T/gb: @&fA7sh1t'W1a SRXAcfc01p8^Gh:JY.O)3@o,y( 6#q)+ߊĝ,-G2t:9o.X_Su߫+lciuR]6o\AF frտ``cbd?2x>g_*oJ1kC33}@b eg0% `/`0AL?  {"w??שGQޣA"wzA >?;'{s>?)/?½7/d}ofk~xWhN?;uNOdwW͟bޝmGNͶG3+{sYXl@`Z=ӟy\MAh;-G83s|o?{.8w$c~H Sς:ۿuoމ +~qƐ'g`}G1i*:EVGdD B]+[b7KD/GM!a gxg)Rm?d?i}/{6G0v Qtq5>.a ]Z  )pɔ8F@_?Ioߏ tyw!TvJ@QiҝP2OaʹUZ G#er6?9*\ ;BoFFqR%A.P*JAgL,y#W3)*xr$uxeXߓ7H4;oMshRT_]*.kb'67E (զww [YАg.-P:Jڢ܌݊6 Fmn6bdLfDs~u*̄z64AwtoR.b)ݒ,p pQ䆘m&BO2tU猛\OΫƾ&M&њNc,>{s0[8CJmzn'[)]I.ZS3&0:o_J*X,:5p6QX1ja*Kϛ7ITzy 8$x ._rqu3CzrhJ ^'xУR6JQ1\ũg2sx •+%WqJ͑;(W V+u>U]פֿud jtI3K2Iu9*Nws_jbˈ9X#V{ai~ T sZ"AX6c Y7w#ʹsjfqObͥ<1o돰WF_qne2W'_k Grn*h[ZD'ӊÙTCO-&X> pLjm7wM 8QC$JmTi[ŒF&Oϋԍ3#r&6z_/]oypSlʔ?0!o]AV9bQ%*FZITo"qAl^ MI&A|u3g]$T@b2bIk-JtĪ bj#b&_R`u~uOF8 %cĠpLٯ'[oe_2hiӲKo(Ϝat"Pͽ#ާz^Dx. T kOd|KH8˴M#@5_nr}{\^{f;S} & `YM!Ke4Н)Ӽ>_ХT;bX [|@&-W%p2io|-QH茥u k[f[@ۺ)\_㉖sψ5y5AבAomݧQQƃjo,H]ňtnoHBT}3,%&aoD%Rn#K3pGvA 3j:R~V5jq鄨Tbab4פ?]CS5| e6kA{CH<47tsnz}/*yhSY+cB<Ա=(q Ҧ΍v+N:tZC=kcQ,X"JҧVCax|J` ʘl<^qC,; p=h]~9lF(56/*1)Ê>vx~xkUYkkfPËw=tF.dqLF0Oqşes D"9^< h,eF-R堐?k&O,7dRZٸV7'7*Rg:mv7`V]il7%Ya`yMe,S" ]N"'cb<2TRCrN;(Ƈ{ڴ&Zͼc( q1y8Z7}e#niRH ʽ&Wz)XD*;-5#8CvR!q`NRtD0Bz-G:›q2%ܗo$/r bǙ$Ƹ4BC,[I߀Wa|߶H0^ p rK׬$ 6fnڨFb~qE`-rTgo o)IRk $j[ ]јLv R,#L--Zgi@_΂Syf.{Sn/Fio]gCӵ!A:QgK;@_++A;[YsrX=:w9$~M7_K䬴H7F ]aHx)}z"m [8QT&v2l^wH7š̽Xm T?v`@@"c#hdu6f*;RfG=ʽZCnX0O6z1sA {ӫsHާ'sXf^}19bD^{)΂lZU9Wkah%KbT?R;ɈϝYGP,xqTC{"kGyY*Ըm2$I3ҽ͊zmqcuBv_SxrWh-ԓ svt8] Kgn(V ^&ȭg30aʡ by_iڵ/IVIv (y*K&2wdLORѱ S][qBefIN!ڗe\1@d ΔS.u>H͆Mu)\6e]aƞ,q6I%A#E R[-JH旬ɘc<vi] Sv=euӅAɴewI9sEk5vB`JSdTҲn{c>QMLxOhB a=*0BGH+`{S{sm~.Xs}# nj `g )?G]YL9 ôb,^'y}DzU'is`m')1GrfǕft\]#RCu?:Iy<Ҽ1ב p#(ÞvW|!!8<#F" reCzAH^#E<P9$71Bn1ڗQ)=Rv  νLN>AX?onw@0X gOzcBf#Cgca6GO`Dtk(s$PQ ǔ=ir*ZKʊp ,6i .@5ʢCLAN]Ag3BF~z!:, _k,UoJQ^i;"~u3ݲCc6c ? ONJ;S$oRos}ήǵ^ Ap[fhuPޤmd|!gt<*+A5>HNs@Dji<_se&mha_˙g|* *Hs.4Js-@$ؐnO AH2̭_ !AҦD*-&fVKaw76NJǣR'?~ʇUeՓ_M]j|6mq}F}Zw >]`&=5VfܪFDo/.2p$yH4&IC :$(hެeiXcfS'[2 )O2Y<;ׂz"@Aʳ >{v)Xµ}iU@fy\:Wʣ+iزo>rHZ ]z,)+y%2t{kIbX, iqCe|})lN7 ѾjgL9YoB@6-tFD =0BW`o*zf8C !"F򅒓AjkDWYWoP0U]rnzIS3,]:eѽK8n)pB NS}YOrMy=z)xNCGy o>X+0q> rh͞Ĵq|`p3ϺuAƛwe5e (Ozh9a@ÿ׫KpVɑb[qm(D *0g}_< 7ϛr]SnOFM7??ɬٮҦmYvbVt2R`kP -#Qcre5iL(Ij#L7x, <׫#.uĮb-Lgؘ"8:,r4w w{ۈk}eU?2әaT@}1pi` 팺&+Ԗ#,;J/ETG:OHIl)P(T~irZXqAm6("/e A- /hʄzeg^]5!}yřNe|Y} :Il痲IC<,ULP ?SJ$ANƿpM|E{|'gWGô:Lwjج{ ??v F9 E _ׂŖroxTndd2yAgNZkjUkW38]z@IXM]eCpQF3p1l '-+\eMQQ`KW# SJVTH0 oЗ[iWGwq(nރ:r Y?~zHW@MngJ7@vtͯwtÁ_nJ[뉾w`O  *wf) ŷJ$,bj>}YaR& к. il$ G8_% yT|%Q4 IqL |2.OH] kRdDW r=͚!ЗkƱ8ur-gPH|rΊ6A޶nւ95_C< 4Y] m{䌘cdiП:@ǥ%3}+ę7U ѽmm?3+?$wZ|DޛEͥHLcC/:uM#{1Yf Nj48>CZ(c+ymzdgAMp),  o5V V,? V#Eȴ5=+[Ϗwm;]#>&4d~7o93FcM-x1٥WW~?E惘Y̋k;-dyrXC)I T&;##URGCJbKZT 2?53i:[ -`i7-eY@)`>ڛT=!n`E*MRiu_lǏ(ntk?L.}A$=XSx(k&W)۩$Lu[pk~tCVOSsqScTs_=ec"Xg#!غ|GU_(H5{>1>coqJԕ<^qWۮ8TrR֥L;9Y72| HK:E!mAЧmӜ6'eޏz̜d^[jSkeZ^jF{׼=K.D2RC?4$l;ջj`  &$ꘁh\'5Bez2hF~4 eG+*[T<7uɎ) [P Is$LXsnVjC(~^\;GKy33 S\P% V㞒+Isw}b#ؼzOCP{:}a/eB2E⫑-CG/QWM;񛃼]5,Bx4hGـ3ߡj`WFe`_8(Pgb ".^z%MCn j](,XPo#$I;.K Kl?w"rxK0w N-= Af!y/%9θז8i(r&s[ E3Dxfe*U fC뉯3/RتNfF\\_>\5'8)0)6Fu$V_X1Tt$B }+!ö~{E v 3\`.3C~H5;Jɫ ]Еt>ݩ[< qqc2bpG^%= I^vu`ԲJ^WDycQ {XVL3+?7FZázT xV:D:>JWzæ+!J֑/(uqQ[v5B4V{ :q{|fW#ڡd:|ғsd[(s4! &w/ 9{LM~OD!qO֧Ժ ܠܴ x> Ǫa Qz K(Ɲ'SxE82D$K0a\V z7v) 0.EͺG:7@7(a=}ͅ]͘q oU2Ha,"6[#0,ŃU_E~-&DU"nA^@MjW.Jf,=n _ҫA*dMSFA#Ұ%p&-ߙ? s4j RWN|L5K#iUѦ 6)jlX8^P53ux˓TaHx ӟx"&mRlX.ZʸQS`k a;gCF`R*oy5&_E0]/ C[%fv:n(NGID (Cqiڿ#( ɘHe P4~Nl,0ohNJ ̶1TMbP)bX`W ꛱H ]U-rxhiLn_BP;B8b@h^%mI#Ql(ϸg  8ʒQtO";*ҘuzM䃠L1! #e\,AjO>4?6zT>bp?0vp4Kk]fiwq#;4F8ڜM?.Ih^ޱhѕ8oڙWW֑B4*7UyCD{~uBm;_>&I ̄mv.,at)/-lRz@Lޓ#:ynjD%z4M ^GMM[Í&UͭI0 kAroz $,a@ 6'72q=9 j_!zvm>ӇПxy}Bn@y':)mLfx$hܼ3)j680CoLg#[ǫ>"r_s4?!}KLk*]2 n,AORS$HT ՚EzeMh՗evA r[=R: &V9lGDZB(Z 9INv"Gɻĩd$xA.>SH۝`IjwͥmgT[ ,= kb;6.2 "PKMO8ޗh#cEpڽeH"ñq 鑿x$#w~gAhBҵb[ qƺq?{y渐p4/*"zU9O5 ^rQcm󛰼+ԧu*%'`dZ 9W4`kAst^ϡau478KiH<hE,%1vh?<׃H/]QFS0E)Oj#V5:_:e x #L<}=>ćF O$,pވ)#w\>V])|Wy'`SmcP^;4؛  |Oz{Fž6([*ӫdԬRKPH$|V0 Nj(+0VU(-Ǥ4q촛=}} c*;V+y݉hzJ~NQ36od4j'--ey-p4z瓷IqDb/l1HO M"b(9Or[^H1fACXM\w-X0猆 {;ǤaT 2 RMA0 j'X `OU5A^)7'fSwX0/ђ`OEid .EO$t#),JpV~/L=ҍrv;)oD[bCe6"%u]5E# : ҫ6B=rVuqK32ZkOޜz{}>S)kSz$SKT:$FÓ\姻* )oRڈjRs)Zccކ|q*_fu 9' 5'.?_!4+df}?FZx}ja'CWIno\ {dXﴯ@t[Lio͗ hvt{fWF[7=LPSͿhxqYȺhaՂ}BfΜSoj,b;+ctO ZݍY ^8I1_WiƙHDFimWګkf% |$\yx4SVRL g9`˿ts*0~\d#9/4UqvBGJQg8OQ7w_Vx]za)?n𬱹Dgcc}vtˍo* $] |-ȃt 1س_ P Y.v<52r;6#EWoYLۼ[NwR\B~Mc/bs$ yY [zIoacKμgzn1Tu~z-<&V=I QS.flgv 8aC1Mrȋbɿ,5+ y<>aNn&0'ˏNiK8o*o/Ý6wIfJoԁ;nvX"^#&gבJ"ˎqJ軎_hV;&^Xo Zsc>RMv{ fFėNMUL&OM>ku,V} S]3 M&@SGnzplMٗD..‚-xMW1c_!t6@lܻj|y[vt%Xհ،Y=*h"ʣ~-LPo^Np)e~&x21H*m{SD&oW RJq)͚W[.x4ͼh}?FTLXJd%do IXdv)o+r]ϘѪ\X{ΪGb N T_N^es\H7mb>;nW1Q{t=C/C3̫Y&uEl<_VdnbDu1Z72]/1U*_ 4;:T=OTa]Ж W e2(Vݶ#0c  9(סD;#X7xlنK e~ e& ,d "T]oiO--\5ͣ<ZX]nXa1P&rZ4jƄWdtXGl;5-z5dE4QuL{ Ua JRg 굒 4o̙tSh\~uӜwri8nN@*NYiq'p󫑼DÇ%.9062c4x"J0 8nG$ FU siLu\?A3޺qZU>"Ȉt!!7f3pr Ux*ڬk\1I^ h52[zXRp֚{7Էbq'xNC%hݴނ7CQPt>Kn`Oơ8I J6mIY t P.ICOy/sܓ 0:H&|2ZϦZtA{]g YGJ/HI&Աb&7B?RDi~KWFb|y[1bǼUegt)9&(e.Zεb=A]hJwE BNaf辆hvQ{cv7RAJ{/׎Js[y[q jŬeӈ*U-F"ԍ^}g.N/D,44q:Z^LA\%GHh5B(2_,TrT|6]0n)ƈr*V-qɻ r*L`o.R(>SG$ISuu*;eiӼjNn5Ĥ{h }1\tkq6I`$'gGJ*J|ΒŅ7xɛ>b?+)?MAU1zE7:]q/Pfxk1l-4z!؈b*`Fǂk5mh_-W^ %x߫+3[9[Z,NA(#|km](kۮ <ёV4S -B{]6Bel\5 lꕨ_?zJMұܻD"<߲j)qw|t|uU+Jwxm*d"z,y15N2f²dن%@^ׄB8JhY,dV%d6R׆@HRXT Jk,DpFlkEaDKN[v? SqByO'*.oSCkQBۚS~;&lㆉn)[<@GOT5BV :v=d.v0Aϧ[+;wHָT h䑊 kmc1OpΙ4cAQPϵaC3 `4bؔ;Z,cU3Q>]WT s%Ue8 QpCPoho|ٻD~χ,L5Uwi]陣88p(D=+lā_$9W l׭DuT;0qi`j{h]._$Ӟu ؓ(1;Dr`vK#BB톷۠eDQTC?X} i*CAg*-Prd|3`wû* v2ߦyUħ׋$:o<|JK@jySɌ$eg <>e{_4Fy> stream xڍP.SܝBp'-ZX$Hp/R[q(V@q(l9w2|gNCKjVB`\ `Mr#A/g?H)98fSQm6x$qԠk_S=_K+u_ kUla +u1[XjǥbY?^S~ܛN)Z`|B qďH`?) rCGcs~+ D9 a~P7U#aP$h :ѣ߫7zn=f=;Z\m VP7F<C8[oX#xL𼏇/]ct wǙa9<=~Tz]2[<^r#Q`O,BcT:͔o=CNzob0wV9 p/z{Rϵ)9N2Wx&͒x g:y򡱵!] rx u&/ڹy¥wwѥGUQIӿilNj( kfrDpm#Kja &SNYR q6xL #5[^\Ke"@J.WQO'yaVBb̀!Cjg{_p^HvЎpf]iM' Dl`^˲b+feԦⲹ'7vɕŧ>DِY&ӊ֚#<,Jrҕ=؁6G(ϗJ ʺAĂKqKvN2>`yWV44Tm'OMA\lN!J\ij׾}+Sxhמi,dLwA\:6/',nUE)cK @.Sm K,iW ^$pJS@[o{;˸ M4" ?yO䏥tjdV-JM;-/ldp=ixӶ_% /ۧt$<Uf4A;Ij{B@HJpTEm`ꌫ.g' ,!oS{[Io$x`tF-q,@T-MK X%/42/ KZfTMr$Y՗EWUh9ƮFٟYXea;Wp1Rip(fJ "NL F:uGpn)XZr2jvJ9<0j5f{f=re^2GȆᎧOGrՉ>5~F-鷍/&E%!I/y{m%%rg6 xQg/&0]+mjbH+sk^wbf1Ai*ϸ'u6i HucANTR_2s'u*"h4G +@5"ł\^hG %iL 5+dP"j+?# /;Z.e`@e_a:гk tB~v P<@;rvRڎbNy^+N p|~u-kDMlh?Q]g'[&" G,+pq-zldp l*XʿD,~)Mɦx UZgF@ 2uqEt]e`8f'Li8S;~0d.{z*/}d6Z1(҂H=a@ȚkZ.lRNytgZ1)m?!ӼKyXVw(ySф|iTh~GAiHm%Fr JR'j X6"4Nu 9O=P^6_Z`%xg~]9w צK yxټ{fCqsE,$ ho)kJ-vܒbrY5%6;yCNϬqQ V3nm^,dv,mTc' j~# DSe&1zyH5Mu( FYyjbz)>xYzm>Ϙz@da(Z||M +!o䅡GIm b&h]^AgI+_P7H-UHE0a?LYu̍7.5H&eV,mYow ^s<ziPChA;)ǀ)o q} kmу}]Y4Cx!iTYoaЏ\rY V@n1z\Әѡ͡„^8k3ndf2CR\{$Y}j@WG[)a5nBeݓnćYgs*s kzdǂ13:M Rl?Oq9[8MHw҂,J7ߜ'bDWpo. fE9 _KwUܣ$~IU 䪯aٌvVա#ϗi-8/~ Ύ*23`pޓLEP^H,0HvSA <MKE}ϸӤWO Q}*?JѲRe6N;\W"uJS ѭU>A+aV%X+AC_It,Wa:vgm.Wˆ&%G U]Wqx1ٴ4+k*(/S< a d"U>޴|ë $8^YJѽƺOOx81 3;9㽲Ƀ љM)^zk\,^~ذd}u;Jv k$ q8C3R)9Do7+k\0< +Bi2iM'K3~R|\}01N{ s/ރQl2hT%Ili!m>I5١sC"ޘsr pMgZڳSԻ=x"!A &xюJU*Yd޼*%aaeXAs4 50grK\h&90N66Qt̶y8Uy(r˱g:>mNE%"ȰU lFSV0DOkZ4حکwIs~/-6֝Ax ~2Y7gR+U&I]-zJ~eۢvzDtۡ2c-Ү$z:U8\[OaB$e ]?a &py] f%=}&ӳz!}1eWn]qj~819OnVW̞~p|TV %}n M˯]!_Ԛv8vDfXx9?Le8MY[ pfs&Y#~,wK)lx&Yų#s>]G`Y' V=\tB&Čl?d)VN7=hi$껥|ʣUa컪+X_1<GkNx`Nt23=šM^6|h 7^55qF@R߻'ΊBj”ƊNK.f2c, v͉Qq ٧hC&|b_updj`d~MhU:vQ01FG-m5c&R="1pTmfOHuLͿ23 4 74~1e%ke}zC'kϥ3dܠnY.ܑgYhPHZMfUgrrK\?lQ0ܛv\(J~MC,`:[dʙ:~PnP%t!kT8յwOlot4"^Ux!ϙ^ڇ!B S5.BedJ eϕ2~? 3Con"׋u~ӹW!" {kq\2Z;wl&~~{Pl[;VnխA#/I1 ֌}a(Ge_ɤLW"cm|ޙ ?ϐk=DtxףOW .]  S9WNuQc0?VfnQiW\@$[d8KkD- .LbɈ:M*.5X_v4BFc}+qkiQ萮,#->R oo9m7 r 䋏뱽{vWd 9+0ώ]lNj34p;a}W Т7ybj{񤨊Q8>߂oPm%5F TP`I+`mMd!LI'ᒜNth_h A|^ ʷJGtNRT:)Rҝ>_ckT^ypkM4E2+/{"{I↬#QwQ$]$4)/SRfϛT,5ׄozӁ96̟zkpE>ZaHEfrc:TNQ#1^~ld%L O!lءgXUYrMOD1[æ}No2 '!UĂ0,r\3tFgo}|BHaJ>v4a'mx`*Me\k>>VU@c/gEh}y$sG>3 |wn%=R#ș/ݹd/M`݈"V!:FSu}'g[A:xhlmfc\wjOsJ^e9#wԾ$xf""*01A-q~&PvMUSSKI2$5t@^"NT>4 |LJ7].~#he2:*8)G]ya(#p'\ő̍h@Tڒ!g-V{y5 85 I:])W i(>PaQB쵃5$'+Ο&/E%Q`˹l^ydā%,~6s}3AN`0R-`DqjX;SUyHus0S?A&K)BE|Jf :E&| JxNuc`L6f37-ٽ%Z[Wpc1Mxf[e/dEwcE>|c=1jC\hGn4)޽I~SGpRlW̺YL)EmVgxaCCV"O(xmbo "Q֠IXW2tוHRdp'gfS-uV6,^1N v|G#>71* vx[CkP9Ӊ!6Wz\/DES$k_3<Štyr ă"JÍ=}diպ+(EuWn֨tyoU X_1 ,ZbF6gYW` ̍LeV#BJ]kT}ex(ѐU?llMgw&<i(\Ύ-.Ndj8h^R/><TY'V<ڪ ?ޣvn ًX3Nc|)>\uvwioXY8c˴Y^g~h6[yчO'ǢbRGһ9;And}ς-Ub^x3afy7t D> btYԾ{@#xZ2\=]^2MȦ\"n-0h Ycճ="s ]gC2Df߮mBGvB!t7*ɵbMo)BA]efdhFdVQ(G\{5eo1@pΕ$L 6ςnL,LC, IHsy *!h((o2POz7CcgTBכF9.x˱~#"Wxk966(*iRN'GPXmʔkz8pnmS:',J4YMCDzIFUY9 1t?QdܟyO9D_ĵ.k$k25zxSK跚V# [@w/;Q(e UZ\u4/j4.xm(;g_q/V'sRD10ʪ|jc{J}(:Jhbj (\8rD&/aFd L$)4sg;$4A~+'/V5Ixi"ʣ^Ji; NyL9e:?557X=0ߜS/xnԻ{DFzg杳9'jq_}ܴ(A)Zg1{IdM [o' }_s鋎^мx9l0l Geq̉ꛆg7u3@[٪sv}gn߰Vw֥(0ֻt7ё2LDcU^=ޗgPȭӏEa='_޶ܣeuTo0vx#&\/5+q[>@jo'jKRЙ;@4XҊl/rCD3Â7x鱯IU2?LN[}~jn ̪JT,j^DD~*i[Fy YKS8o,O+`;ĕYp|AzChgqݎbzwd^H{Jyװu{2eC~Cv ]mC@ibG endstream endobj 587 0 obj << /Length1 1468 /Length2 6663 /Length3 0 /Length 7662 /Filter /FlateDecode >> stream xڍwT[.Ҥ7^BHB{.BBKH"J{.;HS(ETJ=w{׻V=3̞^ox8 )#`wX$ P 0$BcǸ֓Ph8]!TP0S`@=;@+, KH%A to % Pxzm; M£@N>/|P~I%7  'vG(`au`@0 -@9 ' CyJC`J&8/ *\P;`wk 0'_!P( q;00#B\?waSԕ lCCQp$-+ Unn0w W~p =w溸#ʰ=´T`*t0 @$%)*%y`P' L|F/5?$ p ;/?4  C1;#ܝX5/`  z2wjJz2'$* 1)$v8w!?y/_-wW_b=τL. ӭ@ (.7dg/a]} }; 55z0{Cja qPrwRZ,& KGýaw_Kok\4ˆ2 Ac Ǝw#0P;5w(K (ć|$c;u`k8 P$-*ة&5I7c"."ME"–Z_07 Jq snxVKjwwUұ1n7l&pЕ8 lNdZ9~!ڞ־sG`dYTŮךQ{ngiPܶxȟ~ܠi5_jmC +5rV9UXc)?uH>m֗|PE;2\gvobN0>Ad˪կ<]ҩWno8 rOXJe:uȗ G-*J Ϭ16^jq+vYݭ;QO8]t |ͪSr[>^rCTv[zO? guVhS_t? Gij"$tb7Ol%{SlQbhW `m17%؅hL_"U;koRW )n|K Dk88Sii yYg\_rEr(-mد67+,>Ӝ#jK^%M}uAXj Ϯv8S߉>% XQt~k;߯ u ujWBm_xYB-yAΩH;tb4n /% A^ Mn9<@flH]|66܍zXmaIip;c CY9 h7 >K;N! Q&\ٺA@3w68~ ޽=1K=uysz,[~f% l@3U-@v&ռԪケdd~AN&\} GKXQI)GqiSOZ.c۾on^WKK/1Zx INux`o%Em9~w9Ovis=\w㶦ʺ"ZF b;4ys6{at»|Y?;Nˆ u'yz{IFY)[:=i^W1dRac=,Mɖk%$`ey@s" 0>{(S2&l4f}".B h^=l.I9ArhO/cӼ%?x`aUS7h* ?':1T˾+ ) p{K= DH2 KC@+mh oZnCB/1!W"rOIG. B,qHYpCp}QiVaY ?LOy ߎ!ˇb{WrQY=}>:=xjE׍f&bQAO;eu&j fv@"SPЎYƀѠ.Q;^ d?kZ {{t^U̱kuQ544Ql:繐3UOd/6]9+ :NFV7} 3$7eSAmV9SU%):?I<)SgG|ٯ N=`@dw h()\[+~@jzE] v_[9ɫM47pMn9~2dQwЋt=5dv釙^ÕrcZufy4Tw`a\ k[o}S˺M?up\;Hx{,4x?6 ~KsI=Axmq.n0ijiwW7xvBx}^hI;7YLAK`ҁQWNtʚ>+ql}$,(fVC ; W#9C"KI:(.fE6twFUj֍wߑʧQP9Z#[!*ޙ˼/OuKj#|VőKY {tm->a tnF7-f?hLo>- >~b,H~JD74=hEZBv]DĽ'Mh$~Rk-57pMyGY\ghqY\NN9偣c&if>:{+g[0K7j|?hv[6t7_,DBM+sܰldenU7VI"k,7>^)ڦ`ϻ7mR0ƐBſVYV}U}ݣt1_ֈ-a{]D/ј{aL'\|囉qh򾏝OQ Duxl{jO.ZPlVv=FPn-Mr*WcH)fk0OJѶ!$i)|tb|ߕ.]:.=aqW\)Q~T/ mZ:78{4)ό )7%ߏ_re8W'+7U4(S%/tHP*-Mڮv;KIqq7>4-8`ע2$;v7\;Շ XהhWN緞OLKF7,:H^b4UeITG,*'[o._ e@"]A Q|tA*Dw^|vS6qU&kƻ//Ta9 o ,;_lƅN(~V|TC3[.9pb)cEco+"m;ε+&so!LFNM%܂.`D ȱEj[v*5{}nlk Ng⣺>| a뙼܁G*|}3]SNe&aәvsCd aQR!;GkUԔTsB'ջοy#Dz_W\-.ї(h8K;S9 MeK:%}LCiwCfh8R mZފXLn $Cҷ#S! s=⫵=]"Ͼx{.Vl&0*[WKRHyj,.cՔmo=0IXyЏfeq_-. 1?EM& _Q 4HV{,u'vJ!M$oSM+{*Ϯ<{b/q2 NFXZŅ+C2"5] =M PZKG0O[Bp p(N6"-e H9/ R) hxVSi/ϳ-S\R2dAO~6]Y l9|/Jj W8~{]&:רR ĜmHHKA~q,ѿc8c;p۹TPrz(wp`.*ri%n~%ZNjrCQ(Iroyǎ֣o9"5\䥑Y[u$/|MB\_$#^Dw޻;]h50ٕЧ( QͪcJ&L/m򔗷Wf1k`dPW~P7wW)K)! [{gAķ*+\?zQkDMZԲxZx(:(2}E#1"N%၊rrF<*q6'mG5|O>9Og#U| N?A >'MjۻWr:W j':99QV"ܖ3HnO!(zWE_LǪe纂#ɣ4έedESmR}M+|fBIOSUY]뒜ߓ>/lj~BӚm½w-E'ck*`$%Hramڝ_#Y)`&#G)(WJhv9X}B\ zNO5?ܷ̖EJэeD6`_xF!N7(-n( %Pf> wBuq;vZR+er6q/<ܻD€(YyvEJ!\!˚*x$˄}ԏ=lb!W^ZK}p23Ar+)(v}<HHۛ>L0zl|csl(D\kN<4]3>)c4);ĶM*/6΢}5_FlfJ7;}1KԸnfSb1 ^O|JI*J[Ymb%:$G]\b5UVWsT,ވ ITVLZ3C%˩A/H3꠺TaM&;ԸW̺Lӥ(/lɵ H> Lʜ\qM{)~aIE!Ksݚ?&Y:5F˚uxT 'S ?Vg !T:!:\:Ѿ J-(l vaPӼлYc[2G0rYRR$к0Y117`.&lG6ªQG) ZP#G b߷<(\zмO Ξ|/O&UN$P[?uSx-b;+%ͺqё:sDYKK=)刿YHd:md3q6k ܐ _ $6H&yt螗k 貿KVȰ[m)mE> H儜0vMȨOT`x밈xSnwfxah8Բw~H,E!AyB#ZZD+k#u wc+ [^E\wKnA0}UI{7mK]6&>[Q#K$㉧j7[w%ϴL^pG_|I_A\y?->QnIeP5Cġ*]KÏ{°r1vT-/ 0p% 7kqTٴwIC^*QӍ odwb=V;_tՓSwoQkTi *_cJ ÷@v?xi5K,N䒌55N%~>M& HM!S?8O|3Bu]kÊ_3ŸFv6c3"wh l7pUfjcֿ GA%Yis9J~Y#QS~XeI*\vf*__ox\uׇ+}k3z "ȝnÛѣ4r}kcֆ.lЀ%P dR 2!Qvjb"ip:\U -5ڱ`:4Cb@9NG endstream endobj 589 0 obj << /Length1 1385 /Length2 6067 /Length3 0 /Length 7022 /Filter /FlateDecode >> stream xڍtT.)H 1t ݩ CCH ݍ4" " )19߹w{׬ͷ~~~|@&]^y5L@@E--5Q$ p쯛h ss# >% B"N ," H7 n#0w" ngBWw@ 9OBH(G ){Eˋ·txQ};f50@ 3`hw7@ڢ n0  >` q!5x_(Av[ ɇF _@; h!y==ܡnp;;׈ʠoYatv!PSkYG װ#ll aozԔB.`(0HLTPLs~ \.[- GPnElPfG: c<~M/$?W76U3c Ho/+ `(%Ut!]E?ݢ_{%_qpYLf- APM)7"7;;!p'4i=Phh!2@7GZ0GPvh2@Bpw7F/90];׷W /#-65ah9eiKw"ćz% jl?B3ln FGP77>_oq`0(4*PvZ-OŻ6&zj*;oS`9Q2 VpVp=}yoG蘗Qu1T =4I3FI}"> ]]em $=^l*m]ř+5#jg_Gh3kHu$xU]X$ex"UW«2^%.JgLA$gbqZFN`xՐz̺GdSLO! "$.Vz#~-1 Qcjܓ{u;@ D_[F 0Z68G%o0 2 U0cl,2ټ|T$.SYATkC*.HK@\-|[1-⺸YMwmjxl.ZP6ꣻ굜zb1kᄼ'V/qǛ6~+i,r-|2؝oxIC${Ž5lW4*VEM(v%ykJZ(IWJ5eϗ`KM! IbO\(?CO 0~D9CߜPyb4w ?φ,o )/5O{ְ % ͽMS۶];#?8oXėxՀh<ۉ^#-'%eӒOMa|=V HQg;7R_E (H_Tx.ffC77‹ev:?|>1M~P聞ۥNJJj~/p3F,t@z] }sIq=L-CK؞~J{d?^꾫껳EA;(pCȓ4.z}2Ͽ3ʹ͝џ4/Q\4YRjI~b{iI&a9R?|S^K鐚3׶sY2ՐkÛU%Q‹q~F\zCTQ@+̹։Le?+% ⺖ ƶGؚEf]L$|_`ܠj,.NamoYL.{(÷f*sh3-x??gE>[mxXg֨8 >#k\?-`ϏaOCK I-__ >NՄ5zou~ȾɹkH.}gٙLAWm!IqQUP@k>=u7)"+%+ޖ8K).}71lE>:6|P12U >B!M"Ie _^lŦn"~GۭMs8 U^8`.܍V4}\t~1:#pD^($!CW<9rZU{TjH3Tՙ?}k&[C7[ oabXʛcI7.D *cŗuZj%P2vF5B4" 񞏴D ?5V $^>e;tSEH~V8F=Gvqq^ Zr@Ѣ婦5/eᨛ;SEeO:ZJcaIE05,6tUPd#r;enm5ΗkкtIm1|h؋ѻ ::YロXp {1s'_ònlT`ѢiИaן>3Ͻ{,E!ZٯG@ tb=錢IS֕*|02%$L)0͈ E*Oy.z)1dQͰ`m帊{ݫS߹˜%JC@FFT|- Q PLaD݋^UȒٻxoЦθFdh6lزi誺d>v*IzיQ{ΠOWgJ"Dy%5ήS]&'rӥ#t3VeJ7R7׎+4>, ,Ee-,Iqn&aV˼K|{\Jz=:-ܥƍN0v} rNdìDgx'L QW*LC;0 do>`|ͫ{悸w+ƟbO; L;9s QpE: H0"1nbrP@M"8.adCBzV*FǍ^q #qR=ڏd8-ǐ޸3[ Ɗ/OklWTJ_{^8:٫y<[e.vIL^,;F],Smqbwktcu,ͅ-*ifίB-l=#+unߕezL?;NzWԭ(c'}*M(TEґ>U |a㭅wR]Itb9fϸ]'vM!<+>A*3ßY]}G]b* 輶t {]Vա5̓)UpM)}ySJ J{5gw(8.g/ t2P~{QnՇW63BE#i:{9!!_yp˯JX4OkIQVt[v]I?y:rOT@<f Տ!} #FU!ec9AK3k.QDI5%僩/buնn) JN~ H{A3fD:0@y壤O~RUWE3h]|֛ .5Na1iN 5+چs|4Y7cKO6l=i}Za] ǰPWsr mH?L.Nm"Q^?[h|~@=0x|Uwt ucMGC9_+|h|Շ?{;#s5hjqbU_|¯X1}o3 (  ܟ"sP1s ys9.--J3JX(t]bZ[<:='j$ppƻN>mSjO֥*쩱|7t޼qR_#Dp5M~id\\mdGT#VsWOF52A^[ixGea"귘 NJA3Rt4җbb|TWoZ-fIޟPYeҬTMx2r6j|AۏųEq|#hnX#4sqړ܍ңe(-rW.֗UVj̆Μ`Ӟ^K.}a~?ƶHl`Ty[#1=LSc+Γ-ۼRȈэb_#"V %xs;1Œb~+5⓴B+jhJ.37:MJrݴ$jJ?{?0HWAv؍$/p}6.3GFmR+C=W @?>WV4$/9f#%*:kfv*Df\,wDח4 IKSHwXor4hiؤY$_*s `wi,ܣnu긞>g +bT Py3t#!!צ@ׇ=@/抶d=[vB%>ήgG%G2[phey<|k HP(d?C\Nůonsy0Sk؟^E}.Гq='-IkN_'`jDZ.,$Pf2K-2ֆd Wҕʁc>+v2eG*&)7Q{WaܙIϙiכ̃B@?-?CR]=-fK),>Um#ވEv&7S˽z3^G&[^{zJ3zȉ=x|p(Bm3椰!<%Ճ֍)IaO*ДZ[k[ĝLIo\'9w w4wBl:{-Ʒ]YhHZiŦ&cP6r=RCxsԘ k z 3X< "w?N1TYo<腌Ah6,gGwm$4 ڡ$omuHڹu]u9BYbG@ÈliQHiȳvZ9:أHp iZoŎzdmz!CbkZ. .wlqsP7 V; ħ?ّ.GLSa=$(ŧ4LdN =y9"g|VxΥe2 }԰4Ϊ~2˖`lb˭ J`hbe8MTAwyW)!ژ."ZBWGOEǟ^M?p+‰ƨlm#FW }~˹opgQɱ38 @<6J'ZyOƍAG4NZKz>w*|LԍR1w4+~'^]OЕvJxٺQȰ˩P C|Jº"*+⹭R2&{1J )S/iĪʤ\q+/ِ;^~{`z+2F+l@Eca` hb:0&!Iyqzps"/%u4ΏGPfewRh[{+<1t :g}7U __twN endstream endobj 591 0 obj << /Length1 2604 /Length2 22963 /Length3 0 /Length 24440 /Filter /FlateDecode >> stream xڌP\ݺ-h%wBpi,и]{p';'@ngdljUԙLv gfv6;Zo1$𗁄#,4v)ځr.6vN;; ƮVfED-aghea >tv~~^lV %| @ _!,XYXmX-nVΖ5h0@Of,H K+vnƎ@X`ce 9=\@f@Gp;=?Lp /gcSS;[{c`ne(K+8;3Af mƮV6&`17H ;='SG+{g''+)LrvBOh .?sy['abϪ rp XGftps%)xI}́/$/'cW ;;`!;Zt`ϓ>x@6_V1w?:qq;w3 {x>F4}2\ar;xj?Cf 0?EsQ\ 0?Es\ 0?ˇ?gL 7Xgjgpq=-fAp?pCm͌,t񷏃 x~Cb` 8:\[z[AYe/.ǿ n._ '27ޱd;58= )2U{.0k{eg_\B۸8,q3\윁f&6u'ow+XnǍ Fp8_I.ϱໞ4Kf8_=׿ _v {CQu_872'@;iyT0غ.9]4zfeN4d ^m)kgDG'xvi#7{Z[!Q9|ƾsq(_]UݫG~*e֌ (7F@Lu>}3;J&ψsYa#zS7!k/9EҢ%V"\T5f +HPs_rN^2 x{'БB0۹#\|F: l+`Uȿa}dt64nytGDd@䍅;nڪ@&I*lT6ӊk2qWB6|}oN/b|ϕ61mܰ^x^MZrJegJ|K*Xl*g=߬c, SHt1DUNowz$B/TJ=@|8y1`X<(MEy[H̖op.5n'tHo}&'ͱo'ܘIR-+ y//I~tQש|GC Mi9ҬuB$Nqsoqvb|lf˦J mOCq.*<廦XʛA88%|'',6B#BblؖNzuqB*u@RmHkD{IΝuW UgDXP/$/ )p@d`.'2y`z-g.6B [S*t"xҡEӆq(iVSy<|laN&8ND !ʏ/pP[$xʍ3*Vrx~wIH ahg(FEy:Y!_ gJO06uwn\E#R3q֙Ag'ђY8|0%ZNv@`6[Mlwî5,V 9[BN=?uי\[v}jgwc.⶧phK)fe<+$Ҩ nK72棹/592w? &Ѝ?w{TzhXQC+~Ņj,Pk6YR)e)u]h6ϩ(i?8D, ^9j ̒x}-85U+B%gjXx-xEC*, 03w01~ՠj^#G_V,Z].₣mn q]qs&Bӗ 5$4>fiQ.EGJ߹LbR|ȼ96tpKQJWŐ[Ef/' UO BNB2RF!Z-7;GqU'T:`QuRprvܪ/v5ڮ"E=v\ѾPJ*:vJj&3B2 ^r*Dޣ>îs[0Pܘ(Sk+ 0/:e> \`8}:jޠE.鄩' ]6Q$MgꂝהnRz~l@3-u>1X@F 7E`t|FdžB4pRI3bѻϤQ Ղnw2ҟh>9QDeX'Y=CuUbX{Hr>oH)anHw҈:!PU6v d)ٮlI(eRƺw*\!y?ᵟWeHp0t)8q/_=mQUݱLr+ sʵ?_5:BF4Y*sUeBs֭7(4 @FůσC`QMoH:rh{]Я&n@&nlȽ0oQ'[[fct,; دպ0ds`9Q$Tp% :,뼹]V8`:"v)?m;)2+R"SE` Z$4 F~>)~oY#oAN:jJTo;)5Z^ŠZ`FZ'{E}̨dTLPG  8bҎK{~Q*CblQN':c>_R:2g\hp \#ipDu^[RM߷8B6jC\ Kׁ_p8uvKr LjZI3ߊ/'WcP^͵aZ몆*X0;xsUtdʾM Dч)ׁ OXߘ#BˊF j辖+2PS?1zŦ_&Rh%%0|fG3ӨyY;SQuYW؎S+; [:޶Vm9qGǶ#N)y9lJɔ§-Vs΍̣m ̪}ZsEyښ>O7-:C]gʲ#1dMau~?Z\(Wi%,EӅ IOƾ\&Vd#fW63㤋FiC6(]9B4P-NtW8m\Ih=m֒6<_ϩ{%}I;{;io|`dy(4sc2e*ԡ×y][]1&Sdse^rH*]!P9DZaO`YF |3('$SuR7)xƏ&η6E:lq8oIeȨ?e^?ٲ`NoJ/x<&}Fѹ^=l4hq6Ʉk\f/~DwfG~ٌq n()cǸg^noIEP:/zxod0*##]W6tL\,pCʥҿw}sxKDF 6zŌ^z(按r\DŽC͸p|+>|a0f|{7& PCA0R^;1Ju6x[vS{J֜sk׉f| 0y?U8oM<ir' E SyL~А1hC|ʚ1hd|U<[3a45.SF{lLJgu`c=eD bg}L >}b@BPy<)ܲwBfϬ0C3\}&o$ 0j(5J|uĩ\u}@C³VyjG; Mϙ+;1q. y3B}<[+:-n^DsqfL|\0vPei\%$L ^˂rJx)$CՄX9~;?~WyAY שGFR%),?Ȼ(VyѺWtHkY.ȡ0VmmGZz{KZNrZ!kt_$bOLKFaq RpӀ̡f2jigd( -+#3@qITؚ^HhG#\uȫpDKRwj[{t LjaAadsg$A9xf4}[Dh"hdtnjI@TYyWՁ4lUaAwʖ2+2qrk̓UgxxV|,G_Z:4dCsuaOK b0)єb[E*5M-!p"$} gVrS{.˼UZ2ve^@v4̄AE wZW-r,ѳw朳cViEg(_0ӽ':Z3;}BPX(;d='-Go |(p85W</F\v̡Ǘ CU6JG4-#p6ͬ)Zkp-:P[Eexc)Uàv.=C} 5cG (<]8WGK[oּ$VGZxn̹˚}f0Sl%{p\εI!d*Y{\\RSjpw!͞o`WVELo7kOչCz!s(-4;w LʴVQnpwQ!8JU}:EBE4bf$X|?W0D2eVl6La`1qB 9ãVp/SCU^HIM$VٮY[lpH|1@̀_zMYym|!vOEU;zqRVd WYJ0t8F)uV׎ݽD,*.Ҹ8. *b@.U- D`+" {gX,AYX7öI0p $x{#~eK21 ,JZ=;DiCF,k$"˖L1(N){~YXG}{ɧQ(dM ?iB=+Q:bq`yݭ)R-d/g#%ݮѠ=G~Qh'NE^[Sor ,G=HsiS2^wحJԩBJ8LcZG[I}7: }nY)1c-HwџvC$ӌ,Yi88GEH)%]` +M)a )eItt1,g /[}T|Jr8*0Q$e c6{Oת:_Y=Emw.͏f- >KDb/Fi;Q7[Tv*\}8ؾ-ƻPM{1lg;AmW[㻅j꧇Z#YIk⺿ t,H~R S&X7)i^F6q)60w%|p /so}k7{Ҭp]Qw R ny2d5,־׾%_6̾Ǐ-u]ɾ~192e!,G|j8"D u ^W`Sk q4RwŲrWݹ%!,U8s1#Vr= PۆV$R݄ &kd_ [6)c~@ں STq*Z{Efx.kuYT gE^ X:UV,O[R F ddN/ Ĕ0&m졡v)Eɺʏ3(` ;v>\B| kYc>+TmgO K8wCE^પ<'tjL.鋢j[g]>G=뢰#(lHe-Z'1|A ^F7q6ÕQ{o"תT:p>8ؘE.EŎcitu6]JƔitHMO#){zJ{d{o7yaY>%9߮.H2xN.J$H^0FSn1uYo_$|Әzz%..Sd"B~&Jiu٘V vjپtѲ'&gz[̵OihvxEX)@2UA~CGƸm_ZHKLոpd~*jw I>; zi?w9p;7 %=?!jp=i7/ UVY.?b$pGdffp[fc;!Q%jEʱr"v KhseR7|?q2?Ƅf+9bU,8| e+0IψIzɝφjߢ4z\RA.4 b`K+|i;BԺfQjtc" b'374 fsEct|=Qx S!ug'z0Îy׺]CČΪOtm:% K쀄hM~{+mS-C!urғqvV,9]3^ p1|B_/AW*߲| ,.t)OwJ6\ Z#P_SIDb.Tq?! ׂHhuX+Js .g2X`W Ǖ\7C6/ECP d:rӄCU]Td/!' u(k2uE)cAH0 ~ZL)Y ,=2RY sR|D^%vEw>7)R.Gӏ>-VyW9JogP)IͿ.q8 ׯv-N7O=† FH$%hizgLQv@٥XyJ'՛cejQ(oCńJZ޷ouwׅ}5ovC_*MT/=2)gv3p\ w7su*aXS-?"c42hWd''zU4x]5,%2{^B]0Lt4+&d*Urn3  &^W{A֏E3e3DKy0w,) rS %Iav!FuHIK Z1],\CDwSՙ@EꤣKEӭ:_BaUqTޣ]]p [>_,11'&L 7tԼ`h 0ͥzwT.@{  ^vS53oR,t@ikekʒ5<•r'j%#H )W _^  Lޏߌ`@2= ~lў%/xDD`Ӹ/=J2' }Afikzmh˶m!<>[lVD&k~~bLh۳D*}7|F 8Mbְ|jvDn4Nu ĨLOt<+Ǻa|\؛ˠ&ǫ=>IAa?FOcd(q&ܻN_2þZ+Xݪ0^*̭twPēF%ۓnl3X_})nY3w# ~ZϽnȷejb߭ lrěQ€KZDVJ<GNlyQv44VBmCj.%W [:fxe'~7ӆN"1lu{CYr~as_^A0Z\(>c(OD(r(8Ҧ/8"[# jt}B~_,nS TrfvpKI}dF9TTJOU6Ƹð0]RG!ɸ!uq^\jA;tKU! 2uņTXR<, gm[)a\Q$YN<լ7Ƹ6ZuktSNP~i2!yWWO B+z1)J#Ь]&(q2Tlumή1IZc-Gg *S=y3mqYu١y~878;>tkCPJYTvMkC. PdV8|3 ij6ب>^nrE؝- wYDp[^: 5IotJI}1 J^-|K} {WX{-? "o7h:7&7W`GyqѨ7L)}XK缑td+'PK>>~ %fN+:2܈Z>,zɓ?fX bjb, YsO`[BU6_#(|C!vNw1_x9y2lt6jATTX܁zKF܋}.maK/ͻR!+F\^Gɜ>tϼE3e+:2Qrva@0u{3f} 7hyQlxH$QQo2dJXDbrd_1]p)w0$)0xGaya(fϫ|+4Ʋ*|*3 s gZS6# QnŰIú\}ap6V;"bpGijcČRk_~Pu35QK%3opʿӪ7tل98z@Jֈ/)c(it)ֿikYr|qxQP oa5B+9.UfR SapoIt#%7 g a\ $d[lg j%.6V6i~O4u4FqtA7RXаX [􍙳€^K4Wojpt]^7k$*GNܒȞ SuMZ$WF Zfy!uJ&,d_DSWnOU#_0h(7=??u|2yDFj'X{" bayw EaQ}u}{ق=t{ \OA)Z(D:̜fOg 4gߩv 9KeY ;!y` PNaWzO/?M¾GMX-h0~#v.f!kM9G,רPOʞl4D_I,# pt-]i>S I}/ iH|݉<ަn&H3NK.GtA!ǐ4~ ̺1"BiY>N) ?:S"!"$H ,x-A!b?1oGv۞e0$v_Ɲ* [{!Amjv,@jBbĀq]:=S2srOp>-f_mg`Y|ySQOP- ]K|掩,HUB_CL EJ|X&CL6Ǽq-`xt9@@|]x&[Ju~Y!*#:H֞,卜֯j v.?+8"̘g\9hNG!3(a<֯uiఋ0(|iHT6hZ$X7R&Ҩ67TA{g!U&$ͧ>|:skuŔWx0qc/ѕҿJ)쏐.t#J!iQ`\,mAN+o~>mR$fZ9#?!ΊAgi ޞw 0s*8 [5r*Bd4\H'A{q+E[ g^12̫-~_slN댱q`Q 1N~UY 8D7^Mdmy1<;#zcb%ޙIoCۏBԎtU`fP~(h@S /gt?=Cg?LJm/g=#A*X%D:VixZlaYmx@@S \ځ؛݊$k|P7 dt)g5j{F<:E )_-ysgꟿ-+SS|Z݆\Iĺ$ +/ڕ<$]Px$pmO+Ryӓ[mwy^j1nN)tXR7)~Д =vT~xĂsk}Ǘӛý>g VwƶDZ76!jNJ%}LP7 c(2# [sK[Qr$/xƱ!?;=[w/0τHukUG>D<'tzɘ>[W 'pS09șRk^f8۔!ZEOFɯXvL+W?M6JH̚g ^c|``<5 *[q ڐ&Dc\<'9 N1vh ".ENIPY;'~z+ե6Of530v0V&@: fV+p-[go ʊr,1pǔ]?M$@QsrCPXmIm@m&ٛ&h~B oNvBЦBLܿ(,K*#:͇R Gba4:RٌAk'"Θ+o#SO-4;tw<_L8P.cD\'u,Z͠Q Ha|:#IqB8s% JUu[;l(|"WduX\Gޔʀ:C_E8T-AOpkԇ{OM]u"ÿ Ծơ[v3Gh76ϡw~+ވ^wϕ]:F=SO9ʰq$yXFD$3")7O5-8G?ILծB8iY^Oax=D>,{\X>qo=Jޠl=T@ s}, ʚ\r% ٨RE>Zp4dYdA; ('FZpHte.'RL+2?-&Quc%/\ـр򂏝_oĜWWzN,TYu&:8fǢ"'9Dcgڤ@C7}s[Otj(#wO븈pK=h$N _Ul d9U:ڠ\S)ZLWG [oJtq !;:vdh'A\/E0|TJD\(1h?YwPf2Ù<⅖&?rNs1HjzN6jkAy,|a%Z%lK!qڥܼx-!%yXvDQ,+퟇ȈpLR ѕ'k(rgH[q~ÓKH{D%Z< ;@$$MἢJZUo~/{r”XġoARx굉cmceD\^cknfDCw%ƳU/1 rww<[it=cn{[;Ly|It2{=4.GTg =t6ZO?VN= *Ղ|I.;; H_Zc#C"ҜS6{Р^OՉr_Ytғ D&,'/j}? ^.e朇:<1k D+pGk{T?-I:N5 k%ejy#DŽCbQX׽!tXq7} 7pe1(4c]X8x?ya UqRؖ+ /E/#2J:I|"6$Tm:fbC6o^> !W|ǐ2/1Mmpj /Ce5F'OĒeFp>CߌۺA{8w;|<,16.%0@m4#euLX!aߵlz*;E rWw2GMkv RTs+ i S^Q@4\5 k8aJ:(!# *ky_X:|-;XS*ɉl^SI{ⶉX[L 5`Ig3R;V ml̖lOؒ`*tU)hjb7}]`qxaŚ󭘟""[K7-Bx2oR9tM<}4H!VLۜjx449O2U nSXqDW:(q>T]4X9ec\Kfd q _q h", ]TNҳIBoVY Ml<85_̌;WܶnMg4ϩ\=K˓vAjq~f8dģLJjYZV=Oh%5iy$=>g+A<"2F6@^z7/辠{ ,*w=[[) oer]*<ڋ7;p1'Vc& "@%$8*FJ$%%]p=ҫ1-ۈsM՝%cPt}! .]O#WIXOzSAա݊BflYŠj+VX p1cyGxRn8YW3L[G48hxwVFG{Wڞ{kϻ۟B? ^̦g\MP" *a_`Ih$)54r4Fp{SfȧT7qqz!AJoK V>XRtտgֺt+0@np#PMM ac3༞/KR̀X{PYos?ryN3pB1ŗ^h6*ەe^C ?D)YzXB0)[.k ەr8;pLBgMWo ⼕cׂKN%vk`.'{ÜqFwC17 TQ{^{C9d% ΊSϴ6S=͆DK#gl+Ļ'@}Lho}YM!@_5zv>)EТ0n38 v$vzԜT{䭢6I5zљtc 8`0n]S΁e";>[Q];Jm:@k A_$播mr|sGh24klus+yt\KcA>Tsb13>1)yúg\IrcEG7(ezԺ I4;YIpۦ5#e[1ݏelE-ryh ,~8 :kɷ%Oas/ G*jT)ڨq? ?1na$UCMB~ Ϫ(ytK[͏ӫ΀gNz=+_`G#?6cp<|C|]\ʯLG9VI^+%~9FHV * u7|0zsӿtt M&F=:fz ᭒ Ҍf[lw)T {тT* L1n=ylZ:쪡xA10paIЙ oT4'H(3O矎_rThwR]/']jS*hAqbqkfXk⑦l}EK_q/NrrH,BH+xLE~67_,jǽ;Եq :E n glqbkh@ݍ/`D0^Ceilm/+3ʂa܏fqw%.H٥o1[1j ߖS.: :7ҭΔnNEp^Z`]WWT0+myҠrQŽ]Xw ƬG=-UŠ|5L,x Jrg2w4 '% G)5>ęY`ڐcxE4H)0(&x/}:xIU$@KvPp'D X煷>Va;Tiy1zsm² PMӭz[VՈfC;.pFQtǖ5T˞ `Gxey޾4#xvŖ߭CӰ7I^cK#'\2P#8/! FLw@f=(JB0 7*bxЍҫN\dRv^2oJ"Ȏn5W{oa5@1:ϒmެ.h1qضpĿ^K%7u֙6lK!^}M^ Xti0Gv7 :>va!-*o`j '@8dHHIͭen{h`[f܂3f(% nO.l2%Rˊ63Ei?zd:܊`x%m *')z㘀U[,ǣ/ݱ!=`3oɊhQYOn&= |ƈfi,wUʾx-+-wQvO_޿DHYXVЎub9ۏrs柤a4Y 9q'(W7;Ieh&틝聗΁Ċd@:_Nk]PT;%L(b{!ucܧܑc,A[Rs;Y  8ݡ=ϘB|c 7% eb2N`)0T[LΙzyhDRǙظZO($I3hЙ}+m'WH KSe\+ x(AR{IdG/Dx p'0|TeKRC%5C&q5tJDxhQ3v`$.H/jgwt#:p KӪd:G_z}C$0EH&Xv@|“"褵o~ :-Y. ~$L0c%$90S V4nw5hsDPiL#[5'@^Xxs2!'6J|ٛyR J_}Q5=g0M(YTώ|94>}}T",V܇M T,k30e "OVaI j_f$~F͔09JɛE=+_Z6i̜Sm2:#(k;5F dT"0-J10Adc'@%¹)Zh hO]v)^Z)hS`W{DZ8kd4 հQ9,G wa7!G_dI")^S#.1odTpt3ޘ|OLtjd$Lvpq:N 7Aͺ[s(I4%}70<-}ԨC"QA-QM[,R7>>H7*eo! \6:\%uS;NoX:~*X&6 .v4p0TbiW%Ma v |ڧoD6ٟhl8$3nla-sQ^"H.lH|ૼ75GSFi SA&U^:)$hЍ@xu޹[\biޥ|ɍ!dU L`A5(T,}BCIPvPiK%U߼|_-n?R$#20]nXJi⎶3plpmqeWk:-)\0!mь5#֔&>iܚ|7G%yc%3%ܵx,L?~j` EaπwaaӾV%_%\ Qsv&t8t'Vb˲>,nZyQХ{Nmꌓ*)IKDOa-X$ݱWӱX '.qSObXjRw41B ǓW_!sxZ\i5sŞ2⌨l,(6g./{Vp3"g-;=d&oݜ㪢E_3lr>18{QD֤!71.HNGvh~p28¢6v5C)eP [ ek۪2Yi@"n5Wڪ"6_qE\ly68gA EyTJo7FWϊd%@[lFc9pOmk_L’8\칣 ;m0TvMCv!ߎ^YxBv{fsj5Fa PpeՕ*#30NHeL, h /҉)|U ^W%!#fUhNѨ宓r0c4dYNXn^ P:R4*7=d +'uת Ț1xؚ5WS6\:g_՗1abUs{2R hc fJv*{_Gma8M$7anѩ*;-E98$'|,I6d^ݾieO]i~ ?$\}U](Fvkm%ЏE4qӞ%_F&Iڑ*RV'Um1KRbAe|" t_^cc%ȯ|_~ro01[@b46h`;ϔWt$j!uJYmjD{gk-tRcʺ;T֜/ lCAel""Cj4yG<k$Z0 &0w:u/'DkVl= K)j4s` I{<{D%J)c~wc5ͣH"enMҖ-i[väp:ܚ^חH69[E51 ԚokMRh=^mv:?hoRq\6:"޼— i4_rS`A_@+wnI!pOb|Jc/M%x My"2P=MK=h+MBcnu;g?A!w-"T2y7"qUKݾ;S6rcQ[#ZB}~2>z[%J[>r* Knygq^sz낆4o pyXg6p+!NR$nCH)e6Kee c|CUȳ@T1mW,C"V:Hk_l֫&%8FS$&=whKw2旫s0NNv;֍g_5]EG.R`D@1܇_VaoT\%S0^˥h&YUHE=AS' `R ӘaH{A š.ryK;SD7 "|f|aoXa lE04`C}ݹ]Gu4LW3$ɲ!{U&r7dq˖&U dGoESb>Ʃ~WO5Q(N69Kch5S6N8h2{nAv},lisUI!z-f)ՌX)p0M(bQ" b)~6>?!ZePf\nl- WeOZF]_۽eDWSuL4ۈ#=4ʮLؕ4"31ɓzW?o,VNrHҨJ+9v (,yEقmxdr^IS R{"$:eߩ|dGe ;D!`QX ,ItB8'bEBR:+a,2e`#W7ǖ0DK gB./'|-/rP81j!^|/銌Ե {db/_ P.]>-ػ"ї> stream xڍP-qwwwhi!CpwA䑙3sUUWѽ}>k*5٥- (%Upqrpq`a̘z g0"YghT=- -(O Y t[T9*P^ =O3[XXtlT0cE =@j(` >͢u R!VP}3̀R>`G㯹,p?+?fijo t{YWأU[P}П; :W|ic( K 0Oid`HعYv/ˣ"pKC,7_tvz`r=  pr@c{>+3p6#!^?H7~#>G 8?pKׇOڏ܏EOGb0ظy=!'O c5o?w,0gA5AWU_ħSٽ\o+3VJ'u?_ڔgZoCmNl}&Nkbsnþtm v;'o=;&'W!l<+^Exm_H̶N˧%Q s3Р)q/~Ne=PıbDxD_\.q$#5"@`MR!**XuIJ6~s[MyԔ~L@]jRC!u<_*\T܅M=n/X˯Tx&sƀ%Tˆ0 J]ˀm=pEzbyxQLo:oYzh ><}9涷bOp|nut 5EL߭jN̖{J6p9*YmbFZNoӁ7&5O+w[1om?;2g(֖Roh*7T^e3 ̀pB_Ɍ<*i/V$b6[.d~Rf=Aޡ^px+kHhHֈD$P=_[ 'f@cJ ̒˦wW+HvMa5[䀤#Š6~oϦx'H[v" tbywAO)ȝf&)2ybo6ntCP-{ݢ^v}BY-V4I L7 w~Օ,-@·k;͜|,A_X`}NY-((4ACe2ܘv}rDf/`@u!ӑǚ ӭ3 a4~=p"k`d *K+giGۘ=؞ 'u c/I++د?';P[p!vo=wA }?%zV6U"kbQߡzE_:?nֽl,ل\ d5'IϜ@t.=BEZ{gQ/:?~XN `1Z=Td? 0i&j3Z?KIe{aߪMϬ7Јp<[I' VFt"&>#wK+ /J.k8Y&9FV ݟ8o0'H~[H"%T;SVqQ*IFDzMVxۨOH\^\9 O1Sٱ, M|'su~2eN Nԉm*Y{SSONR 9  «L[YbvB-蕢%J |Z J$-S~h3ۺl /GY#"Tێ$jX /|^:#I贍U?sv 2RD4~7$8wW䵦m}jYָd? %kJ]?pHyGOgsu9@f; P-aE8NQ1 6=M@8]W$ndJC:ךHY=؊(Z/7oCi-)XAHP2q9}[w0}t˅ ?D*'II& ]Yn֪1&.ٱ`}b(6ךc7b/?VuAH}_B5/wSt/9X :͐eh"OWl4yBR;Bd¡,)?mr)m`1_$yEx `' b?Z8THEӤ 7nj_XU7+rŊ=Ns9V ! kWKdDVz@R`aVDmR9$5ɯ0a=&AUyr'JNJowG+5e;:9w})cyLA,"YW(KŵE.x6]@pPt+:^D`c꿰GNU::uybyD\}ԔV- ^z3ho`s&[`?N%jAkެ,~?=QPl7U۽*rߖ)HS*j{R%rSL['CjIw5;8mҷ+J{LBcj7UNebʧ֢ \Vd^sx)0ݕ >r\7[@~EҼ?9g`#n'Zz6R9OχVCb$泭sN:K Hhf*V/3⬓CŽB rM+J0}so*NSVݬbY&DV`*?^3v} *"cCO 쵥D[g)1ܺm+P;LQ+&t" 4AfGaf^ap#Bִxb?`ji]#J9.=G. ⟾UDVu2Nmra{`gV$+<<왰T)nH?raPXбSbZ,1kt=H.;;JPw$ KO7\dpkK# Ai-g>.WiL>m\[.)ah;ߪ\y@,{ϰNO3ҁEk|TQ,'U!^LO܋tn$85V&10ߘM{Vi;\E5c~cxa3:~,]^쑟&dّ!dN 9y@3opܕ/{dS=t9ϼ'Un"*EvTo{ߞ]\KOhd8 ]3A~ 1rTyYO(yT@϶Y@W`EPn$RjfVǟ(q ]6 m҈!t#o-^k`(2Ѭ`m\]ԇuv$N>G FyJGHX@Zŭ}0iө,BteqԎD+풭q @,Ld4ݻBKOYÒ6ԽD\uDa3ӌd7,kg] {XieBVԫCHܻ]Yz]eJNBU|"K1_OL$E ; ڠ '40Z-õO6Dܑ#4 nm!)d. +%6|E8L=j)q:zp•l o#Kld9qƙ%$l1K\Z?#4bDžO@jC( dԜT3O?(ŏ.TLώ@8BzaM7F᯸R_>`.nQm{^;hVр-2ې]9B ^b3E߇@>gV#cER~[$.Skk`ԉb׆[lc^">6*fyBuZfmob l%gxp4pN5#P.4sf:N0w3EY1*/J(rH~9%`Sxo ˆzG1LudTRAm]xJ "-4p|j#*0``Dw7 LQA#6gc;ր~T+MOl\eAth;d/YSHA_ɻ9* !E7 gHXS$g4מA `& /R8EʨJ6xf7F`A75h?_4}C%ϤGf5eϹ(RvB[lJI۩$s.#06׍K#bsi紪6QdJs2 ,1#A A㧿 |%pryN:mJa> Ҙ_iMvV fS>%7LyfX4-bG V^p !4\'#MhlܗG~%L[!; )A$nXP$/?ꞇi(Jռ薽kJBoK>\Lu oy~ʊmoӻeblO[c+ӧml!-[y{Kۅ4_,k^.c)\Ei {X%h<^q6xJb| Vʥ˝S9;XAk̤xkёnULxǚSf_]VpQqÆ.̚tNSO>p{"kޱxöTmxBrM,6r'K5* hoŋ6}s+3d~ 昋H(<ֱy0E l-m6TVLaڣwpJa '#Sh<1 +yTn}T;(ldEhkd?{K䓡m=O0! =vn_+\XkLFhj\{$᫘MTr2wYpA>sh'edE` ۙW&1CuδIhǀHn~P.a+o9rfJ؝8.P9E=ob4io$?P"Zd&TQV.UV,s)~bk ߆.1߮J')ۑ)s?CyO8]bb_x2Vc%]Ny{aIb "i$hɐ Pl0ze n$9۝<}Lkb H1o +ĀUk#FU wd+ɠŒ֕IZei- 4a]FoH~~Ol2F碲RFSQ fEeyoMfufi G|w]zcZ F'}9pѢF0e%(E *6hc}ЌؘT|#)w}:KK?2dqaê J2%p0A!3 T>h 5B7@ܾ_R^kHc9zRnBlKI⯪xn9K ?ϨFUt|TCmTؾs 68`~r6y’}Süea<3FUi endstream endobj 595 0 obj << /Length1 1523 /Length2 8229 /Length3 0 /Length 9240 /Filter /FlateDecode >> stream xڍP\-C Cpkn݃Cp \w !kx${WWSƚs1W5  ( p $9x\(44 ;fm3 'ˋM%N Ȼ8o8x 8 $M@%V< tF8x:]^'ޜ' ftJ.@Ms(腬]\YMY!NV" w5@ trZ~7 P6+ @]bn@@K+xY!Pq V+8X9Mwo"O9 [,Av@" 3l;of 35{ S)@ZL `9;\YAv[dMR` =>Ie=:Y[07-,7a9$y1cxyy@Gܚ7_o /Bv6u\\òV 0?/f_@q?2zlOeӑVTg!o.. ';oUSU**eUOl0K"Z 󰛿p?+O4Iqܦ ;Ͽ^4%7T*-@s1}1ݿ, Z\̭_vCfU!Π߷ |/enrs8( 28b{8yLL=Q_xE  XK{K}`ml >?/goL6@.Z/L_l9շQ˦ f@9\0Ħ>mkwIY=4eN{ dMk}XkRW+O??u< |[=o5oPgXb Kh̲ )\XHqN=0箮gqrP|c8c+59{ IapƧiS KZY8䳍ߣ,S{L*"J^oEz:Ǿ" zIhD'+nFIjs;z$?]2 @gh}唊B/SꡱTuj/5ީI\[`SumJG,Ut.o"&Q?ub F/Hk*(#ɷpǥM1<]$GUo$y0ܮ|Ƭ0On6d:i=6=:?Cc/7LV+ǔNeIf0+މA!zHH YggWu.koUW)kxCJ#.=7*^ԲMcZLhcB|2U͆wNCZTT_yWyESчH;Laex8Ï8~QXFFěc(ϖAd%WʽWR'Q΄HXS,ޞjxI$2R[h(>=kɹ] }_H#S#i&W;u9 tԤ;T,! # %L]8nUeI b:J1W'8+iWF0)ŕDL9DP|BBoTSw ĐL $vc"Dlc|/ ]N(:0vrr;MHH9U%[2D}\dCgHjZr9*I#aLI<aױO}-"zIgTr<Þ2įn7*a^F3sGr{fPn Źܤ"#?'O9Mu ^f𖫵4M׈֕.~5d_ ]9"8?Rą޲vHǵk@pNx'GFxLWϐJdѥr5}Ҷh7< +>G;ě=`,v10 Ԇ/ck'_moxXjRg՚cm@a+>MGnU'rXG8Qx~խty%^18q8|;aߕSDvj;oMwToz8+.gΨvT=Ztp ",5/"R(U8}2оo4 + LE,ca2A 7>JF*bJ>0vya1%OVhi=_ƲR̜ m1lPA]-EtOVશ{[ q듇=bzRunQ]i.u=$[ʾ[+酏x^,Ɇt [PڄP;\~Ũ}<{V TjȲ@1O寃nuYSZ`˟>bOUU\𯂶6IauŜI jy"j\6f3':rDA{}ݾ.֕qBQ:ePȋP&va)rFe+aFuaOYzvj:sO@@&'#SLQ'a`}ޞ5eO0*=zi<\+Wt V'6 68 H'42fQ\@VͿ6vr vz4a>Kd**RIGyM9&uߙC6Cmէ;L>VPNƓc'Dzh-sz.F W8\>h,5LI*Ľ0誺VPM8@ztPZRII˞kj=>S{`U_Nޚ8⴮YghnoJ'<%tkΛ9G_m,Hp) 7?6"\J/8yj$Vc:Î8+;N%aZj/t,"PYu>lS<זnVv.b(K}r_x ڴ9޸E%FHsSÒoaC+լʤ3O&,fF]V4_>FQ?EMVy)M <8wH! z@?1mUegqM_.WKy M28 jmMpak=b6`F٥ ?"vk&:JBDp>O̖j Bd$.'Fh(A _&Ipfw@͠`Tc!\)׫v L7)ZmVrR#qh5"l`K۷h1v2=y.Mj3E8(3N~|UTdW]Ռp $(20*?8o3.LBC; ><,^*ȴEէ ϒ${۠ޖ T<N*z:;v蓐ss0ސm_HmkKi_\)޽5w `FyH^4,TL@:ft~)"^u!$ OmuL+$|] I)>f3xǍc/^Y~=*cҴX8UTsO{)y97AJgmh9?.t9wm-ߪUH]iG_*gN#HmjRC "jRJ޿ʫ:jiSia[<Yryʚ4:wS.#q߮ Wَ]I;6bS=1:4NO8Ţd m*Z* R0|1V -*'=G[ 3|[qI8MzICfGF;Q.?A_`ڼo |)_9jy2>P"fs/-t r@tg͔v Y}}t89S oFkRGAa6k̖[R7צ_KP@u@ԺGQ~T(Jf!b7Q҄|Ѵoè2 ("ą. ,<- %v~"<*ϩʛaMfTkf6XnQ_tq+R[2YgOdό~' { "f#d(l?5P +odk0}Lt0yePx36e%kwPr$۟($$oqP($HfojH" |1I{<@4Hڞ1i$W}]A:rdzОeNQ w^HFpDy!HxnS%J5K?KO .,woȨ' p|{@]E#U&"Y1D cQ%葳Tu7ywywRsWrdK +~M&Vux/]VgT4@=g|,FZg:r[LWoYh"]X?P[)K{ -bRL,ѓv,l|5#D\ .+Q^$SщRwT2sO/Q?#MIj޾f{td{ϦT'#kTw<צ Ʋ}2)ZQnpIS$VP&6j9suDžVk?-DbHӅ ie3eg S]ʐ` }%ۭ9mBYF4@TȺq*ׄcM뱕8e;[RNArKCƥ4#b_1tf{(TƐYpjVBl7K]_ٝyXgǹhJ@;Cv#ɯ"0LSv섳l[`(ŚqԖSWt'dVa$+T͈唋†nV +bZ~IS8 TAån^auY֬A [iuSlyI9LoF4>RPCwWY{–tP;Rz i*x}$ Kv  3^ eW(&uqu3c&5ك*E<0lQǧ8)[jucnl%Qnzp7%} ^ )wt=_Mlb6^,I/nٳl2?#]Q\(\c h|L sV;R\$'rX.s+w"qUm|\d? {Mb}?U&D꺕7l|pNOfg=p@ jU餛#5&R >D8]|IƨmH`&g{g͝%XabH 88Xr!yDZ+K9G!VnY3?gtЮ?;UہvA&Tk'#3yG y[}Ac^N) ?0h xfLpi`izoɮ?G)`(14 DW5~;xiވTV\þR h Sqp4;hrК[kyxBG[Q_Ƈ {&j6tt/Nh)&5n3CI>X.ܟ&ϱ&”sG-%V6G {HZo@) 08NGI 尷XSDbP(N~KI߄t;/ZslPUn^8S)ב1-UtReӭDȏXLa(N;Qװ ʬ&l0iy٤M7r#=QOSЃD~Ib C7. [X!y>"߽E+%|]:Z#T%*E0(5$Sj6~WcNP8Lҍ xmjI6/:Cam嚠*o 07qnrlũp'b*Qoi]iFc\ǤWsP"=u}o &m|Ɨf?Bf^R WvcvB$ς>piT|=CN}&=,0 6kiG?ߎ@ѰN~t_f$Xn{ai m~Ė{Wz] endstream endobj 597 0 obj << /Length1 1491 /Length2 7377 /Length3 0 /Length 8381 /Filter /FlateDecode >> stream xڍwP.PN  .[qk"!@BpwwxRRn ?9fޛ${}Kot xm68 +(j@ !>H4"!@c I/"bDaJHpD%$A $/C8Bd h40;>Pꃀ; Qs$$x] (вF:@\P7p0H$?;a/"wb ].@0>| lCzY#  C`(-@ 0P q2~ @Pgk0j vPg@G16vv=6(?[T֨"ܡο+de"CO Q]3V'  ]+ QW " HL\q@B(~è\;T n  O _@` #6{( Q0/5y`BOd-o?W40S?*7W$bCFѵ߾0;8@dQ]WžOg,m8ǿ nQ_4c(w>*W$Zp׺jAl.UGZv@fO*Po. v*F ݡ_:VP;T00v k|ԈQO? H U^=OQo菄 W B~;(("C37Du齹LџX??N;V+=C^Gn!Ni<ĉtK/>zT89Q/IpS5ɛ`oR1 ,ɟaFryO"+cHK*3]L]1te5wN6<槰A=l15CvKﺶ%bpLz\jZKS*pђƪX;N*NY fiÆճՍQeY" *N2 /\:r$:Ve5^3N<u]}G{9ۦN *"[q[YmO'vKnq!5UhqU\6j0Dࣚw6=72YN=A=$? 鮧RO}LP7+awӲ>|7St}O0$c؀<6mT9tUbQ(S}d~EØBL3Ƴ t/#lԾLVܴ:Lذ4>&?6}w;2B\ ^-, ) uˈvd7SX{0eӯY~Fwoj@TbPܣoaH2&u94ɸ|l9ڠY`YUa;{&ԡ~9UuG/z|ɐ )")' OZ5?@SfM2f Ni5,5n\H;vv;FwR|!c "u`(*Ȑ=P=כG wv_0L&7Twj`$C2XۦV%i\b[EI^b[#0AKowEO,^Tbji3cQ|y-yJ_*Y;OmaҰCn:M1Ug™*WoUuwo!NKB ZHN\!RP2wP5?Vf'X`]~b<J"!F=#Öi9vN%xe͈ءhի̼^G۠HYIu88(7Y?[:h&Aisq2 ;%`'L:5.Y p?`NkcR&K? RQWZܪܱ kwMk8 ow[;Wo^=*[=2JfnVLN 1Z Y2W"ڬ/ij7>?zi>\댓 H~1UR'te;avg5x:䩍۟#[1NEa2$nxeamFUKL ~qçmrNڎO;A{16w- L!w.guR6t3 r4& 8l{dӈx: /'*c#`[hN\,15')CV/ .ONN_ D8`sWTkCk/fv_ rgL4HϭI=4t5o@I(9gv١ISo®r^O8La[\jq~wl6u$^+yK_%i\H⠓jM?^|HO!;qG9[XG[tCkwAL΂/y'BכmgڇG΅G'^96?aɯJ0ܹ\&4ɱ=Ƙ8,vF{G-356SSilJKu/{Ԟ(R2_Ef@ؗ-"ȒgM` B8[6^țI_<)hR  ,Mr dj~G;T?o}$`RlC~Z{Zf˨|& Pk+ u}tKysE FK"-`f9ǫl'F;-OG_Sԃ=F!<Գ,_E0'aoxa=uӵo+(O4v#/V@֎_w{gm}y}WCwojqW#0*ƍ~^{,qY?`wߗVup?E{r}a'4Z]Wh f*1 ӝ_.Uk{f$x`秊&̇{}2ê[zב04[ǚc¡9yZ;ЏUGRlM0<.<5aY;GOYc6 OzTM߮ iw[ED+%Y_?bμ 399IIYVXm^aШ@7 \{[){QM &$|`*n~2J4&?i;cWyIps'8΢ud/zGDZ=: ɈU{,F s=5{`FΆW|qYuh_-XlW'S9C}n'1\Ʀ%4v*{Օ5|8A9  ۯ۬=m6d,S C TĴ;5^&@IZיoEk;?WJ)SJ95ube/nx`ʛәMpԮ l: CӅ5w/2S)F&Bf81Z'm:.*: xc ´)VB C^T?l}[|ӽݺ c{TDQ#3>Oj[?a<GyBΧS#E{^rjsxȻ@4RoϩʺfhS Młukͭ9ąDɭDɢj pYyXƃεÏS76DUN;ƹVN)+t1_ׯ]vh&J].#a$\%Ubm9ik"37ہ%˖rZvqu@PIeZ+6`#EqY:!ޟ "L\tAWԏ*6Xfx+|B`??J<_9JimP o4\79#ÿ6Ak40qLu!N7鹭86+t9'їf%EmGUaȼLtяÆ/ڣTb-,UM_{ |)O'FڋJ(|+, wΦtE%֮s 'hu)S-~Θ'cʽڐ%aLΓI +U7& aNj2vR:DW[e3~ُ_)#^ϖavGisczS;{4JiuL T=5b)іۮuSrdQ~W2Bi4&F+:[R<+㗑9N)ř8C["E--Z 0˷>0zΛ&nCn8D]$ꀉUg2 OeF{4; 9GQλ^U>LI"%q%j8KXR: -L8&@naIJaK-杬V`O3mǠ3GE\oH88,imJ+.^7 z)%'0O15(Uk1 6xfk~*KO ΐUTgceJ8x9qt 5qYsf_e*$Hu&Vg]_s-@=o~]RsvBgWxA:lSc"T"_eDžͺ|KW? u( }8ʔ)eհFD28g-[l{"  V Qt-[$$JO)qUܡ8P4 1KYyI6Lv *qޖTTO1hkX*qIhXLTذ)*/X&_mN (E PϋȎǞ3ֱ7R]/\r|S^ir4(C΀v ^WY]!+!Qi7:p7< =d25>`6ٟs:|(&e*.ƹU _ĭJ˔|?tJ}_L$;ir̤ {!M !X;op# , _dwɽzfMrp>Q'CMɯ-ǁ ?K~b>-u5 "1fI}kg5Fl3yiwe+C}FK}B;X$nal|]m1B|h}nAՊZkMf˾?,Nv)0J$r\.X3 c5WW;:QH=N*7Vchs%*\;"#ݔަc]v5gbEE1~𽩟,[ml!qƫr9̜t"RBqV0 dtۇ@nwԄ^¬0~ ^G'scͤH4 wl}< 5]pc-qНoh-2\[c^CIm"r>{1oNضg.2c@ʑST} LV@v%=%dGrm*r㒋$` M*SM7 Bh \{ |rYo5Dr#wIVN-%Tv, q{bs0/_0h;92xtCK aY 7ԂF셁Z3DLdcmŮnqVFh@/ s<+͎йk]b\'8H2Ϙ8;_|yATl/"2A]94@qД+hЀO7ca&Ch hb:Nh^W >a➝;+zcn-x4S\OF?ʦc Ey,}b^Zԧ8{?hF~ɫPOĭ>4%Bӹ5Ιw#c8)Ӡv"+n +N Nx֟y$iiUZ 0z6;7`ۣ(;b in)mS['D;f&%U$SMM|dHϓ;jrXH_3}"\)PD+{[Ca9^}mN"(ĉQSe9}YogHBh\I#(&DLˆi qn+tK|/Di1V"jKB%z I_fuG7?gr}̽kg~`Ɩhu ̉PFi {HxEV?;OS]ӿa33Y: m<бijbN {?œ>?e.O}C]yu4_&^F:KhR::KdV |o"9xEA%Y"n2p?r'X endstream endobj 599 0 obj << /Length1 1525 /Length2 7695 /Length3 0 /Length 8716 /Filter /FlateDecode >> stream xڍTl7ntoI;Kj#6(A)IiQRP@$A@ZBB%o>9wvv_++~}}SHXeWC!!"`$ Eo7m G{!PH+Po,ƚ颐@-7 D Hʀ@Q0X?( PpPH[F89{coB%~h BaP7 {+gooO%B; @C w*u.L 4vFxP~P408 tػF:pc?BZ@@og( r"H'# #-"~BݼPX/N TS4BU B+ ɪHe;  a=VW$svD 2A"<}*Y`!?(%@'s ncYcBc{ SCu sRRB1¢@aQq0JbE_M# ('Yl_k12V`q0 o?v![KBn|r_.ZMo(vNn7᥆;#a7`n$\!`[s>^X>VK+U0ïBhh;b$@k` HƺQhyJA6O#b@#KQ,AHAHl L@^p_ 7r ` c??1@8|h&(;5p?@n?pyi"(Y&0f sNN_4|}NeYHaU0!Š"mj#`r-.6bVacK xZ<} hN:f#'V *%I~}7b;8#0?(uV x;^c p68Xԫɒ SR4W8fS#Z=dbXN"Y|5œ>zttK \ܞP][u%Of-IĄiqd=MeG?efW?dJ "c7 S#}r"xėqQږ #*A"eS^ _h:ܦI{`s(]/۸? '5]-Lj@&ٹصf״v֘퓸(9>ji5$h(ۤ|E@9)`@tdist#Ŀ}aq~D8$˧|E4IQz9nIޙU+:.M+υº)C] sfXkI8ZuV'lLBO6тV;)׏`J.GZHY'VAstsJ]ˤ^/[)|6%M Q:fg_?uu50960^f5L3ż3q?];^1Iy5,P{R5@뢧?&m6&|P}?|Ywi+}Ns>.?^ֲ%>zw/f3vh7p䖐pa8B"yav|J'ܳ-Y|9+Qp~^ .Kf<}RbEfŘ #'r~Y%7+w]kѺ?J^'!ƈ˪v½u4fQSy"wACo"˘o+^@N"Ŧ݇Emdyl~*wv;6nx상'9T()O׺V:u6+E40ʴK`zr!Xd2WvIV'T -/j?eS~bXsCP*`j_S͟$Y&è|8{=o#<^@ /NC8>ilsFi4AVfb Vsa=rSr [|RO!WjW䲔@V 3'M1#ɗ72xI'\$KOCdMmHҫh<8\S6*R$[}:6ܹ5g3HTaa_IЅ2Cl>,D@Ock?!F~5O-RPmeP}7-͑4M"!NNvw]I'X2u@ۖrEPX*oݷJ@9'pcvpCN;AW0 ՍGwB-߾<&Ԅ^D(T)ƈZh,P&smiMudܭO*6s B­e4朙u4eŸamqҺsHNsz#8;}'6 x/dt:mӛG !4Y{!DQ?z\a<1?s&jmUvfX3,/cxq1TcGs_W }NYK|i1 e{Kt$kW9fk$~=%rџm-tN+sÁ #4-,rFWmOq$j^L *}VmXd8ΫpQ8-::\57x 65{;vSqӸm-lnkQi1ی,oQ eM8ۨ=rbptֻOx󭢺|-{W7 nsǡ`mPbӵ6]P@Nj ii%_L-~_#^,pv[1)yvĽHXń_&XP;"/GpXt=)=ye}:bs^_b(lT@g=T_N%:08n$ D){Q~u|x} dz𞡟 fp^N,8!ߔN߱3X%9Zb~s8llv+%ic7R^%uKg+lS,ܷug4vqmƉ:CC /mabH` &~ QIYq)^s'6q!.ҸYn0#>ߙ#Topd~L[\]lL&`w{'Az&' [79 >5Q(WhCP,'$%.m ;_iCθE~Rum#8QGTD `WLuu GåZtܷ N؊ո5:ha_]5qst4͓ _+N8=']MX(FZgeu.}6 7;Ӓb}J56Rt6 rxik{.]3̼Nv? WoՊptc^mRx(WQ*_rsJjLd]]`)/EXRE ÇMIB_~TDE[mfY,+dʶ뷮IJ\'\>uhTkpU^-@&O;^ǜ3GxWׇ/̷um)X5q} +nupI:bHr7X}@V'"s sJdkY O>?Yo_%R-TwEn TF`V`GXdIKhln;~Np 3|%N'5~3k UI=D>n2 7AR'z{gæY!oέe{Je%cTâE8j"K^IV& ę⌄;Lh{)l.\qϯ$aq̕yC؇Q;Ff\_s9]w]w$.IGѸ3ߟ%'6rP?)beu7zZͼӌa^jyȽ]ל.! >K SZ?Vlӑ-B"ZV{㓈:{٨S mہ FA!}3E{]7 }CCJsYYS^8#p1}>YdNLT9s\&Vh^ϓb&.`vhKδ*g^ű( >!똔赈sbڠ{pLޮöqƆ]+UujΫ6;`&en!F<=6d rϙ&"2(%#*6 o"5)`x[,Au懑PwgŧA !\|{ {7rSᴿyp[b,v4#aN jV(9ɿF7|;:>tRϩt`~ 8;y=jv^\F xHAy^2GSZʜSV?{0'? 4~3}/z[^'h2lg~B~8Q0lͩM35]S%6R}ܿ)%:c$uqN?sQcL$Mʼnr? 3~ /5-ctnx]N'arɮ7Uem{K{_^&4@4$)f)<U%}'>V(=:TF 4z19v1OG,_6uk,*p9 w:Gny<&nķvo |Nc 6 }QY^a XL>V #U[TtF*݌Yety9gUgLs\U */LT/+Ʀ3>/'$_33j:0YukII /JRN4ʶ2ćV=pJ`]5koPb9#!սl#%ql:{N(>yz)vj0*wZ 4?r8rwP2m>ImnqG2꽫{J),r!)x`]1ݘY`Ig*mmIiL|E2p}Їg^% [sdhQtr[?e#4L!}[ߪB#vp{n!mJ]`z-3d{1.PTIIGK+Q\ 6Ջj`ߋ;E kfteZ7;Go,&?OD58ȴ`<{oxuKVY{wQamm[@EGmױbsy$?ՉYLp0)TDV=MM.-f$c GԦAB  s*躉]Kkă5\^`> stream xڍP۲ ] n Xw.5;-$Hp{sO_^QeQ*1ٛ%\YXb <v&6JJu )&do/]&nn`ouXXXXl,,ch7vv@gJ1{O'-sИXyyv@vcK65{SQX8133:3;Y|e\,@g WEc[߉1!P-A]܍w hjgt P(91ǀXXK￈@v;:y,  @IRÅ`lg1"*řdWѼYLhW| '{=~Vk;{w; ;3R0su`ְ9ec.B#8YXXyY@GԒ/ruOʿz;;Ś݀'W!@.h~y'@X,[fv6~\fq9UYUJT`ddpE(Xؙx J^?A \ ip=Nmo<66kiRhmA6ѿ{+ؿO53 @3ʸπry͔A.?rdTwP,,G>UKV߇_)agjotqr=ޟqY w]]zO.N_/Y⿈, v` Y񿈇[jAE:?]gi_flXUIfL縉r]O_mt|߈,eЭc|d}_Te_߃u~ux_v6@s?RH}%+{{zt~L}_W{yfK'4޻_s|d{||ןޙN\&D.oG ",ٛ[5w׉3L Sh}e^qr}DMt'2 u}OVx 6=I0Auay{hLqQ]G3 G2ѕE}@ʣqbm"t@尖Kb1F#Z/t2${ ƅ/Ji&AxaOrȻm< a ս!ѡ{p[P1eG }XuԦ0m'9i*Dd*[4ذZLJNd,p@Nk\*E UTqr];]0n37_.NajEɇ"FY[!`j¶2 MizOqBi7otSyl߬ߺ7"[%O-h#waB PB [URڷqȐvH5+jԴġu,u/]15 Fg"[sr ;m5*6npkQ\ Iiv,O w6/2|JoIa;Ǫ Of~D,Ҿc26CɎy*xg8A *[,}lTVRE5jR5гyфݽW+7kqur_ESklO6#c9İ#lRL{4f޶ȵE;grއqOvEf6}Ф6n8 =B; )a4u<$I}rsLw4lȐD6@l,K8LY  5B}Qcn $01gK$ِ/4w@S>\8i0![ l$Ac";:Gu%p}ynL*ɤ[ؔJ\9?Qb#dpL  af{ ݂O ҡ݃22VhkpzЄf Dwyvk>7£@?5Xrhv6:E-05KBXt 6.`l0N.Vt9|ԯlĖ*M,rv.40ASGI}f=m3rL22B4zDܪM%0nuuxcZaT@={Ę&Lz: TcPL;f޴;p8pUqt ;|IDΟIwGy3'8ұ :YbC 1`I3֐o<(|7HL?cUHp@bCN+N+_'8gj7t~t2xۂ:b=ޖB#u`u='HSz|;%E1qr ?U)Md12[TPW"ey)gko G'i>PRۯiŒVZYr]WFXPS\b,3lYcQK:LЍҭjgƁ*l~+&cy;RC oAz  f/qÛa TA3NF!(f.1m+ Wn!x⼭[$dBuy".vIG(=" nɈ{! s7N'#&x//U>A"89`Ň?%N&w$Vr:҈sz zr0Qgw1E6q8V&'?uDԳU\dL>|3`Q˄NV%lܸe Ku:^z)wxC  6]voA"޾;jـ͜3O7ӬVi|vR R0m_;7>KʼKoI%eeuR3z˅ET{*>ؑvZ{q֯{!,Psޚ VAZ*koiW5e\CⰝB]M'ߚ@mi#]\G`FY˵g@n}ҩ"mYZ&e$#+Pr`?rG7^Y1u;_MhA!wn̰1C VLa辂6p OUDq[GͬqkFѧ쑎1kǝ޸E U {\S˸CEq7{35y1B㊅ wI6S92][})BdkK3 H $69LK|N}PQ0'=L.ٞ/!:# . ~Cihrx/%d'̙9UJ27Q!$?,dPaп/4v2l55m2w 䪀 @,34j v& X% "85_,n'@i8 #=cAn_AYM'9%gKV~1BT&E_Z$q 1<l_tK$n N#w6$͠-*Xᤦ) &%=_\ bm< t8ϙpdS1cJKq*3bf0 :Pj񅲵\+bbπ1:Y6j܉=Tp e)T5E0h~"Ĭ^wy'f^sK{ 0 ;D5 cJԎ13DYCsI[{FZ+?ηeLo%8R;Xz{+eTQ7-zu|n, ! |_b]JMT<`DlYc Pl?\eZan㑆 ԋ؊8꺛|G~y /XeLZD}Kh?ut(d ZJFMb7k~#4ALW:Hpg˕D(nw1V(awT&Sgݫ6C+n:2*R**R%qBF6]AT>n (9zw9(jjp(WL/91TFsjѼۦԟu#Qi)Ya;HnK2"2H/LE t 49ԏbitbe[2p&.ONaViZݿ]te@$f;/P3ֱX+|K2g蟝۝i%SFXC.(+&T(ū5NWJ`%&7uxi?o?@&2>1wyu#VკHؽF/(GΧװh.J (8oF K*Ĝ$ff,$Kb:(Q >=wÉg}6;OnsIa F9OKzdm⟖"RV4 T`ҳv]nON}ā,R![߼.m ;l g.2b*'iI9ymX}6'-MfᏋKeHhkFЋٌB.N~d\ 5\p8fSO{\gKnor JDO 蜀~M!K{UN`tVWaK^[/|9sXW'pFlp~xT“M.AySuWqg}=+2"%]B[TrlyٿQ5!"UbƼy> PV!5ib=B䡜[': ޓ8t呩9zDL0J}"LA)\F+i_qn=2@'2 q-[R/>1_L.^&=UBRq} nƍqOXRЛR hAS{Yy̆ڊסS'2BF\H-ڍ]Pk_]8,RC ^Lx}OO 1RE~ es(|lKEaw0F`Wc5i&'hGR2AAŕtU31z;-UV[CA%M~1#}Tt)Ӯ@&2ى=k$ʞNhY#V2y1phy gBw.r:  `gn* /\`,iS"[p1Y!` e|w?ˍpIؗFyS3^e+jn/w"Kו~YE:ZWpu!6rri}(E1@ϊcjACgӆ) 󙿭..&u($j't7EվlbVhjĀ@9cm>B%Tz\Yjt|!Mk%WUT|iy:LM<\Mf5qZϼg ۨ(jsP̜Ն$ut!ks;C[3_bMsnǭqȮi?|qڰ%*S^`ff23`hGs11bŲJʫ ] Sf:7#\JM0 O≂zӭpu)̊<\>G1%n3h,!&@i lˊ͓lLx!Fg׺Ee .g vReS_i^ZPQrO4)9م 4TXu6/PK Fqv<&_fխ q%$xyT'$)H2T5aJ4bFJÏ쳠wzEMJ&<Yuc?b^{'S1>`^}b}|Bg*Vd<"~G֜;tqYVz>Q"*f0"'4GC&m D 1'J*H^ v'_P7Nh %I+ؑ\Un$tS fNkG<|2 so*Omg$avDޣ鵊wx76ke2U$=i^guP)[ڷcM.jOάZ Z%1VW?5rړh}0:n`h(Lz勜F|?8#Ǘ#Jˉe2jw[`>U] Gk'V@E?UZl QlFMz|IACxkg񽉢+e80MHLWiђ+6 y]"%̠兛ivC7:n828lGԧ$UgѪJ2˂BQ9EXz@uTKo=ۮJT}I5Xl5NpV8\iGV烙".||s'JP(b.zR'uOSImz|&­s#ht #bqi=`8C_si5Fүg\eOOh8Mrsm6}V~5M&"NC/ÿpTTor-yR߿ |i@*v0,.VF])[ֱcMy!&k-yG~ob/;CwB2//ArKlo>>1}ۯwN{?dK[3>k11RQ)ղ@}@cq}U(fNcpXQ(,|XR'dNr`D264|g" ; aԸr2s+};4 ~.FD"0--TW5,x5s , - |8b@C-D% :1L~ͮ-/fyXȵz/x9E8gq1i< ꥫXORԤ;0ds}Oux̩^dΪAQccm= HC59N iD> lsqy-{#l&a)HYwevJ~LZsB>Uq>P4w=(Wxw72Õ,$${=u#-gT艼uxvE+bt G: ئbv1 =~SR%=_gjjj@=#KDwps7-|FDy`d'Y%&L lw=eS?Vˠ^*1E8F*JJRzܲ!(cӍ׬6ez6ZJǬ7u߻ZlpK&gԞ6Ps]M1h[bn79T|ŘhtzxM/B+uPB6٩ZpD%P誖z=O=vWn*,cn:oJC"£˭tБ;kڹś3-⇝yj_$F6U|1j0͟dl#<"5DF][Ҿ:v@t3 l-|p1Y=/d)@9Ձ6|OeX*PU S7f2pMk C̗@ߗp)c *=#%f_sT`ӤxVE?ۑ3Q  pr&Uθ8eb)?Ԙ/!=4p!1-5l\j_,Qk7>9~@wS(5 Wa¡~xU%BsW-ѕFD9$s+P9@ @`w)'v\%] 0EM\CFc?=Nd/m9νsN&(z$xS$ Tu)q$яNӘ .TWÉWV`A%Ĵ! { @]xjpsPutJ3OE?ud1R/8|UdGw&ilu8fnrv45^#^u#L,R:*V;R3m;g^7ϧL }θAUx0R?m6Ucz3̸{(=:q]Зl4%{sP0J>!?d!mh}-=m{9*$ԅSLqjYȲRBMe6?YguEjQ۝/6Y)qv tG\ї9 P? |xVβ_Ml+ZfFȓhAT~6!% J!PÅ藇қ}t{3'~Ann% .l{26ox2* 78EuYJ禢IJ(dD nUW[p= 5 ~Y|!EfB eII77~O.6̷SN:,7iG̮U5i0vC!=DEÀ?,}<\AOKhH 7$V_T.(G/5u(,h l*,f)i]I?NtD`%KQNa@GLhȢѰH/qY ,׋|bmAeK5rWOtUqpN*lE]lCܰQ5bu*<،>wUbB9 #O +]?'Scf춦mIkֆ,tYavvP8H''`MGSM&+m^k_ l .s? 0+O3mk|A[ĵt=K~徭/1x6 \MGyO .Ss4ה.6+?>?qLSnjGBs3!hv'"o :orf|C\Lɦb'2t3/UWSb]+sCbGm ,dyJHp=vq=Gz֐Ru5jd*4f~Hh,NAK!;&<9ß%x#fM4+;DtyUNT'~WDS  >B5 {ΐٮ#bXkp՘@:'/\_ ʱ6f&uF .XSo(6D0q!]3}"`\X3'5؁l _pok<ΞH5۔hu,ѷ%O.֞6Z4ݹ ßktip'}&B|z,js`48/iI[7dѵ|}lf4'!;=QIIQm^4[\x B\n՞i{ZuWi@di]o.2BAyK7!BHv"27PVdeN𐤣im⋖}"i vb\}>]S,^6w7A7bES(Z=@_|aϰWis) UN$K؊bA(t${ ByJd\gA˴SD #OBRitnjUn֢dȎ}/~Kk2:m~5G|L.d_vDʷ'EGy؄Dy"zG5 6g/oe&:o"guu8 ]s8IO*͛ˣ ʓDRGh{<, Tc|7NE\to2^D~fWc8Hl>bIz/D `s9- &m[r?UN5HfD73naUQ? i40nRѫlÐpL ^V`ʰK=dqMV2Gats=\fH \&,bG}s ʧAdyʆR+>f1X09ؗk`*y\M j"gۤ杺>5'GXul+FNg }Isv X#IJa @i%0l9U ۢ~3دlՉ[H&D9(pci~5[.s<]jU"BHw '\4]ai@Z=lT-;#J'ȵ3T̠R&wKt3sW"B|m_)'3iU03ozm)r#9S$3D`?9*Mc IN^:KxI-ÈEBYGQ}D~~|ف3=vo$i?c`пxp2fT~>8ڮdy΢52WRS!4&P} dnvط$ ,ߑUb󄆰PQ<2󢻂j {XuhmG/Ik,, K;v?a`;VǢ1"} B[#12R(ϡ&v8`mM"_ c-n%#~h洦(s7KApKuT7Zq=(b{w+Flڈ&ҧn}ђi!6LOzw]+Wμi)*sI3~>ʹT&ϳ1:' P ɅFs+U5pbkEMB<,n ,ro8eؘ\Ԃ.B+k8)B˥ޖ:{CgsF"I26ft.^eDɭYkOe+nQA}*1;@< W/;جy_#O!ejIAegbflMI6NMΨOIȵo`gR$![вFN |ܟHDbR~;v/'nVS% &[x3.c21J EڗsU y˯2~^3(JfXe&-Ջs0kZke1>=^TX1?ÆtІssb);_q'o:4Fa kIrmb;oEV #ڭ(ΫUVyFv9*e"7ruchGzPB^76Bmg@Ҫbr4ً>̣( {>&`i Jᚷ$;o3 đ`Jx}\dz=$_zKV7 0VӜ[]]IjZ _xpANou>K͙5TP d-hn5rg ؄LGx>Ϧ~(?IX *T)o?Bt4AaƧ S'ql{$.9{D r$Nct7~d5Cذ9 *q=~ڭܭ[C^g{=},հ%!hOɤ](;h}5y@FDG^k:\/Ҙ4{a,BF5{j?*ԭgg0\ Tڸ xuٷk| -Qµ\Ÿl! d.n(1s>5CA;mB|R'[|4;H? 1b&m+CQ|瀂5d&/I6mi &?ۑ'Ax8Xu1"!qY#T 0d&qIAřV%W(qc»uR.K"0Ml:ԊT<&h6!{jnczlCd'-<)D?Ԯk!HZNہ`f-Ncs,i=V)K8t;_ڲ%q &o>G,rh֊@cW8'vq+H*4os(YWY9<^ՙDdz)T#帷!gEJmvQ`^d CǕ[$kU]UiZQ/C:HIC-هN<`70_sWVg*\CCGUȼBvvCwŽ.WfRqF_\R2NP0X#VhuA#XU|$Us?Ņ=`@՞5WLE8HIoIOs<5uiH\GMXfweS0̦>P/f~MRY I<;(Al->ʎ.:'ߠ?iK/kٗؖ l}In#|`E@ fMe=F` ƊmQr S6HҊo i3pZXV9SM]OͤbqW܏ܾg v7|.Vԧ(E1`&P9`/,2E[e1U az[#(-t=Vd)ғ}6)1½5EOs~)Uy*DA֥DN|MU:V06=\RS!wK6o'=>l5͜$ۖ4LmV%>ek)0K,)y&pecbpDa6j> stream xڌeP.Cpwi K;wMp;w  XCf3~_9Usrݺ? UVc1w0J:ػ202Tyl̬ W[Rx M z1gLL f `app23Xy n2(0d.b^ K+׷(6p:L &V@f&53_VLL&v.Ζ4@tv~ P4U#<@ Xx؂̀.on@g[l<@h_x&lbf`hbXl%IyFWOWzoC[7w_$ET&o:3g wLiޚ,ao.`gwu8hu/jcaw nL '7,Dd@W333+zY1&Wrd-~`Vd|q1q\݀~>TAfS%h7~3x,ߟ>햹ˤ-AWU:x|x f6Nۃ߿YM@ɂdߺ? g94s):m,@g9?_.;I7[ۿԿ?}us}}`MW9ke\M΀ry͕AfVrdTvpP ,Kvl. }K|;4)ao`trpLMF8>,o\\o,ϓ$[70A\&?$$XLRIz87N"nf `R8 vAzE/yәAo:?""7XG[bgߺ_ַ"&hb2-7 @7r[77?߆ohś:f#~xs[ߪs_^K@?=dg_ek]qhnj/F6?]k-f=c.h)ǛM\b%`yKO;onocq|KKF?ɽ1y ޖ_/u h`j]q_+B7)0Kgٹ6&+xHH/ڎ ɳI[#ld'_F{K߰ND2 >;j@wR9q#+`{Ky6 |^[SٯCy!V#F?t"4{ ƕe,z+l"i,[küz:WxDӔ>i8>ekKm$Hk 5 h:.ݼT@( nr]y 3VMQ4k Btfu: L+`4)'cb]+"[~nDYG9l' <_826bcZFuZZ?~ʑy -EN;INpҁ=[I: mm)[H"J瓸Էi-̆&VthMl&*%J#Fc()/u:* -Eƽ}}2?b瘜9n!桡[ug}雬1 P]rc/i{Ks Lzà+A{yROr@e]rF*R>ƽJ O 3` 1#eySB)J6([l-U&@T<$2nXKvW/T;A Y͢Ub"K6xxiH/JW෸tE5XW_fW=<$\?'29ruK2½h;$~ y}D޷CGR̖bXqy> [l{Cү53]24%dg]ř /*0}'E1A22dǷ`b \Eڽ'/(# 9 WN8N!mFݶ;V/kۀi`KqRsehJkAB;GR']||4,5,1 pCDfAs])~!H|0 ^#y e˛gI=m fS/#b jI&%:L#k5hղU[XsC@e!Gr 'q_(@NunB^wz J%22e7A [ęLC; aݎ׼rP s2bEb6^Эk֜'zרʏA.F]dL#;k؟av3rN4{- mVڠʬ<$+ :X )ӓ5qDSJK AXYZ؁uY|.GdGw;Dʨ+f.ZI2~ y>E,N=mn3EO 7-P[h9M/qU022;&#ZI >r ʗ2Up66( ?0*_1ybQ 釖3F7 l2/]`s5dDZm+FOXc+K,*9 l~R I1 ph/э}5lЯ7v-Piۇz)jBRJuĽ،q`~FԘ-rϟSR"S02vkFGqLm?4QcwMX|ӭ/ͤ7 tx@^t*:Gi#An}P4B{<=\6pԸ)0֏x) U1B͙HW A+!|`ER_̨>1RfsRϜMY䃬X63D |Eb`P1dU 6thAy*WA5\e 2` ֑ k:ZTͷl}D3"G]d*<2>'jmmbৌ%eǕA͚O%v3R!X=ت:YGҔ<, >ЁVK>`K/uO֑V*'^/nN<3 4I-xdeQ:@2ֆG ^ˁZW*=Z*cz%n_s>zKvbg)0~@J\;H-:ACKѡ7p9|1/U7l({40ˤR׮KxnGY}h@,LiY::,")VG/~7;έ͐ 6tQ`; u<&p 4E}y]FT##+~1FIv@4@T[owJ 213e]{4L5dP tBOT^ރqMa[ӓgყnW,j 1K!0.$MzǕI%:XHO},Y'5d6RZ’j>=z3bJ1^\ATx7ɚh˗q1&`hi(!~%T{فS͸(c doUv}]a+sF KŋTMN7z&i! ׸on>'nݖ,Ma:6}ݬi[|ӯ\=[QLzfl!)5*%G1W؂4< 79(w #Z&@z1 6do.Pój;ZɱTi . !$])١OmBMm. ݅"d%7,6׻%',։5~IG T>7BM_i(rFr|7-[1yn;UtHJ,uG^ f}f@tדd!\M8e 5kb<Y#nujNH/Gɨ[Tb43) JdO7x"ԁK~#[oE2|: 2wz]Riԓ9 K5ZPFGC0_@+'dO65A異W+e$&?h#1U1{ },k~9*h Ɓ/Hx`…7DZ|F& G# #3ps3jgiw@ʨr4k+]#"McYJ#lNKrA*~)=~ujjU638C^q%/C-N[xMiȧ_)ky[̕(J9 4 Rn$*cT00Y5!|wE cc9Lm6ZQ۳eܮUʶ) wD~0R O-p%DpI"^)9@A%!,>єYBG^d)`l"#́>ryi&]sL5.`UD@>9 9 V>&W@T[E3)S^n/t(֕ ԰yI8јndI+D({ܦt$(yam"mopfQOexS/\m*! qyknZ~~wu5Kmx]q>: wTksxARONnK1ZybCLR۴〒$?`H9sHF$XU]7i:,Y4YqbtBרJtQpLٯߧ%@)-E&t GlSX(.!=mή+x 780iJ7|yN]N?G"*ťꀪfyXcl*%kNPgf3 Bĺ<_щK۰BejW1S*,߹Ӹ[dt6S iJXL rw&7t%<{%L lSE˦i2rWغSa] ZIkV ˫"5jd`_ilW1ǝx,##Bbjuo/E"Z.EgL\WʳM&yvʣAP@=$} ÚC4`IKnL!(1\,` g5UF"!0J24Adn?luh،q0lj  p,PԌsB9 e~(Q,6Q/W9dlT,\T }`(=V:s.^_?$'>ߎۼy,QL:9Fb7v&1Xe;uG1@אHS`>K&d:%JňjdҽD%wsO/ݬ“ifyINz;r"$ =*-ԻQ4^p-TnI,Hp6\"2:Ðw@_>LNts2tTg0U0^ !+.0?}06goe;et'6ӈ_z(fo}nm"!bEDޜ,bEN]Bhdm IDQq ;%NhVJ2:+[.rYבXaqD+O@AV#ta. ]9/-G/lFXeB)|^q  t9Z"C@O b -hh&$Ëb!Pd ~\p1f@v,4Wk _yS#Ԑ'4zȬs2ˆM ;S|vRK~7I d~WS߉P:~EWlDРph1' JNZ5K|QrZf>t] _{>L`N nKիii7Go,PŰM%)S+|lGAŗm6(?za.ggy]Äg/A~ DHtOI2$h=[o;)p#:٥u&-nA t8W%*wl:o6@D ȧ34 Og!eD [ӡƆ>x\y@7!1BTn07CQvl}uG*"0}n IO0<?JfCŮ!}S^EK%}SqbU%?-Ynʚ )I\ņ6 :J賄=h'0 \ [P2`H!| ƜT ҂՝qx^~^t0剧Ŧ0;4[^ݲ.|56,҄ͽ6,hJ/5_Qto,IOGZ?Š#U"85L-Hg_R?t檚-߬4w_ݖ (?H]i\y=k?X@j +Ikal4K0^|78 Lp$*J,&7tc&LKf:Hp |_uomD|F L(\_+Z}Ar,Ywr!` ws\|a 2D "ȣP'j~&ÆV%ӴFjuZ9=6_=C$ \5fOXN qQI`Qa_o$!)h%+g0WE6qyFCGp΅C G,Fy16 yO[,|{cX5DKlЎWmT5;9u+ :K-޿ȁ['BSXZw^~˪S/kdJ@{oouQl4V"yci^<)F[TzE) ET~m3MY ϷI1'ԯHTw=_1ދp63IJeiz(B1-A3Xat%8\!H +ĿMb|4; "bG&n|VNY}GE@Bnᅆm2<0-əy"\J$mwbiS m[W>gUh%˧4fz?a3‰%r OuCo23":ݧ^Ƥ5_?2 qRэWB y7f.'N1 /gAbDk#** }pQe- ?1%DP򅁘0h3MA υ{ :PyCe(~}7uCxMbxQ`+){`Wg$g`; Ee~Kfszߺc'wnxU?XQӎ.@Ÿ7 kXgƮS"ZV}+ 6Ibo󇰺, LP|i?( *Gσ jv ёYs_װ!Hbe5ly֛胄evJ6p~dNcz$rb\X2ڿlGf_aZڵ7Կt= W/@It_ᄩ;9gˬjm/ۨ̊.4@JZt<^)dl_9/\N Ï͞g 0 rEqpߒ`)$x:h,!4'sx$y#2cٴ߆sjko~O A`.TW9ZHjVg6FaCI߱ݽ1U,WB|yA,3u`)ŧΟc˷_?94 z|JVՆ$8R|im֜%UκʅLЬuw[d񗚾GAH!I Q*e"w% \N uiϝy4G=_5yVM{+xULޢ+TƂ*R; V H8ux1~cf4z^MH¯3Z~/(R)+OT$ 4:-D Ɇ@cӸ5ނΰ[4T>~8QIe"Lr|wvui^');Wu[+7d䜠De99Ż/0m;͂G,UO%JSB ECiWɡܰpl*L#Wbh*i7:]ozRgƒ׋Ul+j憙믓V"R{8VA5D<[5|sDo*Sf"v򥥃LTq&4^pțVCYՊT5}؂ZR H_Y Pቕ?q<&Gk6 ^һVeAIaJ'm()"&]}on c|MzW iCM'e:w>PRcwaoAzh-U" YQ%PڍDQߚ%}e59Ro6=BΑˊ]ԓǩg #VЏq+Ԃ!CECbR#Jm<攨PO2:L C\c{J7&:t>R>ΗBT\f %DgH#9Brmq`b;VGv44I< fs!8'"GPRW( 1}RxN٬Z<;<+'5_ɡwäzmm79۷Bn ^ ~@#Ϭ) o0NI"Cy_,$qVkZ=~aI^w wЙNfW.{gza?AaRPZ2D%|7r':<)ьCaq?>[l}I9 sVd\}KjH3ZcZ^='4>ϭ0360P VS?436"Z9[YfeSZ 69{S,35bdtMr $mD[nX ǿ.gk$d~0uY&;T(L䫵`1-1biBZ NaȶvTZ)3n-)nec\Y`;&g^yk<|0zc5?ej Qe{g#rk}{dFx0u% \䔒'FXrf}^?K$ug 8,rZXL:ʶI:d_Y,ݭ,jW!m&er>³*XA˭ \~sp/e O/yQtѯ/yͳ89 bEew.f?٧\"rtU~#(@X*JSjw'x*,zRʼnH FNJw *{tӜ*]:¦H1 JԹc{eJ=ʅ^XDЄ,_-zb\x_*l_t֒"?@%zP00%]Q4n|lI4ȚhT[vm+ U!>`2!/AW}#ky?l i!-i+:u66T])h,,8zG$ap剷EYNuN&째r?&@C?Äz$t EB qn OW*;/ic虨ML9%@NIN Ξ]ZWnZλ%WDk䵛=ŚgQeV82m:rRn{}=f =eԱ8) m4Kjr~p&lSb6pqاno(si[+8jv28St2^:G,z< hJ)r:whC.O)tUE烦c8y}-!;y,ؕP2Ee%969gXGU}aБdlYgdL31 /4~;ɳ˩ޠ q>>J߃SV /`'e_w]+A9Coo xExF/[3s0Y,!v1/"ܩG i*1 J'xCotDAl{z`KjA# ,pD | 5҅VˤsKx q,7Q1n^X^oO2E2ί6 ,5aZ_aXE KߴH,9<6Uti q;O1 ήʨuC::05h@ aQKIM& ʮGU>-4%edFⲎ.:vC6VR&?jOP7FaOZ*\q=L) "4,?3lE.E(0͒b$K]*E]膉SZ@<l}S_FGS}#N;/^SazыZ@^`vZ0G=cC!*Sa|ZQX݈'LjXTvSc`"]H.G1p|ß:<):JvC|XLzxjiV )fݒ Z<mfA[+`. S9[۬ȱׇ[dp1M^^ grG}굷]j&YlLx“_! ƾ9}OEG1E[IRp-[%R dNU w#ǜ#൛'~HP,&Df7<& V#G\u0o/9^7 #ayT>O+S핢8s Cة݁q4eKoRI]2귽h&wog%M Lhc[+.NV* j-.5l(ف+~7*buNcI)J+)D`8%a1̯ 72Q>T!16 PJ ?ga*.z@9ѯ4,p64*c:H3= Y0 4W|>XEAz`%` ћ.#C+d\N1%N2v+Е/r 6ߞA{KҼò بAhnsw2-ԍºqe|9 1{S-hf^tdzGӳ3DKuƖ_ʂ4WtAw:۞ᗚ,j!>&d&5(@/6BS!22~Kk5{"ynjWgv4 Qdl:>G.sc vyP疡tǹ@`GxY 6.Uq:KyŶ& [KUs#vOpj=|[K"AWAUS>>M1c:}rwpg{z-'7$Q݃ʓb *3 iu.0aGg ={pa _PukIP'8aԏ|;aԎ2`D]~@"R Exn]I#a}J*['F)iaFAⶸف^-ITM,~]Y`J*[<)S7'M>XN`ҀKK׉׆>2_qA쫇蛝1Ƽխ6AGlu^,Rܹ4(ƛD)+7l"V,&‘ CVSxg y-dp$y W2ȟZ>~Wj.?Zqm_\}e-ބm 򋛶fއ3NJ5T *I%kUWofjESerh^0]SW`NOjeܘہkP2; _JZL@D_|g֣ 9P@,  endstream endobj 605 0 obj << /Length1 1710 /Length2 8542 /Length3 0 /Length 9623 /Filter /FlateDecode >> stream xڍTk Ht3t Jw 1CwHH RJ*"]ݍYkvYk4%-a`9ԕ( V@ ^ jGNvvXH;A2룡2 Ppp@7(!Y rX9 0(^ q}#ɂ%$$ vXe 1 ]+0'l-4.`gw%W8Z60+W3(X..nPK31;@S^ epqp'޿AA0G XAU9%WOW6jd{ Gߥrcb qtupWcZJPW_@AaP Ն#6Q @ @[K؃#`b~Aqn`??M\\K+l Q  0>' A5}Ŝ:Zjʬ`|B]P+@j韊߱T` 0;F@>v_Qsɹ3eу ^[<(W6Wl qs_+q$9Hlqk^k4{szع=q()e0_k9;ЁzGK1pr@a.V0g_w/%MNIpG?N? V |,pB"*25e2Ǽc^?>uy~]:=?{-g`"!B$<7W["\s}lP_9IY͔N^yg.%q^:f9kSZHR"֞%S`"2&Nݿ٪|e@h(ġN&snCҧ[uol%=! {%MrfmqkfOw ibg%y( uv^Lz8)KDNoc~Y)O"|{BStHJ*( c3x7"~l@sE]9odUB.ja+!egO:a%o)wuGo*)dAJ^i+-em!^و`iN]|<߽: F$Lw_/⽲B! -OH|Up$Sh"@6/0ח%kH Dۗ}#= j =OF~M4ktd`5_hҨXI4n iX[ۘw>_|yU Jcͤ.ՎU2=}X̷͋@ߜhX7YۢW/{Z輚Gsil{zf@ҾYXQXIy)(VXeH;+M>0= `%6]4Ѳvl1!PSs;ֱz_/}XS۵ ?zIphZ2=~SR0=Zuam #KXǁ]ӴDI&+RO2i%B<\`RHeb깐O Tq!W닏ܞiO%֠ܢ|L;h u.h)m7 uDQS$$xϼw:5J2l<&$85۲rCT]4ۏw<+Ѓ[달8M/*d}x͟Wœ)A3 q`bŧ"_n0{ {8Uw,a-Gʥjs"Ni/x$~3n#3"?wߵ(ڪk双be/7փ{Q RR+aQelC;=4*8tPӁ(]쎫XI0^9~ֶC-Jd@Ӈ\1(m<RQ~< . (rm\{ ` VXkՔg*^Ny3u ;(P ǻq./~&~PH+3t0s/$xu&#@a>@.յ{`0E~`!W9WꦌpJ0p2b@Fg6ԽpnX+ d;uZ`\pvzՉޞ!g^r9cl7>ОT,_R-j&wZT /J2'cUMSe7WluҠQY Ҍ+x&y͵MTX ʹ*9fTMu 91fOɠB@1Vmxt3<~9LVďYYj3Qc/m(5&C<.iczW0u^-[Uf; eOTIswg>0,|t45'BOʓOƿz?+zZr]+sy\t}Ng.ű6a9V09Y ݬ֮NߒfW|`.Č>Ng:qAM;q2"IjC^"'MXu=?KhDU糢O6ܿ1L|={pW;]n:/EӰ?F %>8fwUzn kz{ %C*gdiXZ?,H aD*sr2V»V (|񒔖iXü(O?Sqʫɑ՘:K%ѩo4HNǾEc1Ȇ#u’0$$eT_-e5= 3'!#,Ɵu&}݌F с OŰNm"¤H}5psRN!/A۴4 P (A(+5n?IrpB9Ⱦu!AE#tf_9h^ DDbrP'Jg)&K5 ̜9us D+MqPqqvEÃ\˔ oܷXBII}UgViW Y͑'7|Gێ6Cc^Q|2yӋBD *\dx[;Sjm5X_2xfC*N+q]f_~C4F֓O"86F4H"*5$T3_~dw<Fƀq&q{P1"ap =qG^|զs\0?*?Ö,|6`qa^t}ԈڽX;>r>M6N;A~jcwj_&RgyG8*"P= ML?$E{vV%/=%)ߵlӃҴ ZO /h)D'sTTa$T\o9ľ>#C=!00{- ^St$]0GG!HĈqG䩵o[RZid6fM r鰎f(8R6N ۮBpOeg -F G\\k@0rn~_|2)vˈ o##xz6~ h)K@aڨ.&R&$#oW7Ԗ D3m3Oͯ,ϔp~q.JuPS=~ ff!RUk^nM|ɨ OΝE3ld9*Տe> .GczY^&c]Ys٧G-b@,j`y1-KU[E\X%.y[w֨'f#!) [=B[TRZ6cܻh:3͈1ѥu[f:ݽl"4{RU>COe;GArHp.|JǜILٮ>;m=u@1rOլ0 -uA,_n~?ltYk{ONO%YC0.wed8Y2ZwJSwNPvz ĥ9}w^Pgy/cJ;ŊOgI9N:|䚘raiU{8IW̔x;Fu.ф^D-\"zBśUj+3z6O\Z'HT:c]ʹo^k*k>Ac)wp~,C^Z*5Z-`AH'H1H_K\ >H:=}P75B>򦙦> 1៷1_cs5ܯͿc۔|QRܠ}bf֤_ż`g'ή,rΜҵ GiC{KUF$6zDG)aX:κE(^@p E5C t+%0g([nR'.-xd2/!AO_\E$ihO!^(V.fIqt4?Aix߷< Ƽ02}EPey~BL]ђߢ%`Џ#%OX ;!ު93[.y7-[opڮn~d eىtn[9PQ،O.CoްOݽģb5[d/L49n<'RK_NjOqi[jLsŝ ڹpmfyڐo&>MvjNle_DtWRQS1?QC09uQp ԙBִ1t_{̝RGRrSӁ6[F"F\ߣ_B#G+W{l ˊǢfHÓOI†iʦn[&ض` dDDytW5f}y $fuNZ uZ7smc/G|>aMxYior^T0u)ҚUlH Űg"aJ\_|/zCHF%ˎ̛ Z8 : kz^^;䱞~JF!aj;>54LW|FQ51Gf#@BVc&݃'l4,@}+#x`->7o,"" 6qŠiB8h9J{ͻi|079Z". Ç C" '=-ݎWG X|Pt$* ^ӎJ}\`PԊ*V&vBoL-]Q]|~MδtNQ)|ɄA\V8径9ҢX:z\S+~KK H:Q-?x)qr6Z4@mF{ {xeӾdLɺ\:/~z/1M4$ ovyo-)G %m"rgL1wk5#Ɲ RwMA[lj]M1Ae+s9{V6ڣDjf6#e"ol$Y%6PA9+)Mg+Df$8dY(f-Ycm̐O#vј2.CX7"5"-Ӌ  bgY2Hũw8Aف;J7"6% LPvG1^]|DiW>|o6!`2/R˙zB.K5{ڹܡ$5f f\𛖢IoEoۦuIE]Uܪ`ԋ7";/Fޖ&#[q6i|c|><7SX:+5]^ZUo0CQ!-VK@=\?sy WGD[^I+v#WF%X [f踮>ϋ=|u(N$|mT%ߛ0J go[y"ثqF9=L)nRjҦl#4nrM%RW%ޓ=дY5Z1تQvX4׆堐Ьmy, (ǵbw/ %syAH;اFi<:Qߪr>*i9=7͔+?x^tu-0䝏 E).Jꘚ&}pEdT=pT1^'0߬fR5RIF12yYJ1B{kwD*E{WٞTZ% %Vu[\$ X9ŨXdfgq|MbؐL5[_(s~ [ r0 +(s_`7I}Dg@H6K>2_2j 9Q2q7SAx' IboMyW~ |r"/=AɸSxY|WI}LM] W1S>==[ "Sg~6wd|pZhO9,,q {rT mp.胖e^4 kuA)5<1.AR#WbRPZ&Py|qJrY:iXc? endstream endobj 607 0 obj << /Length1 1443 /Length2 6603 /Length3 0 /Length 7582 /Filter /FlateDecode >> stream xڍTS[6,("E)"M M: wPBH A:RDH#U ҤH{)z}k}:ksf3{?fi)Xc44 b, #q(~bvC8AKB .|PPI ,7ր?p;+aݱH[:0."!!;Ppc0(Ѐl+ (@Cq*)m9J C1XY.^tpc5kd@3?1;ot+A\X8p@!apE .V-G8/_^~U 0P;m (8ΏsP/ 匹ȇ>"QP ֡|0,DQWmVA[+ah3X8b=B ֈ_cX8 N.p5? ?>8``wwB~/ft81HC } pXmC 56H4?/p_cn)~ߣ Yc(࿏X@u?#'qA0 !$]. EiO$b pZ xn.^gN#*WoG.(8_ODA\w! ̅ 5\ 5j86l$YF`//h6n `.?/H;PϿTA0ֿd&(" @X;1K""'Bp4E p17` X `_E_E!`2͡ pF<6I=+}Z{Xpەo\} H:a~'EKBڮxѼg}^{_MK]RiYPK8hg/PlG0Y^1c4|($n9y:d ƅ+ԯ㇚p&fX}5SPdābmݑiīΩ׭-B{D ݤJn~%EJ&lf6S/I]nK_P\''9x\S\L|-.Ig(m~ڳմsԒ'v$aDg~ݠM̦-^~ߚzMDkb>WG{ͤkƯC1TD|I!DZ1<ݻtxza6`6UL~C }" >+Z o)t"? Z8S1w':[YC٧2AE!UD!w,'}- E+Jx흍8Z)cۗoY[Rvuv}|< hpA{S znt.淥ze0Po:.jѮu=﷌#'KyK$9e5t8{̗%0YI.ݗH7TǖtxQrW%cFTFlerU}ܛ%;KrC'L9+2TSQO] p*%Xϭ+> iy$r6>/ u3O7- \ޠ?kܵpQ%V:|ivxad"8wS?lNtkތ~ANxx\Jm{y=4CzwI[thmY4)x},h>BW bmкԇ_ͻ'Ǚq1z+!9W_t;k/c }z=RS^PΩ*3ڤлrvwj;=8=%LFj%ʈ,#hdv0`GU/IΥ H.a/yCp9 zḻ 5мɴ" K߮S.`44 &Qg.Vq=<ʯ/bضdac'PJ0?+ {mVEINĕ~OHa~F>F:E.;Ϲޭ ӜEf3#F=@$&-Z[4*, uB7>Mz$蠽lY`rɞ|wQkYd0΀dR{?/n7CY4aO@d:tʼ`iY˦L=a`yEuzϸO Oޫx5~/hRU]3 nHQ6~ĝc-e\P W XrQ*~;CDAwuxey- ,q}f$ PbI@g`i!s^Iz̯" x6{{vAXUѦ萦Ws}o͇EHz3q+Ȑi[/ؿ)lȝ}'^9zFFsݸasOτa5}\ScM_O|zk4Ք$e,BV!Jck&NѦAYNs$9:A^TVdՓ~>/֥Ցo /#/޺:>]DRL"aH &pD>1EIwEuX$iv{ϢGiX`̰[$(ʼ1CFbjTSqʕvBoyM|ru9υ5Dh[<[m8CL .^ugθmM|j[OlԎFfϔ%W Or%oוKYYIv&ME>{| FXF?[˜\xcOO,Wh%;5Dך} E|h:ĎrgA )fX ЫԒBQY}S=%oOKa*s?ںlc^J8&P' v  ROj*F)_X˼nMbQj k|zzftL6dVPw~{W,*+yI a2S2і`|BT 5zp/w 7Ixwɇ*|4h*=2/>CU*Gxyi@%VVgpb1Pi2_UU%t;Gęͯ#HKZ}Z<E֟|x9%"7ٲcղl+l9N̟MF1Z<5E$m '/Fxdq~q_/++Y}uSu$O͠iI-.陌Zit'>ucُب!,_+—7#ixk41Ӽ3^{*dny3~:? vSI;[wx@9|nE/aTT3?j0DzNLu1[T3n1F|YNo`Pzd͑MwA$PdU\ hGbN6Or0o I CETr՗M}=DNg[1N^]4 Ǜp'e`W2|8( A"!!Ӣa ]+F˗캔Y_ t"얰If:޺WzR7:&uSljoskdyV#KexN*;U;2#f2w׆b'y2 :ǁ' 6o(/RҹykwYYԅ$";X^Û_.z¢H[G`y^$hx[[:?y2]Y;BSd+(,,Jgķ>>$=3}/8d.Jőqf=d0ir8q/ua.tC}g_}sYybMFޥ,4*^S~'6_QUr›ʋ;(㺙#7g" s?g?S g#)7O0 j@w|%`ՇU5"\,cXf-Tۓʏ(q$ߴ{%t*)"}ѿF' ,ΐ*x|c=)ޓbp$aʵ6cx#,-ߞ+PMw]ds:ÅMi?:!-xK{wQxsRi6 A׳ )*LyL;nmMct-rJw&b˼^Dgj1ۛ$*KKr{crSO;"\mGmt: *X9LV.9  T߂\БI~YCf7lPUM^<[{q7%m}Zaɂ\YбpI7{0%'b|\aCgOfjr<>L{܈E4d=LO|"vZWkxQo.Q (ȽyGG],3TxWxHKƻ( gᏂ؃Κ'wQsMoĞY&xI5B0d9'O sYQm7I#I2UD/=ħ626l}: >WoeW֋Ru"H(FVYa]z04cKcLбKymMK՛:HU{ 8Cګ纴~#>ᬻczj4lLwiۼn!,7JV%c qԍwdPOケ\tLOwk*G:km\k7>kT2@ @Ze&t'9 NN`C5L\LDTeR\'BO̯[?A+kg6uw3JuR\'VIn,zI*՛aQǼ_^I>9T%J)R'ʥrt#jz1vgwۍ(=;kAiSR݌{ [gABڛ`+|BA%>LPح;!c"<+{v;=8PY'ұ.:+k̻IcGwnX2^($ۢGܷӖTBst");t24!sEjQv7):=A|@ ʎv&2tgOWC-dLKuf? 4d w lvnE:e=P1im=UEў}xX6,V$$ٲ+v>PreU ]\V9{Gqx5r21GOZϚMcIS?h>bh֢֓k\CA3h|?-zH\vӨ ~^vƯn#X ̯au yqۑy++' sEd}wHd#nxӕrVP6 ~U*}@&n6[E10x~QLTJ)ͱiz<9h%Jp(@a'-V%@36wХH HBgp+ʲܰXd2eD.yJŐ'vjolPý]VsE;t+oH*A/iI{H2Hs4BgNR1SS ~әxt[Q"H/Uf?wQ#ҧdWhĞjӆe-z-#tUNys@@/:}B=Jk>`τrgbT䮻sSw"UӤح%_q۫E3eWJ,Q#"κ.9*FULّZpvNfk;)䑯%jMw7Tە"R ܴFZgƲ/Ը_0LM欦Hb}M Eڥ'C垬OkVUɫf8_҆WZ$ח A@ L[jWc2P;V}h(zxc%}l㪦޼ba3A8/D Rrtpb^˅XKV76^:xQ,e(U8zI&$Ki(f$_F` }jA}.->@ĭ>`z0fLH٨66qudAqaF5R?|WI4V'\ūki" vl|$QAɜ曀t^U2gm@pN򃋥'Ti:9VXi> b[rdFd% \:$A{lW3UpjUX#x2LNjơZQzcg"cHT۬HޫwfkW!4Q 37sf$M&X5ANt[ʙ,j[ 3 AX.[Ѷ)OƾYE4}Lז:2Jˡ堈_ endstream endobj 609 0 obj << /Length1 1436 /Length2 6617 /Length3 0 /Length 7588 /Filter /FlateDecode >> stream xڍwT]6%H47 04tt 0303t JJ7"tH "ҩ()>k}ߺך{_{Ϲְ1!l8O_@PBll0 /7!P@B!k"}Bu@ J I B""fh8EpA%$xrP$ hG@a }QSv!(~A=( !?0>ABk  G]gxHzq@_Mq5xw'Clmn \&? @v: @l;rE(~׈_ewY npu(_)Pm9Yg8 a d{@\9@р u޶_ |ܠ!!0{h?;-:WvCׇy~=zxM/;o)jj1yy7'* B 2_mGަu8ZڈkBοIn! "`{#UH ){s?a+/5i=B\PcjA`UCC wp6P0o. m-TCu(دkصl5%Jp[/ $Cp}ז+xE;o ~8}\#NTT)rąߖ82%(@a^G]ü.GHD3ٿ(jK0= sk:[]Xjyo)f|먉2.omWN5;Uӄ-!o)h =P;G'+w='61H48oThAmI|\WGL)/XQLK~S X2y (X|S4ϊylz|oT|Jw3 $PS1*Q8+H#^M|['9Cûìd3ZD38 T=SU?9Td59io %s2p5[t:xaϢgB8aK7z=a^AM ?``Դ*qDLA>F 尒l!ny9~dAB5څ…)b ;:џ(Ue0DS~lj& dV%tB-V% 1@[PoZ|ܵ}Y˩f|›?Ppa\8 wl2^ !NTb%*떟?&(?w7xQk T2;erބQ$Tg~ @is+[O! ۣ*d:'MUX(׬},J% w 򑎀KJ}aZMoMDZdŁO f`bƱ9ϪM.٘rg3&RRVsf1"l=Pbg#sNˬ4U L4d36_oDѿQݲW}jPlt^cL?Xa&Ka1DV^|Gzwc*᳼}jEYѶMvOo1%b1b?݋L02`=@=5t=]YE2;Si/=n뫝vMFDoe %I6/OPn.le2\2htwʒ,&O~]'Na%z\q6DKr=:caKJ'7?=c܈f8Z <w3Re )]3`[ Gt^ b:(FtQtr!-\EE42PXg[}KMwU a (bP}LUp|M$i:]`眇4+[Y'9-{WC|Rf+owS[:X 9#JY0lj;1 [x517-(vs9_\c`[fmi>BHZ[z^'GTGMеY;Y{$5]z #r9\M*8E!">)I}p'|΃h [g  Y! xF_֗ɤ}h+\:P`.vFw~k 9*Me]>m9~)N}= hFIc EFJeX):OZI܇|Z2`zC1^_<ɑ/+LJGՠ_?t;b!=ǃM"*ql [ǔw <7exY#N2FIɈJRϫ<|ʞ(ƟHɤY=MВG$3=b՝!**|qc%fװ̟3F҃ќC+0 f7F1?x?w@ p*-86ɺxlk]fl E_4P0wiň-a7Tw$95h R9 `nҫOON?w|#&nNI߉̦HqMݬ +QXsF= jb(1kT&YvHZ pV^,jB$%DG)i?K.66zMgb,ڃe l[lz0X3s}ʱ0f3w+_K=t|NVz=(9"+-^!H8]DGUVOٌTo/}p0'G fld4Pib_ `j%U:&۽LYz#,P(l;,ȭu著KȜAS6wB2o-D$ FO7Ov)ЙGV֔m#spWҋ9ŸO~/hBX2;+^D0Jt}asHG0E.y&HgP3T*{j(%YD3yI;"8)FN+1M5&#GjBZ,)6{#v*FǚN.?072U{RT9ux7[TbgRBšWH^Pvk6v>Q?Hɞ\ͺQv{Ka$? >PgWn5ULJ  8}bRÕOztA=kt˗F "0%m0|QmR%S}ftHZ KnxܩRC :hU7ACΐZcdu?tEXHm!&Mke?kMʟ%̚ {bG ] >#JKӤ>Sa<EUa{@!`8q5!=VmaF%X$3f3UXB {|f"P.Zf9{Lthf=Jx/ht""CpOVi(8T\=D /ں1:uP`,~)wnl_cY砲%~]^auP[I~کH5ty;0F7zYe~WO@jz$ĩ(ntp-#~ Ꜣ1:oQ|o,aiWsgg /)jA<K]҅HǠgͭ[ 蛜WՠgM2ߎ$"Gq(;K|p9oLo`u~JbRTrFjXXKO]"b)rZz%RsHU{bxᬗ~is삕^~k6l^N% + iKQJ2ya"|b޸w;*IxԾn5OP!ĝC9ym\3iKvKG[ULNU-=">NazRw @ )ia^={kQ udZ d7Stg?NEN<# %h#ɵj#~ج(^;> !#e^tV-iEm28~ʹ6;Ʊ H9}]b±{y*kLs!orYQٛ:di۝6u?~L5vo-d(Hk4edžX 3ҭD%_NKUU3(H537Inꤐ }7sT@3?/!!W7x4O6RO}}Zҧt3USwժ\M~8$2#Zޑ 1X 6Z6Y?ПnlUÄ2Ah[T 3 o;>!!vLPJ|jQx֕\Ċ؃NypWeA딀z-Mhd]n q~}]GDW}Ʉrku2=7zߗ*a0>Ɣct=ڮ љSP^fTFg00gm{3nky$.}U,~YAަU[NFd Mj6Mp|EyOoUOψ[*:V8ølXxT?Yq0F2鶞UTxF_ӗg>4d>< "[ɴ7;VY/VsBȖ"pTU-9IcAV8ą`t =>q ; WOpa\1u%=K5ޏCtibXD)R\C0)N$2X݇2ekH|u'R=A~_ѦLTˀ%GgVt"&W`)H UDVrҀAD\MլH)'jZͣ7'];17B cBNONaУ>\=)V:\#+#3ju5J<&͉ːBIԧv!O5ǰ˷%>GO!1S3%P5,uT~Lѳ)+1N`0Nmhm#E}W+XH^^&g(i+GjPoxǭse3tWﴩ' >.%}seUMϗ p˞ԂtH:&e7[NjoI-S";#$5"][/ stIvT|Az¹]3=8[fex\>ou8}Ad ƭl$t ]MRڥو7nN>O1M gsdK,z]$zKՑ`KAh`~{Ԡ 1k4jvos jUC&l}_Kw$C/e)^ +'prp&͝ymblyA{S3XfrCCIΥv('g럡AXx`a^[e:O8;JވUQm(3)-wa81[lGiv;9 /I -*ulY e 8~51ar:)aCoRe&\)\8d1> stream xڍtTm>t7]RDSBew [E@CBST;C>y';{^3=357 cWŠ݄ @IPĄA Qb..#eAPrCܮl+6 sG`1,)QH?D @ma w%R8y ݮ_ (  A7{8D( bRڻ9Ɉxzz CP;|'0]<0WÀ3ab.c qW$ G^EappPC u kA _(rh;Zn^n E ]1W "*lprsvE (+ՔU0% GO^[䏛uDc<Ѿ[f 1Pre"fw$@ -(w^P{_鍼࿝_}0NUp-\t ulv4ٯp? ЕWaHWDA}?:˧|$!Q JR i ?T{5Tx\>߹t0WH;_Y7wAHo7oㆠH? WuwZmzjaw{5 WC5F* CAPv_[DzWįg@Z-z%.H4bM|uWH_" [Ā0v\b\ݨ4 DFӿ ]lB+i@ @x*7_( ^z%-ԫ~vp/8z;uhir?|sdYWdSgEkXcOEa~,;^2gԳݰTw^t`fA'TSX[Y$ߟX]l|fUsMSr*d5oDqܜw1{@Gbna<'wth3=1}\͎ ɲ0&Z{YI3qV8V*J6ցC0Eo}TUCa䭳cM_QLSl/x߸p+ /l}5jhrT|+#2.K.%drs-M7٪C"Kx {6ꖌCU&ZAm5; 5C!iM;Otث3D X͔!ZTsUh;/)r΀)E}< lAY$9dm|vVqaC2ЮOjd񳇦ilz@V挓ySS+TO^NĹD6G$lOAxj cUW".OD<ڸesG~ w57x<"#DeeRe(2O RRVwf[*&A&'F7]WG(8=r6D)Ί_gGdiJN l΢1kY=FDC)gu>sN _.?G W\L84 \O*joT[_:G]d4 ' ;}$ܣO%Z+7Ќ2꾺J׈ҶZ#gai;d!$7a, U|boV=iFxkTA%㇓:oc}4/oI/em+=Ht[=?ѿnp+bnlneqO[.Bޖr *8")qZ"iTM+E\dZ>i=5MOA&4òԆ,o~.;}b4G{H0*_L|Sm%d *Q+3JPs1'Xl7,xYjOp XI[8mgL[+~$`23;pStt'*&Mv8sD16#p̎=r 5}O !X^`튨%=pN&Tnu}!/$jƚ9 9'O͖ b}C!y,Iz +ϢCXm*ʃOT7KV.s{S7TR*)=7?rVӾ\}t>F<1MTL5jOܸ{_.{| XT[7*Cj!]cDtohE)nNMe}J]\kzh}븹S nҩn-,(ɷ@/VJ8\N@&]1!%-w|Ų vڥiS0tỗSwr p4syg;sDPLڔz"O$GL#=]j!CÊ59H kSdkT8 9WlȌIn!(1si lej_ةVkROXX<LXZ0?ƻ&/֕ӧ]wA!lnNoGZ9Ӌ[ӷtфI.Y=usH }(_cƘmQߘ#!EHT+[[21bZ?0UtԪgRXɸy|uOu nAEz%Cǐ;QIͅVeVNԊ^Zje~p@5?GFm]>P 0$*8-(i֓|YӓYb"b )?7F(bЍc[ ]u\ նmi [B8鶷!M֭m&3⿂@_7,lsBF$ެe{ V\A%6'Âb_4fgzɓ*wXq1:Ă0DZϑ&ygk= Ir,[J׵ e)1}廏?@ =~+MUL:ӏ\ ('n,[obcO3.;7th gn iJxr"V4!_.ǵZl4%}H9痝YCH}omA& Ei>+ڥG,vL9\&9F᜖2!e1$gԻ^w$uGHқ|IԵ?c͋Ns'SˈMWPɷo˓0yO^ }I =XW0 P iLT^}bRS`zf郘#Kbgl3]֬1$-`Yqʋ<&%T ;T PTa˄ >8Eλ(z0c#@hPj|{G$4E݃St7 PK45F5 Sw588볰&r+Ub19j|@V,FA};\R?.oHצsxAMWbOsai(%_;s7w[e/'\))k /XcbGsƨ{5")kVa.N \+Ӑ3uYA:mm${c יdx.vzl?KT7mCVd(̷Χ 8q4iO[[:c8W07Xgl\1M?Ҝ;Y9=G-==2W1rncIyH`@nGVt1R *GVr\?ƀǦ1t#G-vвC?$굑bpˣo+"WӒqrL4G֎eI˪dL]C^x\ϼ x&a_XB07xKC(>0ry=}W6zg6O:_L>'jYX=$30NQQ^l( w CllPT%Bq֍$_"d;]J,gw~upH GN4nK˒_s0 _"CRoЍ +* % in{~ŪfRru3Ji#Qz0ݱAN.(ԓ7$,Mm&e05w7۠'&Dc -VH|Şk7:) 5GeJwOZ&f.>4'|oxo-XLJuJxߟʁUk67"_ܨg\Du!œg8xYF< gsȧ4i^ e5tIEQ]<-!f[ /wy+{68QEWǗvz.hPX[vnPr{0X 2> ::o?\3\3Gͮ7m 3攪4^|sc#U.y,wygF^Э68 'ג)ႈUY"aS۠V@~-SMaphATJ^'NE8d'Ejۢ!&`f]ڵ]j߫};/' ^%Ua)5zaiۺ e:o!v_~c܆:"rWRej;D"8mlE)bM\;`-ى&n;&Ju z:5ZzMHB'8ٴV;hV.i8xD%6G9P 1$n /掘 upR>#OoT7ܬ\_gcMT4$NƓRsEyS^h]xg}LN_!Oz&o'K3MC9jt'Mr3s$)g.Peg ˯2P{ >.0uVzB,&A?G Fܾ"ZI3:?F>p]DFEH٧4(hC/ssd#K1&pJ/9'fݬapk;uxy%xa\CS֭uwzW#*Q^!هj ?XxRz2u=mR\5-'e/Dx٫  fO;]iؽbM=%=£ċ8)$x]J%x G?.6X it;5ֱ}-޼86ݰǶzqѲZgWxεk|ۢ_I-c=r-65$/v:O_¸GXlM߅0:Ex>ިղ}˰<<G im#zn@qvㄕcY֢(v`ISϓ]k'a"aB ~|U0]Is"3׏g2 SJ>aԆD tO͋tAC.xv+q:O:pdO.̢ml9wX@,f*/ kf+cH!h3n-mV}"lR;D!-ЇZU-(B&F! P$*ć= /PF:-%{u9`QE][F` (mm(e7 W1,˄5O[U߲eUp5q-/K}N]|2_J3o1c'_ySSR}CvynCOfLJ{D8KzGZFF a|gyKҧ+[Tzԕh)@iD$efiXSĆ2| >z?VsKX. {p{{ۜ\IO…)6ApI CMh lM`oDzSWj ;e*mVqⅺ[t7Я_%g-{ x 8I\_צ,A]5)9|r?;(\]v_pQk訢XCGsj 7MYS5^0NM#wv$Zk}@'qlsev]nL?Xjo1' O܌xIYGve@.)"ESOZOl݆;< ~V^B`3eGE/GLhyw#oF!L#UtQ]^k''?;/:ݶLGa%*)Z5i9lν&p^,uĨ5v 6T-Ӌ {7ȍc~ (3M jٞ1w4‰;Zr7cIO::b.̽cIw?k;M`2l"*1 ߠq㘷 BsuͬdPDWΎ9~*=D hirIEsOAθ I?sBh%^0矨g s$VtQ z1UA!θTr.lQrXwԑ]nFpPU2-DՖ\vz0IrbA ɜ, gb$zRp4AǞ wk Y5J H'MIV8[e౷z+岶S#BGIb X]". :Y%`hTHrc5s AmvT`> stream xڍTuXTݷDa`E%DnC.}sZZ{w3?ᒲBYQHW.7X(#m`^n0'`փ](`dpOzUC!n@/" <`_@Z( uGXո($,rB#ll]oVcB9h A]m7+ @ wW 61[WW'ÍBHs=@m u=7GHeEÁ7 tIrCZ:J@ '8NpC.gBd( rt"H5ԐWvtBVPM>pZ~7Ki739 pruvA8F!dPp W4v^@c[#VֿFrs"np%?Q7.?>+  pg f /' f_'f/~@@W? sZmH?op?@c !@?Y^4HH[UEKK<>\ ? @W҄"?r( _M?w-u @on^7_lUAI7/B@^bn8z5ԍ* Շ!ciǔ\7B8y'J 4uIk\  ؍`7W 372rHxP497 n$&x3/:Ua H%= `^ ?̛7F7n}9p`|  n8}+E/vk'Ԁkܰ|NfƄJx;D̮I]4kہR5C1 e1xZ1:\$iz MDw%l:t V}`!{#/ҠM*悶ˮ'Y#L“UqDs=]St-/wB]DhenWM\fvH#T }aQ21C4S?]X.6yT[^{[tq`0WV*Y έ>K'^a!' Ai >C6(dCTn&u+QQZ .s Vn~g/!tr8fZ>=+<Ė*K9 |Vro{i)N L9Z27Fy|\c.rlISU)e|x@?K+"2V%3^+M3];ـE ޒŜR ~5o E͑d-U%yx1=g})I}Z*?j8 Pcg~`_wQ黡G3y~P.+1l\Ե^YslΘ۳I2\z C3>W\?=~rD9Uu, %ʝ;"2qr7k$ehS&nS'oPYJ.\|U&'̽6̴jN kZm1ܧ}ݱ]kzn$r U#5G}}왹=Գ)L}NԛaPУC,I ]2:,s$I-lv,GuޮzA=Q0 xQmDԴݛȌD ::~=ϭ,ESZ+zdm(8+1YY[DQBX ?`Yk׏Eƨ"5 L 5|C*_>Q,".54!Rt:!Aa=5˩悏is tRl{2[|vm۝g9A6ݼL~;+GQp:@jå9넯}' Ny5mFAB7D^eA;^=[ 1qFV"т $V kq;0@-豌WǾ,RSd&V!t(<7)y^f5mRNɏq8s4-wg\S9Xubgh{gM֜h%5+ y_pװy=a;':_j:LRbqt.7‡.p%rFeߎ'wbC׆k~`ȍM[h47Ch,Jty:G!Ο_z/_S:>LŻ́Q[ȄG|CWQ J&ɉV/i Y~TO{_OAqJy ea3M::kPwau\_(֙D\iZ:f#a`uVFh:1T̺ Yr5BQ`}hb0G$6C/ /A{F)̏X%˼7DIG{dpʣAw 5刣V"|ދ0|_ N0:IIk&eu!rT=#9gJ]i1e 7a]5[>cNY6g`#Wbncղ lꫫr2|EDl1̣?Zo uOsg$#bK$ SK;N/{t]Gw|4Lۺ j68^k'86hȒe^Bà]Dk*%3|=dfs8vvd_tgӜqbD[6\e+EOTizi;]$sYOl-Z<;DCy0V Пp++O̹s*dG00 ?Uh걾c<7GKJw#hmjz&QʳR4- >X[ kXNi'DK9-k~z\.)Fuߥd z^.rq@lܼ|SEfdS/^z\uQxHʨIyk㋎}o1trg{~(%gb{ncMYEtg-d%p|YRqxNn)[bϩ|q}+/oih!sGT?49 lMe%T))iT]9y]B<u`J3k߬)a~(,-1]lu:1o8ᄫʫm}~>*VėwtCxKWGz9g z Z->>/"&:PFDŽ S+z ,:'$M5bS"` SJtKӌ}+}NHlj u劵dUo=ҼF~7]ZֽF؎~X^ 5uDH OKS.]v5kƜdd#!£Ntw" wUƒ6ZCC][{ѣ]Wul='l:N, on0q4\_+]l x!qLWO@O7,ޒJ;k&Ȣ./FV˧y-n&%4JužyKj^uü5[u9oi L\3b/BГJ]_rZvYnQ{rtSwMԶG`&"gA?zM=ϸǺ/eǻI1qdwcS-EXQ0M}EqJߘhM[z<f:'ݍ ڝ'Q'{bU4x>O=EuV7-v+By D/#7GW+VqK qb׍ˊ/sfI{F}rzCCHsK2+w}Tg؝Jd_[ gRK&xxM*T(Ăou;>QKj_ٜ;U"lV1dҌx@^nvѫo gaq}r-wr0&V$uC -N<-2groUDt?Ce_ӤT0mtJU(b; ]bHO`Ln>Շ]}̨#N5*IāiX@=W[|P)C $cC}CŸ6,{A犑g77ji'5<Ű,=&B{,p#r}R_5MNdOpq;&ǵ˺ə^`n{ 6UԢ@jQ@77|LoXy4ڶo+^;=A*"%Ld!&F?95}*&lרô՝9#l7reQG28D[x`X :L`#5m%FʽcJm]^bb:k>R~_[N>xJ #,h4˓RSԹ1uZep!P {gU-L"Kgi5i6ZEJ^+CRuZ1 ojS'OJ?0Ҹs9L==V'پjut_Bc3$[TJyuͪX~En_sRy `Y&Nm7]h|32GIL'uKLZ]2/pIr )2&V,2T>ZՕd.FvwKA. ae,טUc<.- [O޷u9w[ 6vhز*6u.-C]ݕ.v>$b]vRNO~ӧjH6Xƞ|ۦ%%[hzaAaWPhJ90%3b:v#c->1i,o1:Nk[{P 񎳻Ι|ӑ+\ai0JiQ+)h77khhhk:fa/I╭i%âވ׸3|S#ٕؓxR5BFY]~)x6tc.^^+t|^~Tczb0GN[ .i=HmGdKVmֶ?zK|R;#;;⥄-ǬQGT~g+L"dsM -'E(L#XMuDl bX?bϔ- HƔl nǙ/m{K=S+2$=N6ꞩO B{CۋJ3MHپ@ۙdtSx݋sےæ1ef=cY g =Ϝ; vy5|Bl D˾๩@{Zv endstream endobj 615 0 obj << /Length1 1496 /Length2 6660 /Length3 0 /Length 7671 /Filter /FlateDecode >> stream xڍxT[5{"{RB AzwAztKUA 3g̞p (8 !8J((,P1 EE98(/;!) EPPh2& M/( K%"’Re7#D!HB%'G7PpxB 8@rw`# A+=g]JHGDx:|(g! 8~ A&H0v"FG@`P0Dx # m;s8 ?x r7w w8Ba ~A0$Aa {4W O}H'DBa?k}*p%BO OOs]x_+G(g^B&pDCm"AĄ%ŀ v;ˌ!(pD :BH78@(= ';: qF Fϓ5Za8o )+)?" " @q qA?yWHN}NGXr!~_XL~QWwF^0/7AnPZ^( гo@^nj@iP;-#(|TB(o7G ?oa!o$Z z p9l"b'ȏkJ DOBp @pDxl,d Bз#'&OwCE}XP+pك<6أW {!U=ۿt f`ZO+]1b(ιxjSvմ#Q c{rCQ*kC_Nz zq5$&2;+l+H^Eߺ;7@99k:B^C V԰}7=25Lƿa>>P숧f8kÇ׹DžZ}5QtTy#ɃtI/bJiltnQKXvK_ ړEtBij@.3ڮ"mIu`Wq8<a0pЙF]Xhc.6=٘{NLQ\>hx}/ @IA5r_Y?Ҝ%~upo!}z*4Ѽ3{v *:9D-OB^ta~~{[(Y1Ŝ&F.TB49)~9*7OeZd?x7qxC`7nȠ M硐V~].&N"y'TRw`[ʲ}}|ytoc M ^}r1cˉݾNM_sCJa5AbXesX҇Xvi g/@ ;6tܿVx(*nqGJUpJ`ǘ+ݽIh  b8;6i wQ4\1~lc_`/k?DwMk30V;˥'Q- 3o UيU#|訆;$Wf,L*%{Y Ә_9S2a,?hkS`:3TEH.%z#g|㴹:;{, A09F0R ~MaՆu[:[hiVcV gmQfYo2oWxߔRN< \;;3~R-auŮb+B%)VJ7..M|'Qj 7E4dnMmHeNͭy/1VZuKsZI=oCb\egB:iy[A\Nכ4a 6 Y> ٔ%C p߯qCF& ZcHHQ=]q֯-z;YQ)7-s=|6.;i٤TGaGn%ŝw6B›t;} 2hM,EH7YP4-S]Ƕ(AItxOD#Ii$AqU3ʓǭ  e VFg^,!ENVkmO?3MKxpmЊ'sk{ =>Bҭ W̷YXVW/?OG̱trlMq#jÓjUsjaa&ӈ@:sڵ Q,q ŻBo,5ꬄɋrJk!QࠀɁ!tP1wл3$a/[yֹ"OUcݠlr3Ę{XJ3x^R\í7 F,=V DVO̒~iԓܥ镇).t{ C9jJrla>Gfx*-Pc>u36bp=^fm$U6 #'M̪mmZOOx2<ށ-GۋsnR꼉f' ߀'|ixy9ʨlAC956%wEx W]&{>+5o6[6^ Tю?F t GL-Cg𩍺: e`J¢7E̯RU/`% U3#!Q J[޺ljA%$xyM[/S7k[Mgʪ`aZ fTK{2_*DJi74/OiYF*`#@eEXeϽ9Dap% ? |zjkO' U7 89S)O(q,q]eTH%@M 3m3v߼yw?Xᇋqо&S:7NJtI'I/۲oH2QZ zzЖԟS`ːxXp1:u)h$i ,DC/ӎN{˸]%i|Dh< "k YXN1m8.qotV#&k8}x $ y2ֻSGmK7*hĚjW. (c0xxdL1?A,Ʃ~h[Ma{0,Zj@խlzPR&E[21ыb};O>*U\?!cY~4y /9(qb\ߑ-A QZSϢR=v;>u{#!x{\0uMꋲ[ǻTGRuIa2=ntV mྊ5-0۟)ߧ˩ᖑᙬ9k4Ѱ۔'wߺޚI¹wEJ..,8D6ԓ*hXGҹ$ n6*ao{0Yki0,AJ{b(XQE$^ |`{vLB%Ym0K :ֹJtsVp2eI1F_X7ބj-(^F贇0= eo-˶pîQ2?Kj%{@IZ/IjuQq'C"d⾇> t+YԦ+sWvWWv;;5؇`ǖv%lt㑓O3Y`5OS 6bWʨOn4BM.:i1>2x~^/CE1l.WnA^Cn-ZAN=8GU'l%gӽH-_;dBq]*Oos9k˒MQS7zSDFA1\3|ITYcDh{'𤺼aFɥ>[XT_eǔEDRN;('sBC 1fl_nzsCa_] u&{`Jj`@Od6)?Svղ Ǧrx~TK2aѸ jZ tZ5mcBi 6 M_ްVVjru|[ndHK|,bUWձtҔ}Lx콲}, WgzITn.Qα)3:i* oHLUiEdRsA i|V $.ֹdIDߒ_ƅxddjxB핰ؐt< `\͗%i'7^1jbpJPd^jZNwO&1Kajzo9rx}A[3](YMDVXvvt0tNrki/i2WZ\`üHaHy_ELq &Ȱ~_+]y:"{ÞX Zݼm\O.PkB^u3H$7Rg nMd"tXM9OR:0N,<$N<2j2VS4vyM2J\T 蜍c@+@+cc/ܔXҠΐoJ ~-mߴVtp$O[e'NRrD\#1UJ= PW+N}\2{&sj#\!HEɣen3O%T$uq[ǻ>#8"k{L]@M3 ";t+5K U9+}2jŸ'c Om SDt*6{۱_,k nȷÅ|{KȒr.,H@@U'HH|Tm f]u,no[ە"&/GwQVu1t8t4–HP%M޸Q3[&uLU~j|1uL* ||*nVRUVڸq8K?8dE=眏&uOܨ*enyRI$7ӇcW SjR'uѨfi;l~b,5V{Y\0fZ ˣJCA-U[J3{(yXG.q5qz%ne-f=,]/|}s*o&+w&.klA(1ӽr \Sտ˜X SWAc+Ii/)|f+ iT8٪]"o<-䔠~Y>KHpW#nfPX 8|GȪϠGkMaԒAȧyEOW3+RZ%beLh{u03TfN'Xtч֝XC5d$G=8Xޱ0hqRo {;3,Ϩ(LO¢E'}ItE+6xL4DSn̬L1ahfYaaEžaX,+tf6yD ֆvV婕cƐb-{5%9["ҿCp݉ROR+6&lAc|[$15 dTRtęNJJĐ'+VԴ`1odINJpk}kK|sYd:/Lޡ,Wn]]&,2@U6k6Ffb%6zl &}/C3&"=3,]%`s}hՅKf\^zw\|b|=c?.5|xl:7؃ԉ*vYN D_M|c&cSu6xx;/%gm=֫CejKQıL㴉ާr?[&϶/WNhv{.L}8.6MB #a1[M )uL[5b_ Yگ<:Κ}Nm:j(Er*fxy\W F<N>.>=mf3~/aɼ\Sږ} (7ܲ7DT5#2> stream xڍvT6)%2@FJw`&lmAENETix{=;g~s_TTriXQ0$P7@@H u5SZ8 )hAx> r%`iy<Djo8蠐0 *bepdD~04 C0`rðPtb=|||BA@?)xfp)Ax; #P/0zz"wN7W"8w0 qp jX cPx7q~wh( qB= kD_i𷬎՟ s_;Nfݐ(߃3 u5C iM) :Jov{<!`pgh/XvDp',GR'; ss/ ؀@>~t{b憖f&OE I*.3 B(ܟf_6e“mAR 'ConH[pCpw_^X ]0zYW鄂4FCp <ĥ`0D(,>1BSZ@ ǸIN^h4^gyoQ`0'iB轺жZe6DH),߻W=, Ohա Oǧ؄vrQY]C}ej-q+8F c t^MfH9_"v,>T?0dHaQMBj4~hq2I̗D|kzJv΋DŽ<L* VǚK]B>uZLcK@<xnxrٞZ֡yؔ i-k)i6u' kwi#ڟHh/)huVg0lhlWR [ ]/~-%iū ,ۂ"RϾ|DXL7D!j"$Y&Rֹ㾱F l:K2)&*R\t4 z1zRïS!g tk+>+ 0};EH09%&/(ӡ5;&Hh^f.7ZdNj˦%p*]awUy\e';, 5SG6 l]. 49gڡ2aV["[B= t`S%vN 骧+v[2{=ߖCms&[j~ơyO:#G~)q3p/R!%3iVcET-7?|6;ZP.Рvf#K*'#VEKH+|8'qBKEpQp+d*WQx&";>a֗ot3yz5t[s\-bVhxBri=tfEtmDxoGDJ'+1YuҊLE1Bַ 8ˇ(*p[ mjE|kYVxa6%:OK]'#DCb GQ36OU#C鯡m썾7חWe?\f_߯-_ʧ[hQ ?5QO ,JBY{1C~lNB@tA3SW[Ꝉ ezn%LXQ(!}dBTN͠ށTMƏzKjnjh &5M%}Yjl۴liW-kcfx7?̧K {Px"G'E =Vӥn,~`LvWy@kT}Zp7Wo<@(AwVe@p̤*8Xyc~RH{βdLNpi`IA7YʴiW o8|iGZ |QD>5&áܽ 嫇P\}my3} sglbhpNH-V3]*Ejkۥ, 0k3Q}L$5pu|x1 :fYA@1>$&=RhgO7FM. *\]қl:8뵸fq&WQ)Nശn?={̲}铿5 =4(&uîє[!M%#O9u+ 䎵|\)_ dJ`/K~+ܝ8<%^oBV3o }(뼾H|8ГeUPtDHk" `.QbE,7_G ,GjF2ϣPQn;Ie@ϊ@-"{DsՎE@̏ku48v=x{(^s w|pަjv`L3~WTsztzNe s.L֋ :"8ԤV]Wy7[N8kJϼfi&4@.(#'d0ȝa[TX-IjA5Uk?`%;ߑC n }x_Ͳ&$ZR24q{2=^Ƭ[jzZpJOn^Uqx{ JHҍ9HYk/ zӭ*u)ޢ&%<3jMjA+DW9ڌ)x׵. R[Oqf|9A7Nq1UDEP'-L['=5Ԩ~\ۈ OHB6O NMkS+΁Aҳ@愱c4AJzs* R&GXo]-,֚/p'r%XAs& ;H,펥-\R^fqԘr?&l*Ȃ!dLgε8/C{B_2ҝW MDJ⼯mk/ujyoTOt{k/.tE aؒR.JNz?[DbS\YH/ ]7aKI(?˞8ⷛI.}dc!z|s[~w'2mv:7v/ͽt!ӾTx1VHt{*ԓi:Yjwb[L}溦IS+K0}Gf3+!?@P󯛸lںo!{;Oi:uۖ) ?Oz .}(-ܓ?ERqVݟqU'Jh_qѝ63뭜zjH۫T` d^=5[ű(sW{}Z},Io`b+xд&evhVFj% #MnhС#\f@SA"/ ڣj  s?LGU(/?„K1 Q mt;ʇKZ[W}i)I )-G &!{eviZYZ\~Lyk;'UQD]{Jo 8:!%voy=Ѯݠ37y(?g37,S[9!I |l1'@m4j4 aţoH Y߈YU20OdNT(Ny62>s^'oe)Bȴkg=<%VȐ7 [ԂMx)Vv2O`$B/HB+yo] -_ w+$Y]T|J<~*lrx\y t/m`ϡ\1ʿkQ#P(귥?bxL& TX~-:!֘:&4y&AvMGtJ82+@itUXzSm;)#L 'USPg&I36Pm >|=;ӝ}0:2eD[7,L1X> WR7Ēg#Ji_hM?i OBijs_%P}vij~bk=vOF>p3{GF61u$idqG;?vպ8)0; 3<&4D1z_dyK$JkvX4ī?X+2zVcH'0{s/-^ #:L1);e_ .wSC7UZCo^c F6`u"?{[̖p4G$J?tt$,OnZ6LD@-ۣpk1͸Pщ%m23?3ζE|Rpyvǫ$c-zKEc#>ĵ9u'/$ ztQ@W%6)"Зr5 : j.&b[ cV(>z<9sJN,[MTKقJsL}@:Ƙ>0L`)Xfj+1۾lt`i曔/䛘@&4ΰhrDaiL+W i=2b[m/:z;|9K{9U,Tb-O%qwAN[:[]V^认#(yj}fFS:.' LL{zU.?.;v8wS!5{1.Ȗ`f+mKˬn<|?V8ʲF4MIU&G˦gtmQ=%t%Ο4ù,_ܐrc[aUM|Ttm}ka!,I/7Ƴm3rsyi-Jԟ9,2];o8we%ϩolĹQܭ 1 6©!zo M{t%l`{cMIIˏ*&Ql4uH}mk3_Ȃަ^h30hgR;uiQs 7nC]NR> TqڧttHjYx>(Ճ Lm >|h QPZ),dp9q-%$ 9q-6ZV d>QfK 1\2VL()ЪK?$ |Rj_mN44G&K ޯ$"UJbD?<n5 endstream endobj 619 0 obj << /Length1 1377 /Length2 5931 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xڍuT6RiPct4tlFlF@AI)i DAB)?yys}]q +Ѷ;hNX[`q,6An3D@65(C@Qq eDcjP$jQ,[A;eEee~]$ Aq|Eh!8Sp\DD<==AP,Wz"q@#@ޅ LpM?vcAg$ #Qp/4"PBw;_P Ey#Q@;3G (/ C=Hg-s(!xXÂH_#Jeu\@ᰀ_!1ڽEl D=!Qp_C]ELQH7w_Je$d7 ++S?+hᏴCXø#}'(ံ{$ x3| ' O/8iZ>WX HeLcEmX-([5c+~?sEYV`I0 %M!7"7tpC]xҺCeo9hp{pPQx2 JHnPԜ(nG `BϺ(KgbR@(tW/H87" gڡ1_kEl0'3G~;o[DC_6U)x $%*+R3ArƘxTI?ͣ!/g8Em᜾6{+l?,H&1YtJry vR;Xx@Ş‚{0Ƃ3U ne:|N;Tie:^ĥJ騔*efOa]%QsX&K^2~h"`\HgcjO-KED`  SG=J1 ĄL_tT{ط+Df<"| < 0-Ƴ;, $!AKQAfS\l绪՟Ԅ-3$Bqff տӔ@ܷQ9mBY, pt"DD ueH ͭXhG-޻vVLhENCTråAd[*RLCg3A noQE~v x, $i :vNK fBxU<-eɭmLRc&sռRoh)fd'Ieh,^ӌ-@e@䀹%IvV |KO <~2X)#Gl$QXX-I+B]SnJb%\ +A?PYzXbµ;qk<CcߧOД1cWfVyu.De2xĖ #-*͏\qE30CT -73MyPk2 ލ@I8wN"Ϣ"MB! ڇ@Nr]{u+A>#䢐Cy Wպ[n*j@J騣YzG;9/k&w}8Tgll^mMYӏ{rA"#*/M{gVc#v]>>{J|F(+9ҵ\W4k~tc|0d3q<|n_g=mKq3P/DY{>=/y=R;=¼XM`9P^, y(m?1ѕuHt II!g.w pm! !yjeBV؜s$:Æ`ͺ/Gޅt+?a짩TeKP9ȑaN8lކm}K{dப4QTO;I-}w0/>W6->zXu:X}1?Z"D}N/+ۚRsgg&'K 71 _b fo"J'뼱eIKMB.''F&_ I V^c6`'X/5j>OYNcaj%2:00'&OYPČ*I#yMlyC*h,]ZωvsO5u(O>U6hzQӖ/ F6?~n9q];H5Ȉ~fƙ"/tkhrن|#W'7zڹt+ Et  *jx[(r,G-cy3 ?C% 1)='Y/o#D%eVtm"P*[715OiHǥYaj=|?]nqzKjzS _6P {30v\.ujmfȯ7 /|*c0Qq_FҒLjԣ:2'zVMZ2W=^`S|Kil)13J5 Rj$>x/YGu8T1=heIsGѹ0g*Ee;S5 6TjMfᵟ rV~LC+r (#sյzꠄ DaPVj"_ծ$R{ؕs?I굽Еņ=S׮~fjЇ0<brM검=- ͜qNFP4)y069XI1!꧕}œ[ڥt@uvSiy%ln_K]8t$|\b0Lk !zWʣh?8"lo0ZƯLI?ENCxe@iD<)UM-/AAA J /[ug9Ӂ~2fo:vt_߿/ftq8+\8+:G" Zs NC6!䦮 ӥ+;RVf~HCx1{ PJ[ )_͸N jo~Z:B@X} m7S?\ OXuB3"[mSukv5{unz@s%X}-7ctydvR#xY-:N\ h0#Ήnh&$^L ƛj&/|'Xɠ`ӾbKSȜ3l\l%;ʩWpgvAKT([U. lya}R/է<:ЬNH>jPxцb0>F^[(N-j wTx.1f+mI.-bTe-SWuay&֟,GxOւ-~0[Wˆ+C=֫OTRD3,To>:W†r&#qc,xeFí?#/Ú'VRը\ԏ%FCםҗ'pM$]te!=ߋzg}ix徾8XS@1ٗw )JNR,;_yl`fөG\\% x^dc\wB vA,ޏ@ZD&0u-)BnAڢjabPgSMaTZMZ={:YxaȕǮ$oDY:G+!X}`g.FBqI{I9\V' i,I؜CNJH'-S $ǻ<dAo+/i 匩0g7E*B2Ic sF#*E $}T3W+˞׊-z6U `ql+Cd Zd)~K+Oi?7ۙRu^xQ22m9C n#N;GB' &ɥ. [Ar⒉mu EI=ZubCອ:N _=~4HZ_%Jr}xÿJp@V*A4zD7}Vق;ϯ'S+YMN +b+[2mGZx{0J&qܕ#E*$Fw2UbMwYZ`$Yx5_ E~![7ߴt;5A ڮI>uM۷.Ȣ7= .*7_U ́}[|az_̱} w#"*ɣѫe~\a]09\QMo+f^ykXf;G=7bOy#Qg,2jm[!;ƑYUB) yn,_ ҳ$% &X@Kj`u/?0w-SzE_k6'͵?ƹl_k12hH~"GRu;澈i: .N9BظšA8ږk؋knGS0 $e\y)t=ս?tb]f>ޏOȃCj2X)3SN S <ᇗGUk{y}~k   `4.t7VU}gk[6y3gqz(we|疔WT=*rdžG;Z+VH(V!e/n<g_$GqwhI-r*X/mGFEY10tPQNo-e[~d6U]膔XR6:F g YM1Am\o뎡r#{O#7+<4A?5[\M6m] -b_q7"sލ5?L_0Ȏl~I]TI|NV+Sz%i֫rTM.P Q| S-(۠`~T^sTPnE R5A-<oVb۝jTY,2ze|>7IG{nR~$5_-c=)Df%??&X/ endstream endobj 621 0 obj << /Length1 1424 /Length2 6306 /Length3 0 /Length 7279 /Filter /FlateDecode >> stream xڍtTڶ-HނzH*.@z"HU JiRD@ҥX=xod${^k97 e@!"B@Y ELXLg Cc(008 qGD""R@ @=P@aPh#Ϳ!"22R*.04FXG nG0FA0?J;bžB` xK :00 90@=9챞`4 p e#049X[` C&& @DHd,GJC (W0t0 +#?`{s0@C g<  wb0p$T Cb1?Saܱ{ Yg$gaGBuw!n0m?D7$2@ 8 ,o  &uEqC0/`0 sE."!X$:^. Xq~>N^P7 Zj{TUQ^_AQ4@DD\ %%gC0Os(nq=9nYKS- ȭ@K,_)?pG ~0C3 gS`M];㌠tYPD\(c4^0! q-8p$|[pY@p8 NB0}$3Q I{qr yR2@XR(4kg q Eq0 !`'v h4ΖT__o O|BA9Ra6@23k.1K9j -gO1\6ɏɠgAZYX; ;9o`PÐTJvORbKeKu ; D%u ʂwgaMCJu7 ]DcUYNb~}mw^J0zk>:ܙ=, qt0x7T%Ԋbݘ&>u\{ZAzZDd?J9cfbIGhCh=VCWm:P}No·ϛ@BDGY3rOfù92}²]Z R9>.yK8F̺bCZ*mR*u}b**ƧCA3}cc6Qݴ 3 Cʠ\Uh\RNO7C2͙b[JX N5wiILf×-3믒 )t]kBf:zm >fxy7=}e? aJJOV:<8?ݶǎWr}s|x='֘;c8uȶFZgC]}/?]$]ki#w/J}-tm*q;խݨur-WЏqj|!V:wn!k%_+,ˆL]/v ACKxVZ6|¶dt$ea܂Lo W?&{?jk J;OT [̑lBjFa9VL,υTFh>r#ЮVdLRԅ\MI.@.5T]5!~dptf܍qpзuj: չ\6eM!J:!*//Df3!* c'FY9P@NN DB͘;:tg0{gqLH 22U* q޷Oƿ\%flow9`."q?OSt6lT’:I_6x~ YQf(Ö&=2l8- ťn27Z3۪6:6 nVy.k9Om߸KҨFZҸ"|‹d*=W?,cT{ ~TL?i {l>HV3(_3 Ż6EmRuZvTa+|kQC c2"_,J:4v&%snv‡)q(&]Y#@$W8W7:K?.IRי{Iw>[mzjyM5϶Wa1}$=b]73сJvj_4x@HX=^znûݓ~@Uݍz9V9}.WINKT(n Y^yPinPUzz"P -mE}|kk4E}z8M9O=)֐-L>G_NωP^ҧ˭`'UUߴr/ݤ|t+eeASZ; oHfy:Ʃv* 7 D Zpr!U`']Ĥ۝J`{%}qOdh O$+qhqƿ٫!nKO?x́fWP-~nH[r-8pE\rm&sW*:6ef3!X[OmO;ܙZu٠X?:$/`0S8ϵO#}{cw6HёIW\4;ɤb8%P,U;㨀{jhtEEd2$+e%-K#GbBJ0׭u\,Y7hЊoRm 7٠b~x+lo)E;%kg]Uߣ^bGO#zeoQi;KKQӤs]TP7ESxa) FK=#܇=M|V<;,j7NF;id >N>ht'^,=j9n!׽`:`+ CVͻa6^ݻ䖮j+dI[Òflg uTX̴I8sx˦ct8|ybNE /۳Ӧu|}-FmUrʪ2<:hۦ9@jɝ^=HW!YE 7:m AjkWZ\%?R'SD=Hcre]p[\z|7la˞Wԗy!TDFx>MHmYDT:aP0;\3 4b}9zsI@Ҡ,T| X>J>5t51kQHg}_::; 8't+L=L?pYS'?">Ufw$ 72KMҊ@=wɇ+DW /on:ƚet쐕[_;_ZP6cEW}Za YOJ;VZpDSڹ$g\c=cfq7Ыf#|^?QhKlyVLR<50\b]n.JgIjs?ьa3+qG;(7'kkO bij-uo jf|$^tсטq+gv`y3# dO[w5fdK-WoPdF_x=L=/,KR'F뽻g3Ȇ˧p~-ұՓӗ4nK&<Z%k =1ܞ10M>:vr).Ri Xy6z %,!Db_%'57ۘ72{ y t "QDzkǭbHoֻx U1hS4%"(SN׌(<03fژ~ϢwPFr.mOݯ]1^b,|SRtDx %L1f\&aB4?̱?EߔshGF

qgW&aKq./C 2sn0ݤc "DY}JB[#fo:(5ǧ{"ȟx!?15E]*{xm;> 2=ؘոF vYlQlD9ްK%釹Ui|ys hNur;%T*&+ўvZ7ztBN\`9.d|h乜RTVWWB_5}L\}aa(Q҃#~]6&G%+gfWxLDW8#̺]VSOk3r TۍL 3i?45D'meQu1_Dpe8 [ś Uވxn̡ۢT{q:楕ЍLqH=_t~w/7n(!Fxu=|ǟ=BgTJ;39o-1hizէ$5S.!gv"m^+̏P䅹CEx.? ,%F3HY-_&*~U @ +?^KP#R)_F0HDְ7^ Q_*x~g-Ʀ޵)\HB1fTUF{Ft{QfhrmsT, [<-ۈK48 ɶE/&YjpQ-L\rz9k(^kp3j]nbQPlpu5pTn=PL5)G72i Cw|zA[szzMrB%CK~B=rcnDrZErx?sCWi%K9;ݲdpn2Msk񃤰*f^=I&ͥ8k7䭩8Q<ε$si/=2::gJC=EAѻ}[+YãxC&n8oA{j--}D@!+*m}{G]ج|~3JZMe,6 4þF]o'&otCl6ڂS]l2o}X>Dܛ/^|OƊfV?m \krw29ǾU4-oסꥡ|gr$:]h(OݪJح~*֓ͩ鰬(;b{gyg1`Rv`z ]gdw&++:)4{$g 'N buya_~1Y9FꙠhI(S+WҴ1'(b:>i=K3yXdcfmݘ5ir4ݫ41|ib z$ZZtm=7_wG SJKͿ|5WqˈB > stream xڍP[ lC 8l7  wwwwwݷϹ+S\k: Pޅ ! `e`feeGҰrJ rG3&a`sqظxYY쬬|0v2(2 *qGOg+ K> 50+ ft25(X>:L.#? ;Bnb Pn@3_# aiC0ZA)f@gGw@h`0s86fO_llj`hlieo0]<\fۂ>݌lM>E % 0?L]@ +ۿfd1Kڛ;]@r~'._c:h[9e%aBftpN%_ 4<re`1d8} `fe0ZX#] 47g+Xm=J2g:?}rx3qpعXll]G?<+ko7ݏsnk)9|([z\?_)TWW_FR;olge庺|l.PmWWhfj. foh&6NfVۭ@RV@3+SvͿbe?%3xE@ C_ 0vv6DfJ3ǿ `awpH| 0wpFby,,E~qd{~0`7ӏJ^@_5uuvx|9@SESڐj1BwIvN[8}I|C qe_QOM6qXm |ҢqVۡM}1OA 仺t8,p.ՆoEp~K R7W>TX^41#ALDr AtT#67)K D,u60ε;ZnFxr(DQ/74`jW%6=$4.B!)?}-s#f,3 9 )O~ /aBk @%QQES[V&)$ؿ /5sR˜.P32hJΜK+`lTQ^b1 vbA 3zp#hʥF3U 5"H+ȇ{|\*;ue#9af_{,P:7g11s Sq^acuێ7>urɴ]Q,BZ.}|OX{H D8k͙{FmvWb͚qH2ߩSƯucܽ~["r]unwn)jrIVTDN69K]&|1j]jvI*Rj(&a͙M0ېI搚NKsI1VJƲizJuGk!9 `а0Yui)'>kGbNUV+-?i 0|UL:DAM.L !I1@XP,|uE#aQw24>])y w"U=MV,+"X/V$*bίVX?7dPkCr5ՊJE@I˵M& .N `3:PEzyO.q!,갴3@n$}BV$Dq6tƚ9)S| wDxy['ǫۄ9)FgbHi3 ,$RIE+O8dZ[Uws_emLMMru򅄨-ܞ<ת+I&?Q8% vULy6) PO p,Mꐋ"rrl/O0ﻂǢo uӳԤ2O(v:Z P>N?h+9a1H3x=_ΫYkk>v@ʹzӚC4,h1^u%j7gO_͂s%iQqWiwJp}^,F[+m~/})4l._ >~(8dvqʩ:$ݽ^|ϭ~g]q#g,ytPs95Uk6֍ܞX(d?*#A{/$]ĉsEjΌ1E 4zDY<~]mC;ӭ!6l̦\8neuSB-p2F̍a=<+>Pp' D(*r 6V[ yMt5⬕}Z!XMI45I8Իiɇ.HkDϩx;.n#N9-@mD';6_?me*8>Ƽg#~c6*;OahgDBB17in a71h7e#[k\_Z PN{fo0Bv;ϣAcL % IA.vU>6窭wއ;{Z{q9͜߁VȪrZܱ;i.\WW8MSo]*Szݓm,7nBۆ ɢ}J0!RfZF#ݣ~]LR+e]3`gd;mņAC#a).9DҸ"•kc~3-.xC ̰\-/#{I'YE=ryS{[\݅;jlFA ?t:? xEMw@*b#Kn &wtz|5Vsf+s~}E4lBviyW3`- w^BTBUp!aH%XzD%ϯX=Fb6dShArW'zso FؓuBqHU2Çn=qpFɵ۹T04^{%mVt~;?ާH 8> *-W'0/ *c>JupDD0HT쭶-T8Op^!lq05,,jgg+M < Da D;ףL 7ݶZT}Si[">9E9|{-G+t5]xsq/,fL=v~`#gM#QT#{C<~yup\6ԉpr&TkxIh7垳a*jCfE IW".zHXal{^oR];>Yhs]wyN{; }#/MaOgY]bA#B/NYmË /,zm&wh%|uhKЩ ;!o3M8 ?Տmun#设eNbFj*Ni;]V?E<<_OM=5qUEQC5י+k+- 8u.dMvbJ ;{-ttf֔ a2STŴN3|.MݥZ`,!0t)T 8 Vrwbn]=>T X(4lh =MA^ dP, _B;8!v6/P<bǁܙ¾3,^/Iٌ6|H"Kh>"$e0#knc9$Ş1ÇWJ<9RP|HŷMzz׵xHqD񐶟7t h`.&zB,+//ᙁnҨF2:s)ܢ1uf)d[&=wpD0%+Tgt~^kIdΈL9aѱqf~rS!2C#UjƍUSP\ɤ76pH%LѾ@Kx̀GF;4_U\"=%\4&ՆCLUbq&hIb' |^@+1.!ub{m^PjvN7RwB}aW)СC|t6Nc!?ctznҝɮ#;Ԡudn5\7l(#ztFm P?ap }.Rw2kV0զ9K1dMMG 7'˲3AWNMSp 5in=&p.]e\D| & 盬ff_4&꿱ec@~G?vnAyh+wӜx~B^uMk +`V Us; G,w$1d}6Y7uFѤ:?4m7f^W3S,⍋4w"8{Q\TosmT;9]Dq\ =պSBR q|TPK8orϣwp(@2l=eyFYJ L }ے~G@Lx@f(5M6D4A![H6A֮1[hݿk \Q;'%w+{^[ _]44,wԘ[,Zz,Q?C @#l CgnDD aQEex-)V-BObRKn'p,BM7,#r[="mʲ-:oLo[s7Lim;%Qϰ+I\aGq!)`̏*eɈ.11TEt隩|Ga~;,x a;K L2sm_ hF!>گP6wD+Z\4(K"ɭ񘠀*!r|kP{)$DMf pJcUЋ᤿`GhܳtZ W{5x7I 6a; QH(;٥2)ړY$j'Xj p `) Kޭ._0rhslb;|) 8iN4FyGԞ?$;&O*C^m5X*x!X!0 [4+ GD=[_DN0Y TFrqhY K{ Y^4>:ގmp\@5[۲uyx`QL\2'02Hdt?yKRO8ϥG&K8af9S@~_qs$䙰S80͢HU%JAk7{֒ʇݷ;; m}=FW,H  e  6B3W& 8Yz8V G#L ;CñxmuU1[%޿lxbkYǦJX_a4`}tggWZ|Foe5GoA7tɴR̜^׮lz*r$+Q틳gȿGO [4g[|Ϝ VI`Mק˄FX]#mYE3bn3Y:7!J!Tq啝V[oԫ";wRQmF䛳#;Hڄ鉄k8Rv ?M]+.tG/2w>}!K4_:ҠId{v/t ,ֆ]ޗgQ^hk'4=A<*h=XJsIOz䗍C)/Wb$0 "aFۛʸP'Dx892cy 2B8??;}˾=zS|xl_yLeʥgݣ[ȃ0Ml (ea5wW!Rbbi^RԊ~#岋Q \6 ؚ{vI,H[5qo'N:rmw9+GXsj5!v]Dyoo&c`Ե50}s &b4#}lz3]OP.Z g084+j0{Мa)%tWfD+2$QulZ[Tmx9 Kjݵ ̉wf%7u nZADX? yqAmA2= (b4M4 2![gr:S??/dBr*f/\*ᝪU:܄URRdb WN;Z wx2QJ#aێVXcycڲp>/*h-\Wj6σo^Lh6daAl5=85a{Z{`iCtZ@@})n$\0/s05 oΦѧ59PǧLg4uL?j{!xd#~ (2:7l1 9X~l)8z?[@E= o:1ԉZ`לm.~ ?Z)Qet qwJ'Ihlrr$DWⶻ&9@EhE4IIJ -+DPY%tM rqyX9ieG5U 1ݖ"9Y*WXXy\*eِ 3.k_)\펖D--U1J&6NAo+J:!6MWH[qx!.Dyz5&[%aNՐӨ/aw9Rשg` ka"@/榈%Yj#ayd /:$ /.*$]0,be-T~ʭaH@ d]U|{%ڣS.D 0mxFJ@{ t@DJ-)`?χ`tg!|#xZr{:fw=RowliyZ/*s<əYaCf(Gy$  `9;|R6OKQ*ǿR8,{>d*-d=m&#xOB`W}E` T+_AفZ;:<$Ia"Fsb-K a{AG)z+Mk!~[?6ˢ%!j';S~m?^_ݾ謰Odrm#j`E!&2P6NØxʊa%aϼ+5ѰQbY3Ƣjcq#Z|7Ju#m.n#" E)A5SNvfC<1 hhd(nҐZX)-te9N{aɓTNh56oKsCEF(,cV ÙI< T}`nFq0 3 U]ߤG?^7'A s;/ kUC)^K|ٵD{k6:|Q0G>_& _]D{)QnI4p~* MdЁ^ŭ{{Uu54fpϔ!kMdOnڗR]Sz2er`+B ,4%{([8X?\^G;,fyNJ-egu{' 4!&fKOGsL~^ {2F(:V ߏ~}v#3fCUu)=AFõ!ۻ S'T)4pLgă+Δ u/W PSMjF#2y#QxvC EX;;EW"R`坫EXސ_O#FAm.K*YHc|Lm;Ź*5}wPm8FFpb16"X+yKЛ1~RښfIƓ:E8v0Wmkszʎ}adq^\z*1nsQ4.`+=4b~2H+d_e fwoCBՃzS^KQ?}رIuTW_T{h*ikh_ f&p"\:K!HxЪk=(e75~EWLJZ+`WsO6D4l<")%7s(. mPy#) TUӀ,_Φ]@ 5ty apS_)>D&O-4fVL2i!ݟe&B2(G͸ylu=@`2} x椒?HWSoA{|ݩHGTh 5UJU=OR1yb=T4?0;%wD͢o`GEx&BCoJ}=Zu v%Ǘ0a 8x&mыi8;LWy*pQY4t5YjhxA}؎ygYUڔ D߀%Pq3ڎ8/D k#n7+E4+Ao&)k4<;0:u>B-,"mgk@Dd2K:Tl9Mynxc4նDŽ;A%#O_[/ J<ˑ)#>[dV\rO'J Jr+S</}mH#()ݠyߊU*&3 X2r#|LX}pp$U8+TԱ!v#΂.yv9Qx)EM^G@p싨~-T1g)^XX|C4r#^:qָkz[ jg=u#SnTDã*?;:0C_-`6k4EvZKEOAoJ#l$IŒ((w/5 F./kaGΩ_eW"Zw|ԋ"S>VnvGQe=Ϻ%#ux(E"&(u'S7;J67 3[bK¼R8:mJ7`}H\fT nutɐuR~JƼ2FAK,{O"NF1 C&kj(%S$^'^RL%2I/^]lfuZ^PYTN4[D(jXeT3]6`K>U*KM@o,OaaH #RD GYGq<=D,Fkԉ +ӴEvye6҃cA>K$-(A1Ha)) 8,Kן}Kӂ?SZ8B(5#/6]J={@R{sF H gAAt=(b=Y|1 !7ZJvt |K:ieu Ne κ! lHFRD!yo0Sk@v"u={N3 ޟHp A,/^"YK<]\T1 2C9 Dgg* .sQdFE.ԘT#=cT,F# iG$/WLd-(O+@վ,-aAB"w h$⮇GK!{~OFj!k+iv K Б{bMJ[rgEc[bu2-OvUWcq7Cac6uR.3wt>1CJ˔U_p^r")ƎgR"KMz7<{u2f* GDb Ο' S': ۸;#ÃX`'CCNB?e^"ǔNi-"EƧޫꖜy﯆nRgVR1Oj衝(πr+Pz)uA/bGmƆe.e-Y(#`]KPB^c65 lϢ-FB<;YJQcxu'!U/?ܽDS |S"4:(S9YrNf4r#To;FOu_%vl*92ק&:keeP]YHнX&:JJ2.Tf;~ߝ*3/"5sjl7PBO endstream endobj 625 0 obj << /Length1 1368 /Length2 6039 /Length3 0 /Length 6981 /Filter /FlateDecode >> stream xڍwTTo. *%!Ja![D$)Ai$PBA$%$UFAc|}u:ky߽߽pC=e~I _|_>]wkۃ&>`œÚ*,B˃T]ߣ?3y}1 U?+m[9&Z|^rb=#0QLh$0tEd]StEa{OyQugy7M /[d7 bȮJK]$ k>n)Wv<Ʒ>QŮR ȅ U*U:C(v?xCBxM47]&=ŊeԔ/g\M-,iqkJHj jdiE+'& Γ?ĄQy / &bQf48|訟8O1Q,?۱M䰠fڱ20}` D0x'1|[F4I e~ OHKjj}[|6I<;`gkY%2c7fDp) ֎u1#C/U.ά ?^WJh[ٌO(hNgn/k{ ^U<7N$֒o?&ط! Q\ϖ_rS[ySy SkGwGJ\NУQx8P/xS8y:u0x/D(s`$Ა)I ⺁+VTdyMR_0AQð~yX%}\@mC+,uĽUmY[wF3`cU¸SCI8WccʃD<-~[PʯHRKwH ;T><IҫDBޑW6T$PqX/a.qxcr:$Bđ5mqFG).堞,m:WW+RNfi,]k8fEze NZQd:Gp0^"y|%/#=)M8B&Nc>41X c=2/a3s hQD?^,S9(vvRsn͝3'˧:ZD$,|eH>e"=Lcx\xPdOȏI|:U ܱۅ\ T,RHV}Uy'-h/sl Zfz>ff[ׂΪ&/x]RNx]xvP#wAƥo6jYO/ WMޔW`?` ]T. ~0h*J=1*`RE3FwBFwavrɴS<=&Bq] ^߃Sl%ڦ9/0#q$?G}VyQ\b|V,r16dqƴ` u۵_QHӪa]$ q׵2JLvwyJFۖ[,۞CBچ1Ѕ5(tIy|h}SXE`z?rd'@})yW\ G0U@1Nj6sZmj󎚘\KPO3^d5%(F8ȦtfKNջՆ8-0n/FL3eoP 5etZAcI`{BX0A~JPD !Vq _6?x;P7)CKLr90˳Աb{K8fWE ֊?OۚZ P9(ηp'rW'#5~a(ឬڈ}u /3/DTLtW!^)/`vh$gT*EݏC s1%=~ x#WJ&$u"ہV[L&Tt 4-21vwCi^B+Ͱ7,>^rRjp.rw\6t3[wW_f;=:RgY *],*X7ȷ Ƿ֬ADr9艮Ks%k.M VJx^OfZMr,t.0̤1`s0Nh]mًt{[K5i[1uLFn LZ덝_UMޫԖlRB r,k$۰&ҔB~śq4)$'d+-kJHK=Ⱦf]-77/Tx!7+>|SHO>jQyG7XeV?P>KPJ8qnKGУb٬vA7-ߕTMG*(Lwܧ̄$!۔h,o"hPl*^z+W\*OJ 9L>1<^u!+l`M+u@)~3gt.6_,Iͤr%%2as>wDN xCm),[+9{UOPp<r]vyn\ʫXe[Q`OʌXyuy܃;SțyA_|QTxEb0G X;^I:]{{{$W8xy*̶VT7* Å?^%>$%V9Z̭W;N^pی4>4ݙWMg@$Z;H ZDq|InUsrLnPRb Ov]x2k/IkoDG^QbvR ۙ@{ {vLiLKힳAg]#r&c ʃ)Lm 1kv']d=Eo1k*%o07=̴kCL&`ﳙw%s_!!g't5Z5CT{mi eb۟F$؝f>i +RI=Ldènu̵1ش'w T84=#C36_MQfW~407J#<^lEqó K3`05]"{UB * SsN`'v|+1&9Kkk0h.^'t/Lp=$A{>HN5='AC>j5FގŸҩR.^8DC *l;|C g^Q4Q5!u6baQ!YԾ1J]&\L,dc k7ߊd{[$.~Et@H*!MEv7ʁ\udV-zK|]NY%gNhS᾽Jҳ5 nh\^W b䈞VQ ٵ8ax1B4F5yqTth]`fihŷΎ߇E-7D6u+,T2Z`4j '{ݗk>O~0|,Hj4_ajyVq+]#CtL- g{Wjʛ5ؑ6۞UeyK;~L~>[}|ᰧ<[z sxp4U|=2/D66H&,q?c)Lj6vJ3Mkb9넗uqi&kQAi'*;=%.L=A9F[ҡw!7-Ԋo^OMAkKll^2E>%lG^M=NG.lMa/m-%窳3t=hWoo<˗\e*`Nu z=(Q07 +MEcX۲k_L^65J_=qr6t֞6H[I?X׃P&->:^%ac`#O #]c14B~L{Hт߹W5GްS7L&&Eqmk)^E6ѐ:Q ~,n߈- ]M> stream xڍP۶-&hFw\;! n;'<ܳ_^ukLsU5MA&6fV~Jb [L rrCe $.vJ- `geC{'~$ lPbC@TN`K+4sКxtفf@@ b{hh؛A.VŁݝhld)LpXA '79@;_1#S45-\܁N l8zBAN 9E_g`cfO 43sB<KPVdvpa!m_n@-ʁi15s6s;83;mh0SKف .' vݓ寛ػC`M:hA 9ɿM^E,A..VVV^v0b#O%|M|?dog 2l0Y!D,¯r ?2zcȨJhI1to&.;+z0@e+Ub @r;+kAHnja. # iW[?մ?joWҺ.@该U]VbW23q2r%;K=@`3(\UC@?ޖW/V{/3@y f;7D~Wf{]HsǟL0C]^]=,읐Vn>?+AE?ZA:k> W^9,\k$Pv@6V _5 ;_|D u\^?7^ށ@ 3y{3뺐1"wh׈:;Rn{jAWQb]QG/_mtqYm6|ңq,L}&1]w:;M8 斸gCע3tx?dnX!43BD!rBeW׊vQ:_|">OaX.gH':K%gsKtRg.bK#ĂZ8~qLw;86"؜Urp%W\|T%f2wv$XXQIi ݙq߰E'i=EWCq~P^.yHUّi)9^ '{(#fWu B#O',&K /uy49/ņv`j1ڏctC9Zopoɭ NE}`ܒ!lrPVs^6/um?g%Ybɾv+eȿ#Z'O=xCX=|^n_x_j@ٟ6-h.&vyWgȝe%X>t;T%l.3JVn'k8;wsK:mBcꛩ7͢enRաv\ho^iyO ))'3<>;%w`xzSљ>нf0,cS5)x,x~2Ӡ~ $P]/jmyZn1FÏ{ŢúZMjYg,љ/)R3J1GC͢@j7-4|Fvy !`A;ggߚ$INm-X>udݶoVEDzؾZ~NQ\;]DK~ހ3NjES5ȧs ܦ)$Lw$Y˃ԁ5z$p1tEr\1ސӘsŞ*! tؘlF6'AdgoVEK: iQ''s\{QUf@!g);#YM[%ourQVyUak6#}T5um{'׷exZ*QAJ`zWv fsא>? ѾMߍ1 4&DQC,6xhR_hevB[܅ 2/*&yDީxQZ" }U7̯s{Ͼ?*sNE ^޵=Z GanXZe&& jm%]QՆ Yb~™<=%vV *kյSA M/^R;䪽DqCdP^($3[z*҅!R>![gN4E'p3- FMu̧>C@gSDrկ֥>6~5}&/| 8Q&fsᚑKZ5krH:0*wŦeƓ].]3L;NΝr}^bJYI<711Z6<{J8$7/ Wxhgvz 6,}#<|VA 'O= +f,n zÑe!ݣ\LW50Pră{X8بpd=ft{OR.G׏G =.jhc.7P\altEȷ0r5$<90GLppҒ..m'v#gwl_ƙӶ!Ǜ"T,+\7PLth A?%SfR2riWK4aaE}7/ߨlc0Q.O%T?Hb=?Hv-i|l\؃|=A@@-\4L5]a;Zׯ잲oTJSak [c3d DrJJ}´@mԖDϭ s44[u* x53N>|#CV/#;%ިp:\?Q;_L;Y~nLR<$RA,dȼļdΕ͘ XCT9G銜[,%FܺvBn-Di o.F5'&NPZWuɿDB QGD3`G^)¥tRoYfa#hhIc]r` ֦ax+_8*) Rp[sDn d(#E\#fP}JƓ{?>:9ʾ%3Ks;;6xy(axޥ}URet67ɼheln$x<8\̫`}d׳Ձfң{u XzhD$]B{Qv&cֆ%g@urvox™ki1,uYuc;-)(fbzx v7Ayu$O]!r+Q5?3" DZa+:S UJݭK5"f<[vD'4WbIOp[;`PB?5.42{; l`ײ j2d22]θ 8Jރ\W/j9˄g>R̬ 9޽a^Gw rSYN~*c6FI^q,G-pI {[0*`ފ V dְ  }]z&ﺿ[,j8=VnOWYG"cyu(gƁ3 YIjԥb|wƥ;x/7o-c"hHV*u ђaoRM >lF9#:U#dEF˂xmX<7LErLd<[WVmL‹9EF /R!߅0Ƒ/AZǷ򎓨GX&?nj46Q°s"'̲u@afk߹ Sew@J)GS ꕳL_FrVZC:( GP-PkѮt_^SC>J$cʞs[sD7Na!=W;ht%k2s( 3,ovU 3&WGL G#To+/7я @K ]P<9aL CyE3z\TWUi O{|%o-˨x?RyyWȱ%7#$)gճʦo~tRDf%5(KX+@ L33{n'S])p]@PfMTܰ_{>r ykQ"Vo/) )&)ʒy.TFˎO1^VUx7;t4fWr$fv]݅@p`W `29m/01ivrǡcu1ɡ dB$%ɫU0 ֲ"Z2yJIUp?j@>ށHo5f/ɕYbFF2qtqcDb86Ʈ4v`?`!9kܻt$Fcep\n}REKs!^wb)klI&Ƕ4&xEYIrL:,5]\Ƣ-hz{,έ}QR[Ř^ vq;2_ݍ*Iإ巨 /,5E[~;~|v}J9͢\PC`K5V9@;0~t,Y7Mkɔ^ⶆa._y|neMU k4KQk:?Eax摒m: L6Yo,î( NO]B2 vG& ;I,l`c!}mw&w6k[GB2r4"D,љdžG̼ͬ%̖9/ 1/Fwr\dF&k0z [n/<%}ts8|r߿6\jVc|\͛t+pcftZ65vEUww)cIp˕2PJ$OBghUپtU$k $ ]Ow`&1:M?s(j(=.fz0m<=S/ՓË=6gi([ޒG]4c@}7p_(ay.!M Yϩ,s/V w1x{9'5NaqD) mbV 0[p ,SH t`O)>oX`"y|{ʶ̚%J IVE4槎~Bs4&RA"fo#3iXCFroٷnMJ- 2T/AjvoOwl٥t 9^tOK0b2w j&+8P6ףـ7Bm=3k&EPN_c98KȂC"!-cB1=QgW^EXE0yjMFģJ1 $56cs;ܻnJ `Nk!U8nji?'ydُ:Q"tsQ?z)`^HEEs}Nɛoc֮smj˹%_|UDwF#0Bm*JX,ɳ352{IS& K*ŚcS籙U(.봥z2AhpcĆGӔB{QA|3۹ٰlq'"EX%pGޙ$9 siXl[-v95Pu곖Bdk?gp~\4{T"?Kݩ9Qx5&ѷ-M6e@-TUp9 M- C] 頄9k:qfOq =h)꫽)VI)|* bw1YCPEҮ6?+6@YSLl~.NմyWjN!v\eS45DjT,^[wxieH>l2,!mRڲYwԂvZhO,bK>Ju(]X'S93k' Mi>1v^c0i1_9F)sQ=IJc@{~z~uy]0En}c?#MUA&aZ.wUY=F5˦Vro%lap Wm>F} g[=K 1=dܮ& z 8BrED ujn[ۨKaգrb좕e 'a5_aUï"(JqM팷Nڄ?8KVtt>3U`zm,RV#H+W"rRxrmiĖ@7ZF9;vJDeAZV.WsEy_ߓv$pzA K Pb%8TSQS֠?bW t{oЍXD+h.񲍏\p{̈cj՞ʸ&@S8/QhEI866$zeb"Okf5d;eBe!7u˿4)hD~ޫhݾDjNLZ[k ]Sɨ.xJ|3/S#2')ityTX>H@04hIAu (F0&DYs?P!˜)ڱ<2deW1'%}d 38WInoJ)[{a=,;[zF18:姝؃v{ [-},/8|Ԭ .ѸB#>e'[%RL w8%/GcvM+Lt_ vggsH.^? o j,8;@ñhBI4Cn@n5:cqGc}gEyYؓ:PX!rELyXRe/N.<qW>B5~ho¿8@swQ+_ PIc#] Zk棷i6csvqF_wo0oӡCM%L5X^dj"?UFcd&Cܐv-ȫfs^lM=blͶ CEІJ>|m6^fEOM~~^0JBn7q{a;?:~n̓4y7uy,F3Hؕ6׎#%J xGڐ˾i{2ȣt+eFLb6i&ɲ(nV Hcƙo%'i{k(p4げix/Ɋ O[es8uDv ԵjװLh@ZU/Q6ԉgkrTlCĵ&Hc ͒{gܜ{%7*Yj$;s`~b YĦ*\BsMNыv4^ؿ]FT̷AF8 *CE!#3&˖c ܽ/~L`̸*CA"깹pJFUu. {r^U։[ʹf>-U&kKhpGIw_^kiB@ L~Eh@cWV`5qŗ&ggw1_^}+z70:D0 BB~V]_NEŘ(GΠ;`i\ :lcGrZ%t}erIc#hvV{o5ך&6rhb"Cݳʑ5YWWwMpԯQ7K(NmYPgzEwI*QLgHe42\5T#i!EK`qcfLHG֑+|ا&9(zlwRJrp<DM"n> stream xڌt 'il$m۶hbf4llvcNn~w9߷ֽko?OHim b6Nt \aYF3,)谤j@Gs[I; i"N6)g+#3\sc,@K*lk`nj~((4F6Y'3G#+9LP99qӻX;:Q\͝J@G ;e5`I*fa(ۚ88+s#㻊1,)GX?4`cڿ l`ddkmg`nnc 01dܜh6ƿ m \ ̭  &0xͭ~H{Emm6N1wݝZغx21163PRow) nFfb2&igk0yOmn|t4pޞf7ed9 6&w0wh3#_flkcGӋiIiJQ?L!![7'- `dx-?Wv{(^Jے}[ Ϙ02a<V_#sOs`,,N hcjO!݀ NFfȪ`hh\F}$bw=^2&V6;,$1<߷llUyLl` @/ 3d v?@1w+*+^k8mAzFFFY~eh'NtAFVfPF@+ӿȬ3a_GὲF lޛO,)2= @ZY8K= roUT޳7˿lf:ǻ|O8EcSIۙm%N3|o{5ݟ36?YmټʟBq6}LեMi12gfh_ea߽ey/{쬜 ;:X12_e| ²;?'q^k8xNfu=S'W)p3>z%p4uw{/뿶ݨۿWR{ݒ?m3rvx_ h8gkd3RוvgwtG=sѡ*"-`V0~ yeKF`*)VsN3fxޑ`u/> ׋Fv),{gD{q呐 6i)HlYlbH'Z|h*s7i7BjXHZLQ*L8$8ZnPG&<= #x3(@Fz ۉNe$Q9GH5av~!cS7܅9P˺DCɹ{n,hH6لXZy FĻʳH-"?vuSn+=uFʋOFBFKc'Bcсl6YS]}e9J~puūuϗd5D'09(CLB˞77X,]uI@jٸ\`YtT6tsq1'S꟏G|G_gC |ݠ`դ_ٗ +:C{x,+Re!b2 Ҥ>LN,SypBT)YZ7|B@CRtޛMEO>I#ZӝZ Cn?CDc@RPkwf9bڻ' n,>Ef- K֮FFNOSY7bj' 9정~3db(!?0UWdqG~6Ѩ>}עWSFt޹%ndKFesQbk$ D,˹1fkwBJN:SPRnDMuôWE|0?X_H \YEQE^g}EG&X%h"yN3Ɖ]YiW-Ըuy읤Goh(8a* aUW&529Lկ La1tSOMOʷ K#zb4ucfl`n(ԩdX68d; [O>*I4P|w&fkcƴ: 9g͕>~d0SR74K{Om좕ï;O&ǤvO<Eѳ?]K^w"oÓLcwbe~BӑM1'hzZpGoBA='Œ» 6RǹYWgYZH,KOvD-E'|l>*͙&K)< l':kKJuF+=M-@>rwFNNGyjN6`ƘUOkFSP;~-41E™ G-|}~ |F7e*jRcK,7"5@KV>TcsE׫a/Bኯ @-1_bRPD%}ݹtiNԉcqe~D^eT{p($c_>dٟ5UUa2D#q;i3{E:0|j[x}ZZWO³mm\9;`5 .A_/AަE ;ݧ<þY!c N ucrh908Y6Yƛ^aҳSUS8snF|9so]Ǿm> om3!Z9+̈́pCy@DPU)8ٖ뇐t' 3 ՁW Y 6U m8~˧:cvc:z0P91ƈ|_}%Poj+EIrΐԜoKH,(_ő(&^ :y m"w}*5z $\m{X0%#È}>;M ?P7G[T};'Fն[3X^x 7>둽M&,뙋@+wcF\ 8B( Vq(6 QZ䤻&>l 2芓!YO}&1~*&xWJm=GpL2~!= lfd#B& DXM aN<_?h0z2`{?1ZoTA+k{E2;4.c*Ί\5Å[Cã tQ(ጟ0~nSBmhTmޏo@G<e(9>6<ᵲ,>kLI֦o҈)lPc =kc1aA:&?i]ivGJ&p$0fF(r 1:X>9a ^sU}eT2=<DCHh|(ʇ ;$y]e7=\_0OQtPu'$U,S-L 3$b(`;7J"&Iۋ0}K?:;` y5<.t5dL_gKPAl:zp '`Sþ:J\>Jarjnc4M{>W#?Bg8My+<9`HUsL+-oax;ic\42wE?w:I~L~+, W q&oў|miJqv±HvV-+e}RU:Tԅp*Gqc ')FL~4ٚ~4TÂNDFL 8S+ȳV q^ #cX)(ԜdA(Gc=<@DD( JR$khRעx: c7 WbsSRE B@E,3I~0i)'i6Da[pTކcyL97k0#& t+$mȗ@`W8]z@=f2%@j7f;kxWM~S8Qo3Nqv*@`L3q"U '9[g5e̜ho& {fknٕr'}ӪL§%`5%zhڦΔF,yU@wb!9ɇ}WKUaP% Zɒ˂hv*s^QSA$@rաe>vV83nϥ)#bD]oī`XÁ23am/e[BG7M«L9*f~`gj'C`2H 90ﴳZHS9 r S%[ i,, ,d#u43y\#3Sc6ZٖQ|eVLIpQҎ1ផ B!`h:kނx k?>[w~_Uv6́ iD(H:JIQ-??ᐳ\F&1'9gJ+RᵎE^WOMOuG`X8t~zvĥ5o۶a{i*@/L{NsCxtgؑ8-h3XN9'FR~FZ^u$ړ_pSw O??2{ xmhܪC-(I %ImdPjw_rcd*5gxqϖKFiٗ~vfTt(ua jcEs驃P;?3y'zdr0}.VB&P IPqY}wo4!~J+R78Z@Vlo1kg\`냔Gx[.e2lE6x4Œ z>~0Dm<. |5':eR:xeGA!IKE~m6!RW1y+ȤģbXu^jo90l%ZXdx_F^avAE1 ӟ UvGX:'F X-u"æE1s~ Z.faoC.<Ղ3ߧ<eݒy8b`YTYlxXHt[{phs'na sc:n"a`"wsv?qaS]PD\1@W=knj/wuCʍ/Bzu*|-/~0G ~XMcsM;AUcw3}TX ў!_ִzqc(ġ>$mDpo$$ wB@ݡAiAR.;fhژGF3"U'JPOARhs{VdfW4V }.@ҭxE=0.?nG r` j7|V -5SW(nb1g]8K\WA91~_WR3QrPB4q:| ZRu PhѰ ^XOQ2&-ChH)Xaak!=?R;Y+RBp D.ꃲmO na8ꛜ3/y_iy[bPQR"3m]zvdǪk{{f3 ?eUG]bȷ Qy;W.Ği\nƔ)e:81w^%˸U[e>e:ܠRrUlޢ̀m2} 58&9^7ezS$ <6R 1*rO+獛G0rAָ'N_ /*Dsx&hrhuLUKȽЅ}[F;lcKƮ\+E`QOG s+[˒}W?\v f[Yb@50Z2; xSڌ Nmd;`,QSTGR5W˖mQ90U9!#71{OCTM>e5Sw5Y7lj]k:fԫ єo`1ᩍ~2PpMV9IP9 Ω8ry/Q^&:?e[Y娈,_$_*rN֐K9׫d̫9A %%?J2&mlj)Ev5%Abíu5< ho#AJ&·lb[hlP[ 6bxU&l9/BĬ-OSAMukǛ\?pV %W|%YOj6IM琰Cts=r+<{}2<^"*JขԊa3~0Td8 qUvMM @gU":ɇ34eG1m~.[-VsH8z ?IE*;kjis39IQr\:D4W>73[Mx$q6Iq@bZL^fSrm|,FMu'Obh]f5ljviaS*~j_g]%\~0=vtjԑ4CMe]oNkժsBTb, !m%v;zp h?r 6#e-s66S-â 71O=D$(R8h`.D%E(4Gar`k#Px X5 ]5yEiD=x3"O:6voWBfXW!(C[zčY* +8BO b־ H橷y6 A(USڟھ#Oٗ~;+Bd6\n}&jʥVlK;;YC[YZ5CJߞ ovz$4jE:X|%YVW\wڒw0II5ACe Ὣv&NIu`^Ay{i-rIE!~4HzUEgs~iCiKSB1>uZ6 ÓJ[կ@69ET_` k-կ#AuX:'v\K w.3g,u}~1S_ȊHʦaOwoJ1`) @EnCO'~`!RlT GҸG,̧qJƯmq3Ӛi[b1Sv ŵ):GE K.YI7//-pj>)g" $,,YiwJh-__B6iW Nr!>L$ "/dϟڑk1:v~ӊ t;gxSzŻI ~ёt|} q}MA'A.}t}҆:wW͓&YU(]vQqHހk*>H?+Ht$Oon02W/%@F |ܬ&v4K*MG^?u1L8t_hC=ƴ`kK&JЧ )4C зk t)_MP\r/%1UuJz7(tZ/.Xnd|3"/Q^ ,!yCn3 Q쳢a8rve4e&prXW`l/N4+x %w(sx`-A|nrA>upۧYz5ũ5y V+Ǽjpw# }=F6J@s0%@ т-yЕxw6z-z>;艋qL%ϤtEGku w4'M)t2Or12LYu8j$jMW*4:rb ZdӼf| H*~ᅈ>/>ը Xc`PVD]Ņ= 9$y2-TÓVe&ҒOD Y x!=7$B$n!:@W:tN|u+`(&7hӬӼzK'3.fu#K ie$bF8D+c~DThR)S#<81AI[%с{jQ/r/>LVw \G.DY1ہcaXERAeHKX!G|?>^y4SpIU|ė~c042qw5]ʞhozW)('?Hlw> Lsbhwvfc@,唄e]5 Al{l/ ԮYL# rpIw#Z3q|PPaYtS=7֌cD+6KyS|Nbx!P8^| \>*. wZOϤpy|WS^tBվ H'@$C Vn G[_6d`1j*u^t:'L{Y9rC{ALb2^'c& |t7] &% *Eoe#l#h(|tj"ؠ[ ?i_Qpwz~mNkd;bOg^~aѩD$>zg_dS G>Da־R`nVQWS){J`|'3qzK'08#KlATR&YCmFXV%lB+{vb=i_ؼw]ÌcDXv`i xL8iQ$ۄueS͡+k\[&ѳŐNOX5ץڔΙX.0$E>y{к%ӳ|w 2("jE/0qµ 24ϺN({9$C6M2q)L!դ$A :B)Z7@9TUHpG lB0twAYU#(#OkG.sRkPT<7وonjϲhSSWV0$k)͕]A5",'\i,0NtJQ2&K9٬'gHD*Jla:VADJmQpUx>hR5}x"cte0H07FSJB)&JQ_!!۝Gߨ?@] n[$>9aw̟+cx^E׷<^|%~C ~xa&=?W\Dތ6Cߠ$Ib?BFq s(ѼJVܺyK I8ɣ!"Zhe+.lpK*Jee_𱂲|1*\Ђ"gW7^F|< `ݕX _A@[Y<"tt(0*pi@:.Fh4w (z^˕&7= !jM=l~Қhڴ-@kq.E]_agP.n~>},}݈ޏ8-,ڍmpoe,FZdRccWx큂Y9;'(- 87>ޞErx);QV8܏Xիֽ\7rA=Rd4  gqmK=WI㴥םee4>+->pXrqU_BK ogDk]ey>"2lޘДRv!S&x3eylEe*Vf>)K(Ad]kȁWXXJ$mxHζJ~C 4ME=^HI}(e+&_mꤢqy;NJW>K5sY7q!B2#yEe\4p@R/2AZ0&+巘P DCf履e",LDA҃ƱnAakO>R~"?dz  ja^gp[2ʤRG<'$1< kYNFMf8뺡/YK/`:2tRMAMڜGi,AI϶cי+fp|:mtأߢPd.迗LhRO Z[su`IPjeiwJ([K>~琫[DlHV/8~Vc3 3# :.=]8ߖ2|z$Ee/J(z#6DIq>'~IB(>1!pIe!i^}5O H&}4VY cXnPS罥u,eC#onbHN糤=f$`4¾ԍ$i# 8I@ 0h#锕?}rdlPL88Hׇ._m-萳F' iR -pJz|$!(T 22 hӥNJ Iy0Ľ2@&HJLXlr;C(`R:b^l@}.܂`hY #j%2xL1qA MGP:)l>;?X;tq5?"OA {z Ps+¶"D$ɶF=u'6f6ksxS+y=>;ezRʜvrƠp0HeP:İz\Ai /¥iBm6m9pߐeÎ >4yUCOM>%[ +sMJ87s+kYPeqg#@a385j,"`$Nj<J8\:}7#lR\ExlmGIu#ZN!Ѻ*_Ʊ'JM&ɲŰY%ډ@-XJ"'xK5AB_jD=]٭c+s||HKZ heS.tiw vثKVg7&,UWx `ԙg#t3EkuzVדDw yTgҭNbd9PMo^ Ȗ0N?r1 o4շN2?0\&qg18\ȜAFm?up2 e9_}Ŕ,zX|hBP42b `DSdY.9}/!F *>xS y!eUހ%ʶ_z8"&''t^PU?.%X$Ţ575%6/7{@Oa+Y<Fu`//n9McWZR(qZg5dL3y]ogWGSǃϒaE8x4k͐s=Ԥ;/V2R! 25_nӲ+Sz8ꕉƏHnYfgP { K 3p+7a`}pП+;ͻǶi}U.&5%fWCmhQ--ipEz=}c VeJG*ZNfo ѢPs ~"5uٕwR~˙k8Ji\VcﲑG\^hv;aqSiZN:.۰3&8\)g!˙ ޥ482ުIVQP;!kE P]x$٨Yw`$4jOȻ-(p\^;W!Za&۶./Ў+lr|h jh*c [hALYҭN"%tg"HU#E.7\NLP2&5* !Ud0|T ,kGe1a)*UbBm\-jGy/㪑vqM;a뮒tO4*30THvHQ͓^xIGw'9+]-a-k!&~0dt 1 ="*3$)#`SsiΥLK6nf9Džb˜9F{|yLos*[>!1k"=0g-1Z|9-#}hmrsA6D1;$oqx]Wڻ/o')y$eK^E 'ɽg^raH.`_n,^$}ki{BQ82~ :ǍW3.־nQR]PRx,xMtOA |6T[BQ78b{C`POoNUE_r r.M1ETy1. *+*^t(Íx'.!QƮĞ.g[*a#]s$[qr?lD4 `aO l'nRTti.7|riˣH|N TIK(Bl !a"7orB6`ϰAr8-.HIpVt36ZF$AhU0f *sMw֞"xkmZzc&J_ rn̝dFKMFy?!y2yR n/ 0"[,:(+y.2_6n ^$}bme3Vz(`A%$pW@ ic8u?3g{z1KOux& 7`88.xi' 9 Zv.Щ6Gp]a TU[ ߖV)IOW^dm%U#&鐒QW2iRNM)|82w P6"vfP%ҦO ֺTP'RyYd{I?B5ohWŞ-! ۿ|VdKjv͗M(^)TuN(pc`mPɴ t:*EA7x$Gu^R_b}~/碑OA;`=L]"^ 5 ڷ^lDC }uڬbzۭPB(7WB0׉jNEԢ,*,df(;em(##:?&$w]@R y"t0{Pj˽$ g&^-Xװ5PS#mnid99.vO,تlK Q?UOG %û- G1ֱQ8a1#o} uD՜ܜMb?7EY,0e Z"-kbN$-Urpk4F8-]d/2T+̥ʍ(ʮ[l+*<*6$l./(md~]2FlAjP<(ƹLx솎fBVRx+N鐌Cwj!?G ZF?Ӳ%zrYF=T̷۠.MHR ]` n씊Ơ3'JJR(> hW^k۽Oi|G(MAAx=s*J{yAle~fe;2 ˾ D,7*k "SOStǽN˫q2U8[9occe4x 1 PX 4g.1.0u m{g^cU)t n,.& ;Y%yYu2Eu<^;e[ARuvZ(rX! ^ռA}u5Di4E> stream xڍv 4~b$I* _fƾٲfŘ0f%K$Y.*Y Ih!DRe-ߡgΙ>>~~𘚋k NH<$(ZFPI@$AB~Kү=*@z2Su"Sg4+!c~s`2%;`nTk5B"0dzI0.h߃u0^H)wΞa18)ٹYq(uۃH IݝO%`*IRFR1Iڝ?@;TAvLHVHF;A(F0/HM,v `_zH07S(5;/HYؕ3uDz!n<\)QH"6IikK#_]R^]ʊxQv,buȔ'6 ?%E(-C9 uQY"% ;Jcsf/(K]"]Yk p>l?Ȃ_.)Dxfިi@MiH9K=ƙSq _jJ7Y?9 'O.Z*T|v:G 0|3+N.aߺ2pbMK/ThNX^;b @#elWMMCAG58bZjSP e7hKK@GtY^ ;"[%FZ;i]"=\0uYji$ENp!`ר1T. <ߌ(@ј `p?g+>\v#)Źi.QXÃkkQ5'4o.:AΟ(SWVç4e NCE1$qIsZbn-[NrSvl>.m:nϥυ*/mأc7C=>Y$sFBk } f}!5Yd/y“~/ج\@NxٲCstRliDZ{+qA>lRx ? 0;U}+ܱj лÏ@b`$SK#6]͟l+Um"0%[2y'Tʖ\Bu }*S2fTqi~[{ŖoB%FzжR].s+6Gk{\PgQv~LNf_Ò볶\Юz3no>_P0p͑3)Tf~T@#'ᱧ6HNo$"֞ie+9hUO3OK"ݛz.6Kr񦷻ofRTy޳U5K_ ~]Wthۭє8xT[5|kyCǗjj"ojRWyr.4uu 29H+ =#7 Y=O{щouh.AnlY;fj@n]V{ɅgBȶdʗ.]Y|B۰4sޘ> +<ѡ6V)U1.Ƞ3x`I wF^OQ 2PǍטoq T]A{tn GZm :'*EL5HZl+Fip ľRNz"щŠzY vDbh>֏۸)eﱋxѰw.A"[C!1S$pKxI^j=:.{p#CfD8Хcmؖ YoҜf2֚F|xXh9[ t2;OnT8}?(lc8#aMB}fZ¶t\=nگcci[^<g?s4%i;k k>(,ԟ+H\vwaTLJ"͘2=h85.l;=³aD t7ҶVBCc󖤪;::y䬭{#f.TH^x55YOܽwmi8^MVkxo[yZOU-lޓSp[r!Ynpԫ,p[+^vh4gcP[E-ԮCq$ڤ6pQ?'lY@RΤE{Txhw||( ԧ8<" ۏt f)30<za)ð J = UُdhWΧ?}t>y v'ha\Vj7~sZR#b癑V5ܕ}WU >NhwptJC|kΒJi蛇nCa`9+]*Cnzn;.-g >[}5o=%iu,nV= o:ݸOC<1V҄XY7xN\D^Q=j _NNYA"Wk[+$uIsUy픯@)D3Ɍ9ϴ'Bo3irgʪk2VpUQddT{Z2mMw'Tǔ;B =yqfq-j,h4?ma^/LiGMh a. 3%?Q3;0^MQư^҇'OP  XHYDa/`ۢh.k/I6mܹ#XPv+g!{K;hx@)I=|| x\,-r G qsC? G3kG{6n4uT8mL2}+\QGK{ vɦȥY"+}pǖ-7Ϸj =3! }D5tP݅2v8ck4e^ V4ʬ9tyK_LǺSbz|y2L_+(, endstream endobj 633 0 obj << /Length1 1673 /Length2 4218 /Length3 0 /Length 5263 /Filter /FlateDecode >> stream xڍt 8kؾ%b"[e Y-;c 3c'I(Zv$;E q"{%79u]wu98H0qڍh;(' #R"\qHt(OO(l8tappu<18qBWuI$QCND<%8)်! k<"q&ʼni(|Tc(O C@!( y7qxw/!`SB1~P$@.JB @8ӛx:}3e_og3 ŠQ7HW# 1`r@S(OL|P P<b s|**x[ IHJ0) -+ ; H-rHy߹͢ ,ooCNNnc1Nɺ(S_9ꡐWZ$8e qN#@! 0$0~MW C7B Q qn)zFQe^w. )浰/ Wf TK*׾6>/'QrC%>=엶牺:55v8r[/J}ON'~P8WqPق8MWDa%hT ޿ )u->+\;Q_^ ; i=\ּr.>{g_[h^.8WR7N>M#pG5qgiFJZtmn'Im)jt6Smի=M؆]&w,IrCow+ O4,ĥfZ/(I,2/G2}=#nwi}2Dݸ I0!M5'[V;_qN|W?qkM#0Z$gU BvyRP[J7JNlPwmZa4X!n[i:[&7AXQ>2Uz'_恷T0YӞ-Z)#vS=E}*tb1 0=ޫCq>|aM};cmxE)[R_:&ZW="gi#r!#KJG*_(|'NrZ P.:5g*Tp,E*Xzٔd1=LLjeɃdCpy';ʣ VݟK=V gJ`dG}Ѯ]~m~$Т'Xns&#.)ѵ޲ãqd,itvx+7p;UA9#W='^$rM|O^ LrE{uD2nG;^]Ek kpoGW#}D T0c4:HR!ۘ}^Z d4G>*NsFb.x%Rvwd#ꥴI\|_|!zHT.J}Vbq"M\rŒH$S߷ q?H%ӛC4̜_G1^b/]u!ڵX*χpIBH!CjӴ6H[89E)N,<_wJ' m)3(j嫼vBYkoJN&VU1>]?sjҲ*Ay߀}&p̢? N*}uJPbq3TU90u'>[2`ޅS4μUQ?A~ygy5= S`\%=$q >!\FyMu!:Zy(SUecSj6VE7{^b Wo5]ahŰ!##C+tV7[7f^c"D&:R /D|6~-rk3r&`ΟtesÃo$?hCοuBu/ j 5lnoJ>+4nΥ({ι{9}bcVX[٥Tk2X|;112mA:G>J}_H^,٘鏩.x*tdNRŎ14zj>--r|$OʲPL w}9LN"44|{*vAtu@D]ME0K=ATǷI2ۊROVB]˦wn{U n`": 4|OR t 7AR2|qfQt fH?)BcӨRRjZN^_x?<٭ ٜ<,g[U?^q?2yK!]BD+VvbX|m3ct=D4C^O΢q%|?rJK{ X_Md.$>N֞g)jZ8HoɐkX#BCkv ~GaU^{cjY$tTpWc g3i;!?H-x:mh .9zo#C^pC_OvcPМ)=leG[nh8\lT,c h& Oe6B]6en~>^x4쬃~aRH>J$T҇ZZ{)qz僳6o̶]zur4s*R}ta(c2ˠ'G3k:"{Qq +O{G Rw8[)0– _Pz۪uc0QúOG&3o@W6[tGFU4wnU+MQ oO$Ol*heZ+en€}h oỳ@q~2`E殡9AVU<9RTc)52ёIqה*TlNd5~nYP:U?ؠ=o`pr*{THY]%&֠L7$apN1€>s?Aˁ/g>~Olp{ŷ%"@Ս %C,vm/AK=gcp!4e3HbKV=yw2Єrؤ"ޑ32ZM-sɼ{{  u#|[DTǀ ބ5 V 8RigR K~UI0 V3KȸK a:ɨnҍq7*46 YQbhl*|9}5^x}ࡐt*# ߮ k$=a ^wv:$|Ѿʞk &lG%!rt?D̕2߼F`^=zocBS&n"niUU OVkp endstream endobj 635 0 obj << /Length1 2755 /Length2 17791 /Length3 0 /Length 19353 /Filter /FlateDecode >> stream xڌT[.L lCA[:DN=q` yf5Z/* P΅ *`ffcdffEP(4N {;?D.`N'ooqX8yYx=A0Nejia{hHa-ЮF5td E+7R>G`؇o;ʻ5O Qz%y&Ysp. gh739?e|~DylϽ_Tcu#%O*-ZfaX?13a*"ae(6j(QA8C]nRs)>~Q39QO> d~+W}W7J(kߦex|H˶\({jj\ɡO@z2>7,*>ebo80J_Q&@ҿ<}Mq0-QeNٓC7&V=BK"]7cP/ᙸY*"K&AIQa2N)(Į8 !fGy<sө 0r9Ԍ \%« yrlJPXӋX\Ta{p0u:?gJL;˿pG;Il#0e=8\ YOޑ#Mo< jɏI^u79M}\[ӨJ c(75jAIB&'a&G37m.;}U`uUrR`i՚: ptp&߃w҂/ݠ@'Y2"mݖ'A$*Sz57ֱRu 0ܕLZ\`vJfJô [7nuY^[ ;G tz*#xvŬ jL{l!4WfSwZV?ۃ4 qGw+lG+|F1oY)rh\Uu!`[}"GCµ`0*-'v>,NII/L3]<[׆q e-|7q3US'%G'!{.q[qKѯ.>^upBn pݼl?Kӥ"SJYŧI <"; Ώ6p0XC=ZC·|Vj?dG?>,єU]Bڲg@{ci][ZZhٻ@AR۴<8gYat[6b{C,rKɸxGp{|~ ԉj8x!TWNTS9Ħ@^ { \c\K4u1G F@;[Ƒ˴x6|C.~)JW) @ _v;{A)ZClUtEnWFS {&F?x9ޭ!Ȅ8c>X|6Bp;rI;Ol@P|aDHuĬ F 8J j=bq{) .K^Xeh96Rh.Rc m#R(Cu@/ #ZI"^+ߊwUwlc3O$hpB2>a<_ȃٛt]ʗ$JT$p#??cKnDiw23~w֭E?:v::/~6eՆnؾ_z9(|DRVAsͺ&%!R_D ٜ!D v}Bpj8f g ; S zCޘۺ߱nfLߐ;$oF?NM?+FzO M!A4R*R[B̉$nlyxfV݌5Zjފ*4d9bYRW?"nU_'#?{Aʁ\\DZW޴D b߼1/O#{lRjY]2`וO;n G/ 4 ,ykr.y`b1m;vzaD~a:j0UԸ{}7ۦFTHy.9 $``m DÌwc,!L&3/`dEپZdTLHL!\P#)gfh0lv~ 'W]  \s#LƊT!'BfEbŵr +o0LiqBqbtrn&|-Rd. l%<3I'fKupM}3z\gѻ/FAA#sXPv]Y"2#ׂ!pnV9H2 y[@_?d7,en}S})(mfK7TzjoڋxrrqqȆUmR o2e>$ZEe[SۮlDۀ5r}e%Gp\IA]BgK;<)~ x`XQjW <]ޘXz۩_r}5!:>I 큞WU,kڑ+U0cjRdZ(} z '%bo)26cPF7s~LJ|}^E%(@ϻTG50S :񬤬 U,mioѹJ5xx3Nu__; 5α9AL}.!e'IԒE$Fz?lCN1ɨ'#DQW+mkIl+ 5*=@(4/նKα"{6G))q [#b/޵뒢R^=V#詠-ֶ/w01m|,w1 FDdX0rj4_PRMG '` }LK DK-(>iW0F]4 f\Cv'PnN}r=!Bn)ލ=-a"2^BLHuKuٙp{IRG\sWaujl9\ ;ԯ1 Zm8kvԫO˨J (`Oj xY&ݰlnPz/A)$Y"h!p0ݦ|f9޳n,_0 ]4T5_vLJAH(K`O /<(x[jϒ0YRyx#DLB`l:Nt %0 CsCyUO{VTH1/<$o]8]545CW)̾@㰶Le 0xP%=sʈ_W۵u Bnr훖Vj$jĔZ U\̧ 4c'.|Ƥ, 6:ѻc&17Ԣ)+ʊuZiB>_5q淢q7 f/T6N|}_& yHӜdx4aXC$\9NmSuB;8o 7ϘZ%KIM"lݖأlkX_u, Np~uUF6F$, G{tTho0NX$hwi}wTeYn3nwf2{S0h0蚲(&acS"9HBeT;Ro,,ΖUpU/v#:.w Ua#HSG'+&pBq|##3so?Фж ej |WSR >@LSm aSL{_YRftV%5<h)Lx:谔tE1MU9Mژ:X>t xr Ïeƃ IVڊ;t>_"֛̍7mwfO:ĭ7&0|X *ƈ( CC 6ڕ7\5EO""h[kߞL" /0+AaE@=3N9k^Ƥ To1[k^2>}Ya26#~huW?ʳ\01E>b:%eGp2a[RY,oqDyJ=C{h?igqp6q];3Ly+RЎ2T"'.՝%)~FuE릳Wm 2ei/R?6nEHdG熟m[$HSV o[9Nߘ5D?C<{Ϳt`bl3 sJYif` A7 $G=zl՗/mTywĞԩV U-6ƿ@ĨxF#"ZWd]X/F_p'' s+>KNoo"}"UvWLQH*S`ݪudB…}ɵT)[dW3J:f6-N8m^kpUK7/\`bFR]FSgμN8}Ru<^*oyIx뗉Q-S 7FU(P_nNnH眑-}z`Cgң,̽#ycwrˆ*h^ɰC㮰yv"N ='b}*ϯq!<E T9NrEQZ@Kԗ/a/>2{Uhdz9Ӑa]OaJz2Ix貥ܛeVdoX3gHMUqZj_La.ܷ#xLP9{mkHaVP2QǤF!qFބgBmQgX{bfE%Ynos\ ^󽌂D :"*Ͽ5EL+db {20A@|ж?'9HWŚgoYƏ; {IdAn@i^\?ը90M3#>"=a&a]<w87~*T`t1m£yG^'}N!Ym4cE&GI-dUz)Oit?^̐٦f{"&"PT<32s0F,8 ] zDp!$Q0@'9ʄs !)VߘTVl[o7%Sy#_p2 jy2X% IȬk* "~;6"u-v[ݘ2qsݔ ڒ rn#<᰻6)խO?M\@*l\]Yn & ƯN񺇈Փ2mNdCzeaXuu;7vutՔsltXs%1'1d(rIs2>1~q387tNUX$7 iʕ * .iE|oF{]{ھTsF4B^P_t}!F=>:ߩ-ՊAPߟ,pHlh2Bt>qr"7(_Xp¹rrsD9k_9cr6QH貖h_ݧ,W@#!b;s?£R}T muV]ZCt,z6PftlKRV28vC@70Gw=eݎ=>w}T[hޢ\+iSo3/cա 在ř =״L@OAxV{tF2TPQMgMV4fg4Y Y$ABM }EOfoS-?weP 8zZJջN>}570Px֢RK|~>nJz"?DyHObW.4R#16O60 p )`mپxx-r W@!!]ϥ~;'^imVvu~8mEX^Z}S',S':fUd]v8YVӂ;fs\nhD;֊CEƶ"ʟ[Q38~Lyș#RtMarXCA9O.=3L%ќKAUD "JF'繂H#Fʾ 2hH)W9)#m;W0Njk# ţ(W jzqȊ& IǝYTzUe&{,<;O쟑gtɄP DVذ8( u ߀ :j-~PAB/(QF>^.njr b'ad7 41y?Q*(р> yu _7Fez-籺'C=WO2uixҲ6 X+k|<|l؏gV_kv;7CuF-|)Sw&,ڈȶ]]#,gMdo`aL>)xNۮھժO[FY]Ț8gtxҔ}{Ÿ,D0̩)Z rC v$A?],\ڔ6_? ś|im:JOѲkv$*04Ób`{`cH; /b0ϗ:5 R';b*<?-'9Zu|> w=LI}`{eŹOm.NE#RC-󇠩O4I3XWe9~ě~h}rw9A^:2S?FH?F8k;=8/f!O WN/01g⧽]@C\ap + R[!~;^j j(153m BK D O_qS82F/T'C1H]Agb݈iYGRT:ȪTh%a"ySJw;uk.PEl6ا}SVpP7$Cܟ4Pd\oFs86;u Yb0Q/]jM' syhn#R QaZdUڂ eƇTE WpΑl|*1%f|!" GSg35O%>b"P$<mD6<*5k;HuWUWKZ3q>AMxY] xJDR[5YFtNbngޤ,'GWʀ hpjj:畭 DzTO1 aq{VX9_!rz"Ɇ"G F-te0❢t[,g4rvn/1\)7d AN_wV)z Jɑt`+i6 x4> b^f?ˋIT,"u%Gή]Ξ?S=ѴȊ''~f%5,plQ5i+V3s Q=`E3L4`eDE4uCA(zVF?B0@O7iNHUy qՌIo4mθ]y,*~B- b i?%Oʸrga2'8[FWf(9]DJ$v:Kj3׽|'OM%mc~z8g5̕QRSѷ¾oC(Ǔڕ`R}(,FηQK֪_&0aMvc=ލ6V@b0i ^BĨQjEY&䬌áU~c賤֡fϨPAYz)k²Rl=k 0>=lE*Cȕ|·#Yec Py{$:$KXҷ 63Cwq)Aף#M^~ttP\.3o|t?#~2Dm[f]"l|4@v1T%A͘ebO/5ӲŴ?XϽSC!0R~X-UC61Y/Ĉ|^%MWxϰ8"|%tGq[| G[CxRB"gMji9W X1xg\Gݝݠu{'u?2ؠa%8}OkA&c[.au4H$IU_Y_&پsXRX"˙Џ|0h4mA*_)idT0N\ e!%BE(/2l''8+J f(Y:Qe>HaND݁sm EhygOיw1f5|ς2lAY8 *۷fWYV*s  ݑa"a!'/)'2Q|Me X튘ԡ 7 DR [=k"@4,!U'UEH*W#u*MS+Wm{kT-F/Xj7&N8[=j5i-b AG`KGPȤ C⧤@ɤQV.lxnq[_{h|TWxK8<;Bޚu'ԏ0^P>o\~Dm5p-+!jZ>] FˡNR].L\dRNq!oD#ވwQ:r"Q .=ӭMzivba^cA= ,10[g|.V߀!뚓,R|xDr`FE!c!a?Á63<^DpevC瀠p?@o7xhsaLo䉔ᕟGU=ƶ&ƿ "ծF̀PF ͦq+u`t`L-%+ax/MmR, !5a!J5V+Ey-1qz41ǩժ VpU ʬͷv; AEښmuWD(z[J$Ea&=l6 *O !%,j Ug*ŝiOdQP^%sV[fkg`ó7%$BFXLRymC s>@=V~*$~vU4kZUN(S  G,?9=wODH|Zz8!#X\ n"^UN>`7ķ#˚(v| kEGǕϝb>}4zUa$Q\I,wL+ aª4d2+; UN7xCa6: $k.oXʿ?HT^a*kk/Yd72 ˝Z@U%Y强׬V+ N l>nAO 3APAڏËE*̰noP s$ـGlŲ%'5zox]Aqȶwr"4β=_C^c[6^~Z 6G``>o70}.>OK^f§laiǷѬ+|^ϝGq-:H+cuu)qFཛྷ'AHC"p8˧I4RmVvd(f6\'ay IҎ`E)b >!cɩlPiЯAe9GJ X dh B4\Q1h{]b.p1_D^ ҕ%8IsR1`6Pp6F1.)`ujgK܃mB59Ksgƛ*"{EJ8hiȸN(>SF?)IF&Vs,5h ޢ d4xQZgas~ 8mB,xqfjD 9Ef"ޘ8D7ׄUbVra?Jn\Fm,%VSyڅ po1c h3?B+GBk%v5܁1o*r Es(hnS⬂^7TrbӑB8gЊt5@K'nJ-`e:bnh8E섋ǡ:εMlk[gX&Xѹz+Ql Q'ARx@BovٛeD `uHb3ح'H3Fr `;nd6[17ߣBLk `ҭ(yꭻ 0G) Fͫ|'a-ep'V\qݬk5oSV*&"{IӤB!S$*nMM7u"Oq]Za5{?b߷f9΍zZV l+}j#NitV dXm&l召DMZNhbq/Pİ[W Fik{,Ĉ=]o9Ս8WqK6|n{WAaw ~Mq AcIإG8bʩ(>3'p՚J-[Q$i`d 6ZNg84Iup)K_wB+dEMhPwnPbPCdPQFP"=U LU9h~*+PuӖܖ:3:rb2= Rr|.$}$akk KhkMf].ya|HDM#Q39[csdA"5 a{s,ߘ!FbzRJlaEb kc;G'ix]BN-6"\0_^&"q>?g_4L \Fb*}Maª*^HuQ/D9fv9:,UgY\~S1* wuOSȲh^ƿsv[+4s[}e7~OcB 81.": >tWV3W`tyP9T[g1 Y/?4)?fa)3xvVY+(սT(Ԟ9 q/}?6щt5 0\MweF4]Y4AK[*= WbJ-^3~:S?wtdˊJvrH|v"+l!\i"+g6 rl$ΩuhT(B)/m kN|I2Y=Ҥa,S>g\C(^S0K+U+@5$_m 08\n>b̍}ܙ_S{8*&f#O&.j1~"?]SNP)yHdp;O CUR*AOkβ#pq;J]e /<[wnMF+ s.W&ANBM.Pd]CS{'mjt1nq|hSȯ.DEdtc LÊETZhnszٞy|Iu?DBmP- a '=08(A|Dz08;(Wv[4a^m{w̫)9I4dKqR!t~%Kogi{  :)STV7$. %Hv`ocS\a9c uoZC;gfWN+Sl%VVuPFhN&Jga=r #] !3n t(I^ Ocѝ@ \S=~6Ut 3fFx(n#1(C q-<9 0E@zdWS ,CzYx{jNR7sOh/SD䋨 .ys{g%-@٩+¯]AB󰸲X]i ):KUQ`_>ޡ>H${<ͧ_ƟU҅I|IkPՏfd|gΝɧdŅfM߄ok¥ư)^Z .D837Xus9p tgs,gf}T}@?n!4 C *"*+0UFIϹ=R3|% X*v1JooR Ձ)\'<6p"2_-]lI4f5X^Hy$9qL3abUS H~3; ܪ96ʃ]#}RBwU$~d> c3yòYx`4=jwC;* Q7 TEyq'aZ$vϞ7+X؂* gux R(0]9^aN>XHK;?͸'4ɤGTB]^.5&mhS~6lo6}Ӣ^4;QY$4$=^g;y);i`g5^4"] endstream endobj 562 0 obj << /Type /ObjStm /N 100 /First 962 /Length 5367 /Filter /FlateDecode >> stream x}q8N8<(hƷLf~Ҥ(p[žTu](:Y:]hN-WH/i e=LGAQхQ X#RCpq g`ǃ('ӎ `+<"[A!(Z#_11 E!R ~ P-v )l VZ@j4WFPGR)XM$Ѣ@2h `4@G-GhOB.FF+U!Q#$;:"v}F<b!1Bk6iN4+= :7Gaeؑ`MDz£؇+Ȉ "t@ q%Q#` l/j#wpx®.xP0ꢁQk$ wc  kp2ڄ7V,d%0vZ 5\ý!|||68AWp`O_>P:6.C Da4*hDnM3u`h'R #ORa@#H&9 3aH0W$J*`%X["IQR'asY<Y9|ctc|b8Gd[s쀌 1hqϽsb)rD"<'B{na K PXui-)r2GIWp/H 9 teā@{d;xS'E.s$H!,f C,M&rƲ-X߯Z؅ϲn;$ftr#p^|:PQHOx&IM=eqBߐߔ4vL,i#3-:UsI=gHi l`۹Mkx<7踍dj:YJ\o24*2D :̔+%R-P>-Q1pF.nHS=ܳȅ_#-d5l9nUI91ƣn<@˄$]P˞w2˕6Y7 <`Mu ئuV6yL =d̔d,+]Yss1n؂=eJ ,o(^_[ 7_ 7Zȳ2lZMڄ1qSW#VcX d td8 /joAR8T;Op#6AcPFuxL ͋$C-gI@'FΑ5{zOε3boK[aкf.0&-XB }-jb{VG?8!y7^o%@iDҹt1wV7tSet!t,-8XJ5% -\X5ܫ fuS@T9|nQZMRz>y*0H0mˈ2MJ@8*!oc=diVѯShXkؐNOp=<'rÉ'ʦfy>x8嵑WK ZV`փh}\14"k$ *u6Sh35>H>J-6L :ì{Lc8 8yXճtrp5Z(3,Ǎxdf4wn1`Z!-I-9>>x d# %WsR #.K̓P"KAaEKEKN4dr IB#"pȰKk;EY(l>{%PSx [,}1.sdeyhKO-@alEw)h(IN&pטF'SnFdA# citҹ5zC!CȂ#;TVcjS )jHЩ<8Ta=NTS-qX!/iu0fR`8|NZTUzI;wUQ>Wnv;١58zyO_KWo۟ůXWf)&p .L/)Wogx}) "qh6_>vUݬՔ<-GwլG+˃<*_<+ߗrT~./۫hG嗲*_g ??~R~+^ݔ.oʛMUޖޕwd|rZ]嬜}TU9붼/?˿&y6r!ӝk#y~zqwV=(opc[ĕ~ ~2%9ʙ?L"7{HֱGԡ6hɴ Qa߁?$V_F,L]\dx~`bų'@,VI.„5rѫ tW`SMh&hVMx?\!\>;}r~@\LZ^>Axf%aɓsTi%Cxi^Ncg>E'Mǻ̃\z<7{d՟^ȿ u1IusU}14!ɎU_>_Ѭ'}NjzUAa'*MB q4l{5O eV?KĄ%AѳWê5[8~ћ1}sE91_屹ݵq{%sDh77Ex:`\wA92ܣNkz}0;\/1AzыSd=XrN /u,;Yek{:҉A(➴$bGfpx؈M Z^n8[an( 7Ld޽d\bDfM4z$Ro=?<{y|7Hw1v#$}C.< rOOFT3Gv)ףhR~7=+7Ӷy?$9p`ZїA fj9}~v/:HCCig$6O|͇ǟ\v zJ4Ԋ 2jyqtqls0TqӧYn!uU[$A}׺˓rkjlV[qh2yש*^j+}Z[ _Aç/r+o%e)[,còRjxnX~ALI}d}4/ǓI#8k@VDp^]A\k.:uy/i\Mo7K}ooIroϟ~@ן an_q~O/[a~YOt3kmstjxffn)ae?"/ޟ}zgg}t 5lx̠|u TG^a;aXa`^Y]U ڻO3Tvr<R>̾O_# &}/%o6'pW]Kɨo!.%M[ȾC=Eыɇ;^&{ .3mL~8΋.T+|fa o_:pp.niOҥzhmN{I8]Τnz%rsw[([ptqSwfnZsCƻN}݀["_0V.c 7)Lv/F،xvNS=V6G]_ BW[;լ.Eg{݂x%mw AzmI>g~ޭ@tɫ9SR7k2 y[g%}p羽|ӤďWiI&߄$d=ۊo3kɲ*4mMgβ3ísbˉ$+Utc2tz!GĨ$y$=A̬ՀQKj|)-RZ^8]U5m}LL_sbbq}:~0.ARrTjٮҷZJDXJ֨2LuA#!2b#BuQ(K4+rq% Y\qC#B!sX"ٯυ : endstream endobj 669 0 obj << /Author()/Title()/Subject()/Creator(LaTeX with hyperref package)/Producer(pdfTeX-1.40.16)/Keywords() /CreationDate (D:20160514185921-04'00') /ModDate (D:20160514185921-04'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.16 (TeX Live 2015) kpathsea version 6.2.1) >> endobj 641 0 obj << /Type /ObjStm /N 46 /First 376 /Length 1470 /Filter /FlateDecode >> stream xڕXێ6 }c@A<y$bd'؝ ڿ/iZָyxHQD2Do0J!=Y5 ~ހ#rka L&ƃ!o6^locCy`80G 4.eB ? E6md6xBAD81q v*JȜ8CdBb9y3?brV$Z1VRfq +Ns`t<]q<L\vWMpsoφOPWf%|;|7?o+Mw|\{quk#P#mEŴn`7θnϼrrCXUF讜bvTƪ2n?%G-y 1+`PVpXӄ*1VP鲛@MMrp5je7>)7S|_UzšžJ7$ZbߑW݆NK;*K<ꪪn..]47tnc= &R'*syGR4Zu9|_^><|=Y1yӧ|s:߻= 4-$FQNS<~9\wKi[.x*/(?/K/* @KMpErAd3w*p  xg߆nNc-BZR KsTTHHJ}fc^uy>2VMu endstream endobj 670 0 obj << /Type /XRef /Index [0 671] /Size 671 /W [1 3 1] /Root 668 0 R /Info 669 0 R /ID [ ] /Length 1669 /Filter /FlateDecode >> stream x%[l]Gg>lj8;cDZsK'vn$N8c׉c/@$*(2"$TH$j)b) (< Bx(Eey_sfϞ99w;sM:}D.4bxܗOKçQo>ki4}/ysw[ FO +^Qg,qS4q*%(x܃/Μ/q(ڀ~yefzgΙ%)z_J1VXou/Z վ3{V^_+ʘJQǟQ3{PTg~Hߖ68w v {A%x_TP G%A'h6{Yi:uv7%sstrn68JJ  Dł){Q_Z<c$0mi'8&͏+q L'ޗ2y0c~Ĵyptiq䡢KCJ\e,_Pb \?}i| `3^7_vmYn!f' 2{iYsB9țrR`#%pXaK_|K lpS24l@Bh4sҨ OZch3J?4cHHÎA_Ԏ{aǀB|B>. i]%g{(1 z;ͿWZ pLZUafKv,ԬIÄAg*[qe$pNk%}GRBAӽbɑQi<2XdjI ^XdUZa`&ᶘalӢ̀,5&ݹN T` *>Kk*K^RTmɓj,UE:,MQe^˼ѲOE-٦ɲUlOX]EOYw-7DQVuZOuY!EݖߩrUk6YSX~n XE-F--E2Бje|u>T.۵ԃc[)@3Զu[mݮ;nz`Ǡԥ޸x endstream endobj startxref 544133 %%EOF mathgl-8.0.1/mgltex/Recompilation_decision.eps0000664000175000017500000032601614167366474021307 0ustar balakinbalakin%!PS-Adobe-3.0 EPSF-3.0 %%Creator: cairo 1.13.1 (http://cairographics.org) %%CreationDate: Sat Nov 7 15:28:00 2015 %%Pages: 1 %%DocumentData: Clean7Bit %%LanguageLevel: 3 %%BoundingBox: 0 -1 631 791 %%EndComments %%BeginProlog save 50 dict begin /q { gsave } bind def /Q { grestore } bind def /cm { 6 array astore concat } bind def /w { setlinewidth } bind def /J { setlinecap } bind def /j { setlinejoin } bind def /M { setmiterlimit } bind def /d { setdash } bind def /m { moveto } bind def /l { lineto } bind def /c { curveto } bind def /h { closepath } bind def /re { exch dup neg 3 1 roll 5 3 roll moveto 0 rlineto 0 exch rlineto 0 rlineto closepath } bind def /S { stroke } bind def /f { fill } bind def /f* { eofill } bind def /n { newpath } bind def /W { clip } bind def /W* { eoclip } bind def /BT { } bind def /ET { } bind def /pdfmark where { pop globaldict /?pdfmark /exec load put } { globaldict begin /?pdfmark /pop load def /pdfmark /cleartomark load def end } ifelse /BDC { mark 3 1 roll /BDC pdfmark } bind def /EMC { mark /EMC pdfmark } bind def /cairo_store_point { /cairo_point_y exch def /cairo_point_x exch def } def /Tj { show currentpoint cairo_store_point } bind def /TJ { { dup type /stringtype eq { show } { -0.001 mul 0 cairo_font_matrix dtransform rmoveto } ifelse } forall currentpoint cairo_store_point } bind def /cairo_selectfont { cairo_font_matrix aload pop pop pop 0 0 6 array astore cairo_font exch selectfont cairo_point_x cairo_point_y moveto } bind def /Tf { pop /cairo_font exch def /cairo_font_matrix where { pop cairo_selectfont } if } bind def /Td { matrix translate cairo_font_matrix matrix concatmatrix dup /cairo_font_matrix exch def dup 4 get exch 5 get cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def /Tm { 2 copy 8 2 roll 6 array astore /cairo_font_matrix exch def cairo_store_point /cairo_font where { pop cairo_selectfont } if } bind def /g { setgray } bind def /rg { setrgbcolor } bind def /d1 { setcachedevice } bind def %%EndProlog %%BeginSetup %%BeginResource: font DejaVuSans 11 dict begin /FontType 42 def /FontName /DejaVuSans def /PaintType 0 def /FontMatrix [ 1 0 0 1 0 0 ] def /FontBBox [ 0 0 0 0 ] def /Encoding 256 array def 0 1 255 { Encoding exch /.notdef put } for Encoding 32 /space put Encoding 46 /period put Encoding 47 /slash put Encoding 60 /less put Encoding 62 /greater put Encoding 63 /question put Encoding 64 /at put Encoding 65 /A put Encoding 67 /C put Encoding 68 /D put Encoding 69 /E put Encoding 70 /F put Encoding 71 /G put Encoding 73 /I put Encoding 76 /L put Encoding 77 /M put Encoding 78 /N put Encoding 82 /R put Encoding 83 /S put Encoding 85 /U put Encoding 89 /Y put Encoding 92 /backslash put Encoding 97 /a put Encoding 99 /c put Encoding 100 /d put Encoding 101 /e put Encoding 104 /h put Encoding 105 /i put Encoding 108 /l put Encoding 109 /m put Encoding 110 /n put Encoding 111 /o put Encoding 112 /p put Encoding 113 /q put Encoding 114 /r put Encoding 115 /s put Encoding 116 /t put Encoding 117 /u put Encoding 118 /v put Encoding 119 /w put Encoding 121 /y put /CharStrings 42 dict dup begin /.notdef 0 def /S 1 def /t 2 def /a 3 def /r 4 def /F 5 def /i 6 def /n 7 def /d 8 def /backslash 9 def /M 10 def /G 11 def /L 12 def /at 13 def /less 14 def /s 15 def /c 16 def /p 17 def /greater 18 def /I 19 def /space 20 def /e 21 def /question 22 def /C 23 def /o 24 def /m 25 def /v 26 def /period 27 def /R 28 def /w 29 def /slash 30 def /l 31 def /U 32 def /D 33 def /E 34 def /A 35 def /h 36 def /y 37 def /q 38 def /u 39 def /Y 40 def /N 41 def end readonly def /sfnts [ <0001000000090080000300106376742000691d3900001d14000001fe6670676d7134766a0000 1f14000000ab676c796600c0787b0000009c00001c7868656164026638f700001fc000000036 686865610cb8067b00001ff800000024686d7478cb7f16780000201c000000a86c6f63610002 4608000020c4000000ac6d617870049706710000217000000020707265703b07f10000002190 0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec 310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f272062900010087 ffe304a205f00027007e403c0d0c020e0b021e1f1e080902070a021f1f1e420a0b1e1f041501 0015a11494189511049500942591118c281e0a0b1f1b0700221b190e2d071914222810dcc4ec fcece4111239393939310010e4f4e4ec10eef6ee10c6111739304b535807100eed1117390710 0eed1117395922b20f2901015db61f292f294f29035d01152e012322061514161f011e011514 0421222627351e013332363534262f012e01353424333216044873cc5fa5b377a67ae2d7fedd fee76aef807bec72adbc879a7be2ca0117f569da05a4c53736807663651f192bd9b6d9e0302f d04546887e6e7c1f182dc0abc6e4260000010037000002f2059e0013003840190e05080f03a9 001101bc08870a0b08090204000810120e461410fc3cc4fc3cc432393931002fecf43cc4ec32 11393930b2af1501015d01112115211114163b01152322263511233533110177017bfe854b73 bdbdd5a28787059efec28ffda0894e9a9fd202608f013e0000000002007bffe3042d047b000a 002500bc4027191f0b17090e00a91706b90e1120861fba1cb923b8118c170c001703180d0908 0b1f030814452610fcecccd4ec323211393931002fc4e4f4fcf4ec10c6ee10ee113911391239 30406e301d301e301f3020302130223f27401d401e401f402040214022501d501e501f502050 21502250277027851d871e871f8720872185229027a027f0271e301e301f30203021401e401f 40204021501e501f50205021601e601f60206021701e701f70207021801e801f80208021185d 015d0122061514163332363d01371123350e01232226353436332135342623220607353e0133 321602bedfac816f99b9b8b83fbc88accbfdfb0102a79760b65465be5af3f00233667b6273d9 b4294cfd81aa6661c1a2bdc0127f8b2e2eaa2727fc00000100ba0000034a047b001100304014 060b0700110b03870eb809bc070a06080008461210fcc4ec3231002fe4f4ecc4d4cc11123930 b450139f1302015d012e012322061511231133153e0133321617034a1f492c9ca7b9b93aba85 132e1c03b41211cbbefdb20460ae666305050000000100c90000042305d50009002940120695 040295008104ad08050107031c00040a10fcec32d4c431002fecf4ec10ee30b20f0b01015d13 211521112115211123c9035afd700250fdb0ca05d5aafe48aafd3700000200c1000001790614 00030007002b400e06be04b100bc020501080400460810fc3cec3231002fe4fcec30400b1009 400950096009700905015d1333112311331523c1b8b8b8b80460fba00614e900000100ba0000 0464047b001300364019030900030e0106870e11b80cbc0a010208004e0d09080b461410fcec 32f4ec31002f3ce4f4c4ec1112173930b46015cf1502015d0111231134262322061511231133 153e013332160464b87c7c95acb9b942b375c1c602a4fd5c029e9f9ebea4fd870460ae6564ef 00020071ffe3045a06140010001c003840191ab9000e14b905088c0eb8019703170400080247 11120b451d10fcecf4ec323231002fece4f4c4ec10c4ee30b6601e801ea01e03015d01113311 23350e0123220211100033321601141633323635342623220603a2b8b83ab17ccbff00ffcb7c b1fdc7a79292a8a89292a703b6025ef9eca86461014401080108014461fe15cbe7e7cbcbe7e7 00010000ff4202b205d50003002d4014021a010100001a03030242019f008104020001032fc4 3939310010f4ec304b5358071005ed071005ed592213012301aa0208aafdf805d5f96d069300 000100c90000061f05d5000c00bf403403110708070211010208080702110302090a0901110a 0a09420a070203080300af080b050908030201050a061c043e0a1c00040d10fcecfcec111739 31002f3cc4ec32111739304b5358071005ed071008ed071008ed071005ed5922b2700e01015d 405603070f080f09020a15021407130a260226072007260a200a3407350a69027c027b07790a 80028207820a90021604010b0313011b0323012c032708280934013c035608590965086a0976 08790981018d0395019b03145d005d13210901211123110123011123c9012d017d017f012dc5 fe7fcbfe7fc405d5fc0803f8fa2b051ffc000400fae1000000010073ffe3058b05f0001d0039 402000051b0195031b950812a111ae15950e91088c1e02001c1134043318190b101e10fcecfc e4fcc4310010e4f4ecf4ec10fed4ee1139393025112135211106042320001110002132041715 2e0123200011100021323604c3feb6021275fee6a0fea2fe75018b015e9201076f70fc8bfeee feed011301126ba8d50191a6fd7f53550199016d016e01994846d75f60fecefed1fed2fece25 0000000100c90000046a05d500050025400c0295008104011c033a00040610fcecec31002fe4 ec304009300750078003800404015d133311211521c9ca02d7fc5f05d5fad5aa00020087fe9c 077105a2000b004c00954032180c0309a919151b03a94c0f34330fac30a93715ac24a937434d 33341e1a00281206180c281a2b1e2849122b2a28492c3d4d10dcecfcec10fefdfe3cc610ee11 123939310010d4c4fcec10feedd4c610c5ee3210c4ee11393930004bb009544bb00c545b4bb0 10545b4bb013545b4bb014545b58bd004dffc00001004d004d0040381137385940090f4e1f4e 2f4e3f4e04015d011416333236353426232206010e01232226353436333216173533113e0135 3426272624232206070602151412171604333236371706042322242726023534123736243332 04171e011510000502fa8e7c7b8d907a798f02213c9b67acd7d8ab679c3b8f92a53f4068fed5 b07be2609db1736d6901149d81f9685a7dfed998b9feb8808086887e810152bdd4016b7b4b4f fec2fee802198fa3a48e8ca5a4fe484d49f9c8c8fa4b4c83fd2016dfb16bbc50838b414066fe b5c19ffeea6a686d57516f6167837d7d0149bdb6014a7d7f87aea062e67bfef9fed006000001 00d9005e05db04a60006004d402a029c030403019c0001040403019c0201050605009c060542 05040201000503a806a7070102002404230710fcec3239310010f4ec1739304b53580704ed07 1008ed071008ed071004ed592209021501350105dbfbf80408fafe050203f0fe91fe93b601d1 a601d1000001006fffe303c7047b002700e7403c0d0c020e0b531f1e080902070a531f1f1e42 0a0b1e1f041500860189041486158918b91104b925b8118c281e0a0b1f1b0700521b080e0708 1422452810fcc4ecd4ece4111239393939310010e4f4ec10fef5ee10f5ee121739304b535807 100eed111739070eed1117395922b2002701015d406d1c0a1c0b1c0c2e092c0a2c0b2c0c3b09 3b0a3b0b3b0c0b200020012402280a280b2a132f142f152a16281e281f292029212427860a86 0b860c860d12000000010202060a060b030c030d030e030f03100319031a031b031c041d0927 2f293f295f297f2980299029a029f029185d005d7101152e012322061514161f011e01151406 23222627351e013332363534262f012e01353436333216038b4ea85a898962943fc4a5f7d85a c36c66c661828c65ab40ab98e0ce66b4043fae282854544049210e2a99899cb62323be353559 514b50250f2495829eac1e00000000010071ffe303e7047b0019003f401b00860188040e860d 880ab91104b917b8118c1a07120d004814451a10fce432ec310010e4f4ec10fef4ee10f5ee30 400b0f1b101b801b901ba01b05015d01152e0123220615141633323637150e01232200111000 21321603e74e9d50b3c6c6b3509d4e4da55dfdfed6012d010655a20435ac2b2be3cdcde32b2b aa2424013e010e0112013a230000000200bafe5604a4047b0010001c003e401b1ab9000e14b9 0508b80e8c01bd03bc1d11120b471704000802461d10fcec3232f4ec310010e4e4e4f4c4ec10 c4ee304009601e801ea01ee01e04015d2511231133153e013332001110022322260134262322 061514163332360173b9b93ab17bcc00ffffcc7bb10238a79292a7a79292a7a8fdae060aaa64 61febcfef8fef8febc6101ebcbe7e7cbcbe7e7000000000100d9005e05db04a60006004f402b 069c0006030403059c040403009c010201069c05060202014206050302000504a801a7070602 240400230710fc3cec39310010f4ec1739304b5358071008ed071004ed071004ed071008ed59 2213350115013501d90502fafe040603f0b6fe2fa6fe2fb6016d0000000100c90000019305d5 0003002eb700af02011c00040410fc4bb0105458b9000000403859ec31002fec3001400d3005 4005500560058f059f05065d13331123c9caca05d5fa2b0000020071ffe3047f047b0014001b 00704024001501098608880515a90105b90c01bb18b912b80c8c1c1b1502081508004b02120f 451c10fcecf4ecc4111239310010e4f4ece410ee10ee10f4ee1112393040293f1d701da01dd0 1df01d053f003f013f023f153f1b052c072f082f092c0a6f006f016f026f156f1b095d71015d 0115211e0133323637150e01232000111000333200072e0123220607047ffcb20ccdb76ac762 63d06bfef4fec70129fce20107b802a5889ab90e025e5abec73434ae2a2c0138010a01130143 feddc497b4ae9e0000020093000003b005f0000300240065402b241e0906040a1d1304001486 1388109517910083021d1a0d0905040a1e010d1c1a041c05010300261a132510dc4bb00c5458 b90013ffc03859c4fcecd4ec10ee11393911123911123931002feef6fef4ee10cd1139391739 3001b679097a0a7a20035d2533152313233534363f013e0135342623220607353e0133321615 14060f010e01070e01150187cbcbc5bf385a5a3933836c4fb3615ec167b8df485a582f270806 06fefe01919a65825659355e31596e4643bc3938c29f4c8956562f3519153c34000000010073 ffe3052705f000190036401a0da10eae0a951101a100ae04951791118c1a07190d003014101a 10fcec32ec310010e4f4ecf4ec10eef6ee30b40f1b1f1b02015d01152e012320001110002132 3637150e01232000111000213216052766e782ff00fef00110010082e7666aed84feadfe7a01 86015386ed0562d55f5efec7fed8fed9fec75e5fd34848019f01670168019f47000000020071 ffe30475047b000b0017004a401306b91200b90cb8128c1809120f51031215451810fcecf4ec 310010e4f4ec10ee3040233f197b007b067f077f087f097f0a7f0b7b0c7f0d7f0e7f0f7f107f 117b12a019f01911015d012206151416333236353426273200111000232200111000027394ac ab9593acac93f00112feeef0f1feef011103dfe7c9c9e7e8c8c7e99cfec8feecfeedfec70139 0113011401380000000100ba0000071d047b0022005a4026061209180f00061d07150c871d20 03b81bbc19100700110f0808065011080f501c18081a462310fcec32fcfcfcec11123931002f 3c3ce4f43cc4ec32111217393040133024502470249024a024a024bf24df24ff2409015d013e 013332161511231134262322061511231134262322061511231133153e01333216042945c082 afbeb972758fa6b972778da6b9b93fb0797aab03897c76f5e2fd5c029ea19cbea4fd87029ea2 9bbfa3fd870460ae67627c0000000001003d0000047f0460000600fb40270311040504021101 0205050402110302060006011100000642020300bf0506050302010504000710d44bb00a5458 b90000004038594bb014544bb015545b58b90000ffc03859c4173931002fec3239304b535807 1005ed071008ed071008ed071005ed592201408e48026a027b027f02860280029102a4020806 00060109030904150015011a031a0426002601290329042008350035013a033a043008460046 0149034904460548064008560056015903590450086600660169036904670568066008750074 017b037b0475057a068500850189038904890586069600960197029a03980498059706a805a7 06b008c008df08ff083e5d005d133309013301233dc3015e015ec3fe5cfa0460fc5403acfba0 0000000100db000001ae00fe00030011b7008302011900180410fcec31002fec3037331523db d3d3fefe000200c90000055405d50013001c00b14035090807030a0611030403051104040342 06040015030415950914950d810b040506031109001c160e050a191904113f140a1c0c041d10 fcec32fcc4ec1117391139393931002f3cf4ecd4ec123912391239304b5358071005ed071005 ed1117395922b2401e01015d40427a1301050005010502060307041500150114021603170425 002501250226032706260726082609201e360136024601460268057504750577138806880798 0698071f5d005d011e01171323032e012b01112311212016151406011133323635342623038d 417b3ecdd9bf4a8b78dcca01c80100fc83fd89fe9295959202bc16907efe68017f9662fd8905 d5d6d88dba024ffdee878383850000010056000006350460000c01eb404905550605090a0904 550a0903550a0b0a025501020b0b0a061107080705110405080807021103020c000c01110000 0c420a050203060300bf0b080c0b0a09080605040302010b07000d10d44bb00a544bb011545b 4bb012545b4bb013545b4bb00b545b58b9000000403859014bb00c544bb00d545b4bb010545b 58b90000ffc03859cc173931002f3cec32321739304b5358071005ed071008ed071008ed0710 05ed071008ed071005ed0705ed071008ed59220140ff050216021605220a350a49024905460a 400a5b025b05550a500a6e026e05660a79027f0279057f05870299029805940abc02bc05ce02 c703cf051d0502090306040b050a080b09040b050c1502190316041a051b081b09140b150c25 00250123022703210425052206220725082709240a210b230c390336043608390c300e460248 034604400442054006400740084409440a440b400e400e560056015602500451055206520750 085309540a550b6300640165026a0365046a056a066a076e09610b670c6f0e7500750179027d 0378047d057a067f067a077f07780879097f097b0a760b7d0c870288058f0e97009701940293 039c049b05980698079908402f960c9f0ea600a601a402a403ab04ab05a906a907ab08a40caf 0eb502b103bd04bb05b809bf0ec402c303cc04ca05795d005d13331b01331b013301230b0123 56b8e6e5d9e6e5b8fedbd9f1f2d90460fc96036afc96036afba00396fc6a00010000ff4202b2 05d50003002d4014001a010201021a03000342029f008104020001032fc43939310010f4ec30 4b5358071005ed071005ed5922013301230208aafdf8aa05d5f96d000000000100c100000179 061400030022b7009702010800460410fcec31002fec30400d10054005500560057005f00506 015d13331123c1b8b80614f9ec00000100b2ffe3052905d50011004040160802110b0005950e 8c09008112081c0a38011c00411210fc4bb0105458b90000ffc03859ecfcec310010e432f4ec 11393939393001b61f138f139f13035d133311141633323635113311100021200011b2cbaec3 c2aecbfedffee6fee5fedf05d5fc75f0d3d3f0038bfc5cfedcfed6012a012400000200c90000 05b005d500080011002e4015009509810195100802100a0005190d32001c09041210fcecf4ec 113939393931002fecf4ec30b2601301015d0111332000111000212521200011100029010193 f40135011ffee1fecbfe42019f01b20196fe68fe50fe61052ffb770118012e012c0117a6fe97 fe80fe7efe960000000100c90000048b05d5000b002e401506950402950081089504ad0a0501 0907031c00040c10fcec32d4c4c431002fececf4ec10ee30b21f0d01015d1321152111211521 11211521c903b0fd1a02c7fd3902f8fc3e05d5aafe46aafde3aa0000000200100000056805d5 0002000a00c2404100110100040504021105050401110a030a0011020003030a071105040611 0505040911030a08110a030a4200030795010381090509080706040302010009050a0b10d4c4 173931002f3ce4d4ec1239304b5358071005ed0705ed071005ed0705ed071008ed071005ed07 1005ed071008ed5922b2200c01015d40420f010f020f070f080f005800760070008c00090701 0802060309041601190256015802500c67016802780176027c0372047707780887018802800c 980299039604175d005d090121013301230321032302bcfeee0225fe7be50239d288fd5f88d5 050efd1903aefa2b017ffe810000000100ba000004640614001300344019030900030e010687 0e11b80c970a010208004e0d09080b461410fcec32f4ec31002f3cecf4c4ec1112173930b260 1501015d0111231134262322061511231133113e013332160464b87c7c95acb9b942b375c1c6 02a4fd5c029e9f9ebea4fd870614fd9e6564ef000001003dfe56047f0460000f018b40430708 020911000f0a110b0a00000f0e110f000f0d110c0d00000f0d110e0d0a0b0a0c110b0b0a420d 0b0910000b058703bd0e0bbc100e0d0c0a09060300080f040f0b1010d44bb00a544bb008545b 58b9000b004038594bb0145458b9000bffc03859c4c4111739310010e432f4ec113911391239 304b5358071005ed071008ed071008ed071005ed071008ed0705ed173259220140f006000508 0609030d160a170d100d230d350d490a4f0a4e0d5a095a0a6a0a870d800d930d120a000a0906 0b050c0b0e0b0f1701150210041005170a140b140c1a0e1a0f27002401240220042005290828 09250a240b240c270d2a0e2a0f201137003501350230043005380a360b360c380d390e390f30 114100400140024003400440054006400740084209450a470d490e490f401154005101510255 03500450055606550756085709570a550b550c590e590f501166016602680a690e690f60117b 08780e780f89008a09850b850c890d890e890f9909950b950c9a0e9a0fa40ba40cab0eab0fb0 11cf11df11ff11655d005d050e012b01353332363f01013309013302934e947c936c4c543321 fe3bc3015e015ec368c87a9a488654044efc94036c00000000020071fe56045a047b000b001c 003e401b03b90c0f09b91815b80f8c1bbd19bc1d180c06081a47001212451d10fcecf4ec3232 310010e4e4e4f4c4ec10c6ee304009601e801ea01ee01e04015d011416333236353426232206 010e012322021110003332161735331123012fa79292a8a89292a702733ab17ccbff00ffcb7c b13ab8b8022fcbe7e7cbcbe7e7fdae646101440108010801446164aaf9f60000000200aeffe3 0458047b00130014003b401c030900030e0106870e118c0a01bc14b80c0d0908140b4e020800 461510fcecf439ec3231002fe4e432f4c4ec1112173930b46f15c01502015d13113311141633 32363511331123350e0123222601aeb87c7c95adb8b843b175c1c801cf01ba02a6fd619f9fbe a4027bfba0ac6663f003a8000001fffc000004e705d500080094402803110405040211010205 050402110302080008011100000842020300af0602070440051c0040070910d4e4fce4123931 002fec3239304b5358071005ed071008ed071008ed071005ed5922b2000a01015d403c050214 02350230023005300846024002400540085102510551086502840293021016011a031f0a2601 290337013803400a670168037803700a9f0a0d5d005d03330901330111231104d9019e019bd9 fdf0cb05d5fd9a0266fcf2fd3902c7000000000100c90000053305d500090079401e07110102 0102110607064207020300af0805060107021c0436071c00040a10fcecfcec11393931002f3c ec323939304b5358071004ed071004ed5922b21f0b01015d4030360238074802470769026607 8002070601090615011a06460149065701580665016906790685018a0695019a069f0b105d00 5d13210111331121011123c901100296c4fef0fd6ac405d5fb1f04e1fa2b04e1fb1f013500b8 00cb00cb00c100aa009c01a600b800660000007100cb00a002b20085007500b800c301cb0189 022d00cb00a600f000d300aa008700cb03aa0400014a003300cb000000d9050200f4015400b4 009c01390114013907060400044e04b4045204b804e704cd0037047304cd04600473013303a2 055605a60556053903c5021200c9001f00b801df007300ba03e9033303bc0444040e00df03cd 03aa00e503aa0404000000cb008f00a4007b00b80014016f007f027b0252008f00c705cd009a 009a006f00cb00cd019e01d300f000ba018300d5009803040248009e01d500c100cb00f60083 0354027f00000333026600d300c700a400cd008f009a0073040005d5010a00fe022b00a400b4 009c00000062009c0000001d032d05d505d505d505f0007f007b005400a406b80614072301d3 00b800cb00a601c301ec069300a000d3035c037103db0185042304a80448008f013901140139 0360008f05d5019a0614072306660179046004600460047b009c00000277046001aa00e90460 0762007b00c5007f027b000000b4025205cd006600bc00660077061000cd013b01850389008f 007b0000001d00cd074a042f009c009c0000077d006f0000006f0335006a006f007b00ae00b2 002d0396008f027b00f600830354063705f6008f009c04e10266008f018d02f600cd03440029 006604ee00730000140000960000b707060504030201002c2010b002254964b040515820c859 212d2cb002254964b040515820c859212d2c20100720b00050b00d7920b8ffff5058041b0559 b0051cb0032508b0042523e120b00050b00d7920b8ffff5058041b0559b0051cb0032508e12d 2c4b505820b0fd454459212d2cb002254560442d2c4b5358b00225b0022545445921212d2c45 442d2cb00225b0022549b00525b005254960b0206368208a108a233a8a10653a2d0000010000 0002570ae39778045f0f3cf5001f080000000000cef5cb7600000000cef5cb76f7d6fcae0d72 095500000008000000010000000000010000076dfe1d00000de2f7d6fa510d72000100000000 00000000000000000000002a04cd0066051400870323003704e7007b034a00ba049a00c90239 00c1051200ba0514007102b2000006e700c906330073047500c90800008706b400d9042b006f 04660071051400ba06b400d9025c00c9028b000004ec0071043f00930596007304e5007107cb 00ba04bc003d028b00db058f00c9068b005602b20000023900c105db00b2062900c9050e00c9 05790010051200ba04bc003d05140071051200ae04e3fffc05fc00c900000000000000440000 013c000001b8000002e400000354000003a8000003f800000470000005080000055400000650 000006f80000073c000008bc0000093400000a9400000b2c00000bcc00000c4400000c8c0000 0c8c00000d6000000e3800000ed000000f74000010380000115c0000118400001298000014bc 0000150800001544000015c800001648000016a8000017a40000181c000019e800001a880000 1b0c00001bd000001c7800010000002a0354002b0068000c0002001000990008000004150216 00080004b8028040fffbfe03fa1403f92503f83203f79603f60e03f5fe03f4fe03f32503f20e 03f19603f02503ef8a4105effe03ee9603ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03 e63203e5e45305e59603e48a4105e45303e3e22f05e3fa03e22f03e1fe03e0fe03df3203de14 03dd9603dcfe03db1203da7d03d9bb03d8fe03d68a4105d67d03d5d44705d57d03d44703d3d2 1b05d3fe03d21b03d1fe03d0fe03cffe03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe 03c6851105c61c03c51603c4fe03c3fe03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03 bbfe03ba1103b9862505b9fe03b8b7bb05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff 03b64004b52503b4fe03b39603b2fe03b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403 abaa1205ab2503aa1203a98a4105a9fa03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a332 03a20e03a16403a08a4105a096039ffe039e9d0c059efe039d0c039c9b19059c64039b9a1005 9b19039a1003990a0398fe0397960d0597fe03960d03958a410595960394930e05942803930e 0392fa039190bb0591fe03908f5d0590bb039080048f8e25058f5d038f40048e25038dfe038c 8b2e058cfe038b2e038a8625058a410389880b05891403880b03878625058764038685110586 250385110384fe038382110583fe0382110381fe0380fe037ffe0340ff7e7d7d057efe037d7d 037c64037b5415057b25037afe0379fe03780e03770c03760a0375fe0374fa0373fa0372fa03 71fa0370fe036ffe036efe036c21036bfe036a1142056a530369fe03687d036711420566fe03 65fe0364fe0363fe0362fe03613a0360fa035e0c035dfe035bfe035afe0359580a0559fa0358 0a035716190557320356fe035554150555420354150353011005531803521403514a130551fe 03500b034ffe034e4d10054efe034d10034cfe034b4a13054bfe034a4910054a1303491d0d05 491003480d0347fe0346960345960344fe0343022d0543fa0342bb03414b0340fe033ffe033e 3d12053e14033d3c0f053d12033c3b0d053c40ff0f033b0d033afe0339fe033837140538fa03 3736100537140336350b05361003350b03341e03330d0332310b0532fe03310b03302f0b0530 0d032f0b032e2d09052e10032d09032c32032b2a25052b64032a2912052a2503291203282725 0528410327250326250b05260f03250b0324fe0323fe03220f03210110052112032064031ffa 031e1d0d051e64031d0d031c1142051cfe031bfa031a42031911420519fe0318640317161905 17fe031601100516190315fe0314fe0313fe031211420512fe0311022d05114203107d030f64 030efe030d0c16050dfe030c0110050c16030bfe030a100309fe0308022d0508fe0307140306 64030401100504fe03401503022d0503fe0302011005022d0301100300fe0301b80164858d01 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d00> ] def /f-0-0 currentdict end definefont pop %%EndResource %%BeginResource: font DejaVuSans 11 dict begin /FontType 42 def /FontName /DejaVuSans def /PaintType 0 def /FontMatrix [ 1 0 0 1 0 0 ] def /FontBBox [ 0 0 0 0 ] def /Encoding 256 array def 0 1 255 { Encoding exch /.notdef put } for Encoding 1 /uniFB01 put /CharStrings 2 dict dup begin /.notdef 0 def /uniFB01 1 def end readonly def /sfnts [ <0001000000090080000300106376742000691d3900000184000001fe6670676d7134766a0000 0384000000ab676c7966aa72abf90000009c000000e868656164026638f70000043000000036 686865610cb806530000046800000024686d747809d700950000048c000000086c6f63610000 012c000004940000000c6d617870046f0671000004a000000020707265703b07f100000004c0 0000056800020066fe96046605a400030007001a400c04fb0006fb0108057f0204002fc4d4ec 310010d4ecd4ec301311211125211121660400fc73031bfce5fe96070ef8f27206290002002f 0000044a061400150019005240111b46001708160f1404080803160a064c1a10fc3cc432c4fc 3cc410fe3cec310040120803a90010870e18be16b10e970900bc05012f3ce632eefeee10ee10 ee3230400bff1ba01b901b801b101b05015d01112311211123112335333534363b0115232206 1d0101331523044ab9fe07b9b0b0adb3b9b0634d01f9b9b90460fba003d1fc2f03d18f4eb7af 9950686301b2e900013500b800cb00cb00c100aa009c01a600b800660000007100cb00a002b2 0085007500b800c301cb0189022d00cb00a600f000d300aa008700cb03aa0400014a003300cb 000000d9050200f4015400b4009c01390114013907060400044e04b4045204b804e704cd0037 047304cd04600473013303a2055605a60556053903c5021200c9001f00b801df007300ba03e9 033303bc0444040e00df03cd03aa00e503aa0404000000cb008f00a4007b00b80014016f007f 027b0252008f00c705cd009a009a006f00cb00cd019e01d300f000ba018300d5009803040248 009e01d500c100cb00f600830354027f00000333026600d300c700a400cd008f009a00730400 05d5010a00fe022b00a400b4009c00000062009c0000001d032d05d505d505d505f0007f007b 005400a406b80614072301d300b800cb00a601c301ec069300a000d3035c037103db01850423 04a80448008f0139011401390360008f05d5019a0614072306660179046004600460047b009c 00000277046001aa00e904600762007b00c5007f027b000000b4025205cd006600bc00660077 061000cd013b01850389008f007b0000001d00cd074a042f009c009c0000077d006f0000006f 0335006a006f007b00ae00b2002d0396008f027b00f600830354063705f6008f009c04e10266 008f018d02f600cd03440029006604ee00730000140000960000b707060504030201002c2010 b002254964b040515820c859212d2cb002254964b040515820c859212d2c20100720b00050b0 0d7920b8ffff5058041b0559b0051cb0032508b0042523e120b00050b00d7920b8ffff505804 1b0559b0051cb0032508e12d2c4b505820b0fd454459212d2cb002254560442d2c4b5358b002 25b0022545445921212d2c45442d2cb00225b0022549b00525b005254960b0206368208a108a 233a8a10653a2d00000100000002570a13d8c3465f0f3cf5001f080000000000cef5cb760000 0000cef5cb76f7d6fcae0d72095500000008000000010000000000010000076dfe1d00000de2 f7d6fa510d7200010000000000000000000000000000000204cd0066050a002f000000000000 0044000000e80001000000020354002b0068000c000200100099000800000415021600080004 b8028040fffbfe03fa1403f92503f83203f79603f60e03f5fe03f4fe03f32503f20e03f19603 f02503ef8a4105effe03ee9603ed9603ecfa03ebfa03eafe03e93a03e84203e7fe03e63203e5 e45305e59603e48a4105e45303e3e22f05e3fa03e22f03e1fe03e0fe03df3203de1403dd9603 dcfe03db1203da7d03d9bb03d8fe03d68a4105d67d03d5d44705d57d03d44703d3d21b05d3fe 03d21b03d1fe03d0fe03cffe03cefe03cd9603cccb1e05ccfe03cb1e03ca3203c9fe03c68511 05c61c03c51603c4fe03c3fe03c2fe03c1fe03c0fe03bffe03befe03bdfe03bcfe03bbfe03ba 1103b9862505b9fe03b8b7bb05b8fe03b7b65d05b7bb03b78004b6b52505b65d40ff03b64004 b52503b4fe03b39603b2fe03b1fe03b0fe03affe03ae6403ad0e03acab2505ac6403abaa1205 ab2503aa1203a98a4105a9fa03a8fe03a7fe03a6fe03a51203a4fe03a3a20e05a33203a20e03 a16403a08a4105a096039ffe039e9d0c059efe039d0c039c9b19059c64039b9a10059b19039a 1003990a0398fe0397960d0597fe03960d03958a410595960394930e05942803930e0392fa03 9190bb0591fe03908f5d0590bb039080048f8e25058f5d038f40048e25038dfe038c8b2e058c fe038b2e038a8625058a410389880b05891403880b0387862505876403868511058625038511 0384fe038382110583fe0382110381fe0380fe037ffe0340ff7e7d7d057efe037d7d037c6403 7b5415057b25037afe0379fe03780e03770c03760a0375fe0374fa0373fa0372fa0371fa0370 fe036ffe036efe036c21036bfe036a1142056a530369fe03687d036711420566fe0365fe0364 fe0363fe0362fe03613a0360fa035e0c035dfe035bfe035afe0359580a0559fa03580a035716 190557320356fe035554150555420354150353011005531803521403514a130551fe03500b03 4ffe034e4d10054efe034d10034cfe034b4a13054bfe034a4910054a1303491d0d0549100348 0d0347fe0346960345960344fe0343022d0543fa0342bb03414b0340fe033ffe033e3d12053e 14033d3c0f053d12033c3b0d053c40ff0f033b0d033afe0339fe033837140538fa0337361005 37140336350b05361003350b03341e03330d0332310b0532fe03310b03302f0b05300d032f0b 032e2d09052e10032d09032c32032b2a25052b64032a2912052a250329120328272505284103 27250326250b05260f03250b0324fe0323fe03220f03210110052112032064031ffa031e1d0d 051e64031d0d031c1142051cfe031bfa031a42031911420519fe031864031716190517fe0316 01100516190315fe0314fe0313fe031211420512fe0311022d05114203107d030f64030efe03 0d0c16050dfe030c0110050c16030bfe030a100309fe0308022d0508fe030714030664030401 100504fe03401503022d0503fe0302011005022d0301100300fe0301b80164858d012b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b002b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b 2b2b2b2b2b2b2b2b2b2b2b2b2b2b2b1d00> ] def /f-0-1 currentdict end definefont pop %%EndResource %%EndSetup %%Page: 1 1 %%BeginPageSetup %%PageBoundingBox: 0 -1 631 791 %%EndPageSetup q 0 -1 631 792 rectclip q Q q 268.801 790.4 96 -38.398 re W n q 268 790.4 97 -39 re W n [ 0.793388 0 0 0.8 268.8 752.000008 ] concat /DeviceRGB setcolorspace 8 dict dup begin /ImageType 1 def /Width 121 def /Height 48 def /Interpolate true def /BitsPerComponent 8 def /Decode [ 0 1 0 1 0 1 ] def /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def /ImageMatrix [ 1 0 0 -1 0 48 ] def end image Gb"/kM-!XM[`AE!Q8p)k#T4-r#lt*Y"Mu-$K[C@n60;;Q"=FBgZ&5L6jY]stQIP>-3U`M]%>VDDa6 5BKcfX?r'i\45L@'t#95!>0.nH8&)crODSf[<`TN8u8H6e5kQ"@lM--(8BM?R$m9"?2l2Kn WMq$6Z]^AS!-%j!jK-@GadnS\P*EW5n-cYq[QM9W]?^:l!CXh6>,+_)I$&+ hFcF(OX,jZl3OrYe\NLnWmqoa_T^D<$/QWIlJ(W5$1"=ZlUSm-un$WN;2[kO?).KV50W'iO @gQ8YJTXVd1DB=+"i^cr_j$1<@D;9*^2aI=]sU;-T3#/mG'e#ji8At"_o'6O2T>L@:Hq:qf X#5BS2iA\'4^3*:0G;McBb>^*UB2-k9_dK=kp>t`JJGI#5>P9oka[*M;;h!)V16%25CH%Mc &%na_RVUX!;1U&MCDtd[;"F?;=Do\[E-n$gZ`=(+< 10i8=Y.b?N&8%GQKc!F7OEFeC8;`iTZGd-5eRJgbWbhl]iZ)&j`CTb6)05+-Y89_',BOsS- WMZRuF*(ULdA\9PL$GF36Ma;20-9od5;%8?K"COU]!>>JZ]naLIU2bugEq9S-+Y^i&haY*b Z/`-*/itkG\cO0?*<(Jn7U&^TX_Ic=ub_2qaVPZe[qN'FDHP^Dr$Inh`eE 1J"QrdI7(o$Nc.ajDDAss77QK2f4[hCR8Z7Ds``"AI1'q`b5$W`IqtlH43;`a (VYnH)4*UDbff=1iDH'0b>IDp=2_Wn?>h:fJ8mfW=^[9eNO&Pq9YFK`]E=!%k#Pd_JX8L:k r9s(B>I*-rq1u:rH5Z[2pDR%rYOJY0u2^lEULR\B4!WE!3SN-r3 kQWH3UORJ(tT^@^=0hZGYA7SuanaAr,)3lcdu%KRQh-f\0S@CRH"[Z#O9sq=B62IJ+N[HkG *-*#sZbB?r3/Y1\rjC))KdY1.5ppj<@D+ RJ)rd:'+I>7`tG5[d2PJiJ`+9C.^Oi%h3A^f+K)A1*pQg3=".mc7M`-IR_VplLGJ9,f:-gC %.3UT3Q%fK*T=%R[?iR.)l3$Nj_Z,]I,77FJ:UUY$s*:t1M"f\ HHQOgL-aH,1aXG,!HrUb5Zi*n"&9S[-JA=`mL33@rlH?bL.3&1[cHr,)d3M/$j0OQ$\CLH! \)7hW_:_C&]I6LAN,$E^$jWeX/m1?O6J;EIU`0#$W!c,-H!2&E9#"h@6_>@*4"5VeqFmHop ^=2X.g6O\A/^<^#?]K2Hop"*?H3NrDr5i_VO)$#sZG+#p3Z`V=HihJ 57mIJL<`j2XHh?91-HF2Q_917r^rjbm4h,FfS_LW'@6RR@h: L7W;,Q?4^rCf,D>Ae&1CMOq>5q>reXQosA!Ko$Sph?UerZL`Ie9#RTHQ7Ol4ke37cM=P,Xr HEnu)8T2t[#^6\cc5_4FbBO+F-9%glQfi^hnF.2a^Gq?nkQ`>gfhP@nUjlQp=[W#KU?T2Y! T(GBrJ>Se7l&0KnmHZr>7)"&hc\#h7nQ>B+c!4Y5hoF]CI3qDV1,@j0e6[srci/[r[1A_Nf pVoKh*7P/Ib*9Q@,o5Rg$R+W*BeQ@lTEP[g8JSqMu\NBOFR,Cdj\e4uVgj`;6`.P")O. nU5fI;iq_9% Dns"l*l>c4VeK%l':=fDV5Q4t["TB][Jm3en*jW)G6HLfi)E'+AOFE$g$i;>-Ce86bO 1CTQS6CH#N'Hu#Z3XO9%7oS,GMjPj$5GlKe&+82#pWf>-1^(p1X+,*I_MZ?&05#!H6r7;io W5.H`i5q?*d73kmcDS&_\<%R=6GYsh/=td*uMrl0@+p.2AV2sj-8mh1j5o(B"NJU,OX"OlN 5/(-@g$n-*VLQ=RrRf-k3_4rVBGo71f.4++K5"I!'RcKZ>W891[J,1m[67X(?tlf#f\_GH3 J"rXOuI_NAs21HdmuV>kWCs0[*OZ+#D%!p+XFP(=leF"fQ)S^\2cQ_>Oh"Pq"#/mbcTRdqU tTcP6rmdAq=OI&8cQtOHnli#W$jX%sYg6R$;Fm)54TEacC)IICIOCe04W;u\ *HYJ^raRbpb85=KVOC"V&t*X>+,euZ*A\0ckQk&eM+o6a6U^S?ZKnmH9Ch;tSZc Pg85MFrlkeVo![1WFjH?/o6XaRg)V8Pb6CjKi\^WoW@&L("oZ*"OD+&3NfY#6+4Jc8V-HN5^AklR,Z,e;mVO]3l0)jcp&N\:PNb>:ugDYjcr4sACr1](uuT4XS%3\ fuLWI[!W.:S;[S2)5Skt8$5jt/df3,9uuOQ:3H63)`P3CfFSc;J>fk*=e+2?kKZkEA%i]%4 YbUr3fDq[2!E1,a2+1qW!rqM;61:YC:A]T95mHm:l#KV/,42mbJJg!8(?;Jg;ZS;hV&k_&k LYW7/4p"IA@H-Fqj5U,S@+LIZ=2J6&bqtW8I%09Sa&=>+(*n`=X.$@4o"`NPP!OGFT3[KgS YXCB8\m!E&E$Njcsf$4-WfJ&d%)#Ek[OkLu="]*bnPOk,qS3fe%U:5n+dfm^.eMqn7A7(jY ",@b_#(p*@a=Yn`k>\e7TPmn+g=cQ-'B?O(^\*DD5L]Ff[Gi8J*)V%1<4m\/[E+)b0 />O_91P'_H)TI@:Dmb2k)\['?L_\.>N$XYUAT+@SW5=+9L-j5`Nt%$UqRm0@Q#@\OJtgEbI 5:L%+7AF6ZfXokW/;[^9^r]\/Uj*qm$nNco.\4UicK!4tnMs$rY*eGDL8.-uq@V(Xd@B=Qa (,8c^pT[N'W$FQIm)_a#\h77-Xeu$qk`c3Xj;3UOqmFsT=_lUVbC1K=K)u5oEP8H8T uQAaGDD.t?@o?<;T%$O2S\P7jmc^+U00)Hn'd%OcA%mH6>nGj_&LVNG?P^meo0 18WIU6^<2XIWq^ZF5u2]7euRJNFi4`r,%XNR:^O6.g99"CggcO=cHDJLl\s8C./#j8N>kR< 'jNPoNLA/9`0F_-[rKGgO&6A&EJ[&h\[fQ.9?+:pEote5KhQ=LBIU:?PD*$?2pdV+`),\"M `jRD5PK-6b88JE:,isj8&oR$Q/9[u+c>DiDQs7CRZ8lbC5XQY@W-+\p/?o5Fn7.s(d3Cqq_ mk%3LQj%!=N9#+g=iNkr;o-S5Dc./R!%AJoE\R"Q`O[GD?qUkR<%1kiWqrH+@DNOW/t$4GL 4d>6CP?")=?f1J0Jj(ccU]AKVs'4&]%RBdV-DaH;ssqtR\"a#5g_%Uiij[Ph+s$uZ.u=@>Y DK0)qG3$8/fBQ@L\,Lj4iZO/SoOInK6+6Od"PI"dQ60Nf=OR0KNP7_hJ&8@gWj=na`FlTWU oB8Iqo[9=91DeJa]Re)_"V6d4QmEcL#-E]j>UhGKLpt(*(WTd52VX3OgQ/aCb=+d=,@1):+ u*%V6bOEqH'.o=A+Y!kad I#):/4.i5/S4W;9'mni/=-&V5srKn*Ot/Ulu?/WC;Ui^.=7DHu5lb;-AC@nX*[b)L%$=M3U%BBm=E',r"X`+'-*hJfhZ/%IPC^!GEIaeG]K=KlcqnAJD*u[/,V1` q5$]Tk8&pX%;C?&6U4d=Hg]7%'%2UDS%NVf]:S=BR`t9\_KVqb%B9Ip\;C6c.;T4=di^brp dM#^gQ@hV7BilLDM8bXu+ScdF*pGU[T*\/rT./'q)\*Ahs10<8Nhq_RKjPCU,;e-b_PT/p:XM$(^h e&[ItY])-8+WuYj]6<-QU jbT']DTmC;A+ApX-YK7Bl%,0:lq.2X-B;OOhg3.-n.,1;,plgBM+km#ES#`0ujG)P=5Bk01 fQOQnYE)c8P9uUS.^MYq0F?fdC;Ii?h)]`ko!.KRbJtf8]cOmW\U/-Qm8R>MM0`SiG-N[UD qUoX*7B._4&kD_81O[UU6/>F@P+REKkV?4OF#@QQ6JS[Z;7MQlUdf_X=V:%7Wq=Iso;QbXN g5>e3trs,o^6`^~> Q 0 g BT 22 0 0 22 289.473926 763.771396 Tm /f-0-0 1 Tf [(Start)]TJ ET Q q 177.602 708.002 278.457 -71.371 re W n q 177 708.4 280 -72 re W n [ 0.797873 0 0 0.793023 177.6 636.627923 ] concat /DeviceRGB setcolorspace 8 dict dup begin /ImageType 1 def /Width 349 def /Height 90 def /Interpolate true def /BitsPerComponent 8 def /Decode [ 0 1 0 1 0 1 ] def /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def /ImageMatrix [ 1 0 0 -1 0 90 ] def end image Gb"0TGuU"%T#^@ckDgbuA(X,(+bY@PCBuXGEfl$'$R(2-(',"9X!e_WPtT(*[>Lo]["*M2;l Q^gUM.J!?5G);)6K664I1&Ac^n&_:Ngr+5CE6f;.Y"*"K5@*>8m^=D"`h#S;^SSH)7iZXsfc<^3JMgV5dL?n_gP`=)n)oMhnHgRHY)72aoa^;6>m'_;fB#aVR1R=>*r= ?RMAa&"1[C3.=Jl:$`<@K^#SD.X&+O`c^n"[JgjET+$XX]D_EbNR@9R$^UX'V'kLV$QLEO4 ;-K?NRi%_1)kIujQDY%]Pnh&IHJ5YBl&2F8RE*/G4Y:7@WM@Uf4<6!q9MM4T1fnH6-.rS\% FNYRU'c%*ku!"'PPmA4ZG\G.JgsU]/`F"UpkZobq)JlnFgl;HIe)RAoB4HaQJpr#_C'^)Au ;A7l#k@+De^:Y,HrY]hf;_7cgGaR@4Y:5 _T&Ic9NFs/E/q6pRdrO[?RJk\-ZIWPVXiaV.B18sq=8`0uJoX4T^CR (V3E^<19bUQ`-Dp(RQ<+T;,HN6=hkP':!%@9Y_<$Y[-U3U/[iZ[5HcIIglns'XId(qSe@/% j!iHBfT0k;XDEdl!WUWj\\1GL%:Vf)76L.SFL`i]$+el]Z]SBtQA,XnPkLck *upWfk'H-V,b^4dN+e-'R/^:7@:2AZp-\%2,r],!3?&-P8I]!9Aj =q+/Q!@YJ#/KmaJ(0Bk7>%?Np]=]";nIgpo:G($t&IPVg?dY?#7)q!3=@Hb7)YB!3DsK/2^c$p9Y"e3Fa*T3n9I__$h2X(*boGu7"m,ggmn&rnsn?o"@&5HJ #=#[>V6df+ljS/DNHA!abahS.Z9hC+W%K,Qg^&s&ZRu!=fO-])Q1 nh$+4Z0KLC8.`gi+u<+^k1,Nu'h/`.TS?X/d)#"aF4,#aPWfFOl-?_P9Gl00`O`>H8NGb#= B0+-Oq"jEN"3RRg1ga>khddum?bdf-\h9L4/L8W-'Po,?&W+\dgSE'2eh:6s'"Vb'\K4>s- lGm[lRfPZkqG[CJAm)2d*b;O:AA53nLJn=q!NcBWu%(.Y.caclggCu)Qch/TVjH2*mPN-AQ 8OLd=NP"W.P:Ls"p!*Fi(&c>k*?#YRFiHC+)*UhA]2`C8Ol#:-Nb9`i.:^8Sm9j/<\:;3+;G5]icRCWZ>3ENJbfA7LAJ/C FM4,s`mL+Vl2tQ8l3@qV_5PT[o`6fWoqR>1@h`O+q>cq hA8"HsFfKsN4q"UkGNP*\JM/;t4kNuVW7f7G\SZZ';%Ac[O7L?.e]!OFIX;*SuTiI33]R"Z -/qKYF:p\tI!ZS96m5AuA:L(XX5_MCMV]HN"KH4Vb<,6RT`LR@F&K7I+/FOZ?k@^rm_!bT8 8;*SuTiSHU$Qj$,NrOa;.qi*lYfi^:G(hm-GIbkXR%8.6d$^QD@Gs`!!N'Y610H]uZL)=g\ K7I*41@"$31#G'-!bR"7W#mq9I.&ZnQj'@\Ib55'^$?eK(79aN@7/7OSfhDV(kVU06O[VQ+ CGt`UOM&2_jN^pQj!m"@Ot\K^ark)&2V^N!bMIcJ/Eud&24J/"N2;0;h/#d+<]g>*e=oiKt 'As6aK&VYT`/(5(CcX"p$F`p#0Brba&FtLCGs[ouU\Zba&FtLCIAhl?gQ&Qn8]q%i\tAl:W 41=iaG:;Tf.7_hOP>qSk5tVC\7/rm%i8rNII-UV:WiK%[FprNII-UV:NfK%[FprNII-UV:E c_V`VTrnQJY!qjHcR#h*00ahU:!qjHc/->Jf@i!:P"mRHE=Tn"'`[mK)$e.rjZ3\t#Mch`0 (9!i^A.bcd(:.D?/5SQFag+WA:aSK6^E?#6 88l1aTD.!L+EE!D.4:)P6L5!%9Wi!X/'WtADnq(ktL;> Dt)2u=-S!J0]N+KM:0ZF-es6E,mHJK;V\Z@+?25D[`Hjj/>P<%(:$qX1#BVs2ZZB,XaV%<0 XpZ<5@Gafn2*Uifc\m08b)EFZBT-oeC)Ir:ilU[qF>gXMfJC$sYJV[V760K;)6CW_:-Bc^7 a_hhr.K?YTHHG*M/Qu75R"[f&AjI._o5_*qWH_.Up/D-8cB8gp?KbK/NFeH: *u-)%6:UL4uPYJg(>7qAMSSf--]4.#k4@'-BU.(PCp,NCFE?HpRd/&1O>)kC12[F(Fce^j> ,TL`E)?D;DB^1ET'2m/piJ:>F`H4[)=+\`a'H730NXb=!T"@6cm=s`l]P7/o6ag$d;BNG`XfX'GOKEZj5,IA88%gL$ M8B7]oQrbL]d*-71*p$\DTW8gV7@3I@!0\ba+Ff?DPdM*eB99+G>IRp&`-_q95!a.e's2+Z c\:D?q$m.ecI5"paB-jI4\-UDAJg,HNs4`il&+'ZkR/"CRLQj&9Hq7:8j PTpNDq)jKDJip*YaCl,?pgik@O97tm-+.eNY4aR_&@&OO8#LRF_f)&Nk-k@T_kVK=LhZp?: 2VrSf0\R?\BN5q)BO)qS6EoE$Odj?(reBlh!$cAd-L$-dS5CE71WTgb+r#D[d(Z$CLKatg` Nh"ErHZ1`f\aM%nX2>(jOhui@iA%I58LH]spLr)M&4/_ePC_].Hp1+9<_!PV+WN[bZ[B.@k(`A5:bXC:QVtWmjB?o_Z%O *4B9nh">?Y&cp\ajO?D,QOTSW2*C)[VQMFW:p'ORq+u6?]/ lP:3\gGDZfs6^F73CW&RG%2ft:"7sq;3[B%*_*^PVL^hZ:ciePs)cqA*T(Q3Zj1$M&Wk,4q `jKSXSii_!"S1/_*W,^0>$@Ag<.Y%_Ni]K\j/h$Qa%:Nqg\0a7'RWr;J/'Ohr\!/=%_Q$hK \ctC#Nc[Hie3+iE]skC-+12p4'7Enei_OPSCgjChU7RMRICF.gIq-rKpPqm[hu'mSXuE?%< Y+gEoBTE`u41Gq;R>F40UiX/2-1+r\!6mI!1%@X]!5+#e^E;i)b(WG]DZH,[>+d>:TaOGE+ RkS_.HM,jos2)>1BpVFLg$D\0+>8L0$#IWhN-uNN,Woj<,F0] >80ETB!"7p6);L>^B+2uk`W[#sGHuk3jlIDMn5Vs`h(K^SbC\tc.SXJfBW,.AFAZY=/ki6p Lj=oL-bA$DoBdg+No$q!;SJ]gck.Gn7US20*uGS`#mLR>JoRcT$A0rKjp%T5l.s+(ht6(=9 ZR9\V%!>$rB3;,k?D.0lKU9/<\.I\?rh85IWe1uAm0Xq>#&ff6KkPfLl>9Tc@B'6\6rbNlK Vbp0KPRB%$1e!&$K<:175dgJB*E$hVN&"Y$J\ZTr"U]eB-$@:4D&Ar&@%,2hEIr#M%62j+8 W](`LU-7V@$k?rRe5Qg(ZG=&?#MJH<8\-lBV`g`O0MgqVaugPZVhCCfk5FMY%d>VIlLg<58 )iGHI3!mChlir~> Q 0 g BT 22 0 0 22 295.43584 676.569568 Tm /f-0-0 1 Tf [(F)71(ind)]TJ -3.973633 -1 Td [(\\MGL@@@)]TJ ET Q q 243.199 600.798 147.57 -135.715 re W n q 243 601.4 148 -137 re W n [ 0.797682 0 0 0.798319 243.2 465.085823 ] concat /DeviceRGB setcolorspace 8 dict dup begin /ImageType 1 def /Width 185 def /Height 170 def /Interpolate true def /BitsPerComponent 8 def /Decode [ 0 1 0 1 0 1 ] def /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def /ImageMatrix [ 1 0 0 -1 0 170 ] def end image Gb"0WLK>0kqZlWji0Qio%`6*"0"W[J08kVl.%mdYks\F+'EJSB:de8,9sMWo22N6`,1V8K:b 3HIBVJA>p_l5/<:p1Xm+i[oqhcmT0[H/NPES@SGb*0-kIKJsmgK2,O[U$gAJ+rBeD/6b(lGW3]\[,nF-7)&M\2dYenoAr^@tb-`-:WbdT, Le=ATROlUTG=crqknVpT%Bahn:8B%%fj]rjm0_q*NQE+*XQX,R!pgqi5f=?rCjc$uO2skQV q^6Obib;=4qFgkf>D;,_Z,fQ"(.rdPG#P$3T95pt!M4Se=:mIR4poB4Ad)B%o)a^1>h/L`e 9da,hW`I_T2l=ad;78[^]HtTT@_U`h9Viu7j^X)%blPce(DdC+QC)IM83I1Jnp2@]'SiS_^ .l01D+u4,sZIu4Xk+tl:H3JZJqmiqYm-/"2$omBqY&nMb_bo![eZ:0fY*LoIO2ni[P*8BGh md]\e2"B=3Vh^dXkFF9EmdiaiZdu8VO-H.PUsnG)]LI]H?+3(`&M[*5?mDtQCb^VL)Wis/5 :b6XR9a]b"D,,(G!s+j5";o,of-kOOQ%=$T9BR#ojhg;Nar BU;OSAmk$o'CY9.5I`O4%uZ./E?X*`2_\P^nJNCR+hI-\X)%eSi?>.QaU81d31`1-tu UTHHCD=_d`XWu'?*/D+$c\ghI]*-^Gu0pGq'5o*ZheQFQ^5rZSGF!=!-Mlu;ZU1$\4iG'N= $OLDNP_bO9=m=;TNq-aM=g99ZVB0'UZu0a;J\:4d'?4sOF?#Z'4qd%g2itK(T3CSu[+N98V X*GB95T05Q8`*mQ*+P21t'Z;'5=FJ[?B#p1^Zs7Tp+3ja$lN"b_e!EST)6Ii51es@g0uhUl <($3:s])F*gXr^=X"sGOF,7(e-kPm8,M(HQT$YmKUdnq>oa44q'"Q:#4Z>KY<4sL_eXSOBM j&8TV1_74rW/ZDY?HqsoL11MZKu+8f%+Y4^sR+'sJYm@\W2:T:alu(YW3:TR>[T*YPS7bL;ii)l*^?GSM_]VpZfQ7*q6-6FR03+ Zb]Gr?j.K#[X0sVl9V.iF#7C?T?379P]X>tQ_chWBe^Z;DlUXY0Lf5RlU#>(FG65mPN#mr) 3mXK2D1V#0I*<.f$pR6`AJsP]99j&bi:lHYS;1D`/oKjnE'lK],7&4!C-C2D4[EQ)(`2aag M+\](tG)`fXXIdLpDp1P)7aD6E7k*@Xhn3@u-`-.,:a=lG+P3K'*!*%oQi:27u7m7EmgZ68 Y_C;!J)hm6An*q;6;FPo(iFb=&4n2bSKK;j5] d(lRS\9o>X.*>M!^$Zkp'_[fc.2f2o]3D#W@?'Oj:nnuhG%".mW55YlHT)_Y;^ptl?(_#[2 _!+,2&."hfc3W*hbr qRQ\8+NPE:%a38HJ[N`i"Z6a5kc@nCBs'.!A6ckF!9Hm(L6$Q93cFe$dJp-@t%gX2lGc5l+5,dJ\Mp5=,o/DjD`De2DfiAGnIGH00f';7MN=oCd^!^Y_lAZ&Z3*-k[e@B6UY!Vq3I E4;\\1aU"CjcIj]rM,SF@?G@SYF)74nWnYgFc)W(nK`291^`46[4AgNF>k(2*']oRB\Ef(5 sH5,g4`h7(4CGto(#!aD!%=dDlW>7nP\.H;2`'F4d9 *oRMu5^u'j=2$oc@+=C4ocQ*TF6nL>#=tYYI_4F'!dG7'HF.(`G/0.X3J-tO'h\^+U,id[/0%j![="_1:/H Y)5SDd\a,bhWJ'YOC"^UPNJ"Q&RmE^J7W>8KDBJQ`NhZn/S0SBMV*EuA.f$nV_L#^[I*d#h N.V^+:EJ#7I3?-=(r#1A) .F:UGp8M+;En;n)?+b]R9ab#d\EL7EH#ad[3jKb/E-^V&+5e`F#n@V*;8UI)".&Q)n[V21h D-C=\\^<;$BNhPS<2AX:Oi+rC\!(![>;D_5cbUsId)j-"EG,pq$e[_<7DSfYrQ/@nblT7O^ ;(%P$bWVLZnqnnI>`2!!A&(`L),QIBh-WA=uMV3eQ8@g:DG=``1::E/FI%s!UOnjAM,G8gK?1GLF(3r9W^:#BRBqf8b `Cp8pp"Mh%.*L*qE#Jd6DW91956EGgqQq!Vds4dN(ddmAfh8h3J.:rjE-S6W3H3jUm=k\P. gomK!l])[*1l_J*4i7@bi<;VVL2`.5!fZ5/S9gbQ6uPA$)A(YT ZJ-\l=MNA^SC%6cBfXLD.ba'Fn'72qKfg_,[tmd)K_F^>>4s-f>hI)+bmE9!QSKA $^8_rb@F;8[$QdZK8C^&pjVBL0M`\S5%5oShB8\jNP;&RV.u[K&Q8ZT8oKJu5h6.ajr5kc\]_KgppZiUo9K+SeUobMi;^$]I+;g,m8Q-/J[$`4j:fnBd YZlM`[)mTLn[M(iTMaMaK\o8U6_QPcA<)7\ pq<&#.kX>6@1]L3QcEkdre]O'C9!?T`]e&qb[_:kJf3:"_3ZfL(l6*8k\HM:CcZ2,'$Fh&A m'h),=?<:2UP%-R)a`F!@i2+e1%YQu-t?=:8qNpfaU@TGHs?\+Sio%>.[hs'$t9_q;m@d)h @1B1moK#_fP#:>gBfCFJWikW@PF>'P$>;%*@)3`"TM1o)F:]\BNpjM@bu2CD:m4Fp8YQ'@( aWT\I[oB>P6Y530!:2Z`M,S]#PU/#YZ#`NjW:Qel$#]Xa4,VA4a7=uo37H)@ZhgX<^;*HK^ F[gb;+LI2":9Nqc_/mK\WitXN3[_`MRM6tom/eZEL6ED*\ssR1U4p"2S.kGO4c.PUq8!gFj !!03o!5eDC&,(kegt010=RkolBHpAJ$Z'+q1:67*O^9Vlj*Mt`;@ K0Z-p5UH8VTt+R_f6T8Ps)Ag$G]jF(`ON1F4hcF!AZH2+cg7WC=$joJfDncK/gZAP^cUnaI WE_L#@0Bf9mL#rq@((3n`3$F$],3-f7E?\6fMK;SiKDjZ4QAYG jEl#,%/?$&o'Y1/uQJR_jq!n#gV`2-d&"?\bUiJo\jq[K]'A/qmaUW^d*1@Vp:`(M%#sX@Xi D5>d\J(\Q4J7=1d*@.:08Y9a[,A:scA>BY1>nd[QFI2K#\2mjTJ1Q0$F.sl7nRGJ`Q>?\6I ^UZ'05LF;D?j:k?ubF(4>4QkHb783hrcZ.QMrP*8f(U>`ae`!MkHbAndJ`eli$[1Kb(Hb"j<8-o5I[8fL#EcU@;h]&S rB4oH(6FQ!6,_`Ld(3d\aqjXCF5&%jI-c4=V(B05*E>YA<+$'/gO$C'PW8 ,U`NZKHJ2tPdS"G%1,Tp7#U8%U-uD^n6\]o6a@K[\pRL0.#dP91,Z5/E+)aliMN>pV)e(_T tQ8GH>kB)jEXek h$VK%OB_[irmCYG.W^G<3:H'E8]0?&blcQ1GjCb7U,BS!:DCb;m=79Yojd.'L#Vb\t:4'VB q`n\f1r7Pe"QS5G?-s2]J>`]qG@HVChUh4lbs$VUO'1Kc?;G3XiZuWuO3Ee3-cU0Lqm&?cH BUVaj:0R2mj_99@hS":1r;#s-bnkl`=d;!qC>Q&AMIgif']ps;&I-:>M`XSWD9T%59Yt,Z7 W\^$'8]Hu*)B*QMJKc>(",F)F"o7dHnFT!rhnpB)-V4',OMFuY#_F+do/3-?$#2[Xa_EUHM ci!T=$p3n)(nKlKG`uV02gP]if'uk+j7:j^tSsR_:[@F@AZ0bF\:eXb@"c-J'o/m]8&hKX" FFaIX*0:ASq;o8^Ce%?dO+!GT(_f,NlW=D7Rc[6/,+[K[sn.%2+`qV80rbo8TJ3o:&Z;>Bq Ml07GbP7Ja!4QUF?XZLf;DGJoubbUL3ZRbUQk9U?$.pIE"i9#A6[iNd(_nMrkl==2('=hO& 8``UJS%Ku3f7SCW^t&[(g#%-OjPOM!Q!!1B?s9-,-.Q.JMNuJ3]&jhCF[s?3G",YFm?gQ<( *;-.A)!:"="dpt_;TG?(ARLWh;&S`5!4;hQds9FbXkS^cHBL_5:8ZYG0fHdQ@0_@S_@4R33 @136>'Ra+_9UnBi[4#-_5XY'6Fho>RCU.J`%eLM]g;nQY"\e_q6&!bB5a;E6nuucl,8OF#I (*0cXn=Wp@X/ccJjDgX'p6c5kPU^emFl1lo@^bYeY>jH$:(A6YY m?=N-4Uf60[3dTWSTn,$qBK6^(pOYrX&lF9F8HLC*.bTuZ`(Zjkb!A(Bl.Reg9u"Hb`osJZ c_l\k9bp"B#OXF^%57Yn^k6b5JI"&oK:0aI-LbTC;IY"i-[@pqOGp(FJ:<9\<^n3/S>/Nbp 9N+4P7FMMf&L;[d6[Gs,h(plqPTFeXsq0E&/Bn?o6#*k8Tl(g/o`'ig%\^SN?K2feYIh-qF O@jQkF$s7ba):O@6b$^.:MG-&5QoAf013mdI(JH'jYrXO=g"57@=dug: H(gQ-RbHTAl?kJKrU-p@Q@geeBSI`NE\/b5J>K29Fc61I,d<&uA,^kTSEL+f3#V-q(OdaPY &PV#!9Q`id=jj%^\Fju%GQ7O*`JYOi;h:\NV"NpOI]]]YV:9I`58=+"-nR9R ZDX$=24^3*IFnO:DW0L"tl^';^((@!4WRGY(lH:PKu`c3r))l8.1kP2[=p=J#pWfaW%=g#P 0P)VOO3L6JLp@>VO_OaBZp+7,r]PJbpn[,8U:KM[6/I=[EU.XS(/D.gSn*+hA`E:h5 CbtBJu_O0rA8IK%&7i$&@;XM"3YiXl-o*#n!S//[eAP.hAI=XIk]t\:YU5:PT9`]V#^o;%@2?qZbJ]9rk?XHH5[1)h9;#O$!-Wh? I#oo?5G/F'\/QcER51BF%[+R*;dpc*FXKD1AVM5IIbuT;s9BSBP'8&k_@i+:Q^4,J7UIUA/ X0%(Ti"&1)p[6l9l)1)YZ=\?n3JREWKR'nVgoTX+qkd&k94Ut%GT#oXUn3EO]O'\%[YKIGB qQUbe;&rsBd]I!I4G#5LZi9848@YB/@#12a5V7dZQYjQglmocU).OGj^C3-D6.?OruK9JK4 @KB)A.A`n1Q`TDns?p%On$8_P+=P)Ja9+EV.>gW)0X\"jNXA(HU,bMRuTqVbJ_3Rd?bUl9d QC9P]YEIpMCCWht:)QJk_m&CmaI!R.!U,(hs8_4NMO'CT3A[T]N&`en)YcK'H_&:=-7$ktV_CR]c 6LU8\V)gN1DlY ;U`Z[_j-tY85\u_V1n_k/BF6!VS;3dDmu<#ILISZMKcDT[.'BKTA722YNFon9pMP8amlMBM @3G)hj,$<#1F4F8sQ15FJ'cD&!:J-k`pQE_+B]X-]NG=Xd90;REOs2aLWOecfc%$jR5-i/C>]"+D $j`J$Ca0#pP)N#D%/)EM;@HCA5:>Uesp[YtLLEEh"\6ROhIYJ#>Z!k#=+fj61'9CR09dLt] bP,dVG!bd*f@R6b_/H^G<<<&-D"AOcIPGQh3-Of'H#$Wb'<]a.9KL=:TkbN.!XGfJL?GCq@ U4l=los^dX>%$ZJZs8VMmsnSBMeT^E8H.@8-_F1g(pZ_S&jh4F/93M^9OjSd-_Ie.V9`=Ql QW3[:=K>L(VZ3+@=0X9_HQFuGJJ-MlL,2W].=r>G(6I#*U9QSVAZF$8<'V7Q;YW3S?-b'r![8ISgGX*XPV2h2Pqe?u$[g5(+- 9+4D!"VMT&u6#%!U&jUO?S! 39.E5#fl-cNB^TLlC<3)N'OCgE,<4J4d[e+/$f"[7e.\_+W$;N$X#?u4jdEmboHi_F`VJ0" pB]Ytm*g>cVC$9CI!''Bn8\57>HChODu%&+MdS1?tMeNru83FuJT#Ypfi5eVDUcfbi*OV8D M:;0UCqh6=Hr&<3s[5&?GJt>AKML>V2@R[]3&&7'lRM4X6(-5#slU=Bco!Li3AX,)(Ch"JF [Y21p+>#q=^I0Ym&e27U"V7el&TWID-KS]3N_TSd`LY@+rM[$>=OhVI8pmTd-TOB3e()u:G Hs@V_TbtH$Pq*GCM=3m)I9.M35i?djZ$,FcsBj$*r]e"`Bc'q1WguM<$\8nH8(T'f)f.m^6 UJ"0Pn*eF2AGtjZ=?AcsBk/#B[Hk34;A8Et'q]7^)DBQCt'LTEPkiL85UGUeTdCI^3c;.#d g9kf"S(Q=RM>HpM,PITOiqu\V`Cuc&%5i(Q,d["T_mW3%S@Yi,)a6E'dgb#p_K-g!F&.V-*MRCD#q27rdtUWM!:r< 7DI5kd?4.fe'Y]Sen!VM`VRU:/j?_='!EKs!994ak&9b"1m>CQR3DM+n_H>H_N#S:\]i%JB;A%=icEW0Gb91P6`P[2>Q5E :'*p4$!KgcS$dR3mL_G1;LBWnM#EDD0'k?:8F>:RLt&=89W#-7Bd87#uUG7lGk[/\i-1/tT UmJM1*lMB5]6=#t@**P1'dS^Zn?(dL<6)*J!(O(U!)#ND@9ac_bjC`*lsXpu:8EU;kX:/a0QoE;5p^V!^()FmK gdJ5dWU32-d[USsZ*\Yfr7>RT9/m:rB=J#/ONnGdhWD#52L9@Hs+-_a^V?g5a@" SCZ,-QLQk;G5`hJ"@El@?I5%OM@,$"a#NrBMn2(DRlHh&lW=\a4j;**=GZmS>j*[#OR?VeL YE"5&Jn ']hs!:Od(jE;g%Ws*o$Z')O>!g#uGYjSPW^V(r-SMhST#a`IEJJ@*qQ4;!'/A).\"uTUAas sCMeM'DU-D;/,,)\D-Y+&Ui$J,f8=1n8N@hdjO^[^X,$YLl?"A`jMO_a1K_Eb!);;--8NeH .Lp;uuS;:l9>EY:hToufg%E;__ r;!&"$Ur=&W]Q4L@o^%7BlR]$q-'7S/_HXCTi4C%;([$_HSH'FEg_j!X'C5&Sm:%gF=$=E# Y-<@V^AuO1-#R&"`u>@plB3A0[B0jVTHJpQ2=3rJqpUO(O*qS<]*ODV'7:%U6B"4LD^$^Zl Fr*[8ESD'NFs^RRu.SdN9J"#4%cn>hgJiqnZ;'Q\mcHBNJB3P6"P(lW%8!CG7^b$Vj*AUI! g.+0^4rf]r^`SA7`YO>#8n$LMCd)9N[tke^cFoQU%t4ccHQkb@+8EYcXEOo gNhF0'/?jGcah!t[g`K3W:@KsgPo$%%LcHWrfKiKbQAT(:l\$i@1*YATbG?LE).[\U0-4bF +II=9L2eTsp>^1SO3>RkRV)j@fm]B.okpZ&o2OioM9MTE:"T.Y0Cge>6i3QY1O=G6%5HHF[mcBHK@i=ED(?/_di2E"-UcZWI@$RWeM&3# 4S$KnpP4*9JgN@UsXU`rLbKjGBbsWQ_fttkXIOLKj/JDu7J^2I>>N8:U"p($9&QUs_[^t.. rTX$%M>"MPNr";XXbgYYmNrjT`p+%gd#"'D/No%$m>#RNg\L;3ea[#bqcK?_>#TfNqVDW$D n:[aRJI%BFYB3[3)arqdnqaI;3$l=*_W\1f@J]&":$_0 D7HLSi=n_?!'LaUl(S.3i\"O0frk_K*#PNKKO=NEP\njK0@N81-d=7*^Y=:XulnX_qpMiFo$$B;fEP0[`RCKSAj'(-:?Xo[RbPFiW,i(Z]++D-Y[p=&"FS_kDm+mZ$O Lol\g>[VUa+iVKc!bk3hf[7ATN^,+C2NF!l+!sr4rh22MrsE\](u'%>EAc/ 83.V8Ks\L)q0GA"9V`fljp41Fc!tm +]/Dm[`*.*^B(Aor=pfLNG:F$;I8P^3pCXqqXL*>eSp=k"J.apI3%O$5UmU'f(&$H:gNLbg [NPnXJ.64`oWFRStU%huET"p%\(;5O[BQq!d7 ;7uo\P4F$\mATr>W3R],Z'`nIl5SDEPPQUehfZ_,c#Bht8#>:@RTna"^BZpL/_.TEj40lpO M_)0T,)\"Xa Q 0 g BT 22 0 0 22 297.143848 542.838269 Tm /f-0-0 1 Tf (Is it)Tj -1.246094 -1 Td (de)Tj /f-0-1 1 Tf <01>Tj /f-0-0 1 Tf [(ned?)]TJ ET Q q 36 428.798 206.23 -67.715 re W n q 36 429.4 207 -69 re W n [ 0.799336 0 0 0.796639 36 361.085705 ] concat /DeviceRGB setcolorspace 8 dict dup begin /ImageType 1 def /Width 258 def /Height 85 def /Interpolate true def /BitsPerComponent 8 def /Decode [ 0 1 0 1 0 1 ] def /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def /ImageMatrix [ 1 0 0 -1 0 85 ] def end image Gb"/gqchP4q1/Ks_f]Ob8OK;%Q#Z/PrQ>`& UXn6rX:Y"[uCt1;D>L.^b3ib4p:nB5aI!\QdHWpa"sLYPUhn,a[B^q`M%^dlVL*^7CXY(`a WFp$1)&7uqPq[Pg'%T)61/k0TgU_\Iq;m]3GA>BOoBc^W't2+AN-J,UgNb4eq:m&`9ii+RE 3g#Fqa9atC!SHArr8BC>knMbCC+@W1Wos>AL)]S\JgMcs24_hNR[H:<]Nl%n9CK@Qn;FL]l aF2!",d)Ua:4@)@rZ\6dmTRF;o+TL!?iKqQP^#ui\3'Qo*G$EBRHL;0DfLGXablppX:8t=m jkQE4+4$5o>QV(_o'Aq%:NuYT].$J]8&$=K&#_Rp_Bd/i\mu90$%@s0$GdubW2mZ]4sk0V` XL1m)[.R#R@>_"@JUmDou0&*TH$kkHrUacVp)-;+bEqroW@?a,_G5`^kq?VFmG 2g\g>Yf-Y*DGY-#[QBp[L_*PH59GpKJ"mD-TT058clLT[^j[jGHgG`uJfU;KeJXrVt km=&H'W!W:2L*Cp`Qkm=HdY+5]f(1`P3Q\q[_rI".83QI&=Ylmb))6n`<7FkHGoUeUO]r( ;*Ga/K0sonOTY5Q%>Ia?WZ]@M"/8'I;5hL84^,7saL%]$;?ZXj0KJnWLMg]^0Ljf^is=kIB 1s9M8-p:fmC-@"@_RV?Xm*^A@,(IJoV1,\L=bH-t4!)qW((M]7`D]lg@75st=lmCG74^\X[ >o@^4Ddi0KlY77L,np`S^:%Z?9)b1QP]$-;e^@+F7XQTTE?DXoiiY^!n#`lAdS3QYOO)VT" [@cnrCZ.7F_D%Gui#u.%G&4(Efn)_?FObsbR4[(Aeb7&Jl.pW,r'(oQ*i:E/XroKK4 fp)`f1W2*rTB]p%/E)sX>#BOqPfSB*j2[/h%M"MXN"B71nF2'WpPQCro5\A7q2C-Kp)?uZ< 4O-rA,cHM>Bj=Ae9Bk-bKaIlamT7J_a$6K$$d/%IpU5JP0m=AQj9jS]\')J\qu'9OXe/UVP [s5@"@_RL5(Gs\:&^:DQ_'K/TYAL`1.OP0NLa!kV^+U_1[G\5Q'2-0XMYm18-oGSpUT8onP 1belSGRl6VKM9TM[_i'@Qh,XZ>KS;DtEa`hNFD)&+a3?qg?*Qk-Ld8IoU3h&u54GC1Cmao*X/ots4!q,1Dp;VS[k^@;"q@6b:2&tqSl%OP@Za*AN.,U])n((1jYUXGJ;[%0(^r"4E&/3^6_P1bDfgY?VEoRupTt)k/% T"`"T_FMKjl3AFEiq`4f;b+OjKit<'Rgr2q,^aatQ6M>cHfl(/Iu(&ogrto2iP-WFb^+d;1 4q5uS+qNJAjWAd#J8rc<94i/Rkb0L*o)L7&6i6N9g4Uf$NC+Z.="U^Ya>aEIL!)I>cV/)Qg ;,I$gH1\PG*BEcT7mEdCTFL0]acY/Bu5b8KCY(l94E&AV=-\&A?IjNlK_L7@UHG_Jdi1Aq8 l']1];%%%]T^CsE$qc5Xg$qk;]V[)PTp-T[=b.+.!o8WRU\'Ign/k`)bE-V+Idt __isKlAdZ)[.hU?sZJZ_;M;>LG>ro4?-#L\U[0*q1l=.fq_DNoT9\Gs&?m(XU8-3&+qJk-L :B3kW'7d1^mocI7crRZ%$^jfSip0VI#1&q9eJi[6ZXl/1g4g'QOO?qi<8CraYtJ"k\=k5HY"`O 8[*6@/mM3\,u"]p)d@drQ"ot$F'Q_Ip<$J+8\:G.j/+F]n:E.B6+61h?6nF\k[PVl'C<9#c rPuSb*E?rPTHK@g/tbhl?h,Fj`?B2\T7X?j3@lUj%pg,d)[5$:rc?mi^FU>QI\:ORA8q6Fq r^!hq.eh'IK&F9?Z:T19'\];1LLm[ij>mhLrPP!24DFh3>,<^=5hq?Z?"kpH7/_;0(o-!Mb 1K65Ra)*P!m71$H?i/99o!VRU:J1JG7isK`/fRI-,XoS>`)_5T\`t`"^EW^W&7uY?$B2F'UX0F$S&'%i(f'lnW< bCDr\9\i'ZDMknI!2EbQ&I1;@e+R6+j6eZ&INX`IU]a35,e>US0sSQ\43#$=Rs.qI8$+Xso <15man%CY#2;E]EIpC*@EQJ!7`2+3D\"VT/t@Id@rPTHJTV#N&S)Vh_l9N0A3^/@*n\UGo/ Shkds#@3qFE6%'UJ3_0ncRL#jG>I+d$S>@]$]kKb<@eMKUo$nYVjX1B0#T!V5#3m0s<6iMZlSH>>DtoRs4DB ?j('R!7Vm'M_<[QisGETi_jAUNiYXl>g@R785U`W@Z#KpT$DXGlWUcpnP[Ib iK+\LTmo1#H<9WIPlS\o=X$=bbS?;U/s6@f7a0#?ag+<<,Gh-ujqCDK&D\Po'oq+J$Z.TGB ed'5ViB%*kmV:3.\%?N<5XBGo#OnR`[GBgrSu7NnA?g8ZW><%p'igu$jjZ=hJr=%>agMN=< ^T=n6dSQUQ[Z:ISLVdT5:ErMHEJIF/AnR)_H[\+h7+/=lZ4!iIi/FY&ob U4aR?gaRV2T,_i_e/ne nT[q$34t;-b1Y&]V,R3*@1l=QU6nO[%#;MQ[r*4cH Q8)#1).eU(%#,o&2,Y14OSn_jM06D^HBl9NJJ)A9F.jI(RSU1GS&6p;n8dW-ceHruj#VM.^ 3T=)^^=K?^PU=di'C/">-/;*n6fBq=B#AM\riJAZ+J7coK8I]WCf?37UR8b0LnPW#VD6nek %%oL*20#81LDN&hM$oj*q'L"DoA^$1KJTl)#Q,D5e,@5rCNb:\oCX#^mC\*R+\3A-=JQB\& hri9ng#RMshIc>g4[lY9qrAjc*mTqFoeN+M"p0p-OU_-C_'%tc#<,aFm0K&fF?@4B)".He- IY-ZY`Ha@'59]r&bJX7=*F7t?SbDe0H5:?/%n@&bOa1d$$]!&:R[2'i#]@`NgCM@(_!)\WK::%a)!.j\rhMTa>5bc;a7L_c=&:Y71#b9-_@9=I F@";4?Q=43qSIV]R9O\X/cnfOI3.cBYt],VEnd(C$WV$a( d5_EZ`2&^l9XK/Z@IJ'#g[7@:?.b)(S(DIR"cHcA6'8+[RaK]"SH+OCj9%CPSWlgEPkTPIG !"onr6>-^>Bc$W,+cMGAU)'=bIm3A`QOit>+5ZDQ\o@h)R2NRt3r88fUK8qn%nVTT*uc/g> (k`UJ\M9]9O7G~> Q 0 g BT 22 0 0 22 88.727771 400.323962 Tm /f-0-0 1 Tf [(Compar)19(e)]TJ -1.365234 -1 Td [(script )-3(vs. code)]TJ ET Q q 365.602 426.4 250.668 -62.098 re W n q 365 426.4 252 -63 re W n [ 0.798306 0 0 0.796111 365.6 364.303344 ] concat /DeviceRGB setcolorspace 8 dict dup begin /ImageType 1 def /Width 314 def /Height 78 def /Interpolate true def /BitsPerComponent 8 def /Decode [ 0 1 0 1 0 1 ] def /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def /ImageMatrix [ 1 0 0 -1 0 78 ] def end image Gb"0Tq,>adrkS&RTSjQ+_%f9B8IR/6%r.4S4-Bgkl/.hiMoBL P3T7B,kNWoDF.eT(C?:)A#Oj#C>"]%tuP$#=2Jqq]rVD9XH#jSbLepldN0351u0^#'4us8D QLO$A*nrV,2tpYG&sk`nf-%X3$%2K#^)^UBrVCgN3-0JD`46i&kK^!Vor:S27GWq>Re,X\? DIWKgX')('Y-2qNpWoT\WPWXR>=cdJSjlI6m^/M\GY\N"Z`k!c!g\21b]Qio%]dHUI]Qiu+ ji`u=R9pQ]Y=`qPC?k?La'[Z6FnkI"RLO%*MAIqfb:>FdGI%=`@Ae]JT$@#UP`*@$KfmhDX'E+kk<*=`5Dd^D1pD"P:G:d.+ NtI>0>$TRI]oL^UI`pAOXN!F_t?`3uU$Ghc\FY<84gep2JL3m\]@gB"tcLchX0drCo._nit f6?"#VqbiK1[kjdX&pI^blgt.F8S_:5J%MjI4g?HqU5JQscf-o1DUASJAiPm`*G19L!eo*R Q]5E="Dph*.8%sHAWPYpl@S.-:AHbZ!$WFnM<2%uB!LZdcH&7F& 3-gNF3^tIeU,^7@6?MQVIcSkh5Q'L)e#-51&'ra_cG4)=p9.d!I^E"eZ*Ih?h8YcJeOFCtO Zp)^4be0^0#"mp ZtSeQ$B[SN8J`2J2(DMEYg%Z/31Kg")IhdEKp-Br\.=[5:)m7eTF@g;2'?f8d:'kjS;q:tO 0Sh=nO*%Q@As2QRg5r9p32Z1drC&:MQaZV7jS*rt(Pd1k5LVJIEdI*D`fk1sD$;XU1M&/+6*4:@HZOe$[d5-\EM3>U]@Uj)ghi-2U l&qfrp(2B/##$-Ec7N$1R:NAkB\P$$n7+WU,g36`Fupp%@p#V=R@g?dkUX7Ku'$)913#STg >0ONEr'GFQ(U75G%1mYKt)/qZ'Cl*WuRueH1=<$?`?j_8RGFu`ZO2/[D\5N]89AoXsf8< /al>lI+nh)@s?:H9ZbM_A8(g7.,QU?*Pl^5LIP%'I6!kCtc@e", E8D`IAiZB&R>tjo!OE&eAKB`F92T.Xj:!btaD4_eYkJJoD*L`[B>%d5keO\Bk >NT3n\r+Jt]=2J_fH;X?DinT@#H"$&K-)4Vd\RQ7>ZXLGrhFoo&Jo_hI:4]H[E$HBE:g`MS felF/.+g^8Hl<5oA[#A/X]]ne^fqJsb)s7_bb80SV:\bLV3-_f<6j*-0sm[=]GXIU6a$]K/ 6hdn3fII,kGHQ(TjY("_AB2uYD)ppYY>=;-'*t;T,W$?Qr6>g/_)=[cu?,>^E>W\>UurlqcST-K58H6@_W ')e_jVNXk:rD]GFg'Xqgh:KU6-UaBiXT#-QM%&`/?2^pRW0MsrcD%B^GP6%jGjRrGKs9d.. T>D?q4C^8oZfJkskp%0G5/*RWe!\)@CMWXiD#1n_EJFE\4j@1%m9u45H"<`*e8Rs)`)Qjg] 5/N)I6tSL![:7]Wq!aKg5Bi!#`N4pci?sulT.6uYZOXj-T1&ZqVmodO$4%`&')<'/i``TGM X]RPOe;"Tf8AN^$24fh`O00b;mLM&CW17j,YAg'MW%<%d4)45_juse;d:i-;^G)7\5j#^8s W4lXVgJj/=kd(1#+47;T6%Q\5Q:IMJL1MVe#&ASndZ=_R8AumC?/#.u$,39;f:#%&Z^`:3! BQmZ^,=P-*=-:_BiFGNt!TP-`^ZV#],)4*A&.ENK_/nB!$o_B[%-3[V]kT3MZJ'A)N:#bQK b+ZrG'X(*?$o#ZUT,]TprMt#[Q(W(O;[5oYO-_FWL0@:AHD:[`NEMrNf.B_5#&3fpN6?mng =DPYXf1Pu%P7-@*r?epi,=elT8k*SGk:;`5G3bjJ"FUL<Y]k9Q=*3&`_@KI)K)@5e TFNbBYoN]e%9=D*,LnVC<4tM'>hGm.*Y \/_i4'->=OueLbD*^u!3W/-Y5sVDWM.-L7MDqUEuI$3JkomL`CHL%Fs=:MQVgT.]la%.Z90Gh+1HcK*:H TemVOiaGUaZmS,JCAL!s*>6YnfW>0+p3P(#cYf8Y9K5Z;dl;"HJP%B(/%fTW2etFM8u>ogO 6'28X`M2?8OV1QolrQ)b"2p!V?Q`3"5Q1tAKKBCrcaJ1b%7e#(d8@Z*MLgm%f7HD,MF'iUG 0ol5)GYun=B.7T.d=5_#'ijRfrmsr;'rIOb08Ad\F=:&/JQinBaQQ)B6-t;JTXsnV)8Ar]] rkM-kkQ7lAoA+EfCG@lCC@6eQN%RflP;L6WtX]`^M)K[#(P"UW1&H\5qB3WR_9^fh&G&H8M ^s(*8OJ<$rZQC/QQT#bm\oqb3,./k8eSNBJq4]P[m=?=K.k3!K$ B>jAseU2[OYU[4eh,h-aJUE% %WK_A@p!4.0<<.3=KYW3iTHlD/=%0n^(==MeA!<`LhZK=kh'h46RU\,qO 3P/)c*(i7JkB![A$\#A7FQXi';G8)J,"pmG['f2G<+"$1OY1]P!"&Q>A>6<@a`;2`HQKZXu `_beC`YD4TIapn5$l(IPO$2mE1^fk2la*r"uu3j$hq:^!3B7n `Xlt4e74QAu!tDq,$..+,8H%bE/K57l)glFQV'0T&V_e9lomuU^$\mU/YoC2P;#Tkih6S@^ UZe1Vlg[9T7c:dFks@AU/9u:7WLD#B1MH?T4Yh5?27ItC*24VR2kG8E;icD54R1[r-g(;1$#+4TY2_1A3GY5N3S9hc)< cAt.W5-D**0`*aal8)r-\ZZHBJG.UViSb"P*fQ/@UBC"(Z;po7 Q 0 g BT 22 0 0 22 392.355518 400.130603 Tm /f-0-0 1 Tf [(R)44(ewrite/r)18(ecompile)]TJ 3.138672 -1 Td [(script)]TJ ET Q q 352 154.4 278.457 -71.371 re W n q 352 154.4 279 -72 re W n [ 0.797873 0 0 0.793023 352 83.027923 ] concat /DeviceRGB setcolorspace 8 dict dup begin /ImageType 1 def /Width 349 def /Height 90 def /Interpolate true def /BitsPerComponent 8 def /Decode [ 0 1 0 1 0 1 ] def /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def /ImageMatrix [ 1 0 0 -1 0 90 ] def end image Gb"0WHVi1(^;ob.cYf(B'(-or,_Q.(KFgJ+J:Jnu,_U+KJKc9^+H)RYFg1OF[8[k$+sJL='Y Js@B9`fP?E1.#Lg,r#0Qo"&AJhMXD67q$Nq5D08D!C5FUq[G(Wc>00E6,&'0gE--TD4D>Bl `&HhR*rdmoH?rU@]8[r1$5HM)#S=4b9SQJK1=lftoqhHXAa;-$h&=[RXTgpjJfN'^`-DFE! S/M0Dd='\j->?st#;cQh(=]np,Zald'r^^g?GB`ehCY*I]^4#bDh8bQu%hB27)8;(f^RaP5 '*\[H^]!l\[\H@7r'+KW;;qF;(X/;4SsD2j0fE@9d41Ed)Pon9B\T>fmb4'6.+\ h1dlT9=Y*!sKFq1$]89V7Z8]m*l"W[/ag>Pd=Tjbl(!/1N!t'Wj%faJ9LnoPZl79CY('G0# J?0:nMq@Yb<`(NMNVZ"RmbDV^2H/UR4u\T27pBS_nhZq%-s@*A[t0r,-:ekf7BS3&fR6!hj b`?1DI>.1tPD124mT3%=8o(C<]lU ]^h8kYd7g3=K!l[2&>I8XW1\kPc^l:/ui3lSBQbILeMMq`Hj;?ih]'U_1>9A\jGDCQSWEtN ihC):/+s%7IeSiD.5n@ioHc3&V8Dq5o KO'3Ra]1;UkNaDo\BId:ORU8VLK:S#A_.b=RM9/_PmJ$sgsOg.?!n79lcuFJ)EOTN@B%2bG 6ZHLkG+J+ON_B$\b=C2+m#M2)T`OrHQlAU&Z'fMu:NSt)=9Sjo/F]jZ>X7MQj\=HoA*GXqR dL8qC>>>O^i4l

MGL script output

\n

The script

\n
%s

give

\n",str); gr.WriteSVG("-"); fflush(stdout); printf("\n\n"); // printf("Content-Type: image/png\n\n"); gr.WritePNG("-"); if(alloc) delete []buf; return 0; } //----------------------------------------------------------------------------- mathgl-8.0.1/utils/CMakeLists.txt0000664000175000017500000000303214167366473016501 0ustar balakinbalakinadd_executable(make_pas make_pas.cpp) if(MSVC) set(link_type -static) else(MSVC) set(link_type) endif(MSVC) add_executable(mgltask mgltask.cpp) target_link_libraries(mgltask mgl${link_type} ${getopt_lib-static}) install( TARGETS mgltask EXPORT MathGLTargets RUNTIME DESTINATION ${MathGL_INSTALL_BIN_DIR} ) add_executable(mglconv mglconv.cpp) target_link_libraries(mglconv mgl${link_type} ${getopt_lib-static}) install( TARGETS mglconv EXPORT MathGLTargets RUNTIME DESTINATION ${MathGL_INSTALL_BIN_DIR} ) add_executable(mgl.cgi mglcgi.cpp) target_link_libraries(mgl.cgi mgl-static) install( TARGETS mgl.cgi EXPORT MathGLTargets # should be /usr/lib/cgi-bin/ RUNTIME DESTINATION ${MGL_CGI_PATH} ) mgl_po_src(mglconv.cpp mglview.cpp mglcgi.cpp mgltask.cpp) if(MGL_HAVE_FLTK) add_definitions(-DUSE_FLTK) add_executable(mglview mglview.cpp) target_link_libraries(mglview mgl-fltk ${getopt_lib-static} ${FLTK_LIBRARIES}) install( TARGETS mglview EXPORT MathGLTargets RUNTIME DESTINATION ${MathGL_INSTALL_BIN_DIR} ) else(MGL_HAVE_FLTK) if(QT_ENABLED) add_executable(mglview mglview.cpp) if(enable-qt5) include(../scripts/qt5.cmake) target_link_libraries(mglview mgl-qt5${link_type} ${getopt_lib-static} ${MGL_QT5_LIBS}) else(enable-qt5) include(../scripts/qt4.cmake) target_link_libraries(mglview mgl-qt4${link_type} ${getopt_lib-static} ${MGL_QT4_LIBS}) endif(enable-qt5) install( TARGETS mglview EXPORT MathGLTargets RUNTIME DESTINATION ${MathGL_INSTALL_BIN_DIR} ) endif(QT_ENABLED) endif(MGL_HAVE_FLTK) mathgl-8.0.1/utils/mglconv.cpp0000664000175000017500000001372614167366473016125 0ustar balakinbalakin/*************************************************************************** * mglconv.cpp is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include "mgl2/mgl.h" #include "mgl2/wnd.h" #ifdef _MSC_VER #define mnpos (std::basic_string::size_type)-1 #else #define mnpos std::wstring::npos #endif //----------------------------------------------------------------------------- int main(int argc, char *argv[]) { mgl_textdomain(argv?argv[0]:NULL,""); mgl_suppress_warn(true); mglGraph gr; mglParse p(true); char buf[2048], iname[256]="", oname[256]=""; std::vector var; // animation variants std::wstring str; // script bool none=false; while(1) { int ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hno:L:C:A:s:S:q:v:g:"); if(ch>='1' && ch<='9') p.AddParam(ch-'0', optarg); else if(ch=='s') { FILE *fp = fopen(optarg,"r"); if(fp) { wchar_t ch; while(!feof(fp) && size_t(ch=fgetwc(fp))!=WEOF) str.push_back(ch); fclose(fp); str += L"\n"; } } else if(ch=='n') none = true; else if(ch=='L') { setlocale(LC_ALL, optarg); setlocale(LC_NUMERIC, "C"); } else if(ch=='S') mgl_set_size_scl(atof(optarg)); else if(ch=='q') gr.SetQuality(atoi(optarg)); else if(ch=='v') p.SetVariant(atoi(optarg)); else if(ch=='g') gr.Gray(atoi(optarg)); else if(ch=='A') { std::wstring s; for(size_t i=0;optarg[i];i++) s.push_back(optarg[i]); var.push_back(s); } else if(ch=='C') { double v1,v2,dv=1,v; int res=sscanf(optarg,"%lg:%lg:%lg",&v1,&v2,&dv); if(res<3) dv=1; wchar_t num[64]; for(v=v1;v<=v2;v+=dv) { mglprintf(num,64,L"%g",v); var.push_back(num); } } else if(ch=='h' || (ch==-1 && optind>=argc)) { printf(_("mglconv convert mgl script to image file (default PNG).\nCurrent version is %s\n"),MGL_VER_STRING); printf(_("Usage:\tmglconv [parameter(s)] scriptfile\n")); printf( _("\t-1 str set str as argument $1 for script\n" "\t... ...\n" "\t-9 str set str as argument $9 for script\n" "\t-L loc set locale to loc\n" "\t-s fname set MGL script for setting up the plot\n" "\t-S val set scaling factor for images\n" "\t-q val set quality for output (val=0...9)\n" "\t-g val set gray-scale mode (val=0|1)\n" "\t-v val set variant of arguments\n" "\t-o name set output file name\n" "\t-n no default output (script should save results by itself)\n" "\t-A val add animation value val\n" "\t-C n1:n2:dn add animation value in range [n1,n2] with step dn\n" "\t-C n1:n2 add animation value in range [n1,n2] with step 1\n" "\t- get script from standard input\n" "\t-h print this message\n") ); return 0; } else if(ch=='o') mgl_strncpy(oname, optarg,256); else if(ch==-1 && optind1) // there is animation { if(gif) gr.StartGIF(oname); for(size_t i=0;i MathGL - library for scientific graphics

Enter script below



mathgl-8.0.1/brush.ods0000664000175000017500000012426314167366473014445 0ustar balakinbalakinPKnUMl9..mimetypeapplication/vnd.oasis.opendocument.spreadsheetPKnUM`t1V**Thumbnails/thumbnail.pngPNG  IHDRPLTE-:!+&31%!,9;,!H[gv>2ADV]k`LfYbfzey}lv}wznvy~{‡œƍȨѴħַ˶ثƲȷŽѼŷҿ­ǵ͸ѽ4'IDATx}{\WbvO-咲(| ,F{A J"#4wgk4M"Q0N1>AL%tG8&4 sUu"Tݺw|9soʦ1+wݸGn0OG2r]dX{Lab0hf~g?\35S宋گZ8t媉/gۘ}J2rd OZR /Wo o&2_(=ͣGr*A ބ?|]VrغFA&QxiᛅYvUZ>`N0uY{ $/g=' 3wj24LBL-Ls3Ukk c TB`1>O.aﴒs6R} d&&$ka=o8I{*H5uc׃\5'F0É2'0}3ȅ(lo 0IzptYtcMAf%lkš!t[vfJLk0L๵fe@:4-l '0y$ *፛K!x "Uh.ou즌^}r2 4[Q'- {t=As AԜ ݅kADmo':=23suzefF۳4o8q^v"x x6ainh80HvA(IR[ j-|t\o 5.@sдwR=f]NT t؀]3Y셕;i@SkisT36rLptMTptKf&LL7h~eD MuKf@&4?Y&u4 ޠMlBJNVmv`2AfI͛6oBkm֟6~9Sbf>мP ҁfoVo oe\F:6%yy#.?GA4 Wޟw(jz-hgݼe@:мč\'&7lwn>`2O_| O৕!O0?ɯ7~c0!ちm2eX%NŔ172oPФ}Sx}:ܠceԪ'뺒C?A H9 bf&y|T8+<[|lN6#0e־H.q8݀{i5>ئMvl!̼9s{qy /4~y 6WD^3sGF? T6eY0s0*U/3x29N?F\8g(iffv8agfn\ioOé NQzYPYxYm#L55\<"%LlHra0|fb80JU5qAsPA3h |ȈRq_Nۙw=圦s9H!҇rxNpk4Cbv=i4p:ssr&X!f w϶ _gBN95Uk0ݳKnNSu&Ei2K3*l]=5ўQ8Mb4{øgz=(ivGf31rkTNShi*YӼ<*XRAĄIȻ5̙I/*h4 5:дֵ4ٶJizb$IzAs Q3Zi@f$yзlFx21T5y{8#hI*mA:Fʀ;zM*mpܰaM\@r-[6\ֽլ ;mtХY`m۰0vD1 3{Zfi-vqzsɤOlSΔEkc $ʙ9] 뮪L6`rHf E, %@xDLY2i55qKĚ=ivV% 5sjV[ZF9hŸ,[l6|mbf @kUn.g()zc&h͙5 IDhIfmghdwW2 } M^  &isֆ fB߆x"@Sj=!zДsϊWT͘rV-4h*)'ZRN "ߕMy)'Z:Da мgA6>58k`6>*]@s`\Hw@3{io p X;M@d@l zֱ G[(_C=K X7:>Uj4rio[[bG7<͉& |YДM:x?U}%JkOËWHet}O [/,9ј~>;iuqy#yޮzrlQG iG_u8ԝ<SXQ[+V"+53w8a1D7=1I7k&ff{$փ23|PO}۴Dg[,mgRsOQmva?F\h@n67?}':Rm|Rɐg $m+}pX3g?VUP$zNӉ@Ӵ:mwf˸g9́xRt*& lx5$\Ni> NVCuBg3UNV=I@Seӄs=8̀: B @TipY=Em-nR*8M6G_̈́ %w~ݳ8MAcb-;!Ta4/"y`^irNi0Hp{;0pu=:NӾGp liv@݆:I4pv y/3NW}ƺ3AG3sCOrYA~~3M>4 &¶*o,NsDi*8=F,氩ܒy&hm*YN4nPAWet@ڔiZ4Y=|lz1h4 f&͘)巙1OvTH#g?danԢ!Z{VH21֞iVi&\b^SlfBkf>^LEgyqmYYs-aijk϶RAV{[34hB!4MfHϜ7/(d-ݿSP83m Tdsn 5JNϼ03DBMU[&Lw"KLcU_p 08͝*?^Y:N}V<Ãce&t:<͠$xKdpfwR 4r5NDa}I4$uG>n-idpƮ=뺭4yZ$I<(43H4u ?pv%OAsZGʋ0{ 4@Si3Ќ 4y'ibnsL8eiD3;|zEh7+NFNnگ^x7 _j 4]gda қ'@ymX>:&0 4KT9Mu@iڳ98rn=rq-!ٻn8WuyZi٪# 5pʁ&SW,8sώ i=;^>O@vCa<@Sg-A%\Zivf& +<yN R/TŒ(* i'dC6>*l%8_YBQkV܋ ̰X\K1$jzp1Lx+@c TBAQYd=;/waS}['xE S`&22z̙b3CggD2zPF$re-Kԯ|n45Y JgiWD<0c= 9@d,MzM'gw6fwèI3 :J=z {4/[dJ[v߲^cMivD#$񉞭"笉İŎAx06ߊ!_Yȫ}cf;PN3ja)N35pn i2j4Fl4֞RV={SěgƬ=[ ԞݒжEbbtg͢,TC-N^A3RE)'jY SNtg%9VL9FigA5sT!E(NۡݳX{֊)'jY"[{I^3/W}AM9hY{!6 ]Q>מud xڳӴ()uڳJf79K~p#1 *zd#aƮ:PKrU~B]@-!@ hO:_=}Wj>2N_{&m\Ž>u>}ɾw/:/C-Y¢Cy<3u}ׯ8x?K#h&%j, Ƌpt/" BCɥ^\;F8!7D2E,[vz8Sjsώ<*ym9l]UJTRܳGi9M4=; AlB9 3KT9M"iq N 47g9͓=& *< iYd"5Umqu6#466jƾH?$Nd7l(Ih!IQ`;٨oD*hBZm\8 @<'`l0R&DVMjeM AN5[JIQF@u,gDBgTBA3([F h^ h~V:HAam̠6>ThUP  j8 @&IuNOОmh!&D+$xϡ#\7yhZq9 Y7.An7cUe[yf#@S0a.!P>EaEKn-x٨[/A:4&Lj*Աi3[3}]]xt_jD١14#Ψls^y/0Ќp?!l\sgTпcѤMia L*O;gL"N<1a4 D;dW}v]JLZ麇,Xr2SNE<0q(7)&TәI$ǥ̘|^bL4)p`fhRl(r-!UGf+q6 H7p̯fAnE)u>7Cw8^f\8Ϝ ÑN5Sv}J2P=M.Aث9hra:R z0}00y:Y,R{m@4Axf;(Ⱦl~(03UMBendeP5_ZK90h :~3\5$UT3. Ê>go|'\5&+*i3am&Si3+zV4_a{߆g58$RN0̀{Cfݳz^UBf& iJfPtglTzoþ-yP:ܲ[qKWv0IrYpj)GWlͤ=2ٚib;)q,}"h>2o4?336s0/hGD Ә?٧Gi4#83ΠigGLȀf]]Y]dl0ҼjVOf8ܲhgbX}ԱCӑ@cǰ!>O_́A8&m ,t;`XLp<, 3%Lk5=KC$64p,jf6IKgK9A & -f7HCRrksϾbiS{Vgi*y&e(gd !Ěiybt6wA͠Ŋ&KYJ)}%MkuمN3OӲt3aL֌Z6[3)b=-Z 4@[( xшMsX3YUYJ6xzWܠRSRP}n\f))23 !:ȋ@ W)(r%f6;fEADę48~_GO~fF탑9bE ʞۮAheCN30!iAd^nv#iV: 1qlq9~4rfAwۢ>qdm$zNSB?&YLc@:v4$2Wg NifIrfB$N&ifF4{X4$ѷcř 4I6IENDB`PKnUMConfigurations2/toolpanel/PKnUMConfigurations2/menubar/PKnUMConfigurations2/statusbar/PKnUMConfigurations2/progressbar/PKnUMConfigurations2/images/Bitmaps/PKnUMConfigurations2/floater/PKnUMConfigurations2/toolbar/PKnUMConfigurations2/popupmenu/PKnUM'Configurations2/accelerator/current.xmlPKPKnUMmeta.xmlK0ȝ:Z]Dꎱ#c̿/4d1Ks!?5:x*krB0V9St_|ӓ *+ 2JM+u[l^ {KZLFr|aWXl וUjh/ `M#>oӺ&&wtt?:'6S|qv8حR^`}yЀQfQ֫8^d{ H%/PKZ PKnUM styles.xmlYn6}W,d Hj%cǫk HIZoDiP@Rv 'uH\]ײsi " g3C: 悰 3ybg7?'S$$a̢2ùtX@8a5y<D9ʰeF(lCT5M঴r¶d5)s*iSzʧg6tQQn+qgV}>s{r%L3T$zI޷Xam}:[^qwfZD5\5K,mfK}]j'Z} 4p#%dKbuDd#:MEߎaII|WrbM uOڮH4B`%WHBrUbȄ} 9@Nauynl:.39̚^wL ]Fz6~TpBPݰRg7J ArW^|:X0U׵̏yգ0Aq~{WRYh; 6B7m+cBu1,`*|W<81B(zZ<6 շ-ŽmkPDU!vTu0*W#E[1ЫS;X:nWN4%ozEƮJ~PfW}*05z&U-xEf=fMOURݕj[=D&z~#bkHD~ 4 ru. |?_[ogv dTGΏ|%B 4Z.geo8{x]PKk΍PKnUM manifest.rdf͓n0*9R'  !Nxe|T(W B}Hv*o{W6O;e._)0^~lV,iV\:LTQoEQJ lY +Uq])l|cRa7V E)lG)Rde`jʡqX#CA0k+_6""z[䧀TR÷!^S/<_ %te*HbS4aS &]@Fq%R#==@Z䘢ƼYG9r2Z~>)ɐ۔WJx._9e)2(MVuG\bSN75JJlF^JDԣ#P `u>Ԥ63E$74l1mJ1D 8Ҙx΀5;)6#@\܌R?39's9's9' `lMn!yy qk}bȮ-:9bl/ʥGH@Ac0)x)b&ѵ<w :=)lh7u2ݺ`6R# #ĜC(dßʳ)&Y|[8!d|l(tS]& UY9m.gr`@.+t*0>_7E cwޥCv3_o$k>I @-T[aݸu~\]׷77_}{x%߯F[o7㳯~ɞ_nww\Fw%_ߗ֧O_?~k;'O_?vɓ׎+5ۓ]n}շţR/_bnn$y?} _Uߏ.G{ kFCM^/nfx?|oK_w"L7ʟ@_j}}?1^ x!}kWitu{eY>Ϸ߬f777X Yc7sk^y?/?c\=Wiǯk"ylD{}4ŷ>i5] ͋/x~xmjviv+拽b|:&Kޞ?qqֿ.F큷C~XwWUo//^*󚕔xt>>xs6~?zdO^I7}=L?6o0]M&߯™?n}7͗_y;߭-}w/|2`jZ\if-\U@+[YXPl|uՖ+YZ‚e5^0ʪ-ylr !-YU]THn/_ 6KTS?1=ivyߍn_\ /'~) \Qb`劝E [߆_G[02~y;O/]ˣm^\ݺ9? KÈ% o'ٌds9疼zFC5T: e7ߪ9uc:t*}3noƠK\鄒 ?g: N5=}]]NX_^~(Us"u ؞Fa3'uD/`&RW;E:uGU[i*64s* uD_aR`nbW:z.#Xpk#wNEa}T͸x`x>S =_To_4 't]S)v"JQ vvȁ68]iم(PJn,StD_-T㳯%ߞFbK;:"9 FG$6xQ,PTlB(Тt2 q:";kb{y-w* uDܽg8|.V|^ZfГ? K7ļ'v_x{{>sS+6Mvovv/}]Tl_[]ٽոlŷu* kM"{M";:jN"m Q،lȠ۞uDW;k}3&]fLSG4G՜x#w}oƔQ،%͔A[:u3Q[:Y`;n%nQQGT w<kw=uK\X"@v($%kZ@X/  <_To_[i*$(xUsI]ob3&]͘'jw~ZĻQĻSQp#z/X />g!97ݷ7q|x;.M׼Fgw~ _sw[YG翾eL{(|iO ~_'.FVEcyہ1 x< E+M. 2y{3x{s%OKsCh^XfֿG[6׷o>/?G=7~398Iq78Rp  N@#4.jAqCNh; /7|}gꮕN(*Čoon==w*?(ǝ1l1ySEބ& n[_m*p",3(S`U`5I?"^^^hWt+^!-BV+7\ZZZGcP (~F!)um-qUW;ZjT@#\'/9VPؽ0D[u~g lv?=r; 3P^[ u.yzKel1M&[ ŀl1$[̃vSntEٖu]...Z`mEW.V Nď@ )JzD e-xb-xC`|ƙ߅r oQ]z:?l?;]Ϟ~Y\.ޚΜMݶR\) HqR`L HrP󁔶EvE蕶 7:$qeC"_Y)--C-#1H$~?++=;UGA HqRG Hq| " BY)&g A')~Ww" " " "RT@*$^EZ -x $w@]xb @K@KPK$~ ?JiOQŦ9{|D~"d?OdOj  W!BY&g A'*<6~f?؏#d?ZY-F#qJe6.Rm mMm-6E좋v+mP#ihjďA' SYY*A %H R@ %H |RٹDK;W zQz3ZiYk?kxkxkx<b'x@B͇...Z`mEW.܄#VQ--C-#1H$~?$BYA x#<b|Zy0[ zQz3Z zʊ#h[R@<$@z8.q)|xv]t.z+ZZZG c H%~F="I|݅x HDx ͦw4-o9^LԦ?{{5ciO{4iO#؟F?`lH|tE*5 R,;e +EA*Q$_dE2"fLHY$,iUZ+骵j8~4` %_r(Y(Y(Y(Y(Y(Y(Y(%C0B=P0^3rDT0_eGYb|:sGq:>@XE/cث>h"q;1)@iHqq"(G Bzf`|f`~f [@3y<ʖLЌz0DxHk[Joқ*JһF=R:)}݅~J?ҏQ'S3R:)}݅XRWuк]TCwo>y؍_ei_={euxz} 6&66Ķi!r _!;v 1YD~ KUh 6g3H$ ?ğğye7\)HRo[(6JRH$"g3H S?ԟԟNR_wlr?ܟaLLLrvK7.zflli64aLLLriviWy; 7[f#]^Gp}XJj !Ӷd]V` ` ` Gh h 'h Jۙ))xQU0 ` j|A1=tAoP0A 9 ʡLɺr,G( reyʖ8,l@PR'*nԥ5/=G#@s929*!S2HɠuYSH` M0BM5+m D```Ghh'h>hL巐iLE @. ` E0r}vtTSMy]SE&\.h}>6>1>5>hv>D xZlzIGj# LjcD1" vAXXb0~ ?#ƏLjcXJj !"Sxc1tp:F8# .k 4Dtp:F8888@+G7iDhttr/qKaP& %`BP"& ҃{(7\)HRo[(6JRH$H1p#H1q48NR_wl D 2H @i 4A w}A 2H !D d2Hd2JX nG @ C!AȐ dH2$2$$ z Roԛ JRԻF=:I}텲 @ C!AȐ dH2$2I. dH2$ I2 8t;1~ӑ j.>88881qb2dI.3.-rL]$c.*W ώf"ù_TXYX){VsNv?o><;DAd8;^Fh?j@<䁜<ޓ^/jFEEEEEEEH:9"|$B9>2}X>">ic^4(/D4MuDSTG4MuDSuW<uuJ`1tL:Ӂ@tc:(xj;C'-`(7?Pr@0V2+ .6ġ0kB<k}(>KO(Dn+ϛ-" "ѹ^}- BZdp7?C31.yϤP$<$<$վc?NIHPM} E6w{9=,.\\ʐA fd3L& lflCKu"<7b M66vvM n²PT@ =z-[ SB²o4\\`H5R T `jaqIaᢼRj0 C `j0C5Xj)zڛ~' |p' G| >4szZ -ɚRxY^F/렗uJ{YdynqMS ˎˎNN@Ye։8"9H#qArY%>ĈOb''''q<'+'1I$6$6$6$7EO:r B!$rB"CH'I KH%$z Ą^NR_w,2c XBf,13ǨɌI$u&3Ǩ%fddd2 yʌ)3n(mD1r;*5g ]X'P.m"3N 3N 3N 3N03N03N03NLf8ٶH$qqqqqqqb2c:I}݅ȌȌȌȌ̌̌̌I.Mf`f`f`f81qb2$ X$̸VxQ]qRoF#}/'~iYnͱWjkG4ь=Rd8 7 k/ejin{~s#;~ݧ0}z`فg(;g˸GԒdkcO{~~~~~~~~HZ$dH><"|$B9>2}X>o"P" T QD_h#ꈦ:h#ꈦ:ܶ5Sms-`d4kTL:Ӂ@tc:1^ڞ> +r@0^3 lx87sB;C6:<(>KQooQIߎ/0(9uMYW;LLW;LLW;Ld&GjjC' (ݡ9R;&(Jo;Qz_/bĉ׶~J?ҏQ'SyCŻt7bMjLC5؆EP{h#:7֡>;VC6?7 tbjHD^K,Rj)5AJ0fR3LIYNTР/nUlhm6:h]cҶ,oΪ uv{`( !`({Hڦ*؆Pu0Ρv:z{O#F2QUG1TU@8RT#U*p .7A-zAw{奾™z{H3a0LC&1 s̄ɄKK2a/0X{ij|C88EP{#71΄eɄ#qHaI)3N3N|8{)e)e)e)e)e)e)edRʲRq'cê݋ڮ XXXXXNXN6eC[mUĮv@jP# ^ŏβ_ktݥq^z+& W+ ȕse0+zm+ 6RFlFmtmJ*ԉ; ;@ w(m,ݯp[ wra0A rܡ|wpKdOc1pC !F#w;Ć;N.6q6ե^R ^/ke^i/K%0r111111IKwn7RW۠uUPE=ԻWF)=]J)!RJH)%SJ)4)VDSٔm$do7 ٛMb&1{&{+k4M= 7 ٛMB&1{Iޤ*CRVEmк]]}D}qVZY]'P.="{K {K {K {K0{K0{K0{KLVH.7A-zAw{$u eq$q$q$q$q$q$q$&㨘]8 H}uSܸiS####1Gb2dI.(+y.#}Gsl w'|{ϯ505g\`=O~P?nzǫɁe CdvH~/c?jI;=~lkO{~~~~~~~~H,(GR,JeT* RY4©TO*9 d G(/D4MuDSTG4MuDSѴlD{{C`;fxzo?_` !^9x4z/>~]xTT|B!OO]}>^nMZn֓hkx~~;~x}>=_xMO <>7[w=ǭZ+[o_?Yyݿn?_zq9zز<-Y?[a_n% iAΛ=~H&rz>ȭ$r3{8vy0t|4^}=GSONӁsc'(G_/#XO ~_'+kd1c`ES԰ ,#4K8)󙯞 )B{i=w QIWPȭL0Sp_)8MGh~$\eOY&+[1YTTWTWוU/E (%PB %PB%,t3:(ZD`X^xj|E4Rm mMm-06FL+k?q^i;9 ̏@ )WyY2_Dk3t"A @ ? Geiv%"i:@]FR4@]yҍkhl 6mvFh=c6r; 뫂͇ȳٳJH+֞E{ .H [ Hf=Rv=RKtSڜӲSyn^[yN^f#c9]B7Fɿɉ 򂝼`#/ ]&^Ȥ8Aw͗Znj?p1|=f3;6cQR9E6=WtqZׂ6F[`mhmgl_FKg^%jS!7׬kV59z#^wPZ@/) _> ֖ЖԖKh%th P6`ĕQRY=;S--C-#1d~2?++ծw\Ăzs`X0̑sdY07,toD,M"$L,؅RY`&h l6A(MQ]Q]{NF"͂#͂#͂#`Xp,8u15 2JTUCUSU FQUl9iWhҊV+Q--C-#1d~2?++sZ쏛^+PG@#  u:2t3%B&'t&BB,5hl6FvF{FemƦn騮WM&BjZ@jQʾ.Mr2oh7[ 6ȼ2{ee^{ANO2ʅxM7wgqe~e~e~2?OQgee \_g|-75y|S7M|S 7ᛥ4" EKtrH {Q{3r+ġ6=3w륺r,Aw555CbP1rVJz.%Ԧu)IFFFjQuhTFX @,W@̏@ )̝])kk.o@c 1Ib$1FXI\0ImH"Ƚ ro(ʽrKJK$R"EuEu)ug梤&RDI($J Iڊudۙ 515ukAkC@bm|2p%[2?2?2?O@(2uvDǨyZ1 tL@$1tL"nDLjܛ Ƚrܻ({+NǜNNW⁃u5H4K4K4K%@c ұċuv^.Utgjlhljl}>;`]^YbɅx?'2hhj̏A' SYYv2!^ȡAv|3Lo&7䛉ej&w"@{EpH',&Ƚ ro(ʽrK}n WN=p¶=-3rwC׆Y;:mӟo?~d>ͦw4-o9^f# =9oCF?b4i(QO/ŠxՂhlQ_R0*ŲQv!2;^gQ4gD3͢fLhY4,i4fZ2`-bT,22^n4Y4Y4Y4Y4Y4Y4Y4%v +mߎϏksSDCMc2{>w`mtxzQ|Q|`$8{G'W|}^}-")Yg\N |@\\ZTTWTWוϟ^7y0]7y0]7y<Me+fK}2 .x{3] &Ƚro;({WzwcR9~ K) k>g!4#lOFxVƖ% .s6]AjvQj5>վQG9/rrc]^5PM} e6w{9K~|HZ7]+`rR—n\rR])ժ&Dittr&/m"e㝵J9(ɍ+q8p#q8rn8wҭ<3鯂p88Ñp897܉Xnr"rt6}b*ƁqbG* VՀՑڬĸBm7:wPhjA}DP!ԧQgvQgDkD HM&6&1&5&˙HqO.-v0W+B!yEyEU[DrS{Pm{5r!"˥mݤ4ļy <<<<"ٞfUH@-d $laH0$[HvYpdX{]({^WU* {{u3LUWbU1yUlxUdrsIخq4 &Ƚro;({ܝƖέM7h7\z(M &J#HibCiʚ7t'$JC㊧&FJ#ĆĆĆ9JS"6x`\_MHk37bl1rppp8$W1.Ϋ\j4lu@@-%PKR"H-IOj)ZJDj)ZJC-ʝV$j1@-%PK R"H-%RKieJ[d_H$8$N' ++{g&qT./67I$qID' ICdĕ587ZQ ܡv$`G Q(AvvLI)Ƚro[(6ʽr;;F"/>AG(c WzwP7KuҎrwv$H; ҎЎЎЎ$G;~IXmR9E;6Kx9+h\M4WWWW/g\Ƶ\JXv^sH#%ZQvgk*ߍ֯ ٳwuu?Ȏ~{)Xv!";Af2QTAG1xj4Y4Y4Y4Y4Y4Y4Y4e7߶||Eh*s|d1G>J},xgƍl'&m6{rEuFTSTG5QMuTSTG5QM_V,q?oKbx@T`QtT:Ձ@Gu:(ڴMzD>0=| paW@\ln=%^ $x`mtg}9y1u珂 ~=cy^$:wëoE* ܍O\ Xu^scq ,th/ 2Ƀ2Ƀ2ɃlQi([4}6[4~XrorogFRQ]Q]y^W^N`MZw5+mݫGȊ_F#\j]ӑ ^^^^^N^N@Z^)7^^\Ir_Hл(^j^}Dѫ}zW]N Jt(&ʾowF^Ȟ͇n/scwW=@|ӫd@8N!dH8!YɵUJjSON`MZw5+mݛxd/H_֭W^ԕ6:===B=F=A=56zVF*QgKEq5Am7:wPhjA}DP!ԧI% "NNf7Tq͐z3 73ԛ f9]Zt[M_FgNϥ50"́s$0G" ^yFx1vgu7`-6ZwkWں7z*_鬯] {{9+m/]ꆽ) LijZC3T;.6D-Q}ĦM[TJ7Ƹn:1u*L#$92In$7L&sLIRTV#E]J#PrT9B!U UJDBk{ roܛ ʽrܻFr_H$~r?BOPFgՓ(7KEdOjӋE"d{ȰȰȰ(ih0\zCnZnbsdL2B&! rLls_jCLҟNϑ 6Ny~f*$0ILR $2Ia &Y-1Sçڜ3SN`MZw5+mήtHe_u|] _uazYKɅx7uzJ6n,Am:'UhjT}D3UMէv,_j[N-S 90ZN- 9N]Vvv]_f鹓;0匁rH9c1RPθd߶ڮR4/L js|%nu7[hmZwXwuo"t-uJ` ` ` Gh h 'h ʏ,wi^.Mt{;چV C QaKT)}էҍ5FKA}Si-p"H( ;=7R)L w ].Ar K KXx#|1s)7A-{Aw{ڭH/~r?BOPFgՓKRmл(^j^}Dѫ}q_VMeg2X:Ql_+~Wan<~mȞ]Ӯ?CGvۻOaQv!2;${;hoGE*S5DyzT5,,,,,,,ь?{{p(/GS,#G> }Qcɨ2Rۓ <ꌨ:jꨦ:jjVq=!gazE~}dQMFu:QtT:ՁQu[}|w╃o7Ie][b{O j- } ,1> K?-q-0ڳW HpW.GHR: 1wV|KD_Q.M䜅zttAe([2y~>~?a3zG;)Ƚro[(6ʽrJ}$w~r?܏Q'(S#3;݉RY~:^.J^G7WpcFaK /qXo[(}Ⱦkdɾ_Z+]2?w{ ]J:aCP `H)R JSX867@M{ FwP]#^i6m#o !~r?Aܗ:DC7B PաhjÖ>bST-Ojvg'nl Cv0d'̰f 3؉}p =6+p +p 7\{'51++ON`MZw5+mJY"aEl6;RW3T~b!1 話ѳ6:Yoc"nEᅪ2#E]iXjKxER{Z#ږ7>6I17SO;©ZnEwU8 p8/ͼ7 ܼ@Ivg"#E]`f'fv"ىpf'™DeMTn兘S]mN]` &Xw AngRL(Oyyyyyy8+m5|V*_w<V6+? Kmc:XRhZj]K}DRƷԧƵ^s`mzQWD8oM6̼MdmܼMi;\ZB6 JQquFy6mfFTmކզԕ֝u7`-6ZwkW޺7L ߻H'=+mtEfj~Ru,vѴoOfGpd΅fh˅R` 8%pK,afvJ3X:(>i~B4ba#?bq#6q{8ص֕쏶~^cg &Ƚro;({ig^ l/ۋbd{a{$w߇X^ hMU࣪FvI.ZC/ULվqSt+E+|379[PN6͵ck4^綖^:4X%Or6=B0 Mg$r6M"gɲ:ZxX+g$p6 M"g$r6i8[io x Il8&Il94q<_k4 `jC=t-DQʛ*q.ѝWBi$RF"HCi42Gi;NiR\w[xH<$ I$CC/'$xH<$ I$CCJƟ{ '}>AG(c zrw)qd ;lUv@j%P#^Տ3_)nq/,M``` >1|b2$ {˙=̾^Ygk*ߍ֯ ٳwuu?Ȏ~{O,;e C{SHE{;6|z"Uf?f?f?f?f?f?f?fl4kH#ہ(/GS,#G> }Q++yQMuTSTG5QMuTSTG5-UN&1ol$YnT:Ձ@Gu:QFuoodC''6[Nrp&}}[5.pH45Z'>\__\/&bz%t?:ߺ^m oGww ]&i{ '^{c?τN?r>e?!??" Ƚ~S^msϿM\)g=̿<rokoỼݺ?nodC\]\_\}2ůoe3їGOPt*Bϗ~bmY?[a_nh!͗]R|[3qN2y5`,hPO$mƓws $pp?>ޞ6xn~$eORG_/<)yo`5Dv 1-/|: ,#4KS8)%k>~2,c'_,,F/Ll-`'Jq78(8nJl^Pd>sK3Ú׮]Pָ~\*?TP_+"C 2!C2ī!CP;/qUJ!֦jhhhjhi4:`]4^iXv!Λ+T@Pd~ 2?Ϩo$;Qp%ipixiR/panXX~~ro[ 6ʽr{Fr_Fl>hXå̞Oqe~ɍ*qT7m=`&ر 7lp&[2O)rOY^F`+ mp+yp4o\ŖWlx]vWnvedB,p+lsev2\A;;QO0 7Vfw+Uno+'ͩ;(pM& (p$ v̉(QpTs666FLE6 WKsc4Wܝd~2?E*Ĝi (p G(p$ /{]{i^:h/]~Y{ ,7Q*RߩHHHN'!6J%WS橖yC˼eAyeޫ)f262?2?2?O@(2wǻ8n4x7FwLCmG@p" 8 N'BS<<: ^@E]JF`-6hm636/k!ѐWTQnSaФJhR%4@*J Um\qTnhki4i4i4`0.FiZ#+]ke~e~e~2?OQgeeNx+&UHR%T $UI@R% b(H;BHKF`-6hm636/kDhRaJIUIUIU *RT> O\9*"Unj.ҦЦԦhit4hҦ*2hhj̏A' S$s'J5T@b U1IU*FRR!Uҗk!!̛4&44666.6Ӟitre0uڗ$Dj"5 @B$ $D" >t˜HJ5hhhhjhi4:`]4^i B}JId~2?EQH2wTI"H !ID"HCB$v^Q7A-{AwQ=#r_ڊws} qlܸ]ahhhQH($@$ 3HyR9EM?M#զЦԦhit4hҦRiP߸e~e~e~2?OQg7̝(|QH($@$ Bbr*NܼyQ(ܛ Ƚrܻ({{,|(s -{VoNv?o&7f|;N~/#^MXybT5i(QO؟F?b~(ѐ.v B"d`$d`&d [2y <ʖLօGI$w)Ƚro[(6ʽrH$w7J5wI~r?BOPFg$w xW(yWQjߨ^}C6?1;q^j |A> a0g33̇Or' Ƚ ro(ʽk#(|A> a0g3 f;݉RY3  ||||/d|EF8waC!q8f|d|9tMqȰ9d2l6 c1&&{Yɞ.m4yYXX!XZ1Z Zévd d f%Am7:wPhjA}DP!'?,Me MJZFmQW~vA*BPEH"$T!T7 %q1RXCFk5t5J[ٍO#,Q'J5E@" qI\$.BG#,L#,$.B!EEEE9HH\e Mq"uNj>@8$N H8aHqbq"Y' qH@' $q@$U1iE6D8$N@8$N w1)H8$N' ĉbE$v|-75+jA *BPHb$T!T1]nTy\1P(W +F#劑rņrPPzF@nb 71M&FrrS"f&Fr#ĆĆĆ9rEYq H $H$ ID I>lGr' Ƚ ro(ʽk#(lMB&![I$fk5i5;݉RYd 3 D D D D2/dy:!V8QG ܸQ $ $ $ $ $ $ $1HCc%S{Pm{5rInj~@@@``` NrwTHHHHb2d @\zo{ հ݂Y;:mӟo?~drr`فg(;g(GmȐ<ǖJ~r" ggggggg.eiΣhMp*S,JeU* RYLʂkꓶE?:#jꨦ:jꨦjQ5- lc 1÷b؎5̯͢E~nk&;C6ktyBvRY@W,[e:K=pe'܉r?.tTs`iɃ4ts <ʦ9'i4DNrOA {BQ{ȽGr'QӜ !~r?AInj4']AjvQj5>վQ:9?1Y4g|ZZA> a0g3 fCw]䚶f3M66vvM3n²MhW{D3@3=fz16lMeo*6q%#a0d&d&d&dыAU'㣾LC!S吩rT9f3Un2UN}rofn֕5Қ`i-6ZZ-k,W" Z#ڠu#6kU KK;+misZU҈p$  G ᆀpC@xNN6,gT<?PWpL\&B.!DDe/dz|_5S7j摂y4<`-46GͣḳW<%nWkՊ+a00C0#4c44ScgCX+/Am7:wPhjA}DP!ԧYΰUTge7*Θs\Fer\F ˔zbZ2^rӨɺrT5Қ`i-6ZZ-k,Whbvjv[XX!XZ1Z ZکҖFeh̪@.#2pa0\FLYozpǯuLP c 1H$F# ){sh)5S>>>>Ƭ>Ƭ>Ƭ>6Y=5W{D3@3=fz16lnt-eTcTcTcTc&SM2ҲL-5ZOB'!㓐I$f|3>i2>/Or' Ƚ ro(ʽk#( DB"!H@$f 3i2;݉RYd 3 D D D D2/dyBw_`aHHHHHHb2/Or' Ƚ ro(ʽk#( $ $ $ $ $ $ $1ɝD,2333d @$ /P5}X+pZ<: ogE\`=O~P?nzɁe CdvH~/ɏ%RO[W5,,,,,,,Hrɢ|xEh*S,JeU*RYHbTT^FEDhΣΈjꨦ:jꨦ:髜O!͝E)+ߎ˶RڿY-x[sgF0g١88Z@,[Te>:vb-׉c673}ep=7^̋[œI)Ƚro[(6ʽr'u\U]g~r?܏Q'(S#r/Tc˅\+KAW;xW{yE'?\~5o.^@^q{Ue_?3!Av0;d2KrZ6h$ y` 0&G ͣAyTzˋY k555555k8+m N?|wqK:^.J^G7Wp *ff6ny7*IT80L#ST82nJ[OXϫ3qSKed4̣hy<:h]cQ4:"k6+/mt6z6z6z6z6z6zjlcBc0OOGđ?qßO'Oeeɻ2FmQW~.D@z" =IO'2CYpf" 5%I$b!1DHL"CL6Bk4B)@x}W^`/`/`/Gh/h/'h/^JK`-"7_NBRDHn"$7ȐȐȐ(Gn"74kEɗuEZy$' Iy@$' ÓhG & `8@& `p汁+|;%d/%8& `9@& Jr0?LPQ >`jT=RT7UJJ(R VUY +劑rHb\\1mBAi摂y4<`-46GͣḳGQdqk !1 話ѳ6ǹhe֠TA;]>A}SiXnDd`*"Hd*D" S>\Kr' Ƚ ro(ʽk#{?+ _d2[ Vbf+1JٖyzUgk5ٚlMlMlMlM5/zDϳ o‰r?*UM gk dk dk dk fk fk fk+ɝ䞂 &Ƚro;({zrwꞬݥ{&$$$$$$&)+ޓ}]mUv@j%P#^Տ3/\~d3_5s -{VNv?oXv!";Af2Qd059~l'-Ы~~~~~~~YgAD4sQ4_RY8TP*T,JeAUlT 2! yQMuTSTG5QMuTSTG5}E[d)VE)+ߎw.Ah j!_'>\__\/&-cx7I~vxu59}v8gf=[3Og~_xݟuYf9Y"3ܛ]͌`֩g3`=u3̯;uxm_nݍsF~E= Ywuuq}qyۗğwLwy__|o Page Redirection If you are not redirected automatically, follow the link to English or Russian version. mathgl-8.0.1/texinfo/example_en.texi0000664000175000017500000041044314167366465017276 0ustar balakinbalakin@c ------------------------------------------------------------------ @chapter MathGL examples @nav{} This chapter contain information about basic and advanced MathGL, hints and samples for all types of graphics. I recommend you read first 2 sections one after another and at least look on @ref{Hints} section. Also I recommend you to look at @ref{General concepts} and @ref{FAQ}. Note, that MathGL v.2.* have only 2 end-user interfaces: one for C/Fortran and similar languages which don't support classes, another one for C++/Python/Octave and similar languages which support classes. So, most of samples placed in this chapter can be run as is (after minor changes due to different syntaxes for different languages). For example, the C++ code @verbatim #include int main() { mglGraph gr; gr.FPlot("sin(pi*x)"); gr.WriteFrame("test.png"); } @end verbatim in Python will be as @verbatim from mathgl import * gr = mglGraph(); gr.FPlot("sin(pi*x)"); gr.WriteFrame("test.png"); @end verbatim in Octave will be as (you need first execute @code{mathgl;} in newer Octave versions) @c (install MathGL package by command @code{octave:1> pkg install /usr/share/mathgl/octave/mathgl.tar.gz} from @code{sudo octave}) @verbatim gr = mglGraph(); gr.FPlot("sin(pi*x)"); gr.WriteFrame("test.png"); @end verbatim in C will be as @verbatim #include int main() { HMGL gr = mgl_create_graph(600,400); mgl_fplot(gr,"sin(pi*x)","",""); mgl_write_frame(gr,"test.png",""); mgl_delete_graph(gr); } @end verbatim in Fortran will be as @verbatim integer gr, mgl_create_graph gr = mgl_create_graph(600,400); call mgl_fplot(gr,'sin(pi*x)','',''); call mgl_write_frame(gr,'test.png',''); call mgl_delete_graph(gr); @end verbatim and so on. @menu * Basic usage:: * Advanced usage:: * Data handling:: * Data plotting:: * Hints:: * FAQ:: @end menu @c ------------------------------------------------------------------ @external{} @node Basic usage, Advanced usage, , Examples @section Basic usage @nav{} MathGL library can be used by several manners. Each has positive and negative sides: @itemize @bullet @item @emph{Using of MathGL library features for creating graphical window (requires FLTK, Qt or GLUT libraries).} Positive side is the possibility to view the plot at once and to modify it (rotate, zoom or switch on transparency or lighting) by hand or by mouse. Negative sides are: the need of X-terminal and limitation consisting in working with the only one set of data at a time. @item @emph{Direct writing to file in bitmap or vector format without creation of graphical window.} Positive aspects are: batch processing of similar data set (for example, a set of resulting data files for different calculation parameters), running from the console program (including the cluster calculation), fast and automated drawing, saving pictures for further analysis (or demonstration). Negative sides are: the usage of the external program for picture viewing. Also, the data plotting is non-visual. So, you have to imagine the picture (view angles, lighting and so on) before the plotting. I recommend to use graphical window for determining the optimal parameters of plotting on the base of some typical data set. And later use these parameters for batch processing in console program. @item @emph{Drawing in memory with the following displaying by other graphical program.} In this case the programmer has more freedom in selecting the window libraries (not only FLTK, Qt or GLUT), in positioning and surroundings control and so on. I recommend to use such way for ``stand alone'' programs. @item @emph{Using FLTK or Qt widgets provided by MathGL} Here one can use a set of standard widgets which support export to many file formats, copying to clipboard, handle mouse and so on. @end itemize MathGL drawing can be created not only by object oriented languages (like, C++ or Python), but also by pure C or Fortran-like languages. The usage of last one is mostly identical to usage of classes (except the different function names). But there are some differences. C functions must have argument HMGL (for graphics) and/or HMDT (for data arrays) which specifies the object for drawing or manipulating (changing). Fortran users may regard these variables as integer. So, firstly the user has to create this object by function mgl_create_*() and has to delete it after the using by function mgl_delete_*(). @c Also, all arguments of C function have to be defined. So there are several functions with practically identical names doing practically the same. But some of them have simplified interface for the quick plotting and some of them have access to all plotting parameters for manual tunning. Let me consider the aforesaid in more detail. @menu * Using MathGL window:: * Drawing to file:: * Animation:: * Drawing in memory:: * Draw and calculate:: * Using QMathGL:: * OpenGL output:: * MathGL and PyQt:: * MathGL and MPI:: @end menu @c ------------------------------------------------------------------ @external{} @node Using MathGL window, Drawing to file, , Basic usage @subsection Using MathGL window @nav{} @cindex window @cindex widgets The ``interactive'' way of drawing in MathGL consists in window creation with help of class @code{mglQT}, @code{mglFLTK} or @code{mglGLUT} (see @ref{Widget classes}) and the following drawing in this window. There is a corresponding code: @verbatim #include int sample(mglGraph *gr) { gr->Rotate(60,40); gr->Box(); return 0; } //----------------------------------------------------- int main(int argc,char **argv) { mglQT gr(sample,"MathGL examples"); return gr.Run(); } @end verbatim Here callback function @code{sample} is defined. This function does all drawing. Other function @code{main} is entry point function for console program. For compilation, just execute the command @verbatim gcc test.cpp -lmgl-qt5 -lmgl @end verbatim You can use "-lmgl-qt4" instead of "-lmgl-qt5", if Qt4 is installed. Alternatively you can create yours own class inherited from @ref{mglDraw class} and re-implement the function @code{Draw()} in it: @verbatim #include class Foo : public mglDraw { public: int Draw(mglGraph *gr); }; //----------------------------------------------------- int Foo::Draw(mglGraph *gr) { gr->Rotate(60,40); gr->Box(); return 0; } //----------------------------------------------------- int main(int argc,char **argv) { Foo foo; mglQT gr(&foo,"MathGL examples"); return gr.Run(); } @end verbatim Or use pure C-functions: @verbatim #include int sample(HMGL gr, void *) { mgl_rotate(gr,60,40,0); mgl_box(gr); } int main(int argc,char **argv) { HMGL gr; gr = mgl_create_graph_qt(sample,"MathGL examples",0,0); return mgl_qt_run(); /* generally I should call mgl_delete_graph() here, * but I omit it in main() function. */ } @end verbatim The similar code can be written for @code{mglGLUT} window (function @code{sample()} is the same): @verbatim #include int main(int argc,char **argv) { mglGLUT gr(sample,"MathGL examples"); return 0; } @end verbatim The rotation, shift, zooming, switching on/off transparency and lighting can be done with help of tool-buttons (for @code{mglQT, mglFLTK}) or by hot-keys: @samp{a}, @samp{d}, @samp{w}, @samp{s} for plot rotation, @samp{r} and @samp{f} switching on/off transparency and lighting. Press @samp{x} for exit (or closing the window). In this example function @code{sample} rotates axes (@code{Rotate()}, @pxref{Subplots and rotation}) and draws the bounding box (@code{Box()}). Drawing is placed in separate function since it will be used on demand when window canvas needs to be redrawn. @c ------------------------------------------------------------------ @external{} @node Drawing to file, Animation, Using MathGL window, Basic usage @subsection Drawing to file @nav{} Another way of using MathGL library is the direct writing of the picture to the file. It is most usable for plot creation during long calculation or for using of small programs (like Matlab or Scilab scripts) for visualizing repetitive sets of data. But the speed of drawing is much higher in comparison with a script language. The following code produces a bitmap PNG picture: @verbatim #include int main(int ,char **) { mglGraph gr; gr.Alpha(true); gr.Light(true); sample(&gr); // The same drawing function. gr.WritePNG("test.png"); // Don't forget to save the result! return 0; } @end verbatim For compilation, you need only libmgl library not the one with widgets @verbatim gcc test.cpp -lmgl @end verbatim This can be important if you create a console program in computer/cluster where X-server (and widgets) is inaccessible. The only difference from the previous variant (using windows) is manual switching on the transparency @code{Alpha} and lightning @code{Light}, if you need it. The usage of frames (see @ref{Animation}) is not advisable since the whole image is prepared each time. If function @code{sample} contains frames then only last one will be saved to the file. In principle, one does not need to separate drawing functions in case of direct file writing in consequence of the single calling of this function for each picture. However, one may use the same drawing procedure to create a plot with changeable parameters, to export in different file types, to emphasize the drawing code and so on. So, in future I will put the drawing in the separate function. The code for export into other formats (for example, into vector EPS file) looks the same: @verbatim #include int main(int ,char **) { mglGraph gr; gr.Light(true); sample(&gr); // The same drawing function. gr.WriteEPS("test.eps"); // Don't forget to save the result! return 0; } @end verbatim The difference from the previous one is using other function @code{WriteEPS()} for EPS format instead of function @code{WritePNG()}. Also, there is no switching on of the plot transparency @code{Alpha} since EPS format does not support it. @c ------------------------------------------------------------------ @external{} @node Animation, Drawing in memory, Drawing to file, Basic usage @subsection Animation @nav{} Widget classes (@code{mglWindow}, @code{mglGLUT}) support a delayed drawing, when all plotting functions are called once at the beginning of writing to memory lists. Further program displays the saved lists faster. Resulting redrawing will be faster but it requires sufficient memory. Several lists (frames) can be displayed one after another (by pressing @samp{,}, @samp{.}) or run as cinema. To switch these feature on one needs to modify function @code{sample}: @verbatim int sample(mglGraph *gr) { gr->NewFrame(); // the first frame gr->Rotate(60,40); gr->Box(); gr->EndFrame(); // end of the first frame gr->NewFrame(); // the second frame gr->Box(); gr->Axis("xy"); gr->EndFrame(); // end of the second frame return gr->GetNumFrame(); // returns the frame number } @end verbatim First, the function creates a frame by calling @code{NewFrame()} for rotated axes and draws the bounding box. The function @code{EndFrame()} @strong{must be} called after the frame drawing! The second frame contains the bounding box and axes @code{Axis("xy")} in the initial (unrotated) coordinates. Function @code{sample} returns the number of created frames @code{GetNumFrame()}. Note, that animation can be also done as visualization of running calculations (see @ref{Draw and calculate}). Pictures with @strong{animation can be saved in file(s)} as well. You can: export in animated GIF, or save each frame in separate file (usually JPEG) and convert these files into the movie (for example, by help of ImageMagic). Let me show both methods. @anchor{GIF} The simplest methods is making animated GIF. There are 3 steps: (1) open GIF file by @code{StartGIF()} function; (2) create the frames by calling @code{NewFrame()} before and @code{EndFrame()} after plotting; (3) close GIF by @code{CloseGIF()} function. So the simplest code for ``running'' sinusoid will look like this: @verbatim #include int main(int ,char **) { mglGraph gr; mglData dat(100); char str[32]; gr.StartGIF("sample.gif"); for(int i=0;i<40;i++) { gr.NewFrame(); // start frame gr.Box(); // some plotting for(int j=0;j int main(int ,char **) { mglGraph gr; mglData dat(100); char str[32]; for(int i=0;i<40;i++) { gr.NewFrame(); // start frame gr.Box(); // some plotting for(int j=0;jGetSize(&x,&y); // gets a height of the toolbar if any wxPaintDC dc(this); // and draws it dc.DrawBitmap(wxBitmap(img),0,y); } @end verbatim The drawing in other libraries is most the same. For example, FLTK code will look like @verbatim void Fl_MyWidget::draw() { mglGraph gr(w(),h()); gr.Alpha(true); // draws something using MathGL gr.Light(true); sample(&gr,NULL); fl_draw_image(gr.GetRGB(), x(), y(), gr.GetWidth(), gr.GetHeight(), 3); } @end verbatim Qt code will look like @verbatim void MyWidget::paintEvent(QPaintEvent *) { mglGraph gr(w(),h()); gr.Alpha(true); // draws something using MathGL gr.Light(true); gr.Light(0,mglPoint(1,0,-1)); sample(&gr,NULL); // Qt don't support RGB format as is. So, let convert it to BGRN. long w=gr.GetWidth(), h=gr.GetHeight(); unsigned char *buf = new uchar[4*w*h]; gr.GetBGRN(buf, 4*w*h) QPixmap pic = QPixmap::fromImage(QImage(*buf, w, h, QImage::Format_RGB32)); QPainter paint; paint.begin(this); paint.drawPixmap(0,0,pic); paint.end(); delete []buf; } @end verbatim @c ------------------------------------------------------------------ @external{} @node Draw and calculate, Using QMathGL, Drawing in memory, Basic usage @subsection Draw and calculate @nav{} MathGL can be used to draw plots in parallel with some external calculations. The simplest way for this is the usage of @ref{mglDraw class}. At this you should enable pthread for widgets by setting @code{enable-pthr-widget=ON} at configure stage (it is set by default). First, you need to inherit you class from @code{mglDraw} class, define virtual members @code{Draw()} and @code{Calc()} which will draw the plot and proceed calculations. You may want to add the pointer @code{mglWnd *wnd;} to window with plot for interacting with them. Finally, you may add any other data or member functions. The sample class is shown below @verbatim class myDraw : public mglDraw { mglPoint pnt; // some variable for changeable data long i; // another variable to be shown mglWnd *wnd; // external window for plotting public: myDraw(mglWnd *w=0) : mglDraw() { wnd=w; } void SetWnd(mglWnd *w) { wnd=w; } int Draw(mglGraph *gr) { gr->Line(mglPoint(),pnt,"Ar2"); char str[16]; snprintf(str,15,"i=%ld",i); gr->Puts(mglPoint(),str); return 0; } void Calc() { for(i=0;;i++) // do calculation { long_calculations();// which can be very long Check(); // check if need pause pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1); if(wnd) wnd->Update(); } } } dr; @end verbatim There is only one issue here. Sometimes you may want to pause calculations to view result carefully, or save state, or change something. So, you need to provide a mechanism for pausing. Class @code{mglDraw} provide function @code{Check();} which check if toolbutton with pause is pressed and wait until it will be released. This function should be called in a "safety" places, where you can pause the calculation (for example, at the end of time step). Also you may add call @code{exit(0);} at the end of @code{Calc();} function for closing window and exit after finishing calculations. Finally, you need to create a window itself and run calculations. @verbatim int main(int argc,char **argv) { mglFLTK gr(&dr,"Multi-threading test"); // create window dr.SetWnd(&gr); // pass window pointer to yours class dr.Run(); // run calculations gr.Run(); // run event loop for window return 0; } @end verbatim Note, that you can reach the similar functionality without using @code{mglDraw} class (i.e. even for pure C code). @verbatim mglFLTK *gr=NULL; // pointer to window void *calc(void *) // function with calculations { mglPoint pnt; // some data for plot for(long i=0;;i++) // do calculation { long_calculations(); // which can be very long pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1); if(gr) { gr->Clf(); // make new drawing // draw something gr->Line(mglPoint(),pnt,"Ar2"); char str[16]; snprintf(str,15,"i=%ld",i); gr->Puts(mglPoint(),str); // don't forgot to update window gr->Update(); } } } int main(int argc,char **argv) { static pthread_t thr; pthread_create(&thr,0,calc,0); // create separate thread for calculations pthread_detach(thr); // and detach it gr = new mglFLTK; // now create window gr->Run(); // and run event loop return 0; } @end verbatim This sample is exactly the same as one with @code{mglDraw} class, but it don't have functionality for pausing calculations. If you need it then you have to create global mutex (like @code{pthread_mutex_t *mutex = pthread_mutex_init(&mutex,NULL);}), set it to window (like @code{gr->SetMutex(mutex);}) and periodically check it at calculations (like @code{pthread_mutex_lock(&mutex); pthread_mutex_unlock(&mutex);}). Finally, you can put the event-handling loop in separate instead of yours code by using @code{RunThr()} function instead of @code{Run()} one. Unfortunately, such method work well only for FLTK windows and only if pthread support was enabled. Such limitation come from the Qt requirement to be run in the primary thread only. The sample code will be: @verbatim int main(int argc,char **argv) { mglFLTK gr("test"); gr.RunThr(); // <-- need MathGL version which use pthread for widgets mglPoint pnt; // some data for(int i=0;i<10;i++) // do calculation { long_calculations();// which can be very long pnt.Set(2*mgl_rnd()-1,2*mgl_rnd()-1); gr.Clf(); // make new drawing gr.Line(mglPoint(),pnt,"Ar2"); char str[10] = "i=0"; str[3] = '0'+i; gr->Puts(mglPoint(),str); gr.Update(); // update window } return 0; // finish calculations and close the window } @end verbatim @c ------------------------------------------------------------------ @external{} @node Using QMathGL, OpenGL output, Draw and calculate, Basic usage @subsection Using QMathGL @nav{} MathGL have several interface widgets for different widget libraries. There are QMathGL for Qt, Fl_MathGL for FLTK. These classes provide control which display MathGL graphics. Unfortunately there is no uniform interface for widget classes because all libraries have slightly different set of functions, features and so on. However the usage of MathGL widgets is rather simple. Let me show it on the example of QMathGL. First of all you have to define the drawing function or inherit a class from @code{mglDraw} class. After it just create a window and setup QMathGL instance as any other Qt widget: @verbatim #include #include #include #include int main(int argc,char **argv) { QApplication a(argc,argv); QMainWindow *Wnd = new QMainWindow; Wnd->resize(810,610); // for fill up the QMGL, menu and toolbars Wnd->setWindowTitle("QMathGL sample"); // here I allow one to scroll QMathGL -- the case // then user want to prepare huge picture QScrollArea *scroll = new QScrollArea(Wnd); // Create and setup QMathGL QMathGL *QMGL = new QMathGL(Wnd); //QMGL->setPopup(popup); // if you want to setup popup menu for QMGL QMGL->setDraw(sample); // or use QMGL->setDraw(foo); for instance of class Foo:public mglDraw QMGL->update(); // continue other setup (menu, toolbar and so on) scroll->setWidget(QMGL); Wnd->setCentralWidget(scroll); Wnd->show(); return a.exec(); } @end verbatim @c ------------------------------------------------------------------ @external{} @node OpenGL output, MathGL and PyQt, Using QMathGL, Basic usage @subsection OpenGL output @nav{} MathGL have possibility to draw resulting plot using OpenGL. This produce resulting plot a bit faster, but with some limitations (especially at use of transparency and lighting). Generally, you need to prepare OpenGL window and call MathGL functions to draw it. There is GLUT interface (see @ref{Widget classes}) to do it by simple way. Below I show example of OpenGL usage basing on Qt libraries (i.e. by using @code{QGLWidget} widget). First, one need to define widget class derived from @code{QGLWidget} and implement a few methods: @code{resizeGL()} called after each window resize, @code{paintGL()} for displaying the image on the screen, and @code{initializeGL()} for initializing OpenGL. The header file looks as following. @verbatim #ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include class MainWindow : public QGLWidget { Q_OBJECT protected: mglGraph *gr; // pointer to MathGL core class void resizeGL(int nWidth, int nHeight); // Method called after each window resize void paintGL(); // Method to display the image on the screen void initializeGL(); // Method to initialize OpenGL public: MainWindow(QWidget *parent = 0); ~MainWindow(); }; #endif // MAINWINDOW_H @end verbatim The class implementation is rather straightforward. One need to recreate the instance of mglGraph at initializing OpenGL, and ask MathGL to use OpenGL output (set argument @code{1} in mglGraph constructor). Of course, the mglGraph object should be deleted at destruction. The method @code{resizeGL()} just pass new sizes to OpenGL and update viewport sizes. All plotting functions are located in the method @code{paintGL()}. At this, one need to add 2 calls: @code{gr->Clf()} at beginning for clearing previous OpenGL primitives; and @code{swapBuffers()} for showing output on the screen. The source file looks as following. @verbatim #include "qgl_example.h" #include //#include //----------------------------------------------------------------------------- MainWindow::MainWindow(QWidget *parent) : QGLWidget(parent) { gr=0; } //----------------------------------------------------------------------------- MainWindow::~MainWindow() { if(gr) delete gr; } //----------------------------------------------------------------------------- void MainWindow::initializeGL() // recreate instance of MathGL core { if(gr) delete gr; gr = new mglGraph(1); // use '1' for argument to force OpenGL output in MathGL } //----------------------------------------------------------------------------- void MainWindow::resizeGL(int w, int h) // standard resize replace { QGLWidget::resizeGL(w, h); glViewport (0, 0, w, h); } //----------------------------------------------------------------------------- void MainWindow::paintGL() // main drawing function { gr->Clf(); // clear previous OpenGL primitives gr->SubPlot(1,1,0); gr->Rotate(40,60); gr->Light(true); gr->AddLight(0,mglPoint(0,0,10),mglPoint(0,0,-1)); gr->Axis(); gr->Box(); gr->FPlot("sin(pi*x)","i2"); gr->FPlot("cos(pi*x)","|"); gr->FSurf("cos(2*pi*(x^2+y^2))"); gr->Finish(); swapBuffers(); // show output on the screen } //----------------------------------------------------------------------------- int main(int argc, char *argv[]) // create application { mgl_textdomain(argv?argv[0]:NULL,""); QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); } //----------------------------------------------------------------------------- @end verbatim @c ------------------------------------------------------------------ @external{} @node MathGL and PyQt, MathGL and MPI, OpenGL output, Basic usage @subsection MathGL and PyQt @nav{} Generally SWIG based classes (including the Python one) are the same as C++ classes. However, there are few tips for using MathGL with PyQt. Below I place a very simple python code which demonstrate how MathGL can be used with PyQt. This code is mostly written by Prof. Dr. Heino Falcke. You can just copy it to a file @code{mgl-pyqt-test.py} and execute it from python shell by command @code{execfile("mgl-pyqt-test.py")} @verbatim from PyQt4 import QtGui,QtCore from mathgl import * import sys app = QtGui.QApplication(sys.argv) qpointf=QtCore.QPointF() class hfQtPlot(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.img=(QtGui.QImage()) def setgraph(self,gr): self.buffer='\t' self.buffer=self.buffer.expandtabs(4*gr.GetWidth()*gr.GetHeight()) gr.GetBGRN(self.buffer,len(self.buffer)) self.img=QtGui.QImage(self.buffer, gr.GetWidth(),gr.GetHeight(),QtGui.QImage.Format_ARGB32) self.update() def paintEvent(self, event): paint = QtGui.QPainter() paint.begin(self) paint.drawImage(qpointf,self.img) paint.end() BackgroundColor=[1.0,1.0,1.0] size=100 gr=mglGraph() y=mglData(size) #y.Modify("((0.7*cos(2*pi*(x+.2)*500)+0.3)*(rnd*0.5+0.5)+362.135+10000.)") y.Modify("(cos(2*pi*x*10)+1.1)*1000.*rnd-501") x=mglData(size) x.Modify("x^2"); def plotpanel(gr,x,y,n): gr.SubPlot(2,2,n) gr.SetXRange(x) gr.SetYRange(y) gr.AdjustTicks() gr.Axis() gr.Box() gr.Label("x","x-Axis",1) gr.Label("y","y-Axis",1) gr.ClearLegend() gr.AddLegend("Legend: "+str(n),"k") gr.Legend() gr.Plot(x,y) gr.Clf(BackgroundColor[0],BackgroundColor[1],BackgroundColor[2]) gr.SetPlotFactor(1.5) plotpanel(gr,x,y,0) y.Modify("(cos(2*pi*x*10)+1.1)*1000.*rnd-501") plotpanel(gr,x,y,1) y.Modify("(cos(2*pi*x*10)+1.1)*1000.*rnd-501") plotpanel(gr,x,y,2) y.Modify("(cos(2*pi*x*10)+1.1)*1000.*rnd-501") plotpanel(gr,x,y,3) gr.WritePNG("test.png","Test Plot") qw = hfQtPlot() qw.show() qw.setgraph(gr) qw.raise_() @end verbatim @c ------------------------------------------------------------------ @external{} @node MathGL and MPI, , MathGL and PyQt, Basic usage @subsection MathGL and MPI @nav{} For using MathGL in MPI program you just need to: (1) plot its own part of data for each running node; (2) collect resulting graphical information in a single program (for example, at node with rank=0); (3) save it. The sample code below demonstrate this for very simple sample of surface drawing. First you need to initialize MPI @verbatim #include #include #include int main(int argc, char *argv[]) { // initialize MPI int rank=0, numproc=1; MPI_Init(&argc, &argv); MPI_Comm_size(MPI_COMM_WORLD,&numproc); MPI_Comm_rank(MPI_COMM_WORLD,&rank); if(rank==0) printf("Use %d processes.\n", numproc); @end verbatim Next step is data creation. For simplicity, I create data arrays with the same sizes for all nodes. At this, you have to create @code{mglGraph} object too. @verbatim // initialize data similarly for all nodes mglData a(128,256); mglGraphMPI gr; @end verbatim Now, data should be filled by numbers. In real case, it should be some kind of calculations. But I just fill it by formula. @verbatim // do the same plot for its own range char buf[64]; sprintf(buf,"xrange %g %g",2.*rank/numproc-1,2.*(rank+1)/numproc-1); gr.Fill(a,"sin(2*pi*x)",buf); @end verbatim It is time to plot the data. Don't forget to set proper axis range(s) by using parametric form or by using options (as in the sample). @verbatim // plot data in each node gr.Clf(); // clear image before making the image gr.Rotate(40,60); gr.Surf(a,"",buf); @end verbatim Finally, let send graphical information to node with rank=0. @verbatim // collect information if(rank!=0) gr.MPI_Send(0); else for(int i=1;iSubPlot(2,2,0); gr->Box(); gr->Puts(mglPoint(-1,1.1),"Just box",":L"); gr->InPlot(0.2,0.5,0.7,1,false); gr->Box(); gr->Puts(mglPoint(0,1.2),"InPlot example"); gr->SubPlot(2,2,1); gr->Title("Rotate only"); gr->Rotate(50,60); gr->Box(); gr->SubPlot(2,2,2); gr->Title("Rotate and Aspect"); gr->Rotate(50,60); gr->Aspect(1,1,2); gr->Box(); gr->SubPlot(2,2,3); gr->Title("Shear"); gr->Box("c"); gr->Shear(0.2,0.1); gr->Box(); return 0; } @end verbatim Here I used function @code{Puts} for printing the text in arbitrary position of picture (see @ref{Text printing}). Text coordinates and size are connected with axes. However, text coordinates may be everywhere, including the outside the bounding box. I'll show its features later in @ref{Text features}. @pfig{aspect, Example of several subplots on the single picture.} More complicated sample show how to use most of positioning functions: @verbatim int sample(mglGraph *gr) { gr->SubPlot(3,2,0); gr->Title("StickPlot"); gr->StickPlot(3, 0, 20, 30); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); gr->StickPlot(3, 1, 20, 30); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); gr->StickPlot(3, 2, 20, 30); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); gr->SubPlot(3,2,3,""); gr->Title("ColumnPlot"); gr->ColumnPlot(3, 0); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); gr->ColumnPlot(3, 1); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); gr->ColumnPlot(3, 2); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); gr->SubPlot(3,2,4,""); gr->Title("GridPlot"); gr->GridPlot(2, 2, 0); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); gr->GridPlot(2, 2, 1); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); gr->GridPlot(2, 2, 2); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); gr->GridPlot(2, 2, 3); gr->Box("m"); gr->Puts(mglPoint(0),"3","m"); gr->SubPlot(3,2,5,""); gr->Title("InPlot"); gr->Box(); gr->InPlot(0.4, 1, 0.6, 1, true); gr->Box("r"); gr->MultiPlot(3,2,1, 2, 1,""); gr->Title("MultiPlot and ShearPlot"); gr->Box(); gr->ShearPlot(3, 0, 0.2, 0.1); gr->Box("r"); gr->Puts(mglPoint(0),"0","r"); gr->ShearPlot(3, 1, 0.2, 0.1); gr->Box("g"); gr->Puts(mglPoint(0),"1","g"); gr->ShearPlot(3, 2, 0.2, 0.1); gr->Box("b"); gr->Puts(mglPoint(0),"2","b"); return 0; } @end verbatim @pfig{inplot, Example for most of positioning functions.} @c ------------------------------------------------------------------ @external{} @node Axis and ticks, Curvilinear coordinates, Subplots, Advanced usage @subsection Axis and ticks @nav{} MathGL library can draw not only the bounding box but also the axes, grids, labels and so on. The ranges of axes and their origin (the point of intersection) are determined by functions @code{SetRange()}, @code{SetRanges()}, @code{SetOrigin()} (see @ref{Ranges (bounding box)}). Ticks on axis are specified by function @code{SetTicks}, @code{SetTicksVal}, @code{SetTicksTime} (see @ref{Ticks}). But usually Function @ref{axis} draws axes. Its textual string shows in which directions the axis or axes will be drawn (by default @code{"xyz"}, function draws axes in all directions). Function @ref{grid} draws grid perpendicularly to specified directions. Example of axes and grid drawing is: @verbatim int sample(mglGraph *gr) { gr->SubPlot(2,2,0); gr->Title("Axis origin, Grid"); gr->SetOrigin(0,0); gr->Axis(); gr->Grid(); gr->FPlot("x^3"); gr->SubPlot(2,2,1); gr->Title("2 axis"); gr->SetRanges(-1,1,-1,1); gr->SetOrigin(-1,-1,-1); // first axis gr->Axis(); gr->Label('y',"axis 1",0); gr->FPlot("sin(pi*x)"); gr->SetRanges(0,1,0,1); gr->SetOrigin(1,1,1); // second axis gr->Axis(); gr->Label('y',"axis 2",0); gr->FPlot("cos(pi*x)"); gr->SubPlot(2,2,3); gr->Title("More axis"); gr->SetOrigin(NAN,NAN); gr->SetRange('x',-1,1); gr->Axis(); gr->Label('x',"x",0); gr->Label('y',"y_1",0); gr->FPlot("x^2","k"); gr->SetRanges(-1,1,-1,1); gr->SetOrigin(-1.3,-1); // second axis gr->Axis("y","r"); gr->Label('y',"#r{y_2}",0.2); gr->FPlot("x^3","r"); gr->SubPlot(2,2,2); gr->Title("4 segments, inverted axis"); gr->SetOrigin(0,0); gr->InPlot(0.5,1,0.5,1); gr->SetRanges(0,10,0,2); gr->Axis(); gr->FPlot("sqrt(x/2)"); gr->Label('x',"W",1); gr->Label('y',"U",1); gr->InPlot(0,0.5,0.5,1); gr->SetRanges(1,0,0,2); gr->Axis("x"); gr->FPlot("sqrt(x)+x^3"); gr->Label('x',"\\tau",-1); gr->InPlot(0.5,1,0,0.5); gr->SetRanges(0,10,4,0); gr->Axis("y"); gr->FPlot("x/4"); gr->Label('y',"L",-1); gr->InPlot(0,0.5,0,0.5); gr->SetRanges(1,0,4,0); gr->FPlot("4*x^2"); return 0; } @end verbatim Note, that MathGL can draw not only single axis (which is default). But also several axis on the plot (see right plots). The idea is that the change of settings does not influence on the already drawn graphics. So, for 2-axes I setup the first axis and draw everything concerning it. Then I setup the second axis and draw things for the second axis. Generally, the similar idea allows one to draw rather complicated plot of 4 axis with different ranges (see bottom left plot). At this inverted axis can be created by 2 methods. First one is used in this sample -- just specify minimal axis value to be large than maximal one. This method work well for 2D axis, but can wrongly place labels in 3D case. Second method is more general and work in 3D case too -- just use @ref{aspect} function with negative arguments. For example, following code will produce exactly the same result for 2D case, but 2nd variant will look better in 3D. @verbatim // variant 1 gr->SetRanges(0,10,4,0); gr->Axis(); // variant 2 gr->SetRanges(0,10,0,4); gr->Aspect(1,-1); gr->Axis(); @end verbatim @pfig{axis, Example of axis.} Another MathGL feature is fine ticks tunning. By default (if it is not changed by @code{SetTicks} function), MathGL try to adjust ticks positioning, so that they looks most human readable. At this, MathGL try to extract common factor for too large or too small axis ranges, as well as for too narrow ranges. Last one is non-common notation and can be disabled by @code{SetTuneTicks} function. Also, one can specify its own ticks with arbitrary labels by help of @code{SetTicksVal} function. Or one can set ticks in time format. In last case MathGL will try to select optimal format for labels with automatic switching between years, months/days, hours/minutes/seconds or microseconds. However, you can specify its own time representation using formats described in @url{http://www.manpagez.com/man/3/strftime/}. Most common variants are @samp{%X} for national representation of time, @samp{%x} for national representation of date, @samp{%Y} for year with century. The sample code, demonstrated ticks feature is @verbatim int sample(mglGraph *gr) { gr->SubPlot(3,3,0); gr->Title("Usual axis"); gr->Axis(); gr->SubPlot(3,3,1); gr->Title("Too big/small range"); gr->SetRanges(-1000,1000,0,0.001); gr->Axis(); gr->SubPlot(3,3,2); gr->Title("LaTeX-like labels"); gr->Axis("F!"); gr->SubPlot(3,3,3); gr->Title("Too narrow range"); gr->SetRanges(100,100.1,10,10.01); gr->Axis(); gr->SubPlot(3,3,4); gr->Title("No tuning, manual '+'"); // for version<2.3 you need first call gr->SetTuneTicks(0); gr->Axis("+!"); gr->SubPlot(3,3,5); gr->Title("Template for ticks"); gr->SetTickTempl('x',"xxx:%g"); gr->SetTickTempl('y',"y:%g"); gr->Axis(); // now switch it off for other plots gr->SetTickTempl('x',""); gr->SetTickTempl('y',""); gr->SubPlot(3,3,6); gr->Title("No tuning, higher precision"); gr->Axis("!4"); gr->SubPlot(3,3,7); gr->Title("Manual ticks"); gr->SetRanges(-M_PI,M_PI, 0, 2); gr->SetTicks('x',M_PI,0,0,"\\pi"); gr->AddTick('x',0.886,"x^*"); // alternatively you can use following lines //double val[]={-M_PI, -M_PI/2, 0, 0.886, M_PI/2, M_PI}; //gr->SetTicksVal('x', mglData(6,val), "-\\pi\n-\\pi/2\n0\nx^*\n\\pi/2\n\\pi"); gr->Axis(); gr->Grid(); gr->FPlot("2*cos(x^2)^2", "r2"); gr->SubPlot(3,3,8); gr->Title("Time ticks"); gr->SetRange('x',0,3e5); gr->SetTicksTime('x',0); gr->Axis(); } @end verbatim @pfig{ticks, Features of axis ticks.} The last sample I want to show in this subsection is Log-axis. From MathGL's point of view, the log-axis is particular case of general curvilinear coordinates. So, we need first define new coordinates (see also @ref{Curvilinear coordinates}) by help of @code{SetFunc} or @code{SetCoor} functions. At this one should wary about proper axis range. So the code looks as following: @verbatim int sample(mglGraph *gr) { gr->SubPlot(2,2,0,"<_"); gr->Title("Semi-log axis"); gr->SetRanges(0.01,100,-1,1); gr->SetFunc("lg(x)",""); gr->Axis(); gr->Grid("xy","g"); gr->FPlot("sin(1/x)"); gr->Label('x',"x",0); gr->Label('y', "y = sin 1/x",0); gr->SubPlot(2,2,1,"<_"); gr->Title("Log-log axis"); gr->SetRanges(0.01,100,0.1,100); gr->SetFunc("lg(x)","lg(y)"); gr->Axis(); gr->Grid("!","h="); gr->Grid(); gr->FPlot("sqrt(1+x^2)"); gr->Label('x',"x",0); gr->Label('y', "y = \\sqrt{1+x^2}",0); gr->SubPlot(2,2,2,"<_"); gr->Title("Minus-log axis"); gr->SetRanges(-100,-0.01,-100,-0.1); gr->SetFunc("-lg(-x)","-lg(-y)"); gr->Axis(); gr->FPlot("-sqrt(1+x^2)"); gr->Label('x',"x",0); gr->Label('y', "y = -\\sqrt{1+x^2}",0); gr->SubPlot(2,2,3,"<_"); gr->Title("Log-ticks"); gr->SetRanges(0.1,100,0,100); gr->SetFunc("sqrt(x)",""); gr->Axis(); gr->FPlot("x"); gr->Label('x',"x",1); gr->Label('y', "y = x",0); return 0; } @end verbatim @pfig{loglog, Features of axis ticks.} You can see that MathGL automatically switch to log-ticks as we define log-axis formula (in difference from v.1.*). Moreover, it switch to log-ticks for any formula if axis range will be large enough (see right bottom plot). Another interesting feature is that you not necessary define usual log-axis (i.e. when coordinates are positive), but you can define ``minus-log'' axis when coordinate is negative (see left bottom plot). @c ------------------------------------------------------------------ @external{} @node Curvilinear coordinates, Colorbars, Axis and ticks, Advanced usage @subsection Curvilinear coordinates @nav{} As I noted in previous subsection, MathGL support curvilinear coordinates. In difference from other plotting programs and libraries, MathGL uses textual formulas for connection of the old (data) and new (output) coordinates. This allows one to plot in arbitrary coordinates. The following code plots the line @var{y}=0, @var{z}=0 in Cartesian, polar, parabolic and spiral coordinates: @verbatim int sample(mglGraph *gr) { gr->SetOrigin(-1,1,-1); gr->SubPlot(2,2,0); gr->Title("Cartesian"); gr->Rotate(50,60); gr->FPlot("2*t-1","0.5","0","r2"); gr->Axis(); gr->Grid(); gr->SetFunc("y*sin(pi*x)","y*cos(pi*x)",0); gr->SubPlot(2,2,1); gr->Title("Cylindrical"); gr->Rotate(50,60); gr->FPlot("2*t-1","0.5","0","r2"); gr->Axis(); gr->Grid(); gr->SetFunc("2*y*x","y*y - x*x",0); gr->SubPlot(2,2,2); gr->Title("Parabolic"); gr->Rotate(50,60); gr->FPlot("2*t-1","0.5","0","r2"); gr->Axis(); gr->Grid(); gr->SetFunc("y*sin(pi*x)","y*cos(pi*x)","x+z"); gr->SubPlot(2,2,3); gr->Title("Spiral"); gr->Rotate(50,60); gr->FPlot("2*t-1","0.5","0","r2"); gr->Axis(); gr->Grid(); gr->SetFunc(0,0,0); // set to default Cartesian return 0; } @end verbatim @pfig{curvcoor, Example of curvilinear coordinates} @c ------------------------------------------------------------------ @external{} @node Colorbars, Bounding box, Curvilinear coordinates, Advanced usage @subsection Colorbars @nav{} MathGL handle @ref{colorbar} as special kind of axis. So, most of functions for axis and ticks setup will work for colorbar too. Colorbars can be in log-scale, and generally as arbitrary function scale; common factor of colorbar labels can be separated; and so on. But of course, there are differences -- colorbars usually located out of bounding box. At this, colorbars can be at subplot boundaries (by default), or at bounding box (if symbol @samp{I} is specified). Colorbars can handle sharp colors. And they can be located at arbitrary position too. The sample code, which demonstrate colorbar features is: @verbatim int sample(mglGraph *gr) { gr->SubPlot(2,2,0); gr->Title("Colorbar out of box"); gr->Box(); gr->Colorbar("<"); gr->Colorbar(">"); gr->Colorbar("_"); gr->Colorbar("^"); gr->SubPlot(2,2,1); gr->Title("Colorbar near box"); gr->Box(); gr->Colorbar("Colorbar(">I"); gr->Colorbar("_I"); gr->Colorbar("^I"); gr->SubPlot(2,2,2); gr->Title("manual colors"); mglData a,v; mgls_prepare2d(&a,0,&v); gr->Box(); gr->ContD(v,a); gr->Colorbar(v,"<"); gr->Colorbar(v,">"); gr->Colorbar(v,"_"); gr->Colorbar(v,"^"); gr->SubPlot(2,2,3); gr->Title(" "); gr->Puts(mglPoint(-0.5,1.55),"Color positions",":C",-2); gr->Colorbar("bwr>",0.25,0); gr->Puts(mglPoint(-0.9,1.2),"Default"); gr->Colorbar("b{w,0.3}r>",0.5,0); gr->Puts(mglPoint(-0.1,1.2),"Manual"); gr->Puts(mglPoint(1,1.55),"log-scale",":C",-2); gr->SetRange('c',0.01,1e3); gr->Colorbar(">",0.75,0); gr->Puts(mglPoint(0.65,1.2),"Normal scale"); gr->SetFunc("","","","lg(c)"); gr->Colorbar(">"); gr->Puts(mglPoint(1.35,1.2),"Log scale"); return 0; } @end verbatim @pfig{colorbar, Example of colorbars} @c ------------------------------------------------------------------ @external{} @node Bounding box, Ternary axis, Colorbars, Advanced usage @subsection Bounding box @nav{} Box around the plot is rather useful thing because it allows one to: see the plot boundaries, and better estimate points position since box contain another set of ticks. MathGL provide special function for drawing such box -- @ref{box} function. By default, it draw black or white box with ticks (color depend on transparency type, see @ref{Types of transparency}). However, you can change the color of box, or add drawing of rectangles at rear faces of box. Also you can disable ticks drawing, but I don't know why anybody will want it. The sample code, which demonstrate @ref{box} features is: @verbatim int sample(mglGraph *gr) { gr->SubPlot(2,2,0); gr->Title("Box (default)"); gr->Rotate(50,60); gr->Box(); gr->SubPlot(2,2,1); gr->Title("colored"); gr->Rotate(50,60); gr->Box("r"); gr->SubPlot(2,2,2); gr->Title("with faces"); gr->Rotate(50,60); gr->Box("@"); gr->SubPlot(2,2,3); gr->Title("both"); gr->Rotate(50,60); gr->Box("@cm"); return 0; } @end verbatim @pfig{box, Example of Box()} @c ------------------------------------------------------------------ @external{} @node Ternary axis, Text features, Bounding box, Advanced usage @subsection Ternary axis @nav{} There are another unusual axis types which are supported by MathGL. These are ternary and quaternary axis. Ternary axis is special axis of 3 coordinates @var{a}, @var{b}, @var{c} which satisfy relation @var{a}+@var{b}+@var{c}=1. Correspondingly, quaternary axis is special axis of 4 coordinates @var{a}, @var{b}, @var{c}, @var{d} which satisfy relation @var{a}+@var{b}+@var{c}+@var{d}=1. Generally speaking, only 2 of coordinates (3 for quaternary) are independent. So, MathGL just introduce some special transformation formulas which treat @var{a} as @samp{x}, @var{b} as @samp{y} (and @var{c} as @samp{z} for quaternary). As result, all plotting functions (curves, surfaces, contours and so on) work as usual, but in new axis. You should use @ref{ternary} function for switching to ternary/quaternary coordinates. The sample code is: @verbatim int sample(mglGraph *gr) { gr->SetRanges(0,1,0,1,0,1); mglData x(50),y(50),z(50),rx(10),ry(10), a(20,30); a.Modify("30*x*y*(1-x-y)^2*(x+y<1)"); x.Modify("0.25*(1+cos(2*pi*x))"); y.Modify("0.25*(1+sin(2*pi*x))"); rx.Modify("rnd"); ry.Modify("(1-v)*rnd",rx); z.Modify("x"); gr->SubPlot(2,2,0); gr->Title("Ordinary axis 3D"); gr->Rotate(50,60); gr->Light(true); gr->Plot(x,y,z,"r2"); gr->Surf(a,"BbcyrR#"); gr->Axis(); gr->Grid(); gr->Box(); gr->Label('x',"B",1); gr->Label('y',"C",1); gr->Label('z',"Z",1); gr->SubPlot(2,2,1); gr->Title("Ternary axis (x+y+t=1)"); gr->Ternary(1); gr->Plot(x,y,"r2"); gr->Plot(rx,ry,"q^ "); gr->Cont(a,"BbcyrR"); gr->Line(mglPoint(0.5,0), mglPoint(0,0.75), "g2"); gr->Axis(); gr->Grid("xyz","B;"); gr->Label('x',"B"); gr->Label('y',"C"); gr->Label('t',"A"); gr->SubPlot(2,2,2); gr->Title("Quaternary axis 3D"); gr->Rotate(50,60); gr->Light(true); gr->Ternary(2); gr->Plot(x,y,z,"r2"); gr->Surf(a,"BbcyrR#"); gr->Axis(); gr->Grid(); gr->Box(); gr->Label('t',"A",1); gr->Label('x',"B",1); gr->Label('y',"C",1); gr->Label('z',"D",1); gr->SubPlot(2,2,3); gr->Title("Ternary axis 3D"); gr->Rotate(50,60); gr->Light(true); gr->Ternary(1); gr->Plot(x,y,z,"r2"); gr->Surf(a,"BbcyrR#"); gr->Axis(); gr->Grid(); gr->Box(); gr->Label('t',"A",1); gr->Label('x',"B",1); gr->Label('y',"C",1); gr->Label('z',"Z",1); return 0; } @end verbatim @pfig{ternary, Example of colorbars} @c ------------------------------------------------------------------ @external{} @node Text features, Legend sample, Ternary axis, Advanced usage @subsection Text features @nav{} MathGL prints text by vector font. There are functions for manual specifying of text position (like @code{Puts}) and for its automatic selection (like @code{Label}, @code{Legend} and so on). MathGL prints text always in specified position even if it lies outside the bounding box. The default size of font is specified by functions @var{SetFontSize*} (see @ref{Font settings}). However, the actual size of output string depends on subplot size (depends on functions @code{SubPlot}, @code{InPlot}). The switching of the font style (italic, bold, wire and so on) can be done for the whole string (by function parameter) or inside the string. By default MathGL parses TeX-like commands for symbols and indexes (see @ref{Font styles}). Text can be printed as usual one (from left to right), along some direction (rotated text), or along a curve. Text can be printed on several lines, divided by new line symbol @samp{\n}. Example of MathGL font drawing is: @verbatim int sample(mglGraph *gr) { gr->SubPlot(2,2,0,""); gr->Putsw(mglPoint(0,1),L"Text can be in ASCII and in Unicode"); gr->Puts(mglPoint(0,0.6),"It can be \\wire{wire}, \\big{big} or #r{colored}"); gr->Puts(mglPoint(0,0.2),"One can change style in string: " "\\b{bold}, \\i{italic, \\b{both}}"); gr->Puts(mglPoint(0,-0.2),"Easy to \\a{overline} or " "\\u{underline}"); gr->Puts(mglPoint(0,-0.6),"Easy to change indexes ^{up} _{down} @{center}"); gr->Puts(mglPoint(0,-1),"It parse TeX: \\int \\alpha \\cdot " "\\sqrt3{sin(\\pi x)^2 + \\gamma_{i_k}} dx"); gr->SubPlot(2,2,1,""); gr->Puts(mglPoint(0,0.5), "\\sqrt{\\frac{\\alpha^{\\gamma^2}+\\overset 1{\\big\\infty}}{\\sqrt3{2+b}}}", "@", -4); gr->Puts(mglPoint(0,-0.5),"Text can be printed\non several lines"); gr->SubPlot(2,2,2,""); mglData y; mgls_prepare1d(&y); gr->Box(); gr->Plot(y.SubData(-1,0)); gr->Text(y,"This is very very long string drawn along a curve",":k"); gr->Text(y,"Another string drawn under a curve","T:r"); gr->SubPlot(2,2,3,""); gr->Line(mglPoint(-1,-1),mglPoint(1,-1),"rA"); gr->Puts(mglPoint(0,-1),mglPoint(1,-1),"Horizontal"); gr->Line(mglPoint(-1,-1),mglPoint(1,1),"rA"); gr->Puts(mglPoint(0,0),mglPoint(1,1),"At angle","@"); gr->Line(mglPoint(-1,-1),mglPoint(-1,1),"rA"); gr->Puts(mglPoint(-1,0),mglPoint(-1,1),"Vertical"); return 0; } @end verbatim @pfig{text, Example of text printing} You can change font faces by loading font files by function @ref{loadfont}. Note, that this is long-run procedure. Font faces can be downloaded from @uref{http://mathgl.sourceforge.net/download.html, MathGL website} or from @uref{http://sourceforge.net/project/showfiles.php?group_id=152187&package_id=267177, here}. The sample code is: @verbatim int sample(mglGraph *gr) { double h=1.1, d=0.25; gr->LoadFont("STIX"); gr->Puts(mglPoint(0,h), "default font (STIX)"); gr->LoadFont("adventor"); gr->Puts(mglPoint(0,h-d), "adventor font"); gr->LoadFont("bonum"); gr->Puts(mglPoint(0,h-2*d), "bonum font"); gr->LoadFont("chorus"); gr->Puts(mglPoint(0,h-3*d), "chorus font"); gr->LoadFont("cursor"); gr->Puts(mglPoint(0,h-4*d), "cursor font"); gr->LoadFont("heros"); gr->Puts(mglPoint(0,h-5*d), "heros font"); gr->LoadFont("heroscn"); gr->Puts(mglPoint(0,h-6*d), "heroscn font"); gr->LoadFont("pagella"); gr->Puts(mglPoint(0,h-7*d), "pagella font"); gr->LoadFont("schola"); gr->Puts(mglPoint(0,h-8*d), "schola font"); gr->LoadFont("termes"); gr->Puts(mglPoint(0,h-9*d), "termes font"); return 0; } @end verbatim @pfig{fonts, Example of font faces} @c ------------------------------------------------------------------ @external{} @node Legend sample, Cutting sample, Text features, Advanced usage @subsection Legend sample @nav{} Legend is one of standard ways to show plot annotations. Basically you need to connect the plot style (line style, marker and color) with some text. In MathGL, you can do it by 2 methods: manually using @ref{addlegend} function; or use @samp{legend} option (see @ref{Command options}), which will use last plot style. In both cases, legend entries will be added into internal accumulator, which later used for legend drawing itself. @ref{clearlegend} function allow you to remove all saved legend entries. There are 2 features. If plot style is empty then text will be printed without indent. If you want to plot the text with indent but without plot sample then you need to use space @samp{ } as plot style. Such style @samp{ } will draw a plot sample (line with marker(s)) which is invisible line (i.e. nothing) and print the text with indent as usual one. Function @ref{legend} draw legend on the plot. The position of the legend can be selected automatic or manually. You can change the size and style of text labels, as well as setup the plot sample. The sample code demonstrating legend features is: @verbatim int sample(mglGraph *gr) { gr->AddLegend("sin(\\pi {x^2})","b"); gr->AddLegend("sin(\\pi x)","g*"); gr->AddLegend("sin(\\pi \\sqrt{x})","rd"); gr->AddLegend("just text"," "); gr->AddLegend("no indent for this",""); gr->SubPlot(2,2,0,""); gr->Title("Legend (default)"); gr->Box(); gr->Legend(); gr->Legend(3,"A#"); gr->Puts(mglPoint(0.75,0.65),"Absolute position","A"); gr->SubPlot(2,2,2,""); gr->Title("coloring"); gr->Box(); gr->Legend(0,"r#"); gr->Legend(1,"Wb#"); gr->Legend(2,"ygr#"); gr->SubPlot(2,2,3,""); gr->Title("manual position"); gr->Box(); gr->Legend(0.5,1); gr->Puts(mglPoint(0.5,0.55),"at x=0.5, y=1","a"); gr->Legend(1,"#-"); gr->Puts(mglPoint(0.75,0.25),"Horizontal legend","a"); return 0; } @end verbatim @pfig{legend, Example of legend} @c ------------------------------------------------------------------ @external{} @node Cutting sample, , Legend sample, Advanced usage @subsection Cutting sample @nav{} The last common thing which I want to show in this section is how one can cut off points from plot. There are 4 mechanism for that. @itemize @bullet @item You can set one of coordinate to NAN value. All points with NAN values will be omitted. @item You can enable cutting at edges by @code{SetCut} function. As result all points out of bounding box will be omitted. @item You can set cutting box by @code{SetCutBox} function. All points inside this box will be omitted. @item You can define cutting formula by @code{SetCutOff} function. All points for which the value of formula is nonzero will be omitted. Note, that this is the slowest variant. @end itemize Below I place the code which demonstrate last 3 possibilities: @verbatim int sample(mglGraph *gr) { mglData a,c,v(1); mgls_prepare2d(&a); mgls_prepare3d(&c); v.a[0]=0.5; gr->SubPlot(2,2,0); gr->Title("Cut on (default)"); gr->Rotate(50,60); gr->Light(true); gr->Box(); gr->Surf(a,"","zrange -1 0.5"); gr->SubPlot(2,2,1); gr->Title("Cut off"); gr->Rotate(50,60); gr->Box(); gr->Surf(a,"","zrange -1 0.5; cut off"); gr->SubPlot(2,2,2); gr->Title("Cut in box"); gr->Rotate(50,60); gr->SetCutBox(mglPoint(0,-1,-1), mglPoint(1,0,1.1)); gr->Alpha(true); gr->Box(); gr->Surf3(c); gr->SetCutBox(mglPoint(0), mglPoint(0)); // switch it off gr->SubPlot(2,2,3); gr->Title("Cut by formula"); gr->Rotate(50,60); gr->CutOff("(z>(x+0.5*y-1)^2-1) & (z>(x-0.5*y-1)^2-1)"); gr->Box(); gr->Surf3(c); gr->CutOff(""); // switch it off return 0; } @end verbatim @pfig{cut, Example of point cutting} @c ------------------------------------------------------------------ @external{} @node Data handling, Data plotting, Advanced usage, Examples @section Data handling @nav{} Class @code{mglData} contains all functions for the data handling in MathGL (@pxref{Data processing}). There are several matters why I use class @code{mglData} but not a single array: it does not depend on type of data (mreal or double), sizes of data arrays are kept with data, memory working is simpler and safer. @menu * Array creation:: * Linking array:: * Change data:: @end menu @c ------------------------------------------------------------------ @external{} @node Array creation, Linking array, , Data handling @subsection Array creation @nav{} There are many ways in MathGL how data arrays can be created and filled. One can put the data in @code{mglData} instance by several ways. Let us do it for sinus function: @itemize @bullet @item one can create external array, fill it and put to @code{mglData} variable @verbatim double *a = new double[50]; for(int i=0;i<50;i++) a[i] = sin(M_PI*i/49.); mglData y; y.Set(a,50); @end verbatim @item another way is to create @code{mglData} instance of the desired size and then to work directly with data in this variable @verbatim mglData y(50); for(int i=0;i<50;i++) y.a[i] = sin(M_PI*i/49.); @end verbatim @item next way is to fill the data in @code{mglData} instance by textual formula with the help of @code{Modify()} function @verbatim mglData y(50); y.Modify("sin(pi*x)"); @end verbatim @item or one may fill the array in some interval and modify it later @verbatim mglData y(50); y.Fill(0,M_PI); y.Modify("sin(u)"); @end verbatim @item finally it can be loaded from file @verbatim FILE *fp=fopen("sin.dat","wt"); // create file first for(int i=0;i<50;i++) fprintf(fp,"%g\n",sin(M_PI*i/49.)); fclose(fp); mglData y("sin.dat"); // load it @end verbatim At this you can use textual or HDF files, as well as import values from bitmap image (PNG is supported right now). @item at this one can read only part of data @verbatim FILE *fp-fopen("sin.dat","wt"); // create large file first for(int i=0;i<70;i++) fprintf(fp,"%g\n",sin(M_PI*i/49.)); fclose(fp); mglData y; y.Read("sin.dat",50); // load it @end verbatim @end itemize Creation of 2d- and 3d-arrays is mostly the same. But one should keep in mind that class @code{mglData} uses flat data representation. For example, matrix 30*40 is presented as flat (1d-) array with length 30*40=1200 (nx=30, ny=40). The element with indexes @{i,j@} is a[i+nx*j]. So for 2d array we have: @verbatim mglData z(30,40); for(int i=0;i<30;i++) for(int j=0;j<40;j++) z.a[i+30*j] = sin(M_PI*i/29.)*sin(M_PI*j/39.); @end verbatim or by using @code{Modify()} function @verbatim mglData z(30,40); z.Modify("sin(pi*x)*cos(pi*y)"); @end verbatim The only non-obvious thing here is using multidimensional arrays in C/C++, i.e. arrays defined like @code{mreal dat[40][30];}. Since, formally these elements @code{dat[i]} can address the memory in arbitrary place you should use the proper function to convert such arrays to @code{mglData} object. For C++ this is functions like @code{mglData::Set(mreal **dat, int N1, int N2);}. For C this is functions like @code{mgl_data_set_mreal2(HMDT d, const mreal **dat, int N1, int N2);}. At this, you should keep in mind that @code{nx=N2} and @code{ny=N1} after conversion. @c ------------------------------------------------------------------ @external{} @node Linking array, Change data, Array creation, Data handling @subsection Linking array @nav{} Sometimes the data arrays are so large, that one couldn't' copy its values to another array (i.e. into mglData). In this case, he can define its own class derived from @code{mglDataA} (see @ref{mglDataA class}) or can use @code{Link} function. In last case, MathGL just save the link to an external data array, but not copy it. You should provide the existence of this data array for whole time during which MathGL can use it. Another point is that MathGL will automatically create new array if you'll try to modify data values by any of @code{mglData} functions. So, you should use only function with @code{const} modifier if you want still using link to the original data array. Creating the link is rather simple -- just the same as using @code{Set} function @verbatim double *a = new double[50]; for(int i=0;i<50;i++) a[i] = sin(M_PI*i/49.); mglData y; y.Link(a,50); @end verbatim @c ------------------------------------------------------------------ @external{} @node Change data, , Linking array, Data handling @subsection Change data @nav{} MathGL has functions for data processing: differentiating, integrating, smoothing and so on (for more detail, see @ref{Data processing}). Let us consider some examples. The simplest ones are integration and differentiation. The direction in which operation will be performed is specified by textual string, which may contain symbols @samp{x}, @samp{y} or @samp{z}. For example, the call of @code{Diff("x")} will differentiate data along @samp{x} direction; the call of @code{Integral("xy")} perform the double integration of data along @samp{x} and @samp{y} directions; the call of @code{Diff2("xyz")} will apply 3d Laplace operator to data and so on. Example of this operations on 2d array a=x*y is presented in code: @verbatim int sample(mglGraph *gr) { gr->SetRanges(0,1,0,1,0,1); mglData a(30,40); a.Modify("x*y"); gr->SubPlot(2,2,0); gr->Rotate(60,40); gr->Surf(a); gr->Box(); gr->Puts(mglPoint(0.7,1,1.2),"a(x,y)"); gr->SubPlot(2,2,1); gr->Rotate(60,40); a.Diff("x"); gr->Surf(a); gr->Box(); gr->Puts(mglPoint(0.7,1,1.2),"da/dx"); gr->SubPlot(2,2,2); gr->Rotate(60,40); a.Integral("xy"); gr->Surf(a); gr->Box(); gr->Puts(mglPoint(0.7,1,1.2),"\\int da/dx dxdy"); gr->SubPlot(2,2,3); gr->Rotate(60,40); a.Diff2("y"); gr->Surf(a); gr->Box(); gr->Puts(mglPoint(0.7,1,1.2),"\\int {d^2}a/dxdy dx"); return 0; } @end verbatim @pfig{dat_diff, Example of data differentiation and integration} Data smoothing (function @ref{smooth}) is more interesting and important. This function has single argument which define type of smoothing and its direction. Now 3 methods are supported: @samp{3} -- linear averaging by 3 points, @samp{5} -- linear averaging by 5 points, and default one -- quadratic averaging by 5 points. MathGL also have some amazing functions which is not so important for data processing as useful for data plotting. There are functions for finding envelope (useful for plotting rapidly oscillating data), for data sewing (useful to removing jumps on the phase), for data resizing (interpolation). Let me demonstrate it: @verbatim int sample(mglGraph *gr) { gr->SubPlot(2,2,0,""); gr->Title("Envelop sample"); mglData d1(1000); gr->Fill(d1,"exp(-8*x^2)*sin(10*pi*x)"); gr->Axis(); gr->Plot(d1, "b"); d1.Envelop('x'); gr->Plot(d1, "r"); gr->SubPlot(2,2,1,""); gr->Title("Smooth sample"); mglData y0(30),y1,y2,y3; gr->SetRanges(0,1,0,1); gr->Fill(y0, "0.4*sin(pi*x) + 0.3*cos(1.5*pi*x) - 0.4*sin(2*pi*x)+0.5*rnd"); y1=y0; y1.Smooth("x3"); y2=y0; y2.Smooth("x5"); y3=y0; y3.Smooth("x"); gr->Plot(y0,"{m7}:s", "legend 'none'"); //gr->AddLegend("none","k"); gr->Plot(y1,"r", "legend ''3' style'"); gr->Plot(y2,"g", "legend ''5' style'"); gr->Plot(y3,"b", "legend 'default'"); gr->Legend(); gr->Box(); gr->SubPlot(2,2,2); gr->Title("Sew sample"); mglData d2(100, 100); gr->Fill(d2, "mod((y^2-(1-x)^2)/2,0.1)"); gr->Rotate(50, 60); gr->Light(true); gr->Alpha(true); gr->Box(); gr->Surf(d2, "b"); d2.Sew("xy", 0.1); gr->Surf(d2, "r"); gr->SubPlot(2,2,3); gr->Title("Resize sample (interpolation)"); mglData x0(10), v0(10), x1, v1; gr->Fill(x0,"rnd"); gr->Fill(v0,"rnd"); x1 = x0.Resize(100); v1 = v0.Resize(100); gr->Plot(x0,v0,"b+ "); gr->Plot(x1,v1,"r-"); gr->Label(x0,v0,"%n"); return 0; } @end verbatim @pfig{dat_extra, Example of data manipulation} Also one can create new data arrays on base of the existing one: extract slice, row or column of data (@ref{subdata}), summarize along a direction(s) (@ref{sum}), find distribution of data elements (@ref{hist}) and so on. @anchor{Solve sample} Another interesting feature of MathGL is interpolation and root-finding. There are several functions for linear and cubic spline interpolation (see @ref{Interpolation}). Also there is a function @ref{evaluate} which do interpolation of data array for values of each data element of index data. It look as indirect access to the data elements. This function have inverse function @ref{solve} which find array of indexes at which data array is equal to given value (i.e. work as root finding). But @ref{solve} function have the issue -- usually multidimensional data (2d and 3d ones) have an infinite number of indexes which give some value. This is contour lines for 2d data, or isosurface(s) for 3d data. So, @ref{solve} function will return index only in given direction, assuming that other index(es) are the same as equidistant index(es) of original data. If data have multiple roots then second (and later) branches can be found by consecutive call(s) of @ref{solve} function. Let me demonstrate this on the following sample. @verbatim int sample(mglGraph *gr) { gr->SetRange('z',0,1); mglData x(20,30), y(20,30), z(20,30), xx,yy,zz; gr->Fill(x,"(x+2)/3*cos(pi*y)"); gr->Fill(y,"(x+2)/3*sin(pi*y)"); gr->Fill(z,"exp(-6*x^2-2*sin(pi*y)^2)"); gr->SubPlot(2,1,0); gr->Title("Cartesian space"); gr->Rotate(30,-40); gr->Axis("xyzU"); gr->Box(); gr->Label('x',"x"); gr->Label('y',"y"); gr->SetOrigin(1,1); gr->Grid("xy"); gr->Mesh(x,y,z); // section along 'x' direction mglData u = x.Solve(0.5,'x'); mglData v(u.nx); v.Fill(0,1); xx = x.Evaluate(u,v); yy = y.Evaluate(u,v); zz = z.Evaluate(u,v); gr->Plot(xx,yy,zz,"k2o"); // 1st section along 'y' direction mglData u1 = x.Solve(-0.5,'y'); mglData v1(u1.nx); v1.Fill(0,1); xx = x.Evaluate(v1,u1); yy = y.Evaluate(v1,u1); zz = z.Evaluate(v1,u1); gr->Plot(xx,yy,zz,"b2^"); // 2nd section along 'y' direction mglData u2 = x.Solve(-0.5,'y',u1); xx = x.Evaluate(v1,u2); yy = y.Evaluate(v1,u2); zz = z.Evaluate(v1,u2); gr->Plot(xx,yy,zz,"r2v"); gr->SubPlot(2,1,1); gr->Title("Accompanied space"); gr->SetRanges(0,1,0,1); gr->SetOrigin(0,0); gr->Axis(); gr->Box(); gr->Label('x',"i"); gr->Label('y',"j"); gr->Grid(z,"h"); gr->Plot(u,v,"k2o"); gr->Line(mglPoint(0.4,0.5),mglPoint(0.8,0.5),"kA"); gr->Plot(v1,u1,"b2^"); gr->Line(mglPoint(0.5,0.15),mglPoint(0.5,0.3),"bA"); gr->Plot(v1,u2,"r2v"); gr->Line(mglPoint(0.5,0.7),mglPoint(0.5,0.85),"rA"); } @end verbatim @pfig{solve, Example of data interpolation and root finding} @c ------------------------------------------------------------------ @external{} @node Data plotting, Hints, Data handling, Examples @section Data plotting @nav{} Let me now show how to plot the data. Next section will give much more examples for all plotting functions. Here I just show some basics. MathGL generally has 2 types of plotting functions. Simple variant requires a single data array for plotting, other data (coordinates) are considered uniformly distributed in axis range. Second variant requires data arrays for all coordinates. It allows one to plot rather complex multivalent curves and surfaces (in case of parametric dependencies). Usually each function have one textual argument for plot style and another textual argument for options (see @ref{Command options}). Note, that the call of drawing function adds something to picture but does not clear the previous plots (as it does in Matlab). Another difference from Matlab is that all setup (like transparency, lightning, axis borders and so on) must be specified @strong{before} plotting functions. Let start for plots for 1D data. Term ``1D data'' means that data depend on single index (parameter) like curve in parametric form @{x(i),y(i),z(i)@}, i=1...n. The textual argument allow you specify styles of line and marks (see @ref{Line styles}). If this parameter is @code{NULL} or empty then solid line with color from palette is used (see @ref{Palette and colors}). Below I shall show the features of 1D plotting on base of @ref{plot} function. Let us start from sinus plot: @verbatim int sample(mglGraph *gr) { mglData y0(50); y0.Modify("sin(pi*(2*x-1))"); gr->SubPlot(2,2,0); gr->Plot(y0); gr->Box(); @end verbatim Style of line is not specified in @ref{plot} function. So MathGL uses the solid line with first color of palette (this is blue). Next subplot shows array @var{y1} with 2 rows: @verbatim gr->SubPlot(2,2,1); mglData y1(50,2); y1.Modify("sin(pi*2*x-pi)"); y1.Modify("cos(pi*2*x-pi)/2",1); gr->Plot(y1); gr->Box(); @end verbatim As previously I did not specify the style of lines. As a result, MathGL again uses solid line with next colors in palette (there are green and red). Now let us plot a circle on the same subplot. The circle is parametric curve @math{x=cos(\pi t), y=sin(\pi t)}. I will set the color of the circle (dark yellow, @samp{Y}) and put marks @samp{+} at point position: @verbatim mglData x(50); x.Modify("cos(pi*2*x-pi)"); gr->Plot(x,y0,"Y+"); @end verbatim Note that solid line is used because I did not specify the type of line. The same picture can be achieved by @ref{plot} and @ref{subdata} functions. Let us draw ellipse by orange dash line: @verbatim gr->Plot(y1.SubData(-1,0),y1.SubData(-1,1),"q|"); @end verbatim Drawing in 3D space is mostly the same. Let us draw spiral with default line style. Now its color is 4-th color from palette (this is cyan): @verbatim gr->SubPlot(2,2,2); gr->Rotate(60,40); mglData z(50); z.Modify("2*x-1"); gr->Plot(x,y0,z); gr->Box(); @end verbatim Functions @ref{plot} and @ref{subdata} make 3D curve plot but for single array. Use it to put circle marks on the previous plot: @verbatim mglData y2(10,3); y2.Modify("cos(pi*(2*x-1+y))"); y2.Modify("2*x-1",2); gr->Plot(y2.SubData(-1,0),y2.SubData(-1,1),y2.SubData(-1,2),"bo "); @end verbatim Note that line style is empty @samp{ } here. Usage of other 1D plotting functions looks similar: @verbatim gr->SubPlot(2,2,3); gr->Rotate(60,40); gr->Bars(x,y0,z,"r"); gr->Box(); return 0; } @end verbatim Surfaces @ref{surf} and other 2D plots (@pxref{2D plotting}) are drown the same simpler as 1D one. The difference is that the string parameter specifies not the line style but the color scheme of the plot (see @ref{Color scheme}). Here I draw attention on 4 most interesting color schemes. There is gray scheme where color is changed from black to white (string @samp{kw}) or from white to black (string @samp{wk}). Another scheme is useful for accentuation of negative (by blue color) and positive (by red color) regions on plot (string @samp{"BbwrR"}). Last one is the popular ``jet'' scheme (string @samp{"BbcyrR"}). Now I shall show the example of a surface drawing. At first let us switch lightning on @verbatim int sample(mglGraph *gr) { gr->Light(true); gr->Light(0,mglPoint(0,0,1)); @end verbatim and draw the surface, considering coordinates x,y to be uniformly distributed in axis range @verbatim mglData a0(50,40); a0.Modify("0.6*sin(2*pi*x)*sin(3*pi*y)+0.4*cos(3*pi*(x*y))"); gr->SubPlot(2,2,0); gr->Rotate(60,40); gr->Surf(a0); gr->Box(); @end verbatim Color scheme was not specified. So previous color scheme is used. In this case it is default color scheme (``jet'') for the first plot. Next example is a sphere. The sphere is parametrically specified surface: @verbatim mglData x(50,40),y(50,40),z(50,40); x.Modify("0.8*sin(2*pi*x)*sin(pi*y)"); y.Modify("0.8*cos(2*pi*x)*sin(pi*y)"); z.Modify("0.8*cos(pi*y)"); gr->SubPlot(2,2,1); gr->Rotate(60,40); gr->Surf(x,y,z,"BbwrR");gr->Box(); @end verbatim I set color scheme to @code{"BbwrR"} that corresponds to red top and blue bottom of the sphere. Surfaces will be plotted for each of slice of the data if @var{nz}>1. Next example draws surfaces for data arrays with @var{nz}=3: @verbatim mglData a1(50,40,3); a1.Modify("0.6*sin(2*pi*x)*sin(3*pi*y)+0.4*cos(3*pi*(x*y))"); a1.Modify("0.6*cos(2*pi*x)*cos(3*pi*y)+0.4*sin(3*pi*(x*y))",1); a1.Modify("0.6*cos(2*pi*x)*cos(3*pi*y)+0.4*cos(3*pi*(x*y))",2); gr->SubPlot(2,2,2); gr->Rotate(60,40); gr->Alpha(true); gr->Surf(a1); gr->Box(); @end verbatim Note, that it may entail a confusion. However, if one will use density plot then the picture will look better: @verbatim gr->SubPlot(2,2,3); gr->Rotate(60,40); gr->Dens(a1); gr->Box(); return 0; } @end verbatim Drawing of other 2D plots is analogous. The only peculiarity is the usage of flag @samp{#}. By default this flag switches on the drawing of a grid on plot (@ref{grid} or @ref{mesh} for plots in plain or in volume). However, for isosurfaces (including surfaces of rotation @ref{axial}) this flag switches the face drawing off and figure becomes wired. The following code gives example of flag @samp{#} using (compare with normal function drawing as in its description): @verbatim int sample(mglGraph *gr) { gr->Alpha(true); gr->Light(true); gr->Light(0,mglPoint(0,0,1)); mglData a(30,20); a.Modify("0.6*sin(2*pi*x)*sin(3*pi*y) + 0.4*cos(3*pi*(x*y))"); gr->SubPlot(2,2,0); gr->Rotate(40,60); gr->Surf(a,"BbcyrR#"); gr->Box(); gr->SubPlot(2,2,1); gr->Rotate(40,60); gr->Dens(a,"BbcyrR#"); gr->Box(); gr->SubPlot(2,2,2); gr->Rotate(40,60); gr->Cont(a,"BbcyrR#"); gr->Box(); gr->SubPlot(2,2,3); gr->Rotate(40,60); gr->Axial(a,"BbcyrR#"); gr->Box(); return 0; } @end verbatim @c ------------------------------------------------------------------ @external{} @node Hints, FAQ, Data plotting, Examples @section Hints @nav{} In this section I've included some small hints and advices for the improving of the quality of plots and for the demonstration of some non-trivial features of MathGL library. In contrast to previous examples I showed mostly the idea but not the whole drawing function. @menu * ``Compound'' graphics:: * Transparency and lighting:: * Types of transparency:: * Axis projection:: * Adding fog:: * Lighting sample:: * Using primitives:: * STFA sample:: * Mapping visualization:: * Data interpolation:: * Making regular data:: * Making histogram:: * Nonlinear fitting hints:: * PDE solving hints:: * Drawing phase plain:: * Pulse properties:: * Using MGL parser:: * Using options:: * ``Templates'':: * Stereo image:: * Reduce memory usage:: * Saving and scanning file:: * Mixing bitmap and vector output:: @end menu @c ------------------------------------------------------------------ @external{} @node ``Compound'' graphics, Transparency and lighting, , Hints @subsection ``Compound'' graphics @nav{} As I noted above, MathGL functions (except the special one, like Clf()) do not erase the previous plotting but just add the new one. It allows one to draw ``compound'' plots easily. For example, popular Matlab command @code{surfc} can be emulated in MathGL by 2 calls: @verbatim Surf(a); Cont(a, "_"); // draw contours at bottom @end verbatim Here @var{a} is 2-dimensional data for the plotting, @code{-1} is the value of z-coordinate at which the contour should be plotted (at the bottom in this example). Analogously, one can draw density plot instead of contour lines and so on. Another nice plot is contour lines plotted directly on the surface: @verbatim Light(true); // switch on light for the surface Surf(a, "BbcyrR"); // select 'jet' colormap for the surface Cont(a, "y"); // and yellow color for contours @end verbatim The possible difficulties arise in black&white case, when the color of the surface can be close to the color of a contour line. In that case I may suggest the following code: @verbatim Light(true); // switch on light for the surface Surf(a, "kw"); // select 'gray' colormap for the surface CAxis(-1,0); // first draw for darker surface colors Cont(a, "w"); // white contours CAxis(0,1); // now draw for brighter surface colors Cont(a, "k"); // black contours CAxis(-1,1); // return color range to original state @end verbatim The idea is to divide the color range on 2 parts (dark and bright) and to select the contrasting color for contour lines for each of part. Similarly, one can plot flow thread over density plot of vector field amplitude (this is another amusing plot from Matlab) and so on. The list of compound graphics can be prolonged but I hope that the general idea is clear. Just for illustration I put here following sample code: @verbatim int sample(mglGraph *gr) { mglData a,b,d; mgls_prepare2v(&a,&b); d = a; for(int i=0;iSubPlot(2,2,1,""); gr->Title("Flow + Dens"); gr->Flow(a,b,"br"); gr->Dens(d,"BbcyrR"); gr->Box(); gr->SubPlot(2,2,0); gr->Title("Surf + Cont"); gr->Rotate(50,60); gr->Light(true); gr->Surf(a); gr->Cont(a,"y"); gr->Box(); gr->SubPlot(2,2,2); gr->Title("Mesh + Cont"); gr->Rotate(50,60); gr->Box(); gr->Mesh(a); gr->Cont(a,"_"); gr->SubPlot(2,2,3); gr->Title("Surf3 + ContF3");gr->Rotate(50,60); gr->Box(); gr->ContF3(v,c,"z",0); gr->ContF3(v,c,"x"); gr->ContF3(v,c); gr->SetCutBox(mglPoint(0,-1,-1), mglPoint(1,0,1.1)); gr->ContF3(v,c,"z",c.nz-1); gr->Surf3(-0.5,c); return 0; } @end verbatim @pfig{combined, Example of ``combined'' plots} @c ------------------------------------------------------------------ @external{} @node Transparency and lighting, Types of transparency, ``Compound'' graphics, Hints @subsection Transparency and lighting @nav{} Here I want to show how transparency and lighting both and separately change the look of a surface. So, there is code and picture for that: @verbatim int sample(mglGraph *gr) { mglData a; mgls_prepare2d(&a); gr->SubPlot(2,2,0); gr->Title("default"); gr->Rotate(50,60); gr->Box(); gr->Surf(a); gr->SubPlot(2,2,1); gr->Title("light on"); gr->Rotate(50,60); gr->Box(); gr->Light(true); gr->Surf(a); gr->SubPlot(2,2,3); gr->Title("alpha on; light on"); gr->Rotate(50,60); gr->Box(); gr->Alpha(true); gr->Surf(a); gr->SubPlot(2,2,2); gr->Title("alpha on"); gr->Rotate(50,60); gr->Box(); gr->Light(false); gr->Surf(a); return 0; } @end verbatim @pfig{alpha, Example of transparency and lightings} @c ------------------------------------------------------------------ @external{} @node Types of transparency, Axis projection, Transparency and lighting, Hints @subsection Types of transparency @nav{} MathGL library has advanced features for setting and handling the surface transparency. The simplest way to add transparency is the using of function @ref{alpha}. As a result, all further surfaces (and isosurfaces, density plots and so on) become transparent. However, their look can be additionally improved. The value of transparency can be different from surface to surface. To do it just use @code{SetAlphaDef} before the drawing of the surface, or use option @code{alpha} (see @ref{Command options}). If its value is close to 0 then the surface becomes more and more transparent. Contrary, if its value is close to 1 then the surface becomes practically non-transparent. Also you can change the way how the light goes through overlapped surfaces. The function @code{SetTranspType} defines it. By default the usual transparency is used (@samp{0}) -- surfaces below is less visible than the upper ones. A ``glass-like'' transparency (@samp{1}) has a different look -- each surface just decreases the background light (the surfaces are commutable in this case). A ``neon-like'' transparency (@samp{2}) has more interesting look. In this case a surface is the light source (like a lamp on the dark background) and just adds some intensity to the color. At this, the library sets automatically the black color for the background and changes the default line color to white. As example I shall show several plots for different types of transparency. The code is the same except the values of @code{SetTranspType} function: @verbatim int sample(mglGraph *gr) { gr->Alpha(true); gr->Light(true); mglData a; mgls_prepare2d(&a); gr->SetTranspType(0); gr->Clf(); gr->SubPlot(2,2,0); gr->Rotate(50,60); gr->Surf(a); gr->Box(); gr->SubPlot(2,2,1); gr->Rotate(50,60); gr->Dens(a); gr->Box(); gr->SubPlot(2,2,2); gr->Rotate(50,60); gr->Cont(a); gr->Box(); gr->SubPlot(2,2,3); gr->Rotate(50,60); gr->Axial(a); gr->Box(); return 0; } @end verbatim @pfig{type0, Example of @code{SetTranspType(0)}.} @pfig{type1, Example of @code{SetTranspType(1)}.} @pfig{type2, Example of @code{SetTranspType(2)}.} @c ------------------------------------------------------------------ @external{} @node Axis projection, Adding fog, Types of transparency, Hints @subsection Axis projection @nav{} You can easily make 3D plot and draw its x-,y-,z-projections (like in CAD) by using @ref{ternary} function with arguments: 4 for Cartesian, 5 for Ternary and 6 for Quaternary coordinates. The sample code is: @verbatim int sample(mglGraph *gr) { gr->SetRanges(0,1,0,1,0,1); mglData x(50),y(50),z(50),rx(10),ry(10), a(20,30); a.Modify("30*x*y*(1-x-y)^2*(x+y<1)"); x.Modify("0.25*(1+cos(2*pi*x))"); y.Modify("0.25*(1+sin(2*pi*x))"); rx.Modify("rnd"); ry.Modify("(1-v)*rnd",rx); z.Modify("x"); gr->Title("Projection sample"); gr->Ternary(4); gr->Rotate(50,60); gr->Light(true); gr->Plot(x,y,z,"r2"); gr->Surf(a,"#"); gr->Axis(); gr->Grid(); gr->Box(); gr->Label('x',"X",1); gr->Label('y',"Y",1); gr->Label('z',"Z",1); } @end verbatim @pfig{projection, Example of axis projections} @pfig{projection5, Example of ternary axis projections} @c @pfig{projection6, Example of quaternary axis projections} @c ------------------------------------------------------------------ @external{} @node Adding fog, Lighting sample, Axis projection, Hints @subsection Adding fog @nav{} MathGL can add a fog to the image. Its switching on is rather simple -- just use @ref{fog} function. There is the only feature -- fog is applied for whole image. Not to particular subplot. The sample code is: @verbatim int sample(mglGraph *gr) { mglData a; mgls_prepare2d(&a); gr->Title("Fog sample"); gr->Light(true); gr->Rotate(50,60); gr->Fog(1); gr->Box(); gr->Surf(a); gr->Cont(a,"y"); return 0; } @end verbatim @pfig{fog, Example of @code{Fog()}.} @c ------------------------------------------------------------------ @external{} @node Lighting sample, Using primitives, Adding fog, Hints @subsection Lighting sample @nav{} In contrast to the most of other programs, MathGL supports several (up to 10) light sources. Moreover, the color each of them can be different: white (this is usual), yellow, red, cyan, green and so on. The use of several light sources may be interesting for the highlighting of some peculiarities of the plot or just to make an amusing picture. Note, each light source can be switched on/off individually. The sample code is: @verbatim int sample(mglGraph *gr) { mglData a; mgls_prepare2d(&a); gr->Title("Several light sources"); gr->Rotate(50,60); gr->Light(true); gr->AddLight(1,mglPoint(0,1,0),'c'); gr->AddLight(2,mglPoint(1,0,0),'y'); gr->AddLight(3,mglPoint(0,-1,0),'m'); gr->Box(); gr->Surf(a,"h"); return 0; } @end verbatim @pfig{several_light, Example of several light sources.} Additionally, you can use local light sources and set to use @ref{diffuse} reflection instead of specular one (by default) or both kinds. Note, I use @ref{attachlight} command to keep light settings relative to subplot. @verbatim int sample(mglGraph *gr) { gr->Light(true); gr->AttachLight(true); gr->SubPlot(2,2,0); gr->Title("Default"); gr->Rotate(50,60); gr->Line(mglPoint(-1,-0.7,1.7),mglPoint(-1,-0.7,0.7),"BA"); gr->Box(); gr->Surf(a); gr->SubPlot(2,2,1); gr->Title("Local"); gr->Rotate(50,60); gr->AddLight(0,mglPoint(1,0,1),mglPoint(-2,-1,-1)); gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO"); gr->Box(); gr->Surf(a); gr->SubPlot(2,2,2); gr->Title("no diffuse"); gr->Rotate(50,60); gr->SetDiffuse(0); gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO"); gr->Box(); gr->Surf(a); gr->SubPlot(2,2,3); gr->Title("diffusive only"); gr->Rotate(50,60); gr->SetDiffuse(0.5); gr->AddLight(0,mglPoint(1,0,1),mglPoint(-2,-1,-1),'w',0); gr->Line(mglPoint(1,0,1),mglPoint(-1,-1,0),"BAO"); gr->Box(); gr->Surf(a); } @end verbatim @pfig{light, Example of different types of lighting.} @c ------------------------------------------------------------------ @external{} @node Using primitives, STFA sample, Lighting sample, Hints @subsection Using primitives @nav{} MathGL provide a set of functions for drawing primitives (see @ref{Primitives}). Primitives are low level object, which used by most of plotting functions. Picture below demonstrate some of commonly used primitives. @pfig{primitives, Primitives in MathGL.} Generally, you can create arbitrary new kind of plot using primitives. For example, MathGL don't provide any special functions for drawing molecules. However, you can do it using only one type of primitives @ref{drop}. The sample code is: @verbatim int sample(mglGraph *gr) { gr->Alpha(true); gr->Light(true); gr->SubPlot(2,2,0,""); gr->Title("Methane, CH_4"); gr->StartGroup("Methane"); gr->Rotate(60,120); gr->Sphere(mglPoint(0,0,0),0.25,"k"); gr->Drop(mglPoint(0,0,0),mglPoint(0,0,1),0.35,"h",1,2); gr->Sphere(mglPoint(0,0,0.7),0.25,"g"); gr->Drop(mglPoint(0,0,0),mglPoint(-0.94,0,-0.33),0.35,"h",1,2); gr->Sphere(mglPoint(-0.66,0,-0.23),0.25,"g"); gr->Drop(mglPoint(0,0,0),mglPoint(0.47,0.82,-0.33),0.35,"h",1,2); gr->Sphere(mglPoint(0.33,0.57,-0.23),0.25,"g"); gr->Drop(mglPoint(0,0,0),mglPoint(0.47,-0.82,-0.33),0.35,"h",1,2); gr->Sphere(mglPoint(0.33,-0.57,-0.23),0.25,"g"); gr->EndGroup(); gr->SubPlot(2,2,1,""); gr->Title("Water, H_{2}O"); gr->StartGroup("Water"); gr->Rotate(60,100); gr->StartGroup("Water_O"); gr->Sphere(mglPoint(0,0,0),0.25,"r"); gr->EndGroup(); gr->StartGroup("Water_Bond_1"); gr->Drop(mglPoint(0,0,0),mglPoint(0.3,0.5,0),0.3,"m",1,2); gr->EndGroup(); gr->StartGroup("Water_H_1"); gr->Sphere(mglPoint(0.3,0.5,0),0.25,"g"); gr->EndGroup(); gr->StartGroup("Water_Bond_2"); gr->Drop(mglPoint(0,0,0),mglPoint(0.3,-0.5,0),0.3,"m",1,2); gr->EndGroup(); gr->StartGroup("Water_H_2"); gr->Sphere(mglPoint(0.3,-0.5,0),0.25,"g"); gr->EndGroup(); gr->EndGroup(); gr->SubPlot(2,2,2,""); gr->Title("Oxygen, O_2"); gr->StartGroup("Oxygen"); gr->Rotate(60,120); gr->Drop(mglPoint(0,0.5,0),mglPoint(0,-0.3,0),0.3,"m",1,2); gr->Sphere(mglPoint(0,0.5,0),0.25,"r"); gr->Drop(mglPoint(0,-0.5,0),mglPoint(0,0.3,0),0.3,"m",1,2); gr->Sphere(mglPoint(0,-0.5,0),0.25,"r"); gr->EndGroup(); gr->SubPlot(2,2,3,""); gr->Title("Ammonia, NH_3"); gr->StartGroup("Ammonia"); gr->Rotate(60,120); gr->Sphere(mglPoint(0,0,0),0.25,"b"); gr->Drop(mglPoint(0,0,0),mglPoint(0.33,0.57,0),0.32,"n",1,2); gr->Sphere(mglPoint(0.33,0.57,0),0.25,"g"); gr->Drop(mglPoint(0,0,0),mglPoint(0.33,-0.57,0),0.32,"n",1,2); gr->Sphere(mglPoint(0.33,-0.57,0),0.25,"g"); gr->Drop(mglPoint(0,0,0),mglPoint(-0.65,0,0),0.32,"n",1,2); gr->Sphere(mglPoint(-0.65,0,0),0.25,"g"); gr->EndGroup(); return 0; } @end verbatim @pfig{molecule, Example of molecules drawing.} Moreover, some of special plots can be more easily produced by primitives rather than by specialized function. For example, Venn diagram can be produced by @code{Error} plot: @verbatim int sample(mglGraph *gr) { double xx[3]={-0.3,0,0.3}, yy[3]={0.3,-0.3,0.3}, ee[3]={0.7,0.7,0.7}; mglData x(3,xx), y(3,yy), e(3,ee); gr->Title("Venn-like diagram"); gr->Alpha(true); gr->Error(x,y,e,e,"!rgb@#o"); return 0; } @end verbatim You see that you have to specify and fill 3 data arrays. The same picture can be produced by just 3 calls of @ref{circle} function: @verbatim int sample(mglGraph *gr) { gr->Title("Venn-like diagram"); gr->Alpha(true); gr->Circle(mglPoint(-0.3,0.3),0.7,"rr@"); gr->Circle(mglPoint(0,-0.3),0.7,"gg@"); gr->Circle(mglPoint( 0.3,0.3),0.7,"bb@"); return 0; } @end verbatim Of course, the first variant is more suitable if you need to plot a lot of circles. But for few ones the usage of primitives looks easy. @pfig{venn, Example of Venn diagram.} @c ------------------------------------------------------------------ @external{} @node STFA sample, Mapping visualization, Using primitives, Hints @subsection STFA sample @nav{} Short-time Fourier Analysis (@ref{stfa}) is one of informative method for analyzing long rapidly oscillating 1D data arrays. It is used to determine the sinusoidal frequency and phase content of local sections of a signal as it changes over time. MathGL can find and draw STFA result. Just to show this feature I give following sample. Initial data arrays is 1D arrays with step-like frequency. Exactly this you can see at bottom on the STFA plot. The sample code is: @verbatim int sample(mglGraph *gr) { mglData a(2000), b(2000); gr->Fill(a,"cos(50*pi*x)*(x<-.5)+cos(100*pi*x)*(x<0)*(x>-.5)+\ cos(200*pi*x)*(x<.5)*(x>0)+cos(400*pi*x)*(x>.5)"); gr->SubPlot(1, 2, 0,"<_"); gr->Title("Initial signal"); gr->Plot(a); gr->Axis(); gr->Label('x', "\\i t"); gr->SubPlot(1, 2, 1,"<_"); gr->Title("STFA plot"); gr->STFA(a, b, 64); gr->Axis(); gr->Label('x', "\\i t"); gr->Label('y', "\\omega", 0); return 0; } @end verbatim @pfig{stfa, Example of STFA().} @c ------------------------------------------------------------------ @external{} @node Mapping visualization, Data interpolation, STFA sample, Hints @subsection Mapping visualization @nav{} Sometime ago I worked with mapping and have a question about its visualization. Let me remember you that mapping is some transformation rule for one set of number to another one. The 1d mapping is just an ordinary function -- it takes a number and transforms it to another one. The 2d mapping (which I used) is a pair of functions which take 2 numbers and transform them to another 2 ones. Except general plots (like @ref{surfc}, @ref{surfa}) there is a special plot -- Arnold diagram. It shows the area which is the result of mapping of some initial area (usually square). I tried to make such plot in @ref{map}. It shows the set of points or set of faces, which final position is the result of mapping. At this, the color gives information about their initial position and the height describes Jacobian value of the transformation. Unfortunately, it looks good only for the simplest mapping but for the real multivalent quasi-chaotic mapping it produces a confusion. So, use it if you like :). The sample code for mapping visualization is: @verbatim int sample(mglGraph *gr) { mglData a(50, 40), b(50, 40); gr->Puts(mglPoint(0, 0), "\\to", ":C", -1.4); gr->SetRanges(-1,1,-1,1,-2,2); gr->SubPlot(2, 1, 0); gr->Fill(a,"x"); gr->Fill(b,"y"); gr->Puts(mglPoint(0, 1.1), "\\{x, y\\}", ":C", -2); gr->Box(); gr->Map(a, b, "brgk"); gr->SubPlot(2, 1, 1); gr->Fill(a,"(x^3+y^3)/2"); gr->Fill(b,"(x-y)/2"); gr->Puts(mglPoint(0, 1.1), "\\{\\frac{x^3+y^3}{2}, \\frac{x-y}{2}\\}", ":C", -2); gr->Box(); gr->Map(a, b, "brgk"); return 0; } @end verbatim @pfig{map, Example of Map().} @c ------------------------------------------------------------------ @external{} @node Data interpolation, Making regular data, Mapping visualization, Hints @subsection Data interpolation @nav{} There are many functions to get interpolated values of a data array. Basically all of them can be divided by 3 categories: @enumerate @item functions which return single value at given point (see @ref{Interpolation} and @code{mglGSpline()} in @ref{Global functions}); @item functions @ref{subdata} and @ref{evaluate} for indirect access to data elements; @item functions @ref{refill}, @ref{gspline} and @ref{datagrid} which fill regular (rectangular) data array by interpolated values. @end enumerate The usage of first category is rather straightforward and don't need any special comments. There is difference in indirect access functions. Function @ref{subdata} use use step-like interpolation to handle correctly single @code{nan} values in the data array. Contrary, function @ref{evaluate} use local spline interpolation, which give smoother output but spread @code{nan} values. So, @ref{subdata} should be used for specific data elements (for example, for given column), and @ref{evaluate} should be used for distributed elements (i.e. consider data array as some field). Following sample illustrates this difference: @verbatim int sample(mglGraph *gr) { gr->SubPlot(1,1,0,""); gr->Title("SubData vs Evaluate"); mglData in(9), arg(99), e, s; gr->Fill(in,"x^3/1.1"); gr->Fill(arg,"4*x+4"); gr->Plot(in,"ko "); gr->Box(); e = in.Evaluate(arg,false); gr->Plot(e,"b.","legend 'Evaluate'"); s = in.SubData(arg); gr->Plot(s,"r.","legend 'SubData'"); gr->Legend(2); } @end verbatim @pfig{indirect, Example of indirect data access.} Example of @ref{datagrid} usage is done in @ref{Making regular data}. Here I want to show the peculiarities of @ref{refill} and @ref{gspline} functions. Both functions require argument(s) which provide coordinates of the data values, and return rectangular data array which equidistantly distributed in axis range. So, in opposite to @ref{evaluate} function, @ref{refill} and @ref{gspline} can interpolate non-equidistantly distributed data. At this both functions @ref{refill} and @ref{gspline} provide continuity of 2nd derivatives along coordinate(s). However, @ref{refill} is slower but give better (from human point of view) result than global spline @ref{gspline} due to more advanced algorithm. Following sample illustrates this difference: @verbatim int sample(mglGraph *gr) { mglData x(10), y(10), r(100); x.Modify("0.5+rnd"); x.CumSum("x"); x.Norm(-1,1); y.Modify("sin(pi*v)/1.5",x); gr->SubPlot(2,2,0,"<_"); gr->Title("Refill sample"); gr->Axis(); gr->Box(); gr->Plot(x,y,"o "); gr->Refill(r,x,y); // or you can use r.Refill(x,y,-1,1); gr->Plot(r,"r"); gr->FPlot("sin(pi*x)/1.5","B:"); gr->SubPlot(2,2,1,"<_");gr->Title("Global spline"); gr->Axis(); gr->Box(); gr->Plot(x,y,"o "); r.RefillGS(x,y,-1,1); gr->Plot(r,"r"); gr->FPlot("sin(pi*x)/1.5","B:"); gr->Alpha(true); gr->Light(true); mglData z(10,10), xx(10,10), yy(10,10), rr(100,100); y.Modify("0.5+rnd"); y.CumSum("x"); y.Norm(-1,1); for(int i=0;i<10;i++) for(int j=0;j<10;j++) z.a[i+10*j] = sin(M_PI*x.a[i]*y.a[j])/1.5; gr->SubPlot(2,2,2); gr->Title("2d regular"); gr->Rotate(40,60); gr->Axis(); gr->Box(); gr->Mesh(x,y,z,"k"); gr->Refill(rr,x,y,z); gr->Surf(rr); gr->Fill(xx,"(x+1)/2*cos(y*pi/2-1)"); gr->Fill(yy,"(x+1)/2*sin(y*pi/2-1)"); for(int i=0;i<10*10;i++) z.a[i] = sin(M_PI*xx.a[i]*yy.a[i])/1.5; gr->SubPlot(2,2,3); gr->Title("2d non-regular"); gr->Rotate(40,60); gr->Axis(); gr->Box(); gr->Plot(xx,yy,z,"ko "); gr->Refill(rr,xx,yy,z); gr->Surf(rr); } @end verbatim @pfig{refill, Example of non-equidistant data interpolation.} @c ------------------------------------------------------------------ @external{} @node Making regular data, Making histogram, Data interpolation, Hints @subsection Making regular data @nav{} Sometimes, one have only unregular data, like as data on triangular grids, or experimental results and so on. Such kind of data cannot be used as simple as regular data (like matrices). Only few functions, like @ref{dots}, can handle unregular data as is. However, one can use built in triangulation functions for interpolating unregular data points to a regular data grids. There are 2 ways. First way, one can use @ref{triangulation} function to obtain list of vertexes for triangles. Later this list can be used in functions like @ref{triplot} or @ref{tricont}. Second way consist in usage of @ref{datagrid} function, which fill regular data grid by interpolated values, assuming that coordinates of the data grid is equidistantly distributed in axis range. Note, you can use options (see @ref{Command options}) to change default axis range as well as in other plotting functions. @verbatim int sample(mglGraph *gr) { mglData x(100), y(100), z(100); gr->Fill(x,"2*rnd-1"); gr->Fill(y,"2*rnd-1"); gr->Fill(z,"v^2-w^2",x,y); // first way - plot triangular surface for points mglData d = mglTriangulation(x,y); gr->Title("Triangulation"); gr->Rotate(40,60); gr->Box(); gr->Light(true); gr->TriPlot(d,x,y,z); gr->TriPlot(d,x,y,z,"#k"); // second way - make regular data and plot it mglData g(30,30); gr->DataGrid(g,x,y,z); gr->Mesh(g,"m"); } @end verbatim @pfig{triangulation, Example of triangulation.} @c ------------------------------------------------------------------ @external{} @node Making histogram, Nonlinear fitting hints, Making regular data, Hints @subsection Making histogram @nav{} Using the @ref{hist} function(s) for making regular distributions is one of useful fast methods to process and plot irregular data. @code{Hist} can be used to find some momentum of set of points by specifying weight function. It is possible to create not only 1D distributions but also 2D and 3D ones. Below I place the simplest sample code which demonstrate @ref{hist} usage: @verbatim int sample(mglGraph *gr) { mglData x(10000), y(10000), z(10000); gr->Fill(x,"2*rnd-1"); gr->Fill(y,"2*rnd-1"); gr->Fill(z,"exp(-6*(v^2+w^2))",x,y); mglData xx=gr->Hist(x,z), yy=gr->Hist(y,z); xx.Norm(0,1); yy.Norm(0,1); gr->MultiPlot(3,3,3,2,2,""); gr->SetRanges(-1,1,-1,1,0,1); gr->Box(); gr->Dots(x,y,z,"wyrRk"); gr->MultiPlot(3,3,0,2,1,""); gr->SetRanges(-1,1,0,1); gr->Box(); gr->Bars(xx); gr->MultiPlot(3,3,5,1,2,""); gr->SetRanges(0,1,-1,1); gr->Box(); gr->Barh(yy); gr->SubPlot(3,3,2); gr->Puts(mglPoint(0.5,0.5),"Hist and\nMultiPlot\nsample","a",-6); return 0; } @end verbatim @pfig{hist, Example of Hist().} @c ------------------------------------------------------------------ @external{} @node Nonlinear fitting hints, PDE solving hints, Making histogram, Hints @subsection Nonlinear fitting hints @nav{} Nonlinear fitting is rather simple. All that you need is the data to fit, the approximation formula and the list of coefficients to fit (better with its initial guess values). Let me demonstrate it on the following simple example. First, let us use sin function with some random noise: @verbatim mglData dat(100), in(100); //data to be fitted and ideal data gr->Fill(dat,"0.4*rnd+0.1+sin(2*pi*x)"); gr->Fill(in,"0.3+sin(2*pi*x)"); @end verbatim and plot it to see that data we will fit @verbatim gr->Title("Fitting sample"); gr->SetRange('y',-2,2); gr->Box(); gr->Plot(dat, "k. "); gr->Axis(); gr->Plot(in, "b"); gr->Puts(mglPoint(0, 2.2), "initial: y = 0.3+sin(2\\pi x)", "b"); @end verbatim The next step is the fitting itself. For that let me specify an initial values @var{ini} for coefficients @samp{abc} and do the fitting for approximation formula @samp{a+b*sin(c*x)} @verbatim mreal ini[3] = {1,1,3}; mglData Ini(3,ini); mglData res = gr->Fit(dat, "a+b*sin(c*x)", "abc", Ini); @end verbatim Now display it @verbatim gr->Plot(res, "r"); gr->Puts(mglPoint(-0.9, -1.3), "fitted:", "r:L"); gr->PutsFit(mglPoint(0, -1.8), "y = ", "r"); @end verbatim NOTE! the fitting results may have strong dependence on initial values for coefficients due to algorithm features. The problem is that in general case there are several local "optimums" for coefficients and the program returns only first found one! There are no guaranties that it will be the best. Try for example to set @code{ini[3] = @{0, 0, 0@}} in the code above. The full sample code for nonlinear fitting is: @verbatim int sample(mglGraph *gr) { mglData dat(100), in(100); gr->Fill(dat,"0.4*rnd+0.1+sin(2*pi*x)"); gr->Fill(in,"0.3+sin(2*pi*x)"); mreal ini[3] = {1,1,3}; mglData Ini(3,ini); mglData res = gr->Fit(dat, "a+b*sin(c*x)", "abc", Ini); gr->Title("Fitting sample"); gr->SetRange('y',-2,2); gr->Box(); gr->Plot(dat, "k. "); gr->Axis(); gr->Plot(res, "r"); gr->Plot(in, "b"); gr->Puts(mglPoint(-0.9, -1.3), "fitted:", "r:L"); gr->PutsFit(mglPoint(0, -1.8), "y = ", "r"); gr->Puts(mglPoint(0, 2.2), "initial: y = 0.3+sin(2\\pi x)", "b"); return 0; } @end verbatim @pfig{fit, Example of nonlinear fitting.} @c ------------------------------------------------------------------ @external{} @node PDE solving hints, Drawing phase plain, Nonlinear fitting hints, Hints @subsection PDE solving hints @nav{} Solving of Partial Differential Equations (PDE, including beam tracing) and ray tracing (or finding particle trajectory) are more or less common task. So, MathGL have several functions for that. There are @ref{ray} for ray tracing, @ref{pde} for PDE solving, @ref{qo2d} for beam tracing in 2D case (see @ref{Global functions}). Note, that these functions take ``Hamiltonian'' or equations as string values. And I don't plan now to allow one to use user-defined functions. There are 2 reasons: the complexity of corresponding interface; and the basic nature of used methods which are good for samples but may not good for serious scientific calculations. The ray tracing can be done by @ref{ray} function. Really ray tracing equation is Hamiltonian equation for 3D space. So, the function can be also used for finding a particle trajectory (i.e. solve Hamiltonian ODE) for 1D, 2D or 3D cases. The function have a set of arguments. First of all, it is Hamiltonian which defined the media (or the equation) you are planning to use. The Hamiltonian is defined by string which may depend on coordinates @samp{x}, @samp{y}, @samp{z}, time @samp{t} (for particle dynamics) and momentums @samp{p}=@math{p_x}, @samp{q}=@math{p_y}, @samp{v}=@math{p_z}. Next, you have to define the initial conditions for coordinates and momentums at @samp{t}=0 and set the integrations step (default is 0.1) and its duration (default is 10). The Runge-Kutta method of 4-th order is used for integration. @verbatim const char *ham = "p^2+q^2-x-1+i*0.5*(y+x)*(y>-x)"; mglData r = mglRay(ham, mglPoint(-0.7, -1), mglPoint(0, 0.5), 0.02, 2); @end verbatim This example calculate the reflection from linear layer (media with Hamiltonian @samp{p^2+q^2-x-1}=@math{p_x^2+p_y^2-x-1}). This is parabolic curve. The resulting array have 7 columns which contain data for @{x,y,z,p,q,v,t@}. The solution of PDE is a bit more complicated. As previous you have to specify the equation as pseudo-differential operator @math{\hat H(x, \nabla)} which is called sometime as ``Hamiltonian'' (for example, in beam tracing). As previously, it is defined by string which may depend on coordinates @samp{x}, @samp{y}, @samp{z} (but not time!), momentums @samp{p}=@math{(d/dx)/i k_0}, @samp{q}=@math{(d/dy)/i k_0} and field amplitude @samp{u}=@math{|u|}. The evolutionary coordinate is @samp{z} in all cases. So that, the equation look like @math{du/dz = ik_0 H(x,y,\hat p, \hat q, |u|)[u]}. Dependence on field amplitude @samp{u}=@math{|u|} allows one to solve nonlinear problems too. For example, for nonlinear Shrodinger equation you may set @code{ham="p^2 + q^2 - u^2"}. Also you may specify imaginary part for wave absorption, like @code{ham = "p^2 + i*x*(x>0)"} or @code{ham = "p^2 + i1*x*(x>0)"}. Next step is specifying the initial conditions at @samp{z} equal to minimal z-axis value. The function need 2 arrays for real and for imaginary part. Note, that coordinates x,y,z are supposed to be in specified axis range. So, the data arrays should have corresponding scales. Finally, you may set the integration step and parameter k0=@math{k_0}. Also keep in mind, that internally the 2 times large box is used (for suppressing numerical reflection from boundaries) and the equation should well defined even in this extended range. Final comment is concerning the possible form of pseudo-differential operator @math{H}. At this moment, simplified form of operator @math{H} is supported -- all ``mixed'' terms (like @samp{x*p}->x*d/dx) are excluded. For example, in 2D case this operator is effectively @math{H = f(p,z) + g(x,z,u)}. However commutable combinations (like @samp{x*q}->x*d/dy) are allowed for 3D case. So, for example let solve the equation for beam deflected from linear layer and absorbed later. The operator will have the form @samp{"p^2+q^2-x-1+i*0.5*(z+x)*(z>-x)"} that correspond to equation @math{1/ik_0 * du/dz + d^2 u/dx^2 + d^2 u/dy^2 + x * u + i (x+z)/2 * u = 0}. This is typical equation for Electron Cyclotron (EC) absorption in magnetized plasmas. For initial conditions let me select the beam with plane phase front @math{exp(-48*(x+0.7)^2)}. The corresponding code looks like this: @verbatim int sample(mglGraph *gr) { mglData a,re(128),im(128); gr->Fill(re,"exp(-48*(x+0.7)^2)"); a = gr->PDE("p^2+q^2-x-1+i*0.5*(z+x)*(z>-x)", re, im, 0.01, 30); a.Transpose("yxz"); gr->SubPlot(1,1,0,"<_"); gr->Title("PDE solver"); gr->SetRange('c',0,1); gr->Dens(a,"wyrRk"); gr->Axis(); gr->Label('x', "\\i x"); gr->Label('y', "\\i z"); gr->FPlot("-x", "k|"); gr->Puts(mglPoint(0, 0.85), "absorption: (x+z)/2 for x+z>0"); gr->Puts(mglPoint(0,1.1),"Equation: ik_0\\partial_zu + \\Delta u + x\\cdot u + i \\frac{x+z}{2}\\cdot u = 0"); return 0; } @end verbatim @pfig{pde, Example of PDE solving.} The next example is the beam tracing. Beam tracing equation is special kind of PDE equation written in coordinates accompanied to a ray. Generally this is the same parameters and limitation as for PDE solving but the coordinates are defined by the ray and by parameter of grid width @var{w} in direction transverse the ray. So, you don't need to specify the range of coordinates. @strong{BUT} there is limitation. The accompanied coordinates are well defined only for smooth enough rays, i.e. then the ray curvature @math{K} (which is defined as @math{1/K^2 = (|r''|^2 |r'|^2 - (r'', r'')^2)/|r'|^6}) is much large then the grid width: @math{K>>w}. So, you may receive incorrect results if this condition will be broken. You may use following code for obtaining the same solution as in previous example: @verbatim int sample(mglGraph *gr) { mglData r, xx, yy, a, im(128), re(128); const char *ham = "p^2+q^2-x-1+i*0.5*(y+x)*(y>-x)"; r = mglRay(ham, mglPoint(-0.7, -1), mglPoint(0, 0.5), 0.02, 2); gr->SubPlot(1,1,0,"<_"); gr->Title("Beam and ray tracing"); gr->Plot(r.SubData(0), r.SubData(1), "k"); gr->Axis(); gr->Label('x', "\\i x"); gr->Label('y', "\\i z"); // now start beam tracing gr->Fill(re,"exp(-48*x^2)"); a = mglQO2d(ham, re, im, r, xx, yy, 1, 30); gr->SetRange('c',0, 1); gr->Dens(xx, yy, a, "wyrRk"); gr->FPlot("-x", "k|"); gr->Puts(mglPoint(0, 0.85), "absorption: (x+y)/2 for x+y>0"); gr->Puts(mglPoint(0.7, -0.05), "central ray"); return 0; } @end verbatim @pfig{qo2d, Example of beam tracing.} Note, the @ref{pde} is fast enough and suitable for many cases routine. However, there is situations then media have both together: strong spatial dispersion and spatial inhomogeneity. In this, case the @ref{pde} will produce incorrect result and you need to use advanced PDE solver @ref{apde}. For example, a wave beam, propagated in plasma, described by Hamiltonian @math{exp(-x^2-p^2)}, will have different solution for using of simplification and advanced PDE solver: @verbatim int sample(mglGraph *gr) { gr->SetRanges(-1,1,0,2,0,2); mglData ar(256), ai(256); gr->Fill(ar,"exp(-2*x^2)"); mglData res1(gr->APDE("exp(-x^2-p^2)",ar,ai,0.01)); res1.Transpose(); gr->SubPlot(1,2,0,"_"); gr->Title("Advanced PDE solver"); gr->SetRanges(0,2,-1,1); gr->SetRange('c',res1); gr->Dens(res1); gr->Axis(); gr->Box(); gr->Label('x',"\\i z"); gr->Label('y',"\\i x"); gr->Puts(mglPoint(-0.5,0.2),"i\\partial_z\\i u = exp(-\\i x^2+\\partial_x^2)[\\i u]","y"); mglData res2(gr->PDE("exp(-x^2-p^2)",ar,ai,0.01)); gr->SubPlot(1,2,1,"_"); gr->Title("Simplified PDE solver"); gr->Dens(res2); gr->Axis(); gr->Box(); gr->Label('x',"\\i z"); gr->Label('y',"\\i x"); gr->Puts(mglPoint(-0.5,0.2),"i\\partial_z\\i u \\approx\\ exp(-\\i x^2)\\i u+exp(\\partial_x^2)[\\i u]","y"); return 0; } @end verbatim @pfig{apde, Comparison of simplified and advanced PDE solvers.} @c ------------------------------------------------------------------ @external{} @node Drawing phase plain, Pulse properties, PDE solving hints, Hints @subsection Drawing phase plain @nav{} Here I want say a few words of plotting phase plains. Phase plain is name for system of coordinates @math{x}, @math{x'}, i.e. a variable and its time derivative. Plot in phase plain is very useful for qualitative analysis of an ODE, because such plot is rude (it topologically the same for a range of ODE parameters). Most often the phase plain @{@math{x}, @math{x'}@} is used (due to its simplicity), that allows one to analyze up to the 2nd order ODE (i.e. @math{x''+f(x,x')=0}). The simplest way to draw phase plain in MathGL is using @ref{flow} function(s), which automatically select several points and draw flow threads. If the ODE have an integral of motion (like Hamiltonian @math{H(x,x')=const} for dissipation-free case) then you can use @ref{cont} function for plotting isolines (contours). In fact. isolines are the same as flow threads, but without arrows on it. Finally, you can directly solve ODE using @ref{ode} function and plot its numerical solution. Let demonstrate this for ODE equation @math{x''-x+3*x^2=0}. This is nonlinear oscillator with square nonlinearity. It has integral @math{H=y^2+2*x^3-x^2=Const}. Also it have 2 typical stationary points: saddle at @{x=0, y=0@} and center at @{x=1/3, y=0@}. Motion at vicinity of center is just simple oscillations, and is stable to small variation of parameters. In opposite, motion around saddle point is non-stable to small variation of parameters, and is very slow. So, calculation around saddle points are more difficult, but more important. Saddle points are responsible for solitons, stochasticity and so on. So, let draw this phase plain by 3 different methods. First, draw isolines for @math{H=y^2+2*x^3-x^2=Const} -- this is simplest for ODE without dissipation. Next, draw flow threads -- this is straightforward way, but the automatic choice of starting points is not always optimal. Finally, use @ref{ode} to check the above plots. At this we need to run @ref{ode} in both direction of time (in future and in the past) to draw whole plain. Alternatively, one can put starting points far from (or at the bounding box as done in @ref{flow}) the plot, but this is a more complicated. The sample code is: @verbatim int sample(mglGraph *gr) { gr->SubPlot(2,2,0,"<_"); gr->Title("Cont"); gr->Box(); gr->Axis(); gr->Label('x',"x"); gr->Label('y',"\\dot{x}"); mglData f(100,100); gr->Fill(f,"y^2+2*x^3-x^2-0.5"); gr->Cont(f); gr->SubPlot(2,2,1,"<_"); gr->Title("Flow"); gr->Box(); gr->Axis(); gr->Label('x',"x"); gr->Label('y',"\\dot{x}"); mglData fx(100,100), fy(100,100); gr->Fill(fx,"x-3*x^2"); gr->Fill(fy,"y"); gr->Flow(fy,fx,"v","value 7"); gr->SubPlot(2,2,2,"<_"); gr->Title("ODE"); gr->Box(); gr->Axis(); gr->Label('x',"x"); gr->Label('y',"\\dot{x}"); for(double x=-1;x<1;x+=0.1) { mglData in(2), r; in.a[0]=x; r = mglODE("y;x-3*x^2","xy",in); gr->Plot(r.SubData(0), r.SubData(1)); r = mglODE("-y;-x+3*x^2","xy",in); gr->Plot(r.SubData(0), r.SubData(1)); } } @end verbatim @pfig{ode, Example of ODE solving and phase plain drawing.} @c ------------------------------------------------------------------ @external{} @node Pulse properties, Using MGL parser, Drawing phase plain, Hints @subsection Pulse properties @nav{} There is common task in optics to determine properties of wave pulses or wave beams. MathGL provide special function @ref{pulse} which return the pulse properties (maximal value, center of mass, width and so on). Its usage is rather simple. Here I just illustrate it on the example of Gaussian pulse, where all parameters are obvious. @verbatim void sample(mglGraph *gr) { gr->SubPlot(1,1,0,"<_"); gr->Title("Pulse sample"); // first prepare pulse itself mglData a(100); gr->Fill(a,"exp(-6*x^2)"); // get pulse parameters mglData b(a.Pulse('x')); // positions and widths are normalized on the number of points. So, set proper axis scale. gr->SetRanges(0, a.nx-1, 0, 1); gr->Axis(); gr->Plot(a); // draw pulse and axis // now visualize found pulse properties double m = b[0]; // maximal amplitude // approximate position of maximum gr->Line(mglPoint(b[1],0), mglPoint(b[1],m),"r="); // width at half-maximum (so called FWHM) gr->Line(mglPoint(b[1]-b[3]/2,0), mglPoint(b[1]-b[3]/2,m),"m|"); gr->Line(mglPoint(b[1]+b[3]/2,0), mglPoint(b[1]+b[3]/2,m),"m|"); gr->Line(mglPoint(0,m/2), mglPoint(a.nx-1,m/2),"h"); // parabolic approximation near maximum char func[128]; sprintf(func,"%g*(1-((x-%g)/%g)^2)",b[0],b[1],b[2]); gr->FPlot(func,"g"); } @end verbatim @pfig{pulse, Example of determining of pulse properties.} @c ------------------------------------------------------------------ @external{} @node Using MGL parser, Using options, Pulse properties, Hints @subsection Using MGL parser @nav{} Sometimes you may prefer to use MGL scripts in yours code. It is simpler (especially in comparison with C/Fortran interfaces) and provide faster way to plot the data with annotations, labels and so on. Class @code{mglParse} (@pxref{mglParse class} parse MGL scripts in C++. It have also the corresponding interface for C/Fortran. The key function here is @code{mglParse::Parse()} (or @code{mgl_parse()} for C/Fortran) which execute one command per string. At this the detailed information about the possible errors or warnings is passed as function value. Or you may execute the whole script as long string with lines separated by @samp{\n}. Functions @code{mglParse::Execute()} and @code{mgl_parse_text()} perform it. Also you may set the values of parameters @samp{$0}...@samp{$9} for the script by functions @code{mglParse::AddParam()} or @code{mgl_add_param()}, allow/disable picture resizing, check ``once'' status and so on. The usage is rather straight-forward. The only non-obvious thing is data transition between script and yours program. There are 2 stages: add or find variable; and set data to variable. In C++ you may use functions @code{mglParse::AddVar()} and @code{mglParse::FindVar()} which return pointer to @code{mglData}. In C/Fortran the corresponding functions are @code{mgl_add_var()}, @code{mgl_find_var()}. This data pointer is valid until next @code{Parse()} or @code{Execute()} call. Note, you @strong{must not delete or free} the data obtained from these functions! So, some simple example at the end. Here I define a data array, create variable, put data into it and plot it. The C++ code looks like this: @verbatim int sample(mglGraph *gr) { gr->Title("MGL parser sample"); mreal a[100]; // let a_i = sin(4*pi*x), x=0...1 for(int i=0;i<100;i++)a[i]=sin(4*M_PI*i/99); mglParse *parser = new mglParse; mglData *d = parser->AddVar("dat"); d->Set(a,100); // set data to variable parser->Execute(gr, "plot dat; xrange 0 1\nbox\naxis"); // you may break script at any line do something // and continue after that parser->Execute(gr, "xlabel 'x'\nylabel 'y'\nbox"); // also you may use cycles or conditions in script parser->Execute(gr, "for $0 -1 1 0.1\nif $0<0\n" "line 0 0 -1 $0 'r':else:line 0 0 -1 $0 'g'\n" "endif\nnext"); delete parser; return 0; } @end verbatim The code in C/Fortran looks practically the same: @verbatim int sample(HMGL gr) { mgl_title(gr, "MGL parser sample", "", -2); double a[100]; // let a_i = sin(4*pi*x), x=0...1 int i; for(i=0;i<100;i++) a[i]=sin(4*M_PI*i/99); HMPR parser = mgl_create_parser(); HMDT d = mgl_parser_add_var(parser, "dat"); mgl_data_set_double(d,a,100,1,1); // set data to variable mgl_parse_text(gr, parser, "plot dat; xrange 0 1\nbox\naxis"); // you may break script at any line do something // and continue after that mgl_parse_text(gr, parser, "xlabel 'x'\nylabel 'y'"); // also you may use cycles or conditions in script mgl_parse_text(gr, parser, "for $0 -1 1 0.1\nif $0<0\n" "line 0 0 -1 $0 'r':else:line 0 0 -1 $0 'g'\n" "endif\nnext"); mgl_write_png(gr, "test.png", ""); // don't forgot to save picture return 0; } @end verbatim @pfig{parser, Example of MGL script parsing.} @c ------------------------------------------------------------------ @external{} @node Using options, ``Templates'', Using MGL parser, Hints @subsection Using options @nav{} @ref{Command options} allow the easy setup of the selected plot by changing global settings only for this plot. Often, options are used for specifying the range of automatic variables (coordinates). However, options allows easily change plot transparency, numbers of line or faces to be drawn, or add legend entries. The sample function for options usage is: @verbatim void template(mglGraph *gr) { mglData a(31,41); gr->Fill(a,"-pi*x*exp(-(y+1)^2-4*x^2)"); gr->SubPlot(2,2,0); gr->Title("Options for coordinates"); gr->Alpha(true); gr->Light(true); gr->Rotate(40,60); gr->Box(); gr->Surf(a,"r","yrange 0 1"); gr->Surf(a,"b","yrange 0 -1"); if(mini) return; gr->SubPlot(2,2,1); gr->Title("Option 'meshnum'"); gr->Rotate(40,60); gr->Box(); gr->Mesh(a,"r","yrange 0 1"); gr->Mesh(a,"b","yrange 0 -1; meshnum 5"); gr->SubPlot(2,2,2); gr->Title("Option 'alpha'"); gr->Rotate(40,60); gr->Box(); gr->Surf(a,"r","yrange 0 1; alpha 0.7"); gr->Surf(a,"b","yrange 0 -1; alpha 0.3"); gr->SubPlot(2,2,3,"<_"); gr->Title("Option 'legend'"); gr->FPlot("x^3","r","legend 'y = x^3'"); gr->FPlot("cos(pi*x)","b","legend 'y = cos \\pi x'"); gr->Box(); gr->Axis(); gr->Legend(2,""); } @end verbatim @pfig{mirror, Example of options usage.} @c ------------------------------------------------------------------ @external{} @node ``Templates'', Stereo image, Using options, Hints @subsection ``Templates'' @nav{} As I have noted before, the change of settings will influence only for the further plotting commands. This allows one to create ``template'' function which will contain settings and primitive drawing for often used plots. Correspondingly one may call this template-function for drawing simplification. For example, let one has a set of points (experimental or numerical) and wants to compare it with theoretical law (for example, with exponent law @math{\exp(-x/2), x \in [0, 20]}). The template-function for this task is: @verbatim void template(mglGraph *gr) { mglData law(100); // create the law law.Modify("exp(-10*x)"); gr->SetRanges(0,20, 0.0001,1); gr->SetFunc(0,"lg(y)",0); gr->Plot(law,"r2"); gr->Puts(mglPoint(10,0.2),"Theoretical law: e^x","r:L"); gr->Label('x',"x val."); gr->Label('y',"y val."); gr->Axis(); gr->Grid("xy","g;"); gr->Box(); } @end verbatim At this, one will only write a few lines for data drawing: @verbatim template(gr); // apply settings and default drawing from template mglData dat("fname.dat"); // load the data // and draw it (suppose that data file have 2 columns) gr->Plot(dat.SubData(0),dat.SubData(1),"bx "); @end verbatim A template-function can also contain settings for font, transparency, lightning, color scheme and so on. I understand that this is obvious thing for any professional programmer, but I several times receive suggestion about ``templates'' ... So, I decide to point out it here. @c ------------------------------------------------------------------ @external{} @node Stereo image, Reduce memory usage, ``Templates'', Hints @subsection Stereo image @nav{} One can easily create stereo image in MathGL. Stereo image can be produced by making two subplots with slightly different rotation angles. The corresponding code looks like this: @verbatim int sample(mglGraph *gr) { mglData a; mgls_prepare2d(&a); gr->Light(true); gr->SubPlot(2,1,0); gr->Rotate(50,60+1); gr->Box(); gr->Surf(a); gr->SubPlot(2,1,1); gr->Rotate(50,60-1); gr->Box(); gr->Surf(a); return 0; } @end verbatim @pfig{stereo, Example of stereo image.} @c ------------------------------------------------------------------ @external{} @node Reduce memory usage, Saving and scanning file, Stereo image, Hints @subsection Reduce memory usage @nav{} By default MathGL save all primitives in memory, rearrange it and only later draw them on bitmaps. Usually, this speed up drawing, but may require a lot of memory for plots which contain a lot of faces (like @ref{cloud}, @ref{dew}). You can use @ref{quality} function for setting to use direct drawing on bitmap and bypassing keeping any primitives in memory. This function also allow you to decrease the quality of the resulting image but increase the speed of the drawing. The code for lowest memory usage looks like this: @verbatim int sample(mglGraph *gr) { gr->SetQuality(6); // firstly, set to draw directly on bitmap for(i=0;i<1000;i++) gr->Sphere(mglPoint(mgl_rnd()*2-1,mgl_rnd()*2-1),0.05); return 0; } @end verbatim @c ------------------------------------------------------------------ @external{} @node Saving and scanning file, Mixing bitmap and vector output, Reduce memory usage, Hints @subsection Scanning file @nav{} MathGL have possibilities to write textual information into file with variable values. In MGL script you can use @ref{save} command for that. However, the usual @code{printf();} is simple in C/C++ code. For example, lets create some textual file @verbatim FILE *fp=fopen("test.txt","w"); fprintf(fp,"This is test: 0 -> 1 q\n"); fprintf(fp,"This is test: 1 -> -1 q\n"); fprintf(fp,"This is test: 2 -> 0 q\n"); fclose(fp); @end verbatim It contents look like @verbatim This is test: 0 -> 1 q This is test: 1 -> -1 q This is test: 2 -> 0 q @end verbatim Let assume now that you want to read this values (i.e. [[0,1],[1,-1],[2,0]]) from the file. You can use @ref{scanfile} for that. The desired values was written using template "This is test: %g -> %g q\n". So, just use @verbatim mglData a; a.ScanFile("test.txt","This is test: %g -> %g"); @end verbatim and plot it to for assurance @verbatim gr->SetRanges(a.SubData(0), a.SubData(1)); gr->Axis(); gr->Plot(a.SubData(0),a.SubData(1),"o"); @end verbatim Note, I keep only the leading part of template (i.e. "This is test: %g -> %g" instead of "This is test: %g -> %g q\n"), because there is no important for us information after the second number in the line. @c ------------------------------------------------------------------ @external{} @node Mixing bitmap and vector output, , Saving and scanning file, Hints @subsection Mixing bitmap and vector output @nav{} Sometimes output plots contain surfaces with a lot of points, and some vector primitives (like axis, text, curves, etc.). Using vector output formats (like EPS or SVG) will produce huge files with possible loss of smoothed lighting. Contrary, the bitmap output may cause the roughness of text and curves. Hopefully, MathGL have a possibility to combine bitmap output for surfaces and vector one for other primitives in the same EPS file, by using @ref{rasterize} command. The idea is to prepare part of picture with surfaces or other "heavy" plots and produce the background image from them by help of @ref{rasterize} command. Next, we draw everything to be saved in vector form (text, curves, axis and etc.). Note, that you need to clear primitives (use @ref{clf} command) after @ref{rasterize} if you want to disable duplication of surfaces in output files (like EPS). Note, that some of output formats (like 3D ones, and TeX) don't support the background bitmap, and use @ref{clf} for them will cause the loss of part of picture. The sample code is: @verbatim // first draw everything to be in bitmap output gr->FSurf("x^2+y^2", "#", "value 10"); gr->Rasterize(); // set above plots as bitmap background gr->Clf(); // clear primitives, to exclude them from file // now draw everything to be in vector output gr->Axis(); gr->Box(); // and save file gr->WriteFrame("fname.eps"); @end verbatim @c ================================================================== @external{} @node FAQ, , Hints, Examples @section FAQ @nav{} @table @strong @item The plot does not appear Check that points of the plot are located inside the bounding box and resize the bounding box using @ref{ranges} function. Check that the data have correct dimensions for selected type of plot. Be sure that @code{Finish()} is called after the plotting functions (or be sure that the plot is saved to a file). Sometimes the light reflection from flat surfaces (like, @ref{dens}) can look as if the plot were absent. @item I can not find some special kind of plot. Most ``new'' types of plots can be created by using the existing drawing functions. For example, the surface of curve rotation can be created by a special function @ref{torus}, or as a parametrically specified surface by @ref{surf}. See also, @ref{Hints}. If you can not find a specific type of plot, please e-mail me and this plot will appear in the next version of MathGL library. @item Should I know some graphical libraries (like OpenGL) before using the MathGL library? No. The MathGL library is self-contained and does not require the knowledge of external libraries. @item In which language is the library written? For which languages does it have an interface? The core of the MathGL library is written in C++. But there are interfaces for: pure C, Fortran, Pascal, Forth, and its own command language MGL. Also there is a large set of interpreted languages, which are supported (Python, Java, ALLEGROCL, CHICKEN, Lisp, CFFI, C#, Guile, Lua, Modula 3, Mzscheme, Ocaml, Octave, Perl, PHP, Pike, R, Ruby, Tcl). These interfaces are written using SWIG (both pure C functions and classes) but only the interface for Python and Octave is included in the build system. The reason is that I don't know any other interpreted languages :(. Note that most other languages can use (link to) the pure C functions. @item How can I use MathGL with Fortran? You can use MathGL as is with @code{gfortran} because it uses by default the AT&T notation for external functions. For other compilers (like Visual Fortran) you have to switch on the AT&T notation manually. The AT&T notation requires that the symbol @samp{_} is added at the end of each function name, function argument(s) is passed by pointers and the string length(s) is passed at the end of the argument list. For example: @emph{C function} -- @code{void mgl_fplot(HMGL graph, const char *fy, const char *stl, int n);} @emph{AT&T function} -- @code{void mgl_fplot_(uintptr_t *graph, const char *fy, const char *stl, int *n, int ly, int ls);} Fortran users also should add C++ library by the option @code{-lstdc++}. If library was built with @code{enable-double=ON} (this default for v.2.1 and later) then all real numbers must be @code{real*8}. You can make it automatic if use option @code{-fdefault-real-8}. @item How can I print in Russian/Spanish/Arabic/Japanese, and so on? The standard way is to use Unicode encoding for the text output. But the MathGL library also has interface for 8-bit (char *) strings with internal conversion to Unicode. This conversion depends on the current locale OS. You may change it by @code{setlocale()} function. For example, for Russian text in CP1251 encoding you may use @code{setlocale(LC_CTYPE, "ru_RU.cp1251");} (under MS Windows the name of locale may differ -- @code{setlocale(LC_CTYPE, "russian_russia.1251")}). I strongly recommend not to use the constant @code{LC_ALL} in the conversion. Since it also changes the number format, it may lead to mistakes in formula writing and reading of the text in data files. For example, the program will await a @samp{,} as a decimal point but the user will enter @samp{.}. @item How can I exclude a point or a region of plot from the drawing? There are 3 general ways. First, the point with @code{NAN} value as one of the coordinates (including color/alpha range) will never be plotted. Second, special functions @code{SetCutBox}() and @code{CutOff}() define the condition when the points should be omitted (see @ref{Cutting}). Last, you may change the transparency of a part of the plot by the help of functions @ref{surfa}, @ref{surf3a} (see @ref{Dual plotting}). In last case the transparency is switched on smoothly. @item I use VisualStudio, CBuilder or some other compiler (not MinGW/gcc). How can I link the MathGL library? In version 2.0, main classes (@code{mglGraph} and @code{mglData}) contains only @code{inline} functions and are acceptable for any compiler with the same binary files. However, if you plan to use widget classes (QMathGL, Fl_MathGL, ...) or to access low-level features (mglBase, mglCanvas, ...) then you have to recompile MathGL by yours compiler. Note, that you have to make import library(-ies) *.lib for provided binary *.dll. This procedure depend on used compiler -- please read documentation for yours compiler. For VisualStudio, it can be done by command @code{lib.exe /DEF:libmgl.def /OUT:libmgl.lib}. @item How make FLTK/GLUT/Qt window which will display result of my calculations? You need to put yours calculations or main event-handling loop in the separate thread. For static image you can give @code{NULL} as drawing function and call @code{Update()} function when you need to redraw it. For more details see @ref{Animation}. @item How I can build MathGL under Windows? Generally, it is the same procedure as for Linux or MacOS -- see section @ref{Installation}. The simplest way is using the combination CMake+MinGW. Also you may need some extra libraries like GSL, PNG, JPEG and so on. All of them can be found at @url{http://gnuwin32.sourceforge.net/packages.html}. After installing all components, just run @uref{http://www.cmake.org/cmake/help/runningcmake.html, cmake-gui} configurator and build the MathGL itself. @item How many people write this library? Most of the library was written by one person. This is a result of nearly a year of work (mostly in the evening and on holidays): I spent half a year to write the kernel and half a year to a year on extending, improving the library and writing documentation. This process continues now :). The build system (cmake files) was written mostly by D.Kulagin, and the export to PRC/PDF was written mostly by M.Vidassov. @item How can I display a bitmap on the figure? You can import data into a @code{mglData} instance by function @ref{import} and display it by @ref{dens} function. For example, for black-and-white bitmap you can use the code: @code{mglData bmp; bmp.Import("fname.png","wk"); gr->Dens(bmp,"wk");}. @item How can I use MathGL in Qt, FLTK, wxWidgets etc.? There are special classes (widgets) for these libraries: QMathGL for Qt, Fl_MathGL for FLTK and so on. If you don't find the appropriate class then you can create your own widget that displays a bitmap using mglCanvas::GetRGB(). @item How can I create 3D in PDF? Just use @code{WritePRC}() method which also create PDF file if enable-pdf=ON at MathGL configure. @item How can I create TeX figure? Just use @code{WriteTEX}() method which create LaTeX files with figure itself @samp{@var{fname}.tex}, with MathGL colors @samp{mglcolors.tex} and main file @samp{mglmain.tex}. Last one can be used for viewing image by command like @code{pdflatex mglmain.tex}. @item Can I use MathGL in JavaScript? Yes, sample JavaScript file is located in texinfo/ folder of sources. You should provide JSON data with 3d image for it (can be created by @code{WriteJSON}() method). Script allows basic manipulation with plot: zoom, rotation, shift. Sample of JavaScript pictures can be found in @url{http://mathgl.sf.net/json.html}. @item How I can change the font family? First, you should download new font files from @uref{http://mathgl.sourceforge.net/download.html, here} or from @uref{http://sourceforge.net/project/showfiles.php?group_id=152187&package_id=267177, here}. Next, you should load the font files into mglGraph class instance @var{gr} by the following command: @code{gr->LoadFont(fontname,path);}. Here @var{fontname} is the base font name like @samp{STIX} and @var{path} sets the location of font files. Use @code{gr->RestoreFont();} to start using the default font. @item How can I draw tick out of a bounding box? Just set a negative value in @ref{ticklen}. For example, use @code{gr->SetTickLen(-0.1);}. @item How can I prevent text rotation? Just use @code{SetRotatedText(false)}. Also you can use axis style @samp{U} for disable only tick labels rotation. @item What is @code{*.so}? What is @code{gcc}? How I can use @code{make}? They are standard GNU tools. There is special FAQ about its usage under Windows -- @uref{http://www.mingw.org/wiki/FAQ}. @item How can I draw equal axis range even for rectangular image? Just use @code{Aspect(NAN,NAN)} for each subplot, or at the beginning of the drawing. @item How I can set transparent background? Just use code like @code{Clf("r@{A5@}");} or prepare PNG file and set it as background image by call @code{LoadBackground("fname.png");}. @item How I can reduce "white" edges around bounding box? The simplest way is to use @ref{subplot} style. However, you should be careful if you plan to add @ref{colorbar} or rotate plot -- part of plot can be invisible if you will use non-default @ref{subplot} style. @item Can I combine bitmap and vector output in EPS? Yes. Sometimes you may have huge surface and a small set of curves and/or text on the plot. You can use function @ref{rasterize} just after making surface plot. This will put all plot to bitmap background. At this later plotting will be in vector format. For example, you can do something like following: @verbatim gr->Surf(x, y, z); gr->Rasterize(); // make surface as bitmap gr->Axis(); gr->WriteFrame("fname.eps"); @end verbatim @item Why I couldn't use name @samp{I} for variable? MathGL support C99 standard, where @samp{I} is reserved for imaginary unit. If you still need this name, then just use @verbatim #undef I @end verbatim after including MathGL header files. @item How I can create MPEG video from plots? You can save each frame into JPEG with names like @samp{frame0001.jpg}, @samp{frame0002.jpg}, ... Later you can use ImageMagic to convert them into MPEG video by command @code{convert frame*.jpg movie.mpg}. See also @ref{MPEG}. @end table @external{} mathgl-8.0.1/texinfo/udav_ru.texi0000664000175000017500000002365614167366465016634 0ustar balakinbalakin@chapter UDAV @nav{} UDAV (Universal Data Array Visualizator) is cross-platform program for data arrays visualization based on MathGL library. It support wide spectrum of graphics, simple script language and visual data handling and editing. It has window interface for data viewing, changing and plotting. Also it can execute MGL scripts, setup and rotate graphics and so on. UDAV hot-keys can be found in the appendix @ref{Hot-keys for UDAV}. @menu * UDAV overview:: * UDAV dialogs:: * UDAV hints:: @end menu @c ------------------------------------------------------------------ @external{} @node UDAV overview, UDAV dialogs, , UDAV @section UDAV overview @nav{} UDAV have main window divided by 2 parts in general case and optional bottom panel(s). Left side contain tabs for MGL script and data arrays. Right side contain tabs with graphics itself, with list of variables and with help on MGL. Bottom side may contain the panel with MGL messages and warnings, and the panel with calculator. @ufig{udav_main,11, Main window} Main window is shown on the figure above. You can see the script (at left) with current line highlighted by light-yellow, and result of its execution at right. Each panel have its own set of toolbuttons. Editor toolbuttons allow: open and save script from/to file; undo and redo changes; cut, copy and paste selection; find/replace text; show dialogs for command arguments and for plot setup; show calculator at bottom. Graphics toolbuttons allow: enable/disable additional transparency and lighting; show grid of absolute coordinates; enable mouse rotation; restore image view; refresh graphics (execute the script); stop calculation; copy graphics into clipboard; add primitives (line, curve, box, rhombus, ellipse, mark, text) to the image; change view angles manually. Vertical toolbuttons allow: shift and zoom in/out of image as whole; show next and previous frame of animation, or start animation (if one present). Graphics panel support plot editing by mouse. @itemize @item Axis range can be changed by mouse wheel or by dragging image by middle mouse button. Right button show popup menu. Left button show the coordinates of mouse click. At this double click will highlight plot under mouse and jump to the corresponded string of the MGL script. @item Pressing "mouse rotation" toolbutton will change mouse actions: dragging by left button will rotate plot, middle button will shift the plot as whole, right button will zoom in/out plot as whole and add perspective, mouse wheel will zoom in/out plot as whole. @item Manual primitives can be added by pressing corresponding toolbutton. They can be shifted as whole at any time by mouse dragging. At this double click open dialog with its properties. If toolbutton "grid of absolute coordinates" is pressed then editing of active points for primitives is enabled. @end itemize @ufig{udav_help,11, Main window - help panel} Short command description and list of its arguments are shown at the status-bar, when you move cursor to the new line of code. You can press @key{F1} to see more detailed help on special panel. @ufig{udav_data,11, Main window - data viewing} Also you can look the current list of variables, its dimensions and its size in the memory (right side of above figure). Toolbuttons allow: create new variable, edit variable, delete variable, preview variable plot and its properties, refresh list of variables. Pressing on any column will sort table according its contents. Double click on a variable will open panel with data cells of the variable, where you can view/edit each cell independently or apply a set of transformations. @ufig{udav_calc,11, Main window - calculator and messages} Finally, pressing @key{F2} or @key{F4} you can show/hide windows with messages/warnings and with calculator. Double click on a warning in message window will jump to corresponding line in editor. Calculator allow you type expression by keyboard as well as by toolbuttons. It know about all current variables, so you can use them in formulas. @c ------------------------------------------------------------------ @external{} @node UDAV dialogs, UDAV hints, UDAV overview, UDAV @section UDAV dialogs @nav{} There are a set of dialogs, which allow change/add a command, setup global plot properties, or setup UDAV itself. @ufig{udav_cmd,8, New command dialog} One of most interesting dialog (hotkey @key{Meta-C} or @key{Win-C}) is dialog which help to enter new command or change arguments of existed one. It allows consequently select the category of command, command name in category and appropriate set of command arguments. At this right side show detailed command description. Required argument(s) are denoted by bold text. Strings are placed in apostrophes, like @code{'txt'}. Buttons below table allow one to call dialogs for changing style of command (if argument @code{'fmt'} is present in the list of command arguments); to set variable or expression for argument(s); to add options for command. Note, you can click on a cell to enter value, or double-click to call corresponding dialog. @ufig{udav_pen,5, Style dialog - pen style} @ufig{udav_sch,5, Style dialog - color scheme} @ufig{udav_txt,5, Style dialog - text style} @ufig{udav_mask,5, Style dialog - manual mask} Dialog for changing style can be called independently, but usually is called from @emph{New command} dialog or by double click on primitive. It contain 3 tabs: one for pen style, one for color scheme, one for text style. You should select appropriate one. Resulting string of style and sample picture are shown at bottom of dialog. Usually it can be called from New command dialog. @ufig{udav_var,3, Variable dialog} Dialog for entering variable allow one to select variable or expression which can be used as argument of a command. Here you can select the variable name; range of indexes in each directions; operation which will be applied (like, summation, finding minimal/maximal values and so on). Usually it can be called from New command dialog. @ufig{udav_opt,7.5, Dialog for options of a command} Dialog for command options allow one to change @ref{Command options}. Usually it can be called from New command dialog. @ufig{udav_inplot,8, New inplot dialog} Another interesting dialog, which help to select and properly setup a @ref{subplot}, @ref{inplot}, @ref{columnplot}, @ref{stickplot} and similar commands. @ufig{udav_gen_set,9, Dialog for general properties} @ufig{udav_light,9, Dialog for light properties} There is dialog for setting general plot properties, including tab for setting lighting properties. It can be called by called by hotkey @key{???} and put setup commands at the beginning of MGL script. @ufig{udav_arg,3.2, Dialog for script parameters} Also you can set or change script parameters (@samp{$0} ... @samp{$9}, see @ref{MGL definition}). @ufig{udav_prop,5, Dialog for UDAV settings} Finally, there is dialog for UDAV settings. It allow one to change most of things in UDAV appearance and working, including colors of keywords and numbers, default font and image size, and so on (see figure above). There are also a set of dialogs for data handling, but they are too simple and clear. So, I will not put them here. @c ------------------------------------------------------------------ @external{} @node UDAV hints, , UDAV dialogs, UDAV @section UDAV hints @nav{} @itemize @item You can shift axis range by pressing middle button and moving mouse. Also, you can zoom in/out axis range by using mouse wheel. @item You can rotate/shift/zoom whole plot by mouse. Just press 'Rotate' toolbutton, click image and hold a mouse button: left button for rotation, right button for zoom/perspective, middle button for shift. @item You may quickly draw the data from file. Just use: udav 'filename.dat' in command line. @item You can copy the current image to clipboard by pressing @key{Ctrl-Shift-C}. Later you can paste it directly into yours document or presentation. @item You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing right mouse button inside image and selecting 'Export as ...'. @item You can setup colors for script highlighting in Property dialog. Just select menu item 'Settings/Properties'. @item You can save the parameter of animation inside MGL script by using comment started from '##a ' or '##c ' for loops. @item New drawing never clears things drawn already. For example, you can make a surface with contour lines by calling commands 'surf' and 'cont' one after another (in any order). @item You can put several plots in the same image by help of commands 'subplot' or 'inplot'. @item All indexes (of data arrays, subplots and so on) are always start from 0. @item You can edit MGL file in any text editor. Also you can run it in console by help of commands: @code{mglconv}, @code{mglview}. @item You can use command 'once on|off' for marking the block which should be executed only once. For example, this can be the block of large data reading/creating/handling. Press @key{F9} (or menu item 'Graphics/Reload') to re-execute this block. @item You can use command 'stop' for terminating script parsing. It is useful if you don't want to execute a part of script. @item You can type arbitrary expression as input argument for data or number. In last case (for numbers), the first value of data array is used. @item There is powerful calculator with a lot of special functions. You can use buttons or keyboard to type the expression. Also you can use existed variables in the expression. @item The calculator can help you to put complex expression in the script. Just type the expression (which may depend on coordinates x,y,z and so on) and put it into the script. @item You can easily insert file or folder names, last fitted formula or numerical value of selection by using menu Edit|Insert. @item The special dialog (Edit|Insert|New Command) help you select the command, fill its arguments and put it into the script. @item You can put several plotting commands in the same line or in separate function, for highlighting all of them simultaneously. @end itemize @external{}mathgl-8.0.1/texinfo/qt.png0000664000175000017500000013215214167366465015416 0ustar balakinbalakinPNG  IHDRisRGBbKGD pHYs  tIME  $RtEXtCommentCreated with GIMPW IDATxyս{E\P$QEc"Inh\cpM1K1M1₎F12( F /0{/Uu~T^fcy?WwWW:uӟ)!BǏWtu5]B!tE?}28*ؽS}xGO:6޾:ϛcyLou& !<) (*ES>splEQ:.b籇ұY<6ϝNXa[†,a{( T̀MO)WJӳ;^YI)'މOGI)IŋL/\>g*z0̝lS˷ (*/^A}yv޿^*;do- lŠyP"?(8bao]<ͻ`ddCP5wD%mz ?C񥷱_~Ko_]}yhd;:%/y*,6~qi'jV F/$E"IHLLfw\6sT+@Ilg_ݎ`vALtyT%Ez?lB!MzTz8c=*xu[ӻ `z=K8s&Ƿy7 !:E"IHR$)CW$c93|$d!qƐ`x NSqד#ȑr$ߟ^!;mzY Cy✓r1"4 mgg''`t*tͨJ~(6u9$E"IHR$HR헍Gv@Aii)^w;Ϝ߬~߸ f{3Wϟ?QUQPsOz?lL=N ͟Dnÿw (RHDHc0<^2 Uj<_ Jpahk??8.q[#q f9lխx0-}#+ز}c=nfcޔ<) @WibF<(gT|%8wrF sQD#VrŞ_X}g~p4MCkƟ7_9||4N氅X!Yf3902!>ծHtW,)y]eag#X e4T\qV LØ 4UAǭˆ#x{G[/[E>o|]1s|mzgLWN/r1,7U>n`&AjHR$)Id?_7Z66̟9DY[,<~);}^zC4C7@l`zH8mL&Jr ܸp$*4TiWk8yDÐpژ,6& Yl:t[/U|}Y t\5QK`'O7<{bwi;;gWO*q|G>f9g뚉[m/-xNCVT~Xٿ)ˬ(ǐevboe뚓0&M>M!2'aB2b̛۞eWObwx\ rP젆^=9)_# ̛xť8k|o1A) bŸbf$E"IHLxq ߸ d}|:o5=c2aLd:}["vJAKX՛Ҟ]2C7GK/ߓoWo¿]2_L֓]2՛ҧ",^O@s/O>3Ny04aOScc_]DfMIdz,C|bBndkG//ȋ)B `qݜx}i玐ZMٓ0[W= p#D{jCU5'}Q!$_7-6fO.l×c}Tomp+tL(i "IHR$)}} 7D%g=~8=߲矜ckhѐQAv4Lq]GZKϞx;m~p,<]r&)vcM6ߤ1%عMd(=AWϞx?fG6e2n.{wkqb|kHh/~ꝣزTah) "hGRV ;ֈ5ܾn{=APcLՉ<2Z7sBn1grύŬIyWҗٹ2QQml:c)+7__7 _J3K㟇( /bבVv+3$E"IHH ۔NB&~ə8pF~hmmcpFcʔI1c,BSS j1>_>zhE3Ft*/7.v2 4cͯ"ez.wH^鋖w(G䙍G.o%g=*)+#P 5۽} %ur!"m7CgjmGAnev+3lKa)Aj4en:ς4tv̲vnk$geVb~c2hkS@WX@._mkVm jSyc#]/Wccw05RܹP[[ 0'@UU 4iZLz%:iIqo[rzkk1g}`~<k39O6{h|yKl!/CÒ&͍L\Te@WLCbf vJT#e^2? a.̼\ɧ̪=L:O-h 0{rA|h2:SFfciq9(-ĤYI]ge{5ܑbc8dS\L/M l]N*J¦MZMۊ"H+6)ֲ%PZZ}aرI}#555EKK !D*TUJd(ѾѶLzK{K-J7lP>y:C&~[/6kpe긡| Zm ̚G,ڏٓßcCG=o11Z!kʿǑ0RS5qǓ…K0wj!JK2P8x<k[͋Kc(ߊ+?1&`D^P|\Ԇn2k E?ĕsR),ɭ`0̙Z%Y 2k(xC\2sfO. 7 ~>dT̞y}k-}}\ԡO(jGO~EӇa"d"3+'>Jp<` HC|t~@$E" 7"IL?bs҂555Bعs',aYv܉P(g}z*-EMu  A4.3MSF:^MM TUm'7u.~]-zC_pn)wEwbyꭕmۗ#%I$E"9E!وFǾ}PRR6#}>,&NSbjvZ /AHR$)A%lڦHaˁ0^lQ1chjjˆ#MFQ[[M6z*ƍ#G";;\KE"IE"IH |@DJ$4)Ruuu8vjjjЀh4 0PRR"0 #y!E"IE"IH | D4 CQQa!;;[0C+ol"9/:$E"IHHR$l:`Hrb>+A!A %gYYY,B!DKK|jB!Bҡ!BEB!P$ !BEB!P$ !BHB!´R=m7Uet%sC!dh+7Aaa!B@.ߤ |N(B,_sLtsIL+U:-myU^9T޻lw>}%Kg>BHHfwFVG~#:fg ^wDDӉcglruE!tHߑ/T_n&Usyu{{]NK;ιeۙ1]BEG{F{BzRt{[s ѮBȠɁ&sב|CW2#&֗M@a&BcꩴCz{`O eG L զY6IB˕mzKTj']1`BȐT͒urI۝Iwn z/|Uu2ΑB_4m|w_^AMz;ϥ4\-Tҍ hs,v6ϜGBHo9q!,Bj7]_]k.&=dBtY$|Yv,[B!gQYB!"ه0DY$B$B!"I!B(B!"I!B(B!"I!BHIB!B8}ϓb)B!$ZZZkm{w B!$#I!B] UWWcÆ }r'}m)/B!C^$w4iRZ9o ڟB?ո pqˈN!=%0b$U>9 cKWy!BH‰D!BHDDkVߜX !7x555&Oy !EKfnBs9_sXov+_H|ҭ"IB7H͙3Tk(h$.*^K@BF HM23y" tרmxnU$1>BYv>eɒJ,YR,A, Hƙ0.'+VTޓȮG{b@ΥlHc"O?$ϝBHz7aֲ>fJ^8 )dS t$C7GIO(ĽWU>Uܽص 0HVUUbt*/Ҳ'&%FݴmJTlAad|8":.1yޏF8Rzӝ'8ϝBN ٱclfZo;8)JL0-Idt@&LpY Vݻ!ovń΀'"Yk䩽4ށ9'LK kūqfmwmo> [?-|]4uuu2̉  tu`Zk{(;!$p⣶w\ieP}UN+yu,îU5 KVa 'YUX,YQ]}*+T6UYKJyGGw$Kòe$8*.A&z?)7ISiq^e@۶pyAtw˖rN z/*W;79UPx NrBU%~=1i˥ȎF,MܮuwTKږW{=LuQ}%/ĹuS]w+1ϝB0=ve%6j nA{"n2-ëUXʳ4b~WY'zEʤ+p%}\YسtJj"uuuCjdaۺmWzP>wBH?I/ݱֶ+)J'OQQa2g+*8k~e(n?e)y3zC:*}+@r~͘M֛;I ƵԹBHvZ^>>qT@Ql^.3xiথl<\vg@J1u[o/ҟYg IDAT)#l:=1"9ΝOEN/[ߧJB" !#S֛޼_i_kms'SoOӌ )O!q)Jm0G$¹BHĨmBbX~=N>!S]YozOWy!BvHze/HB!$!B!L#Y]]͒!B!I$&E$XJB!$8eDһCg}6^ڸ[B!65>i>NĕM6J!+$p"J_SB!n$B3WmֽǒDReB!@$B!IB!DrǎرcGo'B!\$`Ĉ(((B!ҡQۓ&MJ)y=B! p&I&vB!?`6sB!NOHfnB!%z !BHHB!$!BHB!~" ʒϛ0v6sQz#ڊQFu9m㣏>?y}ݘ?(ǏW_Ŏ;i&|[ӑ+oڊ\DFFكeVTT0!)Hu444 ''gQUUX'~Ήrb4^ollĸq:\W=z;vK/뮻6l?tI2T)--eYm1='NDSSoۑ#GTw}Xt|9˴ǏGmmo '|r4~?)Əcb޽t͘1cg}6֯_&3ZQQQҵ2eJm\s5xRײg_VQQS(l&"ٷkIC|yv1aW^o۷999oġC؈_~`Pa&ma ?o;FKK v/!i, w,X={ѣ}~z@NNLӄ(UVȑ#>msMw^\z504M0Mz[ȫ D"Xv-E3<Ç>$rU5@UUSu/^W1uiӦ ?яEYڶ'>~1999(//GKKihhi={|ĉaSZZ.dffx&˗~|ۋ}o{(B ++ W]uUk---mO9QbG guVŋn6Z EEE0  .e FR$P$''W|{Kڧk׮ɓ38#ezHp8i^& >6 Y!EQ444$5{fZm!epM74>NKYٻMkuuu];4qI_ZnF>W^n+Zqwx ߾mjjB$I[B!#2!O?]>hs_4nK s=UH\M @_L*֭[EQ Mt]m۠iZR}vu 7nB]nTUE @~~>t]ǹ++cǎE0C ;;[(~;4MC~~> @iiiH8|h~:Bze˖_Su[n7 }i]~4 999Ɂ(x8կ}5MimmiE0DII Z[[555={64Mù+#}WO:餴˯}k?y~(d(s뭷_ibٲem{1w\9o ۶1}t444`ҤI(,,଻C//| ">?O8Ν !ފk \mgy&~npue4tKK {m衇RF%Ʀ"BFQQ{={S4MVŒ3-3<EQ\tEB2e *C=%K@UU\qXt)>OZ#L"}<*h4>S &$vkmUqKGnݜ/(s+ӷ-Hߐ# EQ!> ֭['֬Y#_WBDQ- P($v!viB!Ǝ+Sc{y9튢"??_!l"B4@ !,KSZZ*LB &⥗^ĢEd~Ν+߻}N_mm:C}}mܲ t|P^?<#ŽY% b֭4:|ݺuB!~Bm۶ bܸq馛~?TED"'ϟߥ5 Isssi}W^׿/V90nCEEqꩧ_+SMtR@KKxpF-O׿^{5,X qϣA[l\p sAyI'NLӔ29qD8}OtowޔfYYYPUUuVȞF?!~?H5k0l09h0 DQlڴ +r{o|#iڴT} }]|. |.bYF>_`=_2u;z0pҭm%2͍ \|}YxϞ=TW{n 6 퓑T/G!++KVԝ@`qI;Rӌ;l>K͛m۶9زe V\0!m0gs7 ?ilۖۂ tҔizOSRC~~~NF W^ !:… etV4O+o&?pɶ% JKK}ͻ_%7n2zh|BƄ cJ =|0J-c7*%U'6o,?0ݦu7zywpFΚ5 B7_x"31.Gz9r\sM/+V`ƌQuWHW&ޕ+08 <a6~s/䒤cǎnˊw.8qŜUVw|>~x=zp?OtRo;4( E :tuwo/\qeXƜ1cFRz9r$[F2:[tw޽[{r/~ w^!7ny'GD{"77W-GP_L;:E!E]@s=r\ ž}|/ƌ(Dw%Q\\,}:tH466McB!nVo޼ybҥbѢErۤIeYb.K:p8,b׮]{{L9rDuY{7~ ICMM Ν{p(⩧Y"~a=²,om`P|CejY7?|ҔI{'i-//O_Ŋ+XW⇚4%aÆ֭[$O^w~O?,K.p {Μ9ϙ3GX%x׷;H()RUU!Wc=ť^ofy#S$Hjv%6ئ8cӦMݷ0OHHŶ^KWmS}>@ ԩSdQ$R$'MÉX( E((_QK(B({܁2;2[Ӝ~ ѠścI3t谅 ^Ew\j:,i4 eCUUG,aB!d%ɀǝ'RE|䵢nO,͒05Q-65vLت ؊3-PbvZr!9B5HL\D&`\8MնLcLG2?BWt0p 8QE&rNqۈ(""3mYr^I!xO!P$ F% a gM #`8S):؟;9Oa0-fD8F$A"QSʤm;}'(βBETlI/ 7 t'$hG?#f%,Q+PLDn|4&(vm3jb##=%BEKpd6}TZofh2eVl ԝA5jcLJ63mوF22iF wm˲0zH! !P$ P&)\STgnVtmǚkWmiw ۹~w7,˜3H%B(wdƝ;3[1M@ grՑLw_E[-lXL d(nD [@U(v|!2I$B$X"™;;kjzA=LR;ltX 8FK8Q+ t%"Gb 4۪-%6N7'$'2i¶ ZۨFkkj|"r3)i&,ӒK-{F^}σmPw}7)B( ܹ`n\7ހϯeZrrUU**¹Wkci#]tB -*9ІBEA CQV\2QQPq<H@ħ(l(tdO,/9L $!$!y[Q!| -x-lFDoISr G]˲LH %!$!yݨ.pEzVYo%.ؗ}L^ze6BH2۶O(>VKd3TF'9ȆBEϢ+z$Kىj7mpB*2W$B$qJH!TzQQ$AF!mۙȶm\bwkBwG{F{ѝ8]GsC!"IH/ĝ(t(dRgl_:_c$3M[M?\i]>/¦PBH2Lk({J61ܶm amBw4 j 5UHltr'2/XP<;ѹ|P( !P$ eY2*JozK~~>Ν+mGjAhC7e 类*r);ΒRRMYA4Mز,G(a|E9.Y.!C c}J*le{!$IB]&iZZZ|>^sID8Fqq1OT a @@F٦:t] P 9hPra ϚޱiF`R,,) fyTb譫\?|>BE!`XuHrBlڴ e!;͚&2qNxQ__<6è[Y`ֵ0f D0t^SbPwG-D‘0zV4mF`Jrj*ԈU ,A$d0ˣiPBU V_)X孫@l۞KI[1RIHSX{~s]K: ciuhTʣi튤;*O{x/3OQ< IDAToef ##YpnA#D@ @ [,8M؆e kaJjy{3l<)7`"8_ gAʅ Tr?W3]Ž^Y^N$C$2ថH^4 6 R"u]#Od$A i, -~7( >Df0ZH:T[,@VԂ\XIۙȶm4okFɤgjȶ 4Ϻr dV@uibb4MۦpdQde&Lw`L0Wz6y.>ytoeEcc# ÐxeI7zi"BrTΦ%GX‘U?_~~222 z"Bj$2&φAN(Y\P8u4UYPxM܄ P,/GrT!0`:UtpuI"i"j0QDc}}hD')"IH V 9 "P`Pns+s tfDiI)j*f˲ lw<[~u tMT iZ0&LD$AČ bEB &,ł=(đ[OQQF+BVA"=0rpҨ#tш   ù"F%c"X`DD"##ahh$5eP$ iO" ÈG dddi"33@YIwt$q~ś&وFϓi[6كHmٸ{cf9;f2iQD("VQ+FĎ jF&*X"@FiW}+M%,|pL# /p_1sWI Ȁ `0.i$XsFHDt[e~)_L>ā5݇pH}YDk" 2 )R !EҲ,D"X%#eJ4Mp&OŽ;݅߾_8r^w)>_Mc:iicx)tCH UQォ8"$USz.ߏ=la G=*%Իi*#cj܁4~0#nD2QIEMs3 ض#`3B r;PS[nIO(%1f t<\4`_d$AkUN)4j(ڽiM*~葄 iٖ='Z]vaNDR7F& I+ydM@і>EQv!m#jYPMӔGv1Mp;00sK1 Nh񍀯N}xN~ĺhR =r T}9! u.Z< _?bhAgfB}fgNTHWÇ{H&NKI4}}!9rÇG]]4B!am:p4,Gt{3Z%#y0HFU= 8(^iMSdGmJr'JD.厀p\,zCS4g0T D@ h5Zh "jh6l bW.LoP(oeL Hhi ?CMinc9NS7.t˂iN&mH1t玴lHf$H4e( QSaC؀a8:ZRчF<USdƗVuup~r)lJ%E zyԴXx3oXErGHomieOJz2Q2[NNNRdҕB]eӴwNIUUq)c :MPƛbBdE%}+N~ ݀&}maCBB-l/e%]deL|gm#ZW& P]ѡ*IUS*lF8ahumQ4+P2 g¡0,9HN6`sj @(9M챼;2BdA7u&(Ʉd{,puVY7Vfl"?8K PUc4 Zs/UŲ-X1y>No[nE?Z%1N$B^PVƪ뜮jkyy T4_=EuA g(g۹H⤎GgtJ8~8B y*8lfgF'V YRk44֋HE )do 6a<\@-4m[DY( ۱EQ['5 y D62NJYD&B42Z BJ2MljYGGO 'K4GLYֆ+ "wH?ء3&IOxRFOIWFWFF;GVrg y>{:!Շnčּ[EnBm|jpC±ڮ(EwCCCA@VV@Bp acڵnj3c\fM("+2p +/ZףPEY![i*~ ?x2ݍe,dz} 허*SiDg过XKh@Fڎ:)88NHpJ0f6Jlaq;wpFe߭U2 -(s5 L9Fq( m߄gwjvYdҦ0FKWu7aI3]Lcylce.Ǵ6ѕth 4&dӛwBժBX%R'dC^ (+%>/2.X` -rQc2̷P-,hGVCy d* ( m2N_\}@W\uZ z_RQq ;fƶpƲNjL" ͬ¤qD$nD" R HmD'h('Dڥ,[ o/&SqKϾY;EM1[K;$[PD"?Ʊk֛ƮߚMDZ9IHXNrVy;G"$t;灻-,Ҹ#DF/z ^zAv?q,j?6L5o4]w;ڵkZkF)(tIevc0K!YXD}oD̛c ڭvdBg":!clD}AX3 I?[.?h8l4\C8x2WZH٩ӛ`͡[4R#n$@jaM HӞ#SajhF* :n pUh թ+4N:@%;ɔD$:ֈJ+H펻ƵE+=BlZJ$;۲RXF!ecuk!-\ N~ϋ y˗٠WgƷxߎ/&o?i,BVRnPJ!MSh1i$(022gE.g(Nܡ -tgdڣŌ"fPTkmK$!VՊmt }1-l(wNS?xS`茉 tEqe &ZkXmvlZnqj ZC_/!4}Td6`-ǹb2]#rϘ6sz^XpKd"PVaʴo_h(=PV!1 b#q:༒ m /򣲒OdKFPPZn'ɲЀ%ZVeR:"ELjaMS*RH܍㨩GMyط֛R`s㪫h5#9vMD-񢮿?kǡdOOO09}tw*p_$JhA7 "/ǒ<7K,svkKI}SW0[uG-U\1M'1t Gڢ5ϣUU*Shg0 2Eg;׭@7BR(*4! HSNN{<ɢQ|`m5,0}t<]aLhBSdmetf`{X]c%>_9s vVQJQ8Yk뮻3 fWg}D~9TB6F VMpJDL?4%]@:*=tNLVt;-Ә (0~ZKl̿z,tb0I(ʼuo˅v)yi~1~m10sǿ~ף!V&G0$ tS}qCr9).pwC]EW8޾$MpZpZ$*THveH(4"#̡E'fdd` ~U]Jdg<Ȫp DvBNΡcX!h4y(s;wnx/qcxxַV1:Z|Δ_yZo3B1yB#R We[2?:&!k-xqwoi:VX]VN EXuҔjƛCW * tּQw]K' )EcT]5z.311/F? Yz#(Bě&===n欔H$x8Ox8i?.EHk=}T *R8q,(B'>P7!08clηi38G D"81N{44ns$w(T#$y.y =QhpSw2A*Nغ7y߇q \NYyBPweRa(IXvHE9{SvTz'6jfₚjvB!I\dWAM LPPxoUW_zA kzc0]w\8h4> u1;ܱ(w|[b}]fww7[זэf#uT`"J;2xT"1%! &`⹝v&smI22:9~ޱ#WdzLՎ-008 b#2""K{=B#k>B"F@B L>[BŤ!I!IT{ .6B0Y@)U((bzSԉ|zü0"T{WDQ8p0Vd^=yf7Ƹ\BuzIj[T IŃ!{ v @Hx^ B)o?Tk{ !Aۇ17XeNn^lY$HDc$D#ml@f7MCADy#3hHv܆$4*00@Q 7>w\Z0- 92dhH##Lw׈Jec_D1I {,w.X ez/ʣgRF[TDWaT#k*]͓F{/ڴ$IFFi&E7[({q(Ȑy,p91QSo7b?/!d;W4 Rzd$C0 >>%TRL'tSzD()$6h@ ܘ ҫF3.hԂP{চ#okTzW\D{u5` m[c]qJaZ7~0^J -5"<&2V+IyI~ĮHF}WN_,G=@bd" 'PmF9N-ao۴ u-пW?v}'!Ky MF,3eg{(V$d#lޮWRkFz5wȟAB:u4]6iLՙ#Gf3SmLsR=2U7{y G‡BNC(\8" %"YH(B/No@PEY^V_YmJ$ @Vd(S,w}cmtfIB B-s='\E K\^\I+:yJ+Ĺ|yy+h}Ԋ 3^3#ORx#U'=$B!I,&O^ '"&M\RycH#}lɹҪ*lƻߑ( #uB!B-L<Ĥ*=ufXŮOQ^UgjBG [@r jHB!d }lh`]z22ZZHDPI[zOx M~й,O9rؤ1YD2M!d%ޟ4KNY[=MIS4 <\8ZaY<'9{(kcd ;q%%!U IB -i esGW ͆f%Diy>b%ס?1ay(!Bv!ǒl,9%F Cآ̇ly'*5\;F9.9@\E*.LVƌ!m@H2בlWbr q@Wh֮O@.sFR|ݨY!sאPy1|ZB!ۈ$dgmBJ)Eo1II!B!$E$!B B!/HLB! IB!B($ !B$!B$B!B!BB! IB!B!I!B($ !B$!B$B!BB!PHB! IB!B!I!B($ !B$B!B!BB!PHB! y<ʄB!B!e )& !B9D%X80 B!PHB!/{B0M!B!I1I!B!r I !B($)" !BC^bB!bCBRDB!l[l )" !B($7B!B!B!BB! IB!B!I!B($ !B$!B$B!BB!PHB!1yYb֬Y /}{1sLL:QuX1Xr%-[%K}{0uTB_~9I'|K.gqn&5yI^㩧Bww7`tt˸}x ն_===BԶc̙0`ժUHve6m`;1q1n\~yGq'cҥR⦛nGUrWO𾷽m袋;@ 4 hnRpZ_cxxx@Kq'ׅI( ( zx0=v}wSLYfuӃXs5RE0z{{~~Zk<#'mypC)8qG@)ٳgoJ)-ln֮]v-L6<@$IG 83/y>^G}4."??'? $ 1::ઞ mZNJ+^Rzgֶ{߀]vQ!I5WJ)1gΜp㏯O($vp.COŽk~0l<v{ a gΜ }j?p}ҤI?CWU$Jِ7 I4ꫯ9+Wzꩵ^ ^s5]]]{.b}xO>l6l6)}Q]w݅: Qh4C$xg_?_[oh8\׻4B6W->O$Iɓ'?1Cq5k`h4Aoo/Z[n : qH)qm?)F$x\{֭駟)%&M$Iݍ_A~ɓӃK/iIk׮矏81y䚀={vl|d(+I($ yތ 6 {qDžV3!\xZ.͛WyYBho 7pCI2Q|z>ϟz{{7z !{+{o|;3{>{!k? uC8ðxⰀ;kLJz(w/0N pnV#<?OG>r೟lpaLwa_oL_2eJ- p뭷Z>8G}Zk|C/Dg׽nj*2o@'BR _~y}UW<0m4Xk1::¬?46,1XfM j6R??>O#2>xl6}c47*?`֬Y(bP3<DԩSq%V^ymqI' m6ԩSCȟ'd;kU<@΃+'J_%\?k"}õEQ0G?Ѱ7ftи'CC0o޼ؼMkPBN80{lhq!N>qyi-X \e>m;찰{qjk-17 5?KYg(jk>㎉O/+j*\ve/l8ַkr1O;4|#}!&Ƅe˰lٲ};v(bsL{O_l ?!,?zuQa?뮻{Wbٸǝ7{NđG{&| l+,_<|8F[/76byC^f]U[ŧ ˆ+r N{IG>Z覴9so}v>S'?i]_p!6!=:U˵l]q\[-olU}je?o\p }ѵn&>',Y$Lx衇0{q窇asSrlfuh"̜9Vz+_{gST8?c-oy_}iZow}_wyozj\yxꩧ^v5gʕ+7r-x; c gY($k/̘1eN(p__'ܯjc;s&V\z+._?O=Goo/Ν y9CGYgiӦa!! v=M}݇vi_,s ?+V@ݞpj(ҥn:&㩧G~W~}Y|f8/f]_U6:Wv_q 'lB=osFQicL|xӛބ3<y㬳&ݑHH2v͚5/v1w~O?=nZp3'N;-GwO<>w7|CCCȲ O>d-\/})\j_6կbtt4)~-;44;._Zk_CCCW;>~%[6y(, Ν;^{sαa}s+VZ{mBO{fi/| Zymp,Ul$aۣ>jGFFٳökfYV{?M:^7xcxL$+_'*W.튢(E]#_~3<3l___x~a_WjoOo===}߶Rp{޼y|q7k-]j'~wqsox> qU IDATc4M `ԩ6m֭[ӧE_{-q\>Κ5E/!#󐑭>Є+os zXkyo$ꄇG+,$O6E RDB!// 1e$N1$ۤd%˜R@* *υB (:dȦx$B^f)"鼍$I8iڹ$H S'$@'y E<ϝ,OFSLRHB!dHiT.2Al%^R"15p^Fr#kd y;G;k˼.-$6!es"]:#x{{HMt5hv5h4L F0`z:BX,S8x-zP]Vm09̙8 mqɜJ2LY")7BܰFfBww7ݍfD#j J 4vv;GW<ʱg6I qCiB&1` PHģ.&*+orY]ŖW4u,ahB{oz5ҾQIͦFϤ ]1 Q1$bİ"9V X{LXhQLjWmMv !B7kl."a]x^I ɍ6+ ( v @xaYyZka]zQB&dTDdWz03^nf "BE@+m4Ј^5y/wmthd~S5VX($7 Cۤ* eA?Y).-Hpo1az̥)PBX)#8N &Kً^^^iЄFBX)aFF0F@kt9l7spWj( E( gabPH2! V1b)K $R ЧLk(UW(` `!eK$6AhDOw7&MAo/gt[hh sZkPh"kv.*څhB["3 c; rj( GR?F;g@tDRHn mo"ҍت8FǡZ0=˒BJ I+0ƝE򬔂V Z睴E9?PJ 3z>7&Y 0JPVfF[@hgmZmڭ YA9]օxh(#HcFEmB!I0M)t2I)ĭ48tB2:"Rk@kDyFyY/roBk!!sɜ [Xxʍ[sɄ~8]3JW`݃IzzcIBKe΢@!̸se1: d-ny! EkSrvXG\HNhۺcN($7Jgއl\2g g!yϢ6H l@F ZÿOC,PD2DZFG"G]'k9c+' m媲0 IIH? H $Bٺ'p/*KdW]u/ױBeX;[[UqeVlG1? ,ߙ-T@?Lv,-]7քK]OҎ {J _?e3 E.MH $H $HoQMLqڗ"MR4BuJ }t\LD#F#hf(9 H_䨕)ţ?tG0C o[0WB:*&}!KQh 5T`bt,5REBy(5֝*Fv.ig`샑ĉczX~tD' !iYhlH!?քm4@.@tuRZ?MȔ ?LJ2*/|&aDAPz߯ \oXfj 21c+k7?adad (9tʞkk ug]y9ӆ6:GxWH IB>7RT<70I P̆5!iBZ)eMQǠPE 4."Div*1]1P,]U%"a#aAwW7&r^ _!k1S`ť. 7cIt9q}cDwSڥB jEB,w1skLQ[8?4aޙC,nsۇEADvDc8H8.?n==UHQl6*Q Rh+ 4fY+| !+4.l~^,($44 4FjѪPhZ#kd)$ #}Ng/ƬKu 1im'],“w]?IJQWހ[@T"F$A Q `DkZ4v#"y `ť8Fz* yYDdB+If,M]h7IB2@K?,o` (PQ98 j"2MS$If3ED&h6ń.رپ4Mݝ;DVP!-Rhgr(U@v ,NN^缛.q܉H@[hjDlN5kt)&8E<5p RLք0}BtS4@R@\`F*R@^VC~ U((D.BDE{5!w(n\h4hh4N$I/$@Gi3`XZ1j6ڭQLJNۻ˲ߵ眪tO2 6ep18tdBB=#E$"Y" D"$IHۉ떇>/ccOS::UӧvZc&%;|>z_/Y1$d"c"ȃ]bN[g#cZTx[JdWd\bKBkudTdC_;y/]nƭ,p][2#qTivv*<|xrXU{erYO~H20% 80 z:T?ًg V~ˑ;le52)IR^*hXq0ig57=x$>GMErOL Bi-Zˌ9sHf eoÂĔie2]_;vÛ7ç.UW߽)9ICtKHA=NDÕO߄ʵkkփgK;'/O!68I*הʹms)xl3|/ikFAR ֶ+@n!i*8EV|BiFn-=0|WrIZDN._2&Zq)6ƛg:  7>|=q`46w`RR 0`^fXW+vwJ!qͰOp~ ֹi Mq6IfVĴbRiΠ!ܶ̾.,%"!<8H`H$L.w0$$k06͘Ci%3΀#촣b brMU˱ L14Nəϓ9bW]giVC.qqV:|W|ajV' ] SO9eVޮ1#q'R+ "YBN$v-} sXix5\}#t}2O}$w` &cF cG"g0Tg^=~G^]mS,cҚ0WW-WN8!zAسwsnd^3 {Oa0uߝS`trœoަhǭӹl!b,rc*i"HôH[6$Sd6~ [Zr."׺rn0Xe$>46o-A/97Lˎevvw8X֦sS?}swW71[$&ZraH Cf`=R08*Y=F9xty)%8y?3Zf;9qZqIy<%3UeG Ynv&7/mZx7&o?O*X-IdR3!MJ)|J$Y2D3ɥmў3|㱙΂LZ<Ƒ# {$]vzjG]5cm mj[n臨H.ShuRnӶm(2F EY6Of3 xޘ3-vmkHʁe(+18|#8~lo9maO[1ME5fP>G*Pv*ʙ%eϢ_=_51t]4KDOӹ}ibbszc=}Њey͛cgvC.[9Ikr4?^SoW9ӧ45{zX'H?|+i?%tޒ2OԪ [\pKʉ###n 8%P]4|Ǖ`JepUJ[h7qɫL:0O/r'FOJl躞aZmj [up޳G82C9{l7SaRnّ[:lLauJioV. ק0[:Z9gdL-z/$R UQ79O-RHjS]2\vc 8>xcGgѯ+]Fh7#+kv_VnĀGB(Ŋ+gOm &'?Y^_WN$&ggr[ ,n^r8n!a3z?k)]OxYm?O72tJ6&U@N?dd7=ٔ˽^)M<;jX%wyX ?M~,тd{mn}]k8ҭSsD;s}msˋ7@V!!ڐ J1;=KL׮וB6mc`&ƲWW?ml( d&] wҨ1r #,e 3 )=N4[?uu936Uә#'eRZg2o|+ CHCHa2t/D|i+v4ri@Kq?}_+!sμMΧ?v+±ǰG,yJ{U9Ʈli`׌i.:\(]Sol7mOg%3dxmpa뛱uaRQ.$rx}`̃h5HΪkșutu3U^\3-Unlө݂~Q}bl$aﷵ)x kD> @nWTGDbrD Mi:Ùk)ǔY&LZ}?HzYX \ }>yl_^^s^#vFZl7=:EcݭbH9; g̥=) &THp7bg!]0>5 mn=ZO CXo\gG5{{9rg`"@_XRNlITrsO }9t 9m")$pu aEP(m1#}׳X8ܞ;q4Fn|"{Q1qmm.6],m@AL94CC8?l[нqFm9]b"Xz8wdGsu=pu:B=^ϏfscY!)B&g)/$9n4E7M?5"wf3MDRϖg DHa MeDH xw 7gcmw)ĠYc{Xfdv6uN1uUlǧq䆽+wbɵz$RAn-=gw=U[6 B/oM}TyWZ1qs}>{{Ej%RwY?yB,u\ŭ\pZi+8SN iB$x=H:2C4>n[F7ҍÛܸ꒝v;8z]=^uekkQca2 sXjcOa(]|loXSX+S-zc{^V%3[O_C!lNeς܀d-SnO !|$_lF&8zd |ͫk1]35h0m  a=tUG1,x_#Y{{prձtpcv̕d,Z>00B?<c^v$(h4,T;}MIg&s y$zV*Û,K~>@eE"qh(rƒAә8gL\jg2kUn$޳Fr2, ,vI> nӢd*71FL3yI,vinLXR$QyfȤ*KL)#\g7r7ׄ-4\~qRcCm)z: z Zk]d}~7x==V={+Ұ9q:6#l;WdP'0q\3 #{O׹2 "@9WQyV*_Uw;8Da=͞׽u<[Ob% 'XfLuPfƩG]!IP60tՌ9u|Wv=y$[itY'_|"ˎ$m B".#FFzzoF M݈q6G.]΁),<6䔹ە.̙fzH+a>c;o5uHwd L2\i-,c/]9wSz=lcl1ȸrRh=P^O |V]I꤂ĉի-/\`h?sqVoj>;A7fo4y=KOO[7iڬ\ь`q)WwŐ!oS,jֈi*F*k MV竺%L3歝=Ǒb]mHIF"oW˿GѼ"0ԯ5w}]VW&4601*gڄv6M*} DZg.$[ nr.-w8H9Z`?YHb.19vvlO 1vAuhpD 팔mt#~9G55Sя`됄0 %w= ?^i9{&TZ+J>Omn4~cq3^td-{p|S)H't] ʤThFZ︔p2޹m+;C1|6a3uvu"]G7tX7a#+[ j;'>CNL-nip-/{;7oln jr }larc@ߏ u8\Ο-I %Jۢ4َJ_`q=/;vczk+E>aS˛0S$G4bnfpts{*L*H~!R+)T^7D޺aroU|^;(]r$ewb ^چyrj\cJI/_ $FF|T7:=i=F[ _dl<9՗ x3I\LW0HJq? nomȵbTI^?&K5T~gW[|7~gpߛR7Mw, 7u=!$1x1ŦoLrl"ZOa+cǓ!RR$dϘF<0u^P9]t3!Q|.!,rK)BجiB`qHNۭp "r?{Rm>5&OiK8ees杏kRJ(so"J)&|,zOZ]u=$ mT->b|^fgBچlv@$"yTaQj+93m={a_,躎EkzX§֐|э#nJsrV#kMMYcitYr :)tgrє"" 0&lI0Jb|H ):c$B<7&Ӏ;]"'%I&n"?߳KD[^n^M:&Xo0 Lh{qk2F0 )r6|Vミibƞ!$0ɣPR|VlOiArVfgCRD~O`hDCh_^ƒcLvbdHɔ\]ƀO_X.Ui#([Ԋ&QI`+߬@2ndka?1DDnu';>xGIDMsH"홦u~1S #KL&|0a1yڞ¤*H>0 "_@y>{Is||L &^g 7a\/zVedɒE}|}8,IgoC{ 4i+M_XV+sVm<{[M}(apݭ點,:P[!MܶC(M?rQg/rS,M]9)<߶9J7#}(OThe color types are: ‘k’ – black, ‘r’ – red, ‘R’ – dark red, ‘g’ – green, ‘G’ – dark green, ‘b’ – blue, ‘B’ – dark blue, ‘c’ – cyan, ‘C’ – dark cyan, ‘m’ – magenta, ‘M’ – dark magenta, ‘y’ – yellow, ‘Y’ – dark yellow (gold), ‘h’ – gray, ‘H’ – dark gray, ‘w’ – white, ‘W’ – bright gray, ‘l’ – green-blue, ‘L’ – dark green-blue, ‘e’ – green-yellow, ‘E’ – dark green-yellow, ‘n’ – sky-blue, ‘N’ – dark sky-blue, ‘u’ – blue-violet, ‘U’ – dark blue-violet, ‘p’ – purple, ‘P’ – dark purple, ‘q’ – orange, ‘Q’ – dark orange (brown).

@end html @end ifhtml @ifnothtml The color types are: @samp{k} -- black, @samp{r} -- red, @samp{R} -- dark red, @samp{g} -- green, @samp{G} -- dark green, @samp{b} -- blue, @samp{B} -- dark blue, @samp{c} -- cyan, @samp{C} -- dark cyan, @samp{m} -- magenta, @samp{M} -- dark magenta, @samp{y} -- yellow, @samp{Y} -- dark yellow (gold), @samp{h} -- gray, @samp{H} -- dark gray, @samp{w} -- white, @samp{W} -- bright gray, @samp{l} -- green-blue, @samp{L} -- dark green-blue, @samp{e} -- green-yellow, @samp{E} -- dark green-yellow, @samp{n} -- sky-blue, @samp{N} -- dark sky-blue, @samp{u} -- blue-violet, @samp{U} -- dark blue-violet, @samp{p} -- purple, @samp{P} -- dark purple, @samp{q} -- orange, @samp{Q} -- dark orange (brown). @end ifnothtml You can also use ``bright'' colors. The ``bright'' color contain 2 symbols in brackets @samp{@{cN@}}: first one is the usual symbol for color id, the second one is a digit for its brightness. The digit can be in range @samp{1}...@samp{9}. Number @samp{5} corresponds to a normal color, @samp{1} is a very dark version of the color (practically black), and @samp{9} is a very bright version of the color (practically white). For example, the colors can be @samp{@{b2@}} @samp{@{b7@}} @samp{@{r7@}} and so on. Finally, you can specify RGB or RGBA values of a color using format @samp{@{xRRGGBB@}} or @samp{@{xRRGGBBAA@}} correspondingly. For example, @samp{@{xFF9966@}} give you @ifhtml @html melone color. @end html @end ifhtml @ifnothtml melone color. @end ifnothtml @c ------------------------------------------------------------------ @external{} @node Line styles, Color scheme, Color styles, General concepts @section Line styles @nav{} @cindex Line style @cindex Mark style @cindex Arrows The line style is defined by the string which may contain specifications for color (@samp{wkrgbcymhRGBCYMHWlenupqLENUPQ}), dashing style (@samp{-|;:ji=} or space), width (@samp{123456789}) and marks (@samp{*o+xsd.^v<>} and @samp{#} modifier). If one of the type of information is omitted then default values used with next color from palette (see @ref{Palette and colors}). Note, that internal color counter will be nullified by any change of palette. This includes even hidden change (for example, by @ref{box} or @ref{axis} functions). @ifhtml @html By default palette contain following colors: dark grayH’, blueb’, greeng’, redr’, cyanc’, magentam’, yellowy’, grayh’, green-bluel’, sky-bluen’, orangeq’, green-yellowe’, blue-violetu’, purplep’.

Dashing style has the following meaning: space – no line (usable for plotting only marks), ‘-’ – solid line (■■■■■■■■■■■■■■■■), ‘|’ – long dashed line (■■■■■■■■□□□□□□□□), ‘;’ – dashed line (■■■■□□□□■■■■□□□□), ‘=’ – small dashed line (■■□□■■□□■■□□■■□□), ‘:’ – dotted line (■□□□■□□□■□□□■□□□), ‘j’ – dash-dotted line (■■■■■■■□□□□■□□□□), ‘i’ – small dash-dotted line (■■■□□■□□■■■□□■□□), ‘{dNNNN}’ – manual dash style (for v.2.3 and later, like ‘{df090}’ for (■■■■□□□□■□□■□□□□)).

@end html @end ifhtml @ifnothtml By default palette contain following colors: dark gray @samp{H}, blue @samp{b}, green @samp{g}, red @samp{r}, cyan @samp{c}, magenta @samp{m}, yellow @samp{y}, gray @samp{h}, blue-green @samp{l}, sky-blue @samp{n}, orange @samp{q}, yellow-green @samp{e}, blue-violet @samp{u}, purple @samp{p}. Dashing style has the following meaning: space -- no line (usable for plotting only marks), @samp{-} -- solid line (################), @samp{|} -- long dashed line (########________), @samp{;} -- dashed line (####____####____), @samp{=} -- small dashed line (##__##__##__##__), @samp{:} -- dotted line (#___#___#___#___), @samp{j} -- dash-dotted line (#######____#____), @samp{i} -- small dash-dotted line (###__#__###__#__), @samp{@{dNNNN@}} -- manual dash style (for v.2.3 and later, like @samp{@{df090@}} for (####____#__#____)). @end ifnothtml Marker types are: @samp{o} -- circle, @samp{+} -- cross, @samp{x} -- skew cross, @samp{s} -- square, @samp{d} -- rhomb (or diamond), @samp{.} -- dot (point), @samp{^} -- triangle up, @samp{v} -- triangle down, @samp{<} -- triangle left, @samp{>} -- triangle right, @samp{#*} -- Y sign, @samp{#+} -- squared cross, @samp{#x} -- squared skew cross, @samp{#.} -- circled dot. If string contain symbol @samp{#} then the solid versions of markers are used. You can provide user-defined symbols (see @ref{addsymbol}) to draw it as marker by using @samp{&} style. In particular, @samp{&*}, @samp{&o}, @samp{&+}, @samp{&x}, @samp{&s}, @samp{&d}, @samp{&.}, @samp{&^}, @samp{&v}, @samp{&<}, @samp{&>} will draw user-defined symbol @samp{*o+xsd.^v<>} correspondingly; and @samp{&#o}, @samp{&#+}, @samp{&#x}, @samp{&#s}, @samp{&#d}, @samp{&#.}, @samp{&#^}, @samp{&#v}, @samp{&#<}, @samp{&#>} will draw user-defined symbols @samp{YOPXSDCTVLR} correspondingly. Note, that wired version of user-defined symbols will be drawn if you set negative marker size (see @ref{marksize} or @code{size} in @ref{Command options}). One may specify to draw a special symbol (an arrow) at the beginning and at the end of line. This is done if the specification string contains one of the following symbols: @samp{A} -- outer arrow, @samp{V} -- inner arrow, @samp{I} -- transverse hatches, @samp{K} -- arrow with hatches, @samp{T} -- triangle, @samp{S} -- square, @samp{D} -- rhombus, @samp{O} -- circle, @samp{X} -- skew cross, @samp{_} -- nothing (the default). The following rule applies: the first symbol specifies the arrow at the end of line, the second specifies the arrow at the beginning of the line. For example, @samp{r-A} defines a red solid line with usual arrow at the end, @samp{b|AI} defines a blue dash line with an arrow at the end and with hatches at the beginning, @samp{_O} defines a line with the current style and with a circle at the beginning. These styles are applicable during the graphics plotting as well (for example, @ref{1D plotting}). @pfig{style, Color and line styles.} @c ------------------------------------------------------------------ @external{} @node Color scheme, Font styles, Line styles, General concepts @section Color scheme @nav{} @cindex Color scheme The color scheme is used for determining the color of surfaces, isolines, isosurfaces and so on. The color scheme is defined by the string, which may contain several characters that are color id (@pxref{Line styles}) or characters @samp{#:|}. Symbol @samp{#} switches to mesh drawing or to a wire plot. Symbol @samp{|} disables color interpolation in color scheme, which can be useful, for example, for sharp colors during matrix plotting. Symbol @samp{:} terminate the color scheme parsing. Following it, the user may put styles for the text, rotation axis for curves/isocontours, and so on. Color scheme may contain up to 32 color values. The final color is a linear interpolation of color array. The color array is constructed from the string ids (including ``bright'' colors, see @ref{Color styles}). The argument is the amplitude normalized in color range (see @ref{Axis settings}). For example, string containing 4 characters @samp{bcyr} corresponds to a colorbar from blue (lowest value) through cyan (next value) through yellow (next value) to the red (highest value). String @samp{kw} corresponds to a colorbar from black (lowest value) to white (highest value). String @samp{m} corresponds to a simple magenta color. The special 2-axis color scheme (like in @ref{map} plot) can be used if it contain symbol @samp{%}. In this case the second direction (alpha channel) is used as second coordinate for colors. At this, up to 4 colors can be specified for corners: @{c1,a1@}, @{c2,a1@}, @{c1,a2@}, @{c2,a2@}. Here color and alpha ranges are @{c1,c2@} and @{a1,a2@} correspondingly. If one specify less than 4 colors then black color is used for corner @{c1,a1@}. If only 2 colors are specified then the color of their sum is used for corner @{c2,a2@}. There are several useful combinations. String @samp{kw} corresponds to the simplest gray color scheme where higher values are brighter. String @samp{wk} presents the inverse gray color scheme where higher value is darker. Strings @samp{kRryw}, @samp{kGgw}, @samp{kBbcw} present the well-known @emph{hot}, @emph{summer} and @emph{winter} color schemes. Strings @samp{BbwrR} and @samp{bBkRr} allow one to view bi-color figure on white or black background, where negative values are blue and positive values are red. String @samp{BbcyrR} gives a color scheme similar to the well-known @emph{jet} color scheme. For more precise coloring, you can change default (equidistant) position of colors in color scheme. The format is @samp{@{CN,pos@}}, @samp{@{CN,pos@}} or @samp{@{xRRGGBB,pos@}}. The position value @var{pos} should be in range [0, 1]. Note, that alternative method for fine tuning of the color scheme is using the formula for coloring (see @ref{Curved coordinates}). @pfig{schemes, Most popular color schemes.} When coloring by @emph{coordinate} (used in @ref{map}), the final color is determined by the position of the point in 3d space and is calculated from formula c=x*c[1] + y*c[2]. Here, c[1], c[2] are the first two elements of color array; x, y are normalized to axis range coordinates of the point. @c This type of coloring is useful for isosurface plot where color may show the exact position of a piece of surface. Additionally, MathGL can apply mask to face filling at bitmap rendering. The kind of mask is specified by one of symbols @samp{-+=;oOsS~<>jdD*^} in color scheme. Mask can be rotated by arbitrary angle by command @ref{mask} or by three predefined values +45, -45 and 90 degree by symbols @samp{\/I} correspondingly. Examples of predefined masks are shown on the figure below. @pfig{mask, Example of masks for face coloring.} However, you can redefine mask for one symbol by specifying new matrix of size 8*8 as second argument for @ref{mask} command. For example, the right-down subplot on the figure above is produced by code@* @ifclear UDAV @code{gr->SetMask('+', "ff00182424f800"); gr->Dens(a,"3+");}@* or just use manual mask style (for v.2.3 and later)@* @code{gr->Dens(a,"3@{s00ff00182424f800@}");} @end ifclear @ifset UDAV @code{mask '+' 'ff00182424f800':dens a '3+'}@* or just use manual mask style (for v.2.3 and later)@* @code{dens a '3@{s00ff00182424f800@}'} @end ifset @c ------------------------------------------------------------------ @external{} @node Font styles, Textual formulas, Color scheme, General concepts @section Font styles @nav{} @cindex Font styles Text style is specified by the string which may contain: color id characters @samp{wkrgbcymhRGBCYMHW} (see @ref{Color styles}), and font style (@samp{ribwou}) and/or alignment (@samp{LRC}) specifications. At this, font style and alignment begin after the separator @samp{:}. For example, @samp{r:iCb} sets the bold (@samp{b}) italic (@samp{i}) font text aligned at the center (@samp{C}) and with red color (@samp{r}). Starting from MathGL v.2.3, you can set not single color for whole text, but use color gradient for printed text (see @ref{Color scheme}). The font styles are: @samp{r} -- roman (or regular) font, @samp{i} -- italic style, @samp{b} -- bold style. By default roman roman font is used. The align types are: @samp{L} -- align left (default), @samp{C} -- align center, @samp{R} -- align right, @samp{T} -- align under, @samp{V} -- align center vertical. Additional font effects are: @samp{w} -- wired, @samp{o} -- over-lined, @samp{u} -- underlined. Also a parsing of the LaTeX-like syntax is provided. There are commands for the font style changing inside the string (for example, use \b for bold font): \a or \overline -- over-lined, \b or \textbf -- bold, \i or \textit -- italic, \r or \textrm -- roman (disable bold and italic attributes), \u or \underline -- underlined, \w or \wire -- wired, \big -- bigger size, @@ -- smaller size. The lower and upper indexes are specified by @samp{_} and @samp{^} symbols. At this the changed font style is applied only on next symbol or symbols in braces @{@}. The text in braces @{@} are treated as single symbol that allow one to print the index of index. For example, compare the strings @samp{sin (x^@{2^3@})} and @samp{sin (x^2^3)}. You may also change text color inside string by command #? or by \color? where @samp{?} is symbolic id of the color (@pxref{Color styles}). For example, words @samp{blue} and @samp{red} will be colored in the string @samp{#b@{blue@} and \colorr@{red@} text}. The most of functions understand the newline symbol @samp{\n} and allows one to print multi-line text. Finally, you can use arbitrary (if it was defined in font-face) UTF codes by command @code{\utf0x????}. For example, @code{\utf0x3b1} will produce @ifhtml @html α symbol. @end html @end ifhtml @ifnothtml @math{\alpha} symbol. @end ifnothtml The most of commands for special TeX or AMSTeX symbols, the commands for font style changing (\textrm, \textbf, \textit, \textsc, \overline, \underline), accents (\hat, \tilde, \dot, \ddot, \acute, \check, \grave, \bar, \breve) and roots (\sqrt, \sqrt3, \sqrt4) are recognized. The full list contain approximately 2000 commands. Note that first space symbol after the command is ignored, but second one is printed as normal symbol (space). For example, the following strings produce the same result @math{\tilde a}: @samp{\tilde@{a@}}; @samp{\tilde a}; @samp{\tilde@{@}a}. @ifhtml @html In particular, the Greek letters are recognizable special symbols: α – \alpha, β – \beta, γ – \gamma, δ – \delta, ε – \epsilon, η – \eta, ι – \iota, χ – \chi, κ – \kappa, λ – \lambda, μ – \mu, ν – \nu, o – \o, ω – \omega, ϕ – \phi, π – \pi, ψ – \psi, ρ – \rho, σ – \sigma, θ – \theta, τ – \tau, υ – \upsilon, ξ – \xi, ζ – \zeta, ς – \varsigma, ɛ – \varepsilon, ϑ – \vartheta, φ – \varphi, ϰ – \varkappa; A – \Alpha, B – \Beta, Γ – \Gamma, Δ – \Delta, E – \Epsilon, H – \Eta, I – \Iota, C – \Chi, K – \Kappa, Λ – \Lambda, M – \Mu, N – \Nu, O – \O, Ω – \Omega, Φ – \Phi, Π – \Pi, Ψ – \Psi, R – \Rho, Σ – \Sigma, Θ – \Theta, T – \Tau, Υ – \Upsilon, Ξ – \Xi, Z – \Zeta.

The small part of most common special TeX symbols are: ∠ – \angle, ⋅ – \cdot, ♣ – \clubsuit, ✓ – \checkmark, ∪ – \cup, ∩ – \cap, ♢ – \diamondsuit, ◇ – \diamond, ÷ – \div, ↓ – \downarrow, † – \dag, ‡ – \ddag, ≡ – \equiv, ∃ – \exists, ⌢ – \frown, ♭ – \flat, ≥ – \ge, ≥ – \geq, ≧ – \geqq, ← – \gets, ♡ – \heartsuit, ∞ – \infty, ∫ – \int, \Int, ℑ – \Im, ♢ – \lozenge, ⟨ – \langle, ≤ – \le, ≤ – \leq, ≦ – \leqq, ← – \leftarrow, ∓ – \mp, ∇ – \nabla, ≠ – \ne, ≠ – \neq, ♮ – \natural, ∮ – \oint, ⊙ – \odot, ⊕ – \oplus, ∂ – \partial, ∥ – \parallel, ⊥ –\perp, ± – \pm, ∝ – \propto, ∏ – \prod, ℜ – \Re, → – \rightarrow, ⟩ – \rangle, ♠ – \spadesuit, ~ – \sim, ⌣ – \smile, ⊂ – \subset, ⊃ – \supset, √ – \sqrt or \surd, § – \S, ♯ – \sharp, ∑ – \sum, × – \times, → – \to, ∴ – \therefore, ↑ – \uparrow, ℘ – \wp.

@end html @end ifhtml @ifnothtml In particular, the Greek letters are recognizable special symbols: @math{\alpha} -- \alpha, @math{\beta} -- \beta, @math{\gamma} -- \gamma, @math{\delta} -- \delta, @math{\epsilon} -- \epsilon, @math{\eta} -- \eta, @math{\iota} -- \iota, @math{\chi} -- \chi, @math{\kappa} -- \kappa, @math{\lambda} -- \lambda, @math{\mu} -- \mu, @math{\nu} -- \nu, @math{o} -- \o, @math{\omega} -- \omega, @math{\phi} -- \phi, @math{\pi} -- \pi, @math{\psi} -- \psi, @math{\rho} -- \rho, @math{\sigma} -- \sigma, @math{\theta} -- \theta, @math{\tau} -- \tau, @math{\upsilon} -- \upsilon, @math{\xi} -- \xi, @math{\zeta} -- \zeta, @math{\varsigma} -- \varsigma, @math{\varepsilon} -- \varepsilon, @math{\vartheta} -- \vartheta, @math{\varphi} -- \varphi, A -- \Alpha, B -- \Beta, @math{\Gamma} -- \Gamma, @math{\Delta} -- \Delta, E -- \Epsilon, H -- \Eta, I -- \Iota, C -- \Chi, K -- \Kappa, @math{\Lambda} -- \Lambda, M -- \Mu, N -- \Nu, O -- \O, @math{\Omega} -- \Omega, @math{\Phi} -- \Phi, @math{\Pi} -- \Pi, @math{\Psi} -- \Psi, R -- \Rho, @math{\Sigma} -- \Sigma, @math{\Theta} -- \Theta, T -- \Tau, @math{\Upsilon} -- \Upsilon, @math{\Xi} -- \Xi, Z -- \Zeta. The small part of most common special TeX symbols are: @math{\angle} -- \angle, @math{\aleph} -- \aleph, @math{\cdot} -- \cdot, @math{\clubsuit} -- \clubsuit, @math{\cup} -- \cup, @math{\cap} -- \cap, @math{\diamondsuit} -- \diamondsuit, @math{\diamond} -- \diamond, @math{\div} -- \div, @math{\downarrow} -- \downarrow, @math{\dag} -- \dag, @math{\ddag} -- \ddag, @math{\equiv} -- \equiv, @math{\exists} -- \exists, @math{\frown} -- \frown, @math{\flat} -- \flat, @math{\ge} -- \ge, @math{\geq} -- \geq, @math{\gets} -- \gets, @math{\heartsuit} -- \heartsuit, @math{\infty} -- \infty, @math{\in} -- \in, @math{\int} -- \int, @math{\Im} -- \Im, @math{\langle} -- \langle, @math{\le} -- \le, @math{\leq} -- \leq, @math{\leftarrow} -- \leftarrow, @math{\mp} -- \mp, @math{\nabla} -- \nabla, @math{\ne} -- \ne, @math{\neq} -- \neq, @math{\natural} -- \natural, @math{\oint} -- \oint, @math{\odot} -- \odot, @math{\oplus} -- \oplus, @math{\partial} -- \partial, @math{\parallel} -- \parallel, @math{\perp} -- \perp, @math{\pm} -- \pm, @math{\propto} -- \propto, @math{\prod} -- \prod, @math{\Re} -- \Re, @math{\rightarrow} -- \rightarrow, @math{\rangle} -- \rangle, @math{\spadesuit} -- \spadesuit, @math{\sim} -- \sim, @math{\smile} -- \smile, @math{\subset} -- \subset, @math{\supset} -- \supset, @math{\surd} -- \sqrt or \surd, @math{\S} -- \S, @math{\sharp} -- \sharp, @math{\sum} -- \sum, @math{\times} -- \times, @math{\to} -- \to, @math{\uparrow} -- \uparrow, @math{\wp} -- \wp and so on. @end ifnothtml The font size can be defined explicitly (if @var{size}>0) or relatively to a base font size as |@var{size}|*@var{FontSize} (if @var{size}<0). The value @var{size}=0 specifies that the string will not be printed. The base font size is measured in internal ``MathGL'' units. Special functions @code{SetFontSizePT(), SetFontSizeCM(), SetFontSizeIN()} (see @ref{Font settings}) allow one to set it in more ``common'' variables for a given dpi value of the picture. @c ------------------------------------------------------------------ @external{} @node Textual formulas, Command options, Font styles, General concepts @section Textual formulas @nav{} @cindex Textual formulas MathGL have the fast variant of textual formula evaluation @ifclear UDAV (@pxref{Evaluate expression}) @end ifclear . There are a lot of functions and operators available. The operators are: @samp{+} -- addition, @samp{-} -- subtraction, @samp{*} -- multiplication, @samp{/} -- division, @samp{%} -- modulo, @samp{^} -- integer power. Also there are logical ``operators'': @samp{<} -- true if x} -- true if x>y, @samp{=} -- true if x=y, @samp{&} -- true if x and y both nonzero, @samp{|} -- true if x or y nonzero. These logical operators have lowest priority and return 1 if true or 0 if false. The basic functions are: @samp{sqrt(x)} -- square root of @var{x}, @samp{pow(x,y)} -- power @var{x} in @var{y}, @samp{ln(x)} -- natural logarithm of @var{x}, @samp{lg(x)} -- decimal logarithm of @var{x}, @samp{log(a,x)} -- logarithm base @var{a} of @var{x}, @samp{abs(x)} -- absolute value of @var{x}, @samp{sign(x)} -- sign of @var{x}, @samp{mod(x,y)} -- @var{x} modulo @var{y}, @samp{step(x)} -- step function, @samp{int(x)} -- integer part of @var{x}, @samp{rnd} -- random number, @samp{random(x)} -- random data of size as in @var{x}, @samp{hypot(x,y)}=sqrt(x^2+y^2) -- hypotenuse, @samp{cmplx(x,y)}=x+i*y -- complex number, @samp{pi} -- number @ifhtml @html π = 3.1415926…, inf=∞ @end html @end ifhtml @ifnothtml @math{\pi=3.1415926..., inf=\infty} @end ifnothtml Functions for complex numbers @samp{real(x)}, @samp{imag(x)}, @samp{abs(x)}, @samp{arg(x)}, @samp{conj(x)}. Trigonometric functions are: @samp{sin(x)}, @samp{cos(x)}, @samp{tan(x)} (or @samp{tg(x)}). Inverse trigonometric functions are: @samp{asin(x)}, @samp{acos(x)}, @samp{atan(x)}. Hyperbolic functions are: @samp{sinh(x)} (or @samp{sh(x)}), @samp{cosh(x)} (or @samp{ch(x)}), @samp{tanh(x)} (or @samp{th(x)}). Inverse hyperbolic functions are: @samp{asinh(x)}, @samp{acosh(x)}, @samp{atanh(x)}. @ifhtml @html

There are a set of special functions: ‘gamma(x)’ – Gamma function Γ(x) = ∫0 tx-1 exp(-t) dt, ‘gamma_inc(x,y)’ – incomplete Gamma function Γ(x,y) = ∫y tx-1 exp(-t) dt, ‘psi(x)’ – digamma function ψ(x) = Γ′(x)/Γ(x) for x≠0, ‘ai(x)’ – Airy function Ai(x), ‘bi(x)’ – Airy function Bi(x), ‘cl(x)’ – Clausen function, ‘li2(x)’ (or ‘dilog(x)’) – dilogarithm Li2(x) = -ℜ∫0xds log(1-s)/s, ‘sinc(x)’ – compute sinc(x) = sin(πx)/(πx) for any value of x, ‘zeta(x)’ – Riemann zeta function ζ(s) = ∑k=1k-s for arbitrary s≠1, ‘eta(x)’ – eta function η(s) = (1 - 21-s)ζ(s) for arbitrary s, ‘lp(l,x)’ – Legendre polynomial Pl(x), (|x|≤1, l≥0), ‘w0(x)’ – principal branch of the Lambert W function, ‘w1(x)’ – principal branch of the Lambert W function. Function W(x) is defined to be solution of the equation: W exp(W) = x.

The exponent integrals are: ‘ci(x)’ – Cosine integral Ci(x) = ∫0xdt cos(t)/t, ‘si(x)’ – Sine integral Si(x) = ∫0xdt sin(t)/t, ‘erf(x)’ – error function erf(x) = (2/√π) ∫0xdt exp(-t2) , ‘ei(x)’ – exponential integral Ei(x) = -PV(∫-xdt exp(-t)/t) (where PV denotes the principal value of the integral), ‘e1(x)’ – exponential integral E1(x) = ℜ∫1dt exp(-xt)/t, ‘e2(x)’ – exponential integral E2(x) = ℜ∫1∞dt exp(-xt)/t2, ‘ei3(x)’ – exponential integral Ei3(x) = ∫0xdt exp(-t3) for x≥0.

Bessel functions are: ‘j(nu,x)’ – regular cylindrical Bessel function of fractional order nu, ‘y(nu,x)’ – irregular cylindrical Bessel function of fractional order nu, ‘i(nu,x)’ – regular modified Bessel function of fractional order nu, ‘k(nu,x)’ – irregular modified Bessel function of fractional order nu.

Elliptic integrals are: ‘ee(k)’ – complete elliptic integral is denoted by E(k) = E(π/2,k), ‘ek(k)’ – complete elliptic integral is denoted by K(k) = F(π/2,k), ‘e(phi,k)’ – elliptic integral E(φ,k) = ∫0φdt √(1 - k2sin2(t)), ‘f(phi,k)’ – elliptic integral F(φ,k) = ∫0φdt 1/√(1 - k2sin2(t))

@end html @end ifhtml @ifnothtml There are a set of special functions: @samp{gamma(x)} -- Gamma function @math{\Gamma(x) = \int_0^\infty dt t^@{x-1@} exp(-t)}, @samp{gamma_inc(x,y)} -- incomplete Gamma function @math{\Gamma(x,y) = \int_y^\infty dt t^@{x-1@} exp(-t)}, @samp{psi(x)} -- digamma function @math{\psi(x) = \Gamma'(x)/\Gamma(x)} for x!=0, @samp{ai(x)} -- Airy function Ai(x), @samp{bi(x)} -- Airy function Bi(x), @samp{cl(x)} -- Clausen function, @samp{li2(x)} (or @samp{dilog(x)}) -- dilogarithm @math{Li_2(x) = - \Re \int_0^x ds \log(1-s)/s}, @samp{sinc(x)} -- compute @math{sinc(x) = \sin(\pi x) / (\pi x)} for any value of x, @samp{zeta(x)} -- Riemann zeta function @math{\zeta(s) = \sum_@{k=1@}^\infty k^@{-s@}} for arbitrary s!=1, @samp{eta(x)} -- eta function @math{\eta(s) = (1-2^@{1-s@}) \zeta(s)} for arbitrary s, @samp{lp(l,x)} -- Legendre polynomial @math{P_l(x)}, (|x|<=1, l>=0), @samp{w0(x)}, @samp{w1(x)} -- principal branch of the Lambert @var{W} functions. Function W(x) is defined to be solution of the equation @math{W \exp(W) = x}. The exponent integrals are: @samp{ci(x)} -- Cosine integral @math{Ci(x) = \int_0^x dt \cos(t)/t}, @samp{si(x)} -- Sine integral @math{Si(x) = \int_0^x dt \sin(t)/t}, @samp{erf(x)} -- error function @math{erf(x) = (2/\sqrt(\pi)) \int_0^x dt \exp(-t^2)}, @samp{ei(x)} -- exponential integral @math{Ei(x) := - PV(\int_@{-x@}^\infty dt \exp(-t)/t)} (where PV denotes the principal value of the integral), @samp{e1(x)} -- exponential integral @math{E_1(x) := Re \int_1^\infty dt \exp(-xt)/t} , @samp{e2(x)} -- exponential integral @math{E_2(x) := Re \int_1^\infty dt \exp(-xt)/t^2}, @samp{ei3(x)} -- exponential integral @math{Ei_3(x) = \int_0^x dt \exp(-t^3)} for x>=0. Bessel functions are: @samp{j(nu,x)} -- regular cylindrical Bessel function of fractional order @var{nu}, @samp{y(nu,x)} -- irregular cylindrical Bessel function of fractional order @var{nu}, @samp{i(nu,x)} -- regular modified Bessel function of fractional order @var{nu}, @samp{k(nu,x)} -- irregular modified Bessel function of fractional order @var{nu}. Elliptic integrals are: @samp{ee(k)} -- complete elliptic integral is denoted by @math{E(k) = E(\pi/2, k)}, @samp{ek(k)} -- complete elliptic integral is denoted by @math{K(k) = F(\pi/2, k)}, @samp{e(phi,k)} -- elliptic integral @math{E(\phi,k) = \int_0^\phi dt \sqrt((1 - k^2 \sin^2(t)))}, @samp{f(phi,k)} -- elliptic integral @math{F(\phi,k) = \int_0^\phi dt 1/\sqrt((1 - k^2 \sin^2(t)))}. @end ifnothtml Jacobi elliptic functions are: @samp{sn(u,m)}, @samp{cn(u,m)}, @samp{dn(u,m)}, @samp{sc(u,m)}, @samp{sd(u,m)}, @samp{ns(u,m)}, @samp{cs(u,m)}, @samp{cd(u,m)}, @samp{nc(u,m)}, @samp{ds(u,m)}, @samp{dc(u,m)}, @samp{nd(u,m)}. Note, some of these functions are unavailable if MathGL was compiled without GSL support. There is no difference between lower or upper case in formulas. If argument value lie outside the range of function definition then function returns NaN. MathGL version 2.5 introduce user-defined functions @samp{fn1()...fn9()} at formula evaluation, which are defined after symbol @samp{\}. For example, "fn1(3)\x^_1" will produce "x^3". Also functions @samp{sum}, @samp{dsum}, @samp{prod} are added at formula evaluation for summation, summation with variable sign and product evaluation. For example, "sum(_i^2,5)" will produce "30"=0+1^2+2^2+3^2+4^2, "dsum(_i^2,5)" will produce "10"=0-1^2+2^2-3^2+4^2, and "prod(1+_i,5)" will produce 5!="120". You can nest them for variables _i,_j,...,_z, like "sum(sum(_j+_i^2,5),5)" will give "200". Also you can use user-defined functions, like "sum(fn1(_i)-fn2(_i),4)\_1^4\_1^3" is the same as "sum(_i^4-_i^3,4)" and will produce "62". @c ------------------------------------------------------------------ @external{} @node Command options, Interfaces, Textual formulas, General concepts @section Command options @nav{} Command options allow the easy setup of the selected plot by changing global settings only for this plot. Each option start from symbol @samp{;}. Options work so that MathGL remember the current settings, change settings as it being set in the option, execute function and return the original settings back. So, the options are most usable for plotting functions. The most useful options are @code{xrange, yrange, zrange}. They sets the boundaries for data change. This boundaries are used for automatically filled variables. So, these options allow one to change the position of some plots. For example, in command @code{Plot(y,"","xrange 0.1 0.9");} or @code{plot y; xrange 0.1 0.9} the x coordinate will be equidistantly distributed in range 0.1 ... 0.9. @sref{Using options} The full list of options are: @cindex alpha @cindex alphadef @deffn {MGL option} alpha @code{val} Sets alpha value (transparency) of the plot. The value should be in range [0, 1]. See also @ref{alphadef}. @end deffn @c @cindex ambient @c @deffn {MGL option} ambient @code{val} @c Sets brightness of ambient light for the plot. The value should be in range [0, 1]. See also @ref{ambient}. @c @end deffn @c @cindex diffuse @c @deffn {MGL option} diffuse @code{val} @c Sets brightness of diffuse light for the plot. The value should be in range [0, 1]. See also @ref{diffuse}. @c @end deffn @cindex xrange @deffn {MGL option} xrange @code{val1 val2} Sets boundaries of x coordinate change for the plot. See also @ref{xrange}. @end deffn @cindex yrange @deffn {MGL option} yrange @code{val1 val2} Sets boundaries of y coordinate change for the plot. See also @ref{yrange}. @end deffn @cindex zrange @deffn {MGL option} zrange @code{val1 val2} Sets boundaries of z coordinate change for the plot. See also @ref{zrange}. @end deffn @cindex cut @deffn {MGL option} cut @code{val} Sets whether to cut or to project the plot points lying outside the bounding box. See also @ref{cut}. @end deffn @cindex fontsize @deffn {MGL option} size @code{val} Sets the size of text, marks and arrows. See also @ref{font}, @ref{marksize}, @ref{arrowsize}. @end deffn @cindex meshnum @deffn {MGL option} meshnum @code{val} Work like @ref{meshnum} command. @end deffn @cindex legend @deffn {MGL option} legend 'txt' Adds string 'txt' to internal legend accumulator. The style of described line and mark is taken from arguments of the last @ref{1D plotting} command. See also @ref{legend}. @end deffn @cindex value @deffn {MGL option} value @code{val} Set the value to be used as additional numeric parameter in plotting command. @end deffn @c ------------------------------------------------------------------ @external{} @node Interfaces, , Command options, General concepts @section Interfaces @nav{} @ifset UDAV You can use @code{mglParse} class for executing MGL scripts from different languages. @end ifset @ifclear UDAV The MathGL library has interfaces for a set of languages. Most of them are based on the C interface via SWIG tool. There are Python, Java, Octave, Lisp, C#, Guile, Lua, Modula 3, Ocaml, Perl, PHP, Pike, R, Ruby, and Tcl interfaces. Also there is a Fortran interface which has a similar set of functions, but slightly different types of arguments (integers instead of pointers). These functions are marked as [C function]. Some of the languages listed above support classes (like C++ or Python). The name of functions for them is the same as in C++ (see @ref{MathGL core} and @ref{Data processing}) and marked like [Method on mglGraph]. Finally, a special command language MGL (see @ref{MGL scripts}) was written for a faster access to plotting functions. Corresponding scripts can be executed separately (by UDAV, mglconv, mglview and so on) or from the C/C++/Python/... code (@pxref{mglParse class}). @menu * C interface:: * C++ interface:: @end menu @external{} @node C interface, C++ interface, , Interfaces @subsection C/Fortran interface @nav{} The C interface is a base for many other interfaces. It contains the pure C functions for most of the methods of MathGL classes. In distinction to C++ classes, C functions must have an argument HMGL (for graphics) and/or HMDT (for data arrays), which specifies the object for drawing or manipulating (changing). So, firstly, the user has to create this object by the function @code{mgl_create_*()} and has to delete it after the use by function @code{mgl_delete_*()}. All C functions are described in the header file @code{#include } and use variables of the following types: @itemize @item @code{HMGL} --- Pointer to class @code{mglGraph} (@pxref{MathGL core}). @item @code{HCDT} --- Pointer to class @code{const mglDataA} (@pxref{Data processing}) --- constant data array. @item @code{HMDT} --- Pointer to class @code{mglData} (@pxref{Data processing}) --- data array of real numbers. @item @code{HADT} --- Pointer to class @code{mglDataC} (@pxref{Data processing}) --- data array of complex numbers. @item @code{HMPR} --- Pointer to class @code{mglParse} (@pxref{mglParse class}) --- MGL script parsing. @item @code{HMEX} --- Pointer to class @code{mglExpr} (@pxref{Evaluate expression}) --- textual formulas for real numbers. @item @code{HMAX} --- Pointer to class @code{mglExprC} (@pxref{Evaluate expression}) --- textual formulas for complex numbers. @end itemize These variables contain identifiers for graphics drawing objects and for the data objects. Fortran functions/subroutines have the same names as C functions. However, there is a difference. Variable of type @code{HMGL, HMDT} must be an integer with sufficient size (@code{integer*4} in the 32-bit operating system or @code{integer*8} in the 64-bit operating system). All C functions of type @code{void} are subroutines in Fortran, which are called by operator @code{call}. The exceptions are functions, which return variables of types @code{HMGL} or @code{HMDT}. These functions should be declared as integer in Fortran code. Also, one should keep in mind that strings in Fortran are denoted by @code{'} symbol, not the @code{"} symbol. @external{} @node C++ interface, , C interface, Interfaces @subsection C++/Python interface @nav{} MathGL provides the interface to a set of languages via SWIG library. Some of these languages support classes. The typical example is Python -- which is named in this chapter's title. Exactly the same classes are used for high-level C++ API. Its feature is using only inline member-functions what make high-level API to be independent on compiler even for binary build. There are 3 main classes in: @itemize @item @code{mglGraph} -- provide most plotting functions (see @ref{MathGL core}). @item @code{mglData} -- provide base data processing (see @ref{Data processing}). It have an additional feature to access data values. You can use a construct like this: @code{dat[i]=sth;} or @code{sth=dat[i]} where flat representation of data is used (i.e., @var{i} can be in range 0...nx*nx*nz-1). You can also import NumPy arrays as input arguments in Python: @code{mgl_dat = mglData(numpy_dat);}. @item @code{mglParse} -- provide functions for parsing MGL scripts (see @ref{MGL scripts}). @end itemize To use Python classes just execute @samp{import mathgl}. The simplest example will be: @verbatim import mathgl a=mathgl.mglGraph() a.Box() a.WritePNG("test.png") @end verbatim Alternatively you can import all classes from @code{mathgl} module and easily access MathGL classes like this: @verbatim from mathgl import * a=mglGraph() a.Box() a.WritePNG("test.png") @end verbatim This becomes useful if you create many @code{mglData} objects, for example. @end ifclear @external{} mathgl-8.0.1/texinfo/gpl-3.0.texi0000664000175000017500000010441314167366465016236 0ustar balakinbalakin@c The GNU General Public License. @center Version 3, 29 June 2007 @c This file is intended to be included within another document, @c hence no sectioning command or @node. @display Copyright @copyright{} 2007 Free Software Foundation, Inc. @url{http://fsf.org/} Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @end display @heading Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program---to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. @heading TERMS AND CONDITIONS @enumerate 0 @item Definitions. ``This License'' refers to version 3 of the GNU General Public License. ``Copyright'' also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. ``The Program'' refers to any copyrightable work licensed under this License. Each licensee is addressed as ``you''. ``Licensees'' and ``recipients'' may be individuals or organizations. To ``modify'' a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a ``modified version'' of the earlier work or a work ``based on'' the earlier work. A ``covered work'' means either the unmodified Program or a work based on the Program. To ``propagate'' a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To ``convey'' a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays ``Appropriate Legal Notices'' to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. @item Source Code. The ``source code'' for a work means the preferred form of the work for making modifications to it. ``Object code'' means any non-source form of a work. A ``Standard Interface'' means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The ``System Libraries'' of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A ``Major Component'', in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The ``Corresponding Source'' for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. @item Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. @item Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. @item Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. @item Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: @enumerate a @item The work must carry prominent notices stating that you modified it, and giving a relevant date. @item The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to ``keep intact all notices''. @item You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. @item If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. @end enumerate A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an ``aggregate'' if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. @item Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: @enumerate a @item Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. @item Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. @item Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. @item Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. @item Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. @end enumerate A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A ``User Product'' is either (1) a ``consumer product'', which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, ``normally used'' refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. ``Installation Information'' for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. @item Additional Terms. ``Additional permissions'' are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: @enumerate a @item Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or @item Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or @item Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or @item Limiting the use for publicity purposes of names of licensors or authors of the material; or @item Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or @item Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. @end enumerate All other non-permissive additional terms are considered ``further restrictions'' within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. @item Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. @item Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. @item Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An ``entity transaction'' is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. @item Patents. A ``contributor'' is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's ``contributor version''. A contributor's ``essential patent claims'' are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, ``control'' includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a ``patent license'' is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To ``grant'' such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. ``Knowingly relying'' means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is ``discriminatory'' if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. @item No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. @item Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. @item Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License ``or any later version'' applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. @item Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. @item Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. @item Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. @end enumerate @heading END OF TERMS AND CONDITIONS @heading How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the ``copyright'' line and a pointer to where the full notice is found. @smallexample @var{one line to give the program's name and a brief idea of what it does.} Copyright (C) @var{year} @var{name of author} This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see @url{http://www.gnu.org/licenses/}. @end smallexample Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: @smallexample @var{program} Copyright (C) @var{year} @var{name of author} This program comes with ABSOLUTELY NO WARRANTY; for details type @samp{show w}. This is free software, and you are welcome to redistribute it under certain conditions; type @samp{show c} for details. @end smallexample The hypothetical commands @samp{show w} and @samp{show c} should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an ``about box''. You should also get your employer (if you work as a programmer) or school, if any, to sign a ``copyright disclaimer'' for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see @url{http://www.gnu.org/licenses/}. The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read @url{http://www.gnu.org/philosophy/why-not-lgpl.html}. mathgl-8.0.1/texinfo/doc_en.texi0000664000175000017500000001444414167366465016411 0ustar balakinbalakin\input texinfo @documentencoding UTF-8 @documentlanguage en @setfilename mathgl_en.info @include version.texi @settitle MathGL @value{VERSION} @syncodeindex pg cp @comment %**end of header @copying This manual is for MathGL (version @value{VERSION}), a collection of classes and routines for scientific plotting. Please report any errors in this manual to @email{mathgl.abalakin@@gmail.org}. @include copyright.texi @end copying @dircategory MathGL documentation system @direntry * MathGL: (mathgl). The library for scientific graphics. @end direntry @titlepage @title MathGL @subtitle for version @value{VERSION} @author A.A. Balakin (@uref{http://mathgl.sourceforge.net/}) @page @vskip 0pt plus 1filll @insertcopying @end titlepage @contents @node Top @top MathGL This file documents the Mathematical Graphic Library (MathGL), a collection of classes and routines for scientific plotting. It corresponds to release @value{VERSION} of the library. Please report any errors in this manual to @email{mathgl.abalakin@@gmail.org}. More information about MathGL can be found at the project homepage, @uref{http://mathgl.sourceforge.net/}. @include copyright.texi @menu * Website:: * Overview:: * Examples:: * General concepts:: * MathGL core:: * Widget classes:: * Data processing:: * MGL scripts:: * UDAV:: * Other classes:: * All samples:: * Symbols and hot-keys:: * File formats:: * TeX-like symbols:: * Plotting time:: * Copying This Manual:: * Index:: @end menu @macro nav {} @html @end html @end macro @macro external {} @html
SourceForge.net Logo thefreecountry.com: Free Programmers' Resources, Free Webmasters' Resources, Free Security Resources, Free Software Support This Project
@end html @end macro @macro fig {fname,text} @center @image{../\fname\.png, 11cm, , \text\, png} @end macro @macro pfig {fname,text} @center @uref{../pdf/\fname\.pdf, @image{../png/\fname\.png, 11cm, , \text\, png}} @c @center @image{../png/\fname\, 11cm, , \text\. See also @uref{../pdf/\fname\.pdf, 3D PDF} sample, .png} @end macro @macro ufig {fname,width,text} @center @image{../udav/\fname\.png, \width\cm, , \text\, png} @end macro @macro sfig {plot,text} @ref{\text\, @image{../small/\plot\-sm.png,3cm, , , png}} @end macro @macro sref {arg} @xref{\arg\}, for sample code and picture. @end macro @node Website, Overview, , Top @include web_en.texi @node Overview, Examples, Website, Top @include overview_en.texi @node Examples, General concepts, Overview, Top @include example_en.texi @node General concepts, MathGL core, Examples, Top @include concept_en.texi @node MathGL core, Widget classes, General concepts, Top @include core_en.texi @node Widget classes, Data processing, MathGL core, Top @include widget_en.texi @node Data processing, MGL scripts, Widget classes, Top @include data_en.texi @node MGL scripts, UDAV, Data processing, Top @include parse_en.texi @node UDAV, Other classes, MGL scripts, Top @include udav_en.texi @node Other classes, All samples, UDAV, Top @include other_en.texi @node All samples, Symbols and hot-keys, Other classes, Top @include samples.texi @node Symbols and hot-keys, File formats, All samples, Top @appendix Symbols and hot-keys @include symbols_en.texi @node File formats, TeX-like symbols, Symbols and hot-keys, Top @appendix File formats @include formats_en.texi @node TeX-like symbols, Plotting time, File formats, Top @appendix TeX-like symbols @include appendix_en.texi @node Plotting time, Copying This Manual, TeX-like symbols, Top @appendix Plotting time @nav{} Table below show plotting time in seconds for all samples in file @uref{http://sourceforge.net/p/mathgl/code/HEAD/tree/mathgl-2x/examples/samples.cpp, examples/samples.cpp}. The test was done in my laptop (i5-2430M) with 64-bit Debian. Few words about the speed. Firstly, direct bitmap drawing (Quality=4,5,6) is faster than buffered one (Quality=0,1,2), but sometimes it give incorrect result (see @ref{cloud}) and don't allow one to export in vector or 3d formats (like EPS, SVG, PDF ...). Secondly, lower quality is faster than high one generally, i.e. Quality=1 is faster than Quality=2, and Quality=0 is faster than Quality=1. However, if plot contain a lot of faces (like @ref{cloud}, @ref{surf3}, @ref{pipe}, @ref{dew}) then Quality=0 may become slow, especially for small images. Finally, smaller images are drawn faster than larger ones. Results for image size 800*600 (default one). @include time.texi Results for image size 1920*1440 (print quality) @include time_big.texi @node Copying This Manual, Index, Plotting time, Top @appendix GNU Free Documentation License @include fdl.texi @node Index, , Copying This Manual, Top @unnumbered Index @printindex cp @bye mathgl-8.0.1/texinfo/mgl.50000664000175000017500000000123114167366465015122 0ustar balakinbalakin.\" Process this file with .\" groff -man -Tascii mgl.5 .\" .TH MGL 5 "MARCH 2012" MathGL "User Manuals" .SH NAME MGL \- MathGL script. .SH DESCRIPTION .B MGL script is textual file which contain commands for making scientific graphics using MathGL library. Is is primarily designed for quick viewing or processing data files as well as produce high-quality plots as output. MGL support animation by defining special comments in file. For a full description of MGL script language please see the MathGL manual. .SH AVAILABILITY http://mathgl.sourceforge.net/ .SH AUTHOR Alexey Balakin http://mathgl.sourceforge.net/ .SH "SEE ALSO" .BR mglview (1), .BR mglconv (1) mathgl-8.0.1/texinfo/web_fr.texi0000664000175000017500000007523114167366465016427 0ustar balakinbalakin\input texinfo @setfilename mgl_web_en.info @include version.texi @settitle MathGL @value{VERSION} @syncodeindex pg cp @comment %**end of header @copying This website demonstrates the Mathematical Graphic Library (MathGL) version @value{VERSION}, a collection of classes and routines for scientific plotting. Please report any errors in this manual to @email{mathgl.abalakin@@gmail.org}. @include copyright.texi @end copying @titlepage @title MathGL website @subtitle for version @value{VERSION} @author A.A. Balakin (@uref{http://mathgl.sourceforge.net/}) @page @vskip 0pt plus 1filll @insertcopying @end titlepage @contents @ifnottex @node Top @top MathGL This website demonstrates the Mathematical Graphic Library (MathGL), a collection of classes and routines for scientific plotting. It corresponds to release @value{VERSION} of the library. Please report any errors in this manual to @email{mathgl.abalakin@@gmail.org}. More information about MathGL can be found at the project homepage, @uref{http://mathgl.sourceforge.net/}. @include copyright.texi @end ifnottex @menu * Main:: * News:: * Features:: * Pictures:: * MGL scripts:: * Download:: * Other projects:: @end menu @ifhtml @macro external {} @comment @html @comment @comment @comment
@html SourceForge.net Logo thefreecountry.com: Free Programmers' Resources, Free Webmasters' Resources, Free Security Resources, Free Software Support This Project @end html @end macro @macro fig {plot,text} @uref{../\text\, @image{../small/\plot\-sm,3cm, , , .png}} @end macro @end ifhtml @ifnothtml @macro external {} @end macro @macro fig {plot,text} @uref{http://mathgl.sourceforge.net/\text\, @image{small/\plot\-sm,3cm, , , .png}} @end macro @end ifnothtml @node Main, News, , Top @section MathGL is ... @ifhtml @html Surface in fog @end html @end ifhtml @itemize @bullet @item a library for making high-quality scientific graphics under Linux and Windows; @item a library for the fast data plotting and data processing of large data arrays; @item a library for working in window and console modes and for easy embedding into other programs; @item a library with large and growing set of graphics. @end itemize Now MathGL has more than 35000 lines of code, more than 55 general types of graphics for 1d, 2d and 3d data arrays, including special ones for chemical and statistical graphics. It can export graphics to raster and vector (EPS or SVG) formats. It has Qt, FLTK, OpenGL interfaces and can be used even from console programs. It has functions for data processing and script MGL language for simplification of data plotting. Also it has several types of transparency and smoothed lightning, vector fonts and TeX-like symbol parsing, arbitrary curvilinear coordinate system and many over useful things. It can be used from code written on C++/C/Fortran/Python/Octave and many other languages. Finally it is platform independent and free (under GPL v.2.0 license). There is a @uref{http://sourceforge.net/forum/?group_id=152187, forum} where you can ask a question or suggest an improvement. However the @uref{http://groups.google.com/group/mathgl, MathGL group} is preferable for quicker answer. For subscribing to @uref{http://groups.google.com/group/mathgl, MathGL group} you can use form below @ifhtml @html
Email:
@end html @end ifhtml @strong{About LGPL and GPL licenses.} Generally, MathGL is GPL library. However, you can use LGPL license for MathGL core and widgets if you don't use SWIG-based interfaces and disable GSL features. This can be done by using @code{lgpl} option at build time. According this, I've added the LGPL win32 binaries into @ref{Download} page. @strong{Latest news} @itemize @item @emph{13 December 2012.} New version (v.@value{VERSION}) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new plots, advanced color schemes, @uref{../json.html, JavaScript drawing}, and many other improvements in both MathGL core and UDAV, which partially denoted @ref{News, here}. Note, there are @strong{incompatible with v.2.0.* changes} in the arguments of some functions. @item @emph{I'm sorry for making incompatible changes in v.2.1. It was done for introducing unified interface for all functions. I promise that I will not break API for v.2.* later, i.e. I'll only add new features or bug fixes.} @end itemize There is detailed @ref{News, news list}. Sourceforge project page @uref{http://sourceforge.net/projects/mathgl/, here}. @ifhtml @html DATADVANCE @end html @end ifhtml Javascript interface was developed with support of @url{http://www.datadvance.net, DATADVANCE} company. @external{} @node News, Features, Main, Top @section News @itemize @item @strong{13 December 2012.} New version (v.2.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are speeding up and many improvements and bugfixes: @itemize @bullet @item Add class mglDataC for complex data arrays. @item Add Vect3() plot for drawing vectors on slice of 3d vector field. See @url{../doc_en/doc_en_17.html#Vect3-sample, sample}. @item Add Table() function for drawing table with data values. See @url{../doc_en/doc_en_14.html#Table-sample, sample}. @item Add ZoomAxis() for zooming/shifting axis range as whole. @item Add WriteJSON() function for exporting in JSON format suitable for later drawing by JavaScript @item Add JavaScript code for visualizing JSON data. See @uref{../json.html, samples}. @item Add mgl.cgi tool which return PNG image for CGI request in form of MGL script. @item Add mglData::Solve() for finding x-value where dat(x)=val. See @url{../doc_en/doc_en_12.html#Solve-sample, sample}. @item Add mglData::Clean() for removing rows with duplicate values for given column. @item Add MGL commands 'errbox', 'face' @item Color can be specified as its RGB[A] values, i.e. like @samp{@{xFFFFFF@}} or @samp{@{xFFFFFFFF@}}. See @url{../doc_en/doc_en_23.html#Line-styles, sample}. @item Color in color scheme may have position in range [0,1]. Format is @samp{@{CN,pos@}} or @samp{@{xFFFFFF,pos@}}. See @url{../doc_en/doc_en_24.html#Color-scheme, sample}. @item Now pen width for marks is proportional to pen width of line multiplied by size of marks. @item Now you can use different font-faces in the plot simultaneously. See @url{../doc_en/doc_en_11.html#Text-features, sample}. @item Now Legend() automatically use several columns if it contain too many legend entries. @item Add style '-' for legend for drawing them horizontally. See @url{../doc_en/doc_en_11.html#Legend-sample, sample}. @item Vectors is drawn now even if only starting or ending points are placed in bounding box. @item Strongly rewrite the algorithm of vector field plotting. @item Grid lines for NAN origin values are always located at far-away edges. @item Try correctly place axis and tick labels even for axis with inverse range (i.e. for v2' b'} will give string @samp{'a + b'} (here @samp{
} is newline). @item Usually variable have a name which is arbitrary combination of symbols (except spaces and @samp{'}) started from a letter and with length less than 64. A temporary array can be used as variable: @itemize @bullet @item sub-arrays (like in @code{subdata} command) as command argument. For example, @code{a(1)} or @code{a(1,:)} or @code{a(1,:,:)} is second row, @code{a(:,2)} or @code{a(:,2,:)} is third column, @code{a(:,:,0)} is first slice and so on. Also you can extract a part of array from m-th to n-th element by code @code{a(m:n,:,:)} or just @code{a(m:n)}. @item any column combinations defined by formulas, like @code{a('n*w^2/exp(t)')} if names for data columns was specified (by @code{idset} command or in the file at string started with @code{##}). @item any expression (without spaces) of existed variables produce temporary variable. For example, @samp{sqrt(dat(:,5)+1)} will produce temporary variable with data values equal to @code{tmp[i,j] = sqrt(dat[i,5,j]+1)}. @item temporary variable of higher dimensions by help of []. For example, @samp{[1,2,3]} will produce a temporary vector of 3 elements @{1, 2, 3@}; @samp{[[11,12],[21,22]]} will produce matrix 2*2 and so on. Here you can join even an arrays of the same dimensions by construction like @samp{[v1,v2,...,vn]}. @item result of code for making new data inside @{@}. For example, @samp{@{sum dat 'x'@}} produce temporary variable which contain result of summation of @var{dat} along direction 'x'. This is the same array @var{tmp} as produced by command @samp{sum tmp dat 'x'}. You can use nested constructions, like @samp{@{sum @{max dat 'z'@} 'x'@}}. @end itemize Temporary variables can not be used as 1st argument for commands which create (return) the data (like @samp{new}, @samp{read}, @samp{hist} and so on). @item Special names @code{nan=#QNAN, pi=3.1415926..., on=1, off=0, :=-1} are treated as number if they were not redefined by user. Variables with suffixes are treated as numbers. Names defined by @code{define} command are treated as number. Also results of formulas with sizes 1x1x1 are treated as number (for example, @samp{pi/dat.nx}). @end itemize Before the first using all variables must be defined with the help of commands, like, @code{new}, @code{var}, @code{list}, @code{copy}, @code{read}, @code{hist}, @code{sum} and so on. Command may have several set of possible arguments (for example, @code{plot ydat} and @code{plot xdat ydat}). All command arguments for a selected set must be specified. However, some arguments can have default values. These argument are printed in [], like @code{text ydat ['stl'='']} or @code{text x y 'txt' ['fnt'='' size=-1]}. At this, the record @code{[arg1 arg2 arg3 ...]} means @code{[arg1 [arg2 [arg3 ...]]]}, i.e. you can omit only tailing arguments if you agree with its default values. For example, @code{text x y 'txt' '' 1} or @code{text x y 'txt' ''} is correct, but @code{text x y 'txt' 1} is incorrect (argument @code{'fnt'} is missed). For more details see @uref{../doc_en/doc_en_64.html#MGL-scripts, MathGL documentation} @external{} @node Download, Other projects, MGL scripts, Top @section Download @strong{Stable version (v.@value{VERSION})} You may download current version of MathGL for following configurations: @itemize @bullet @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.tar.gz,source} file with cmake build system. @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}-mingw.i686.7z,Win32 GPL} binaries for MinGW (build for i686) @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.LGPL-mingw.i686.7z,Win32 LGPL} binaries for MinGW (build for i686, no GSL and HDF5 support) @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.LGPL-win64.7z,Win64 LGPL} binaries for MSVS 2010 (no GSL and HDF5 support) @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}-1.DevPack,DevPak} package for Dev-C++ or Code::Blocks (GPL version) @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}.eng.pdf,PDF} documentation in English @item @uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.7z,utilities} with all required DLL files (build for i686) @c HTML documentation in English @c HTML documentation in Russian @c @item @c @uref{http://downloads.sourceforge.net/mathgl/mathgl_slides-1.9.pdf,PDF} slideshow of main features @end itemize @strong{Previous version (v.1.11.2)} You may download current version of MathGL for following configurations: @itemize @bullet @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-1.11.2.tar.gz,source} file with autoconf/automake script. @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-1.11.2-mingw.i686.zip,Win32 GPL} binaries for MinGW (build for i686) @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-1.11.1.1.LGPL-mingw.i686.zip,Win32 LGPL} binaries for MinGW (build for i686, no GSL and HDF5 support) @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-1.11.2-1.DevPack,DevPak} package for Dev-C++ or Code::Blocks (GPL version) @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-1.11.2.eng.pdf,PDF} documentation in English @c HTML documentation in English @c HTML documentation in Russian @item @uref{http://downloads.sourceforge.net/mathgl/mathgl_slides-1.9.pdf,PDF} slideshow of main features @end itemize @strong{Font files} There are a set of @uref{http://sourceforge.net/project/showfiles.php?group_id=152187&package_id=267177,font files} for MathGL with following typefaces. Note, that the set of glyphs can be less than in default font. As result not all TeX symbols can be displayed. @itemize @bullet @item @uref{http://downloads.sourceforge.net/mathgl/STIX_font.tgz,STIX} font -- default font for MathGL. @item @uref{http://downloads.sourceforge.net/mathgl/adventor_font.tgz,Adventor font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} sansserif font based on the URW Gothic L family (like Avant Garde Gothic). @item @uref{http://downloads.sourceforge.net/mathgl/bonum_font.tgz,Bonum font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} serif font based on the URW Bookman L family. @item @uref{http://downloads.sourceforge.net/mathgl/chorus_font.tgz,Chorus font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} font based on the URW Chancery L Medium Italic. @item @uref{http://downloads.sourceforge.net/mathgl/cursor_font.tgz,Cursor font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} monospaced serif font based on the URW Nimbus Mono L (like Courier). @item @uref{http://downloads.sourceforge.net/mathgl/heros_font.tgz,Heros font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} sansserif font based on the URW Nimbus Sans L (like Helvetica). @item @uref{http://downloads.sourceforge.net/mathgl/heroscn_font.tgz,HerosCN font} -- the "compressed" version of previous one. @item @uref{http://downloads.sourceforge.net/mathgl/pagella_font.tgz,Pagella font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} serif font based on the URW Palladio L (like Palatino). @item @uref{http://downloads.sourceforge.net/mathgl/schola_font.tgz,Schola font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} serif fonts is based on the URW Century Schoolbook L. @item @uref{http://downloads.sourceforge.net/mathgl/termes_font.tgz,Termes font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} serif fonts is based on the Nimbus Roman No9 L (like Times). @end itemize @external{} @node Other projects, , Download, Top @section Other projects Except scientific (non public) projects I also have some general interest projects: @itemize @bullet @item @uref{http://sourceforge.net/projects/pocketmk/, PocketMK} is small program for PocketPC which simulate famous Russian calculators MK-61 and slightly extend it. @item @uref{http://udav.sourceforge.net/,UDAV} is front-end for MGL scripts. It has windows interface for data viewing, changing and plotting. Also it can execute MGL scripts, setup and rotating graphics and so on. @end itemize Also I recommend to look at: @itemize @bullet @item @uref{http://englab.bugfest.net/,EngLab} is a cross-compile mathematical platform with a C like syntax intended to be used both by engineers and users with small programming knowledge. It is extremely scalable and allows users and the community to easily compile their own functions as shared objects. @item @uref{http://threedepict.sourceforge.net/,3Depict} is software for analysis of scientific datasets commonly encountered in atom probe tomography. You can manipulate, interact with and analyse point based datasets. @item @uref{http://www.sourceforge.net/projects/graphplot/,Graphplot} is function plotter based on MathGL. @item @uref{http://www.sourceforge.net/projects/graphplot/,OscillViewer} is oscilloscope monitoring program. Working with L-Card 14-140 AD-Convertor. Based on Qt and MathGL libraries. @end itemize Finally, few links to free software and libraries: @itemize @bullet @item @uref{http://www.thefreecountry.com/,thefreecountry.com} have a lot of Free Programmers', Webmasters' and Security Resources @item @uref{http://gnuwin32.sourceforge.net/,GnuWin} provides ports of tools with a GNU or similar open source license, to modern MS-Windows. @item @uref{http://loll.sourceforge.net/,LLoL} is project collecting, organising, classifying, and maintaining important URLs about Linux and the Open Source movement for all levels of Linux users. The LoLL project now has 4000+ links which are updated usually on a daily basis. @end itemize @external{} @bye mathgl-8.0.1/texinfo/doc_ru.texi0000664000175000017500000001567114167366465016440 0ustar balakinbalakin\input texinfo @documentencoding UTF-8 @documentlanguage ru @setfilename mathgl_en.info @include version.texi @settitle MathGL @value{VERSION} @syncodeindex pg cp @comment %**end of header @copying This manual is for MathGL (version @value{VERSION}), a collection of classes and routines for scientific plotting. Please report any errors in this manual to @email{mathgl.abalakin@@gmail.org}. @include copyright.texi @end copying @dircategory MathGL documentation system @direntry * MathGL: (mathgl). The library for scientific graphics. @end direntry @titlepage @title MathGL @subtitle for version @value{VERSION} @author A.A. Balakin (@uref{http://mathgl.sourceforge.net/}) @page @vskip 0pt plus 1filll @insertcopying @end titlepage @contents @ifnottex @node Top @top MathGL This file documents the Mathematical Graphic Library (MathGL), a collection of classes and routines for scientific plotting. It corresponds to release @value{VERSION} of the library. Please report any errors in this manual to @email{mathgl.abalakin@@gmail.org}. More information about MathGL can be found at the project homepage, @uref{http://mathgl.sourceforge.net/}. @include copyright.texi @end ifnottex @menu * Website:: * Overview:: * Examples:: * General concepts:: * MathGL core:: * Widget classes:: * Data processing:: * MGL scripts:: * UDAV :: * Other classes:: * All samples:: * Symbols and hot-keys:: * File formats:: * TeX-like symbols:: * Plotting time:: * Copying This Manual:: * Index:: @end menu @macro nav {} @html @end html @end macro @macro external {} @html
SourceForge.net Logo thefreecountry.com: Free Programmers' Resources, Free Webmasters' Resources, Free Security Resources, Free Software Support This Project
@end html @end macro @macro fig {fname,text} @center @image{../\fname\, 11cm, , \text\, png} @end macro @macro pfig {fname,text} @uref{../pdf/\fname\.pdf, @image{../png/\fname\, 11cm, , \text\, png}} @c @center @image{../png/\fname\, 11cm, , \text\ См. также пример @uref{../pdf/\fname\.pdf, 3D PDF}, .png} @end macro @macro ufig {fname,width,text} @center @image{../udav/\fname\, \width\cm, , \text\, png} @end macro @macro sfig {plot,text} @ref{\text\, @image{../small/\plot\-sm,3cm, , , png}} @end macro @macro sref {arg} См. раздел @ref{\arg\}, для примеров кода и графика. @end macro @node Website, Overview, , Top @include web_ru.texi @node Overview, Examples, Website, Top @include overview_ru.texi @node Examples, General concepts, Overview, Top @include example_ru.texi @node General concepts, MathGL core, Examples, Top @include concept_ru.texi @node MathGL core, Widget classes, General concepts, Top @include core_ru.texi @node Widget classes, Data processing, MathGL core, Top @include widget_ru.texi @node Data processing, MGL scripts, Widget classes, Top @include data_ru.texi @node MGL scripts, UDAV, Data processing, Top @include parse_ru.texi @node UDAV, Other classes, MGL scripts, Top @include udav_ru.texi @node Other classes, All samples, UDAV, Top @include other_ru.texi @node All samples, Symbols and hot-keys, Other classes, Top @include samples.texi @node Symbols and hot-keys, File formats, All samples, Top @appendix Symbols and hot-keys @include symbols_ru.texi @node File formats, TeX-like symbols, Symbols and hot-keys, Top @appendix File formats @include formats_ru.texi @node TeX-like symbols, Plotting time, File formats, Top @appendix Символы TeX @include appendix_ru.texi @node Plotting time, Copying This Manual, TeX-like symbols, Top @appendix Время отрисовки @nav{} В таблице показаны времена создания графика для всех примеров из файла @uref{http://sourceforge.net/p/mathgl/code/HEAD/tree/mathgl-2x/examples/samples.cpp, examples/samples.cpp}. Тест выполнен на моем ноутбуке (i5-2430M) с 64-bit Debian. Несколько слов о скорости. Во-первых, прямое рисование в память (Quality=4,5,6) быстрее буферизованного (Quality=0,1,2), но иногда результат некоректен (см. @ref{cloud}) и пропадает возможность экспорта в векторные и 3d форматы (например, EPS, SVG, PDF, ...). Во-вторых, обычно картинка худшего качества рисуется быстрее, т.е. Quality=1 быстрее Quality=2, и Quality=0 быстрее Quality=1. Однако, если график содержит множество граней (например @ref{cloud}, @ref{surf3}, @ref{pipe}, @ref{dew}), то Quality=0 может быть достаточно медленным, особенно для маленьких картинок. Наконец, картинки меньшего размера рисуются быстрее. Результаты для изображения размером 800*600 (по умолчанию). @include time.texi Результаты для изображения размером 1920*1440 (для печати) @include time_big.texi @node Copying This Manual, Index, Plotting time, Top @appendix GNU Free Documentation License @include fdl.texi @node Index, , Copying This Manual, Top @unnumbered Index @printindex cp @bye mathgl-8.0.1/texinfo/core_en.texi0000664000175000017500000116342714167366465016603 0ustar balakinbalakin@c ------------------------------------------------------------------ @chapter MathGL core @nav{} @cindex mglGraph @ifset UDAV This chapter contains a lot of plotting commands for 1D, 2D and 3D data. It also encapsulates parameters for axes drawing. Moreover an arbitrary coordinate transformation can be used for each axis. Additional information about colors, fonts, formula parsing can be found in @ref{General concepts}. The full list of symbols used by MathGL for setting up plots can be found in @ref{Symbols for styles}. @end ifset @ifclear UDAV The core of MathGL is @strong{mglGraph} class defined in @code{#include }. It contains a lot of plotting functions for 1D, 2D and 3D data. It also encapsulates parameters for axes drawing. Moreover an arbitrary coordinate transformation can be used for each axis. All plotting functions use data encapsulated in mglData class (see @ref{Data processing}) that allows one to check sizes of used arrays easily. Also it have many functions for data handling: modify it by formulas, find momentums and distribution (histogram), apply operator (differentiate, integrate, transpose, Fourier and so on), change data sizes (interpolate, squeeze, crop and so on). Additional information about colors, fonts, formula parsing can be found in @ref{General concepts} and @ref{Other classes}. @end ifclear Some of MathGL features will appear only in novel versions. To test used MathGL version you can use following function. @anchor{version} @deftypefn {MGL command} {} version 'ver' @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{bool} CheckVersion (@code{const char *}ver) static @deftypefnx {C function} @code{int} mgl_check_version (@code{const char *}ver) @end ifclear Return zero if MathGL version is appropriate for required by @var{ver}, i.e. if major version is the same and minor version is greater or equal to one in @var{ver}. @end deftypefn @menu * Constructor:: * Graphics setup:: * Axis settings:: * Subplots and rotation:: * Export picture:: * Background:: * Primitives:: * Text printing:: * Axis and Colorbar:: * Legend:: * 1D plotting:: * 2D plotting:: * 3D plotting:: * Dual plotting:: * Vector fields:: * Other plotting:: * Nonlinear fitting:: * Data manipulation:: @c * IDTF functions:: @end menu @c ################################################################## @external{} @node Constructor, Graphics setup, , MathGL core @section Create and delete objects @nav{} @ifclear UDAV @deftypefn {Constructor on @code{mglGraph}} {} mglGraph (@code{int} kind=@code{0}, @code{int} width=@code{600}, @code{int} height=@code{400}) @deftypefnx {Constructor on @code{mglGraph}} {} mglGraph (@code{const mglGraph &}gr) @deftypefnx {Constructor on @code{mglGraph}} {} mglGraph (@code{HMGL} gr) @deftypefnx {C function} @code{HMGL} mgl_create_graph (@code{int} width, @code{int} height) @deftypefnx {C function} @code{HMGL} mgl_create_graph_gl () Creates the instance of class mglGraph with specified sizes @var{width} and @var{height}. Parameter @var{kind} may have following values: @samp{0} -- use default plotter, @samp{1} -- use OpenGL plotter. @end deftypefn @deftypefn {Destructor on @code{mglGraph}} {} ~mglGraph () @deftypefnx {C function} @code{HMGL} mgl_delete_graph (@code{HMGL} gr) Deletes the instance of class mglGraph. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{HMGL} Self () Returns the pointer to internal object of type @code{HMGL}. @end deftypefn @deftypefn {C function} @code{HMGL} mgl_default_graph () Returns pointer to default instance of class mglGraph. This is default instance, used with new classes, which can be used to keep plot settings and to speed up initialization in small different plots. @end deftypefn @end ifclear @ifset UDAV You don't need to create canvas object in MGL. @end ifset @c ################################################################## @external{} @node Graphics setup, Axis settings, Constructor, MathGL core @section Graphics setup @nav{} @cindex MathGL setup Functions and variables in this group influences on overall graphics appearance. So all of them should be placed @emph{before} any actual plotting function calls. @anchor{reset} @deftypefn {MGL command} {} reset @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} DefaultPlotParam () @deftypefnx {C function} @code{void} mgl_set_def_param (@code{HMGL} gr) @end ifclear Restore initial values for all of parameters and clear the image. @end deftypefn @anchor{setup} @deftypefn {MGL command} {} setup @code{val flag} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetFlagAdv (@code{int} val, @code{uint32_t} flag) @deftypefnx {C function} @code{void} mgl_set_flag (@code{HMGL} gr, @code{int} val, @code{uint32_t} flag) @end ifclear Sets the value of internal binary @var{flag} to @var{val}. The list of flags can be found at @url{https://sourceforge.net/p/mathgl/code/HEAD/tree/mathgl-2x/include/mgl2/define.h#l267, define.h}. The current list of flags are: @verbatim #define MGL_ENABLE_CUT 0x00000004 ///< Flag which determines how points outside bounding box are drown. #define MGL_ENABLE_RTEXT 0x00000008 ///< Use text rotation along axis #define MGL_AUTO_FACTOR 0x00000010 ///< Enable autochange PlotFactor #define MGL_ENABLE_ALPHA 0x00000020 ///< Flag that Alpha is used #define MGL_ENABLE_LIGHT 0x00000040 ///< Flag of using lightning #define MGL_TICKS_ROTATE 0x00000080 ///< Allow ticks rotation #define MGL_TICKS_SKIP 0x00000100 ///< Allow ticks rotation #define MGL_DISABLE_SCALE 0x00000200 ///< Temporary flag for disable scaling (used for axis) #define MGL_FINISHED 0x00000400 ///< Flag that final picture (i.e. mglCanvas::G) is ready #define MGL_USE_GMTIME 0x00000800 ///< Use gmtime instead of localtime #define MGL_SHOW_POS 0x00001000 ///< Switch to show or not mouse click position #define MGL_CLF_ON_UPD 0x00002000 ///< Clear plot before Update() #define MGL_NOSUBTICKS 0x00004000 ///< Disable subticks drawing (for bounding box) #define MGL_LOCAL_LIGHT 0x00008000 ///< Keep light sources for each inplot #define MGL_VECT_FRAME 0x00010000 ///< Use DrwDat to remember all data of frames #define MGL_REDUCEACC 0x00020000 ///< Reduce accuracy of points (to reduce size of output files) #define MGL_PREFERVC 0x00040000 ///< Prefer vertex color instead of texture if output format supports #define MGL_ONESIDED 0x00080000 ///< Render only front side of surfaces if output format supports (for debugging) #define MGL_NO_ORIGIN 0x00100000 ///< Don't draw tick labels at axis origin #define MGL_GRAY_MODE 0x00200000 ///< Convert all colors to gray ones #define MGL_FULL_CURV 0x00400000 ///< Disable omitting points in straight-line part(s) #define MGL_NO_SCALE_REL 0x00800000 ///< Disable font scaling in relative inplots @end verbatim @end deftypefn @ifclear UDAV @deftypefn {C function} @code{void} mgl_bsize (@code{unsigned} bsize) Set buffer size for number of primitives as (1<1 the text and lines are more sharped. For @var{val}<1 the text and lines are more blurred. @end deftypefn @c ================================================================== @external{} @node Cutting, Font settings, Default sizes, Graphics setup @subsection Cutting @nav{} @ifclear UDAV @cindex SetCut @cindex SetCutBox @cindex CutOff @end ifclear @cindex Cut These variables and functions set the condition when the points are excluded (cutted) from the drawing. Note, that a point with NAN value(s) of coordinate or amplitude will be automatically excluded from the drawing. @sref{Cutting sample} @anchor{cut} @deftypefn {MGL command} {} cut @code{val} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetCut (@code{bool} val) @deftypefnx {C function} @code{void} mgl_set_cut (@code{HMGL} gr, @code{int} val) @end ifclear Flag which determines how points outside bounding box are drawn. If it is @code{true} then points are excluded from plot (it is default) otherwise the points are projected to edges of bounding box. @end deftypefn @deftypefn {MGL command} {} cut @code{x1 y1 z1 x2 y2 z2} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetCutBox (@code{mglPoint} p1, @code{mglPoint} p1) @deftypefnx {C function} @code{void} mgl_set_cut_box (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2) @end ifclear Lower and upper edge of the box in which never points are drawn. If both edges are the same (the variables are equal) then the cutting box is empty. @end deftypefn @deftypefn {MGL command} {} cut 'cond' @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} CutOff (@code{const char *}cond) @deftypefnx {C function} @code{void} mgl_set_cutoff (@code{HMGL} gr, @code{const char *}cond) @end ifclear Sets the cutting off condition by formula @var{cond}. This condition determine will point be plotted or not. If value of formula is nonzero then point is omitted, otherwise it plotted. Set argument as @code{""} to disable cutting off condition. @end deftypefn @c ================================================================== @external{} @node Font settings, Palette and colors, Cutting, Graphics setup @subsection Font settings @nav{} @ifclear UDAV @cindex SetFontSize @cindex SetFontDef @cindex SetRotatedText @cindex SetFontSizePT @cindex SetFontSizeCM @cindex SetFontSizeIN @cindex LoadFont @cindex CopyFont @cindex RestoreFont @end ifclear @cindex Font @cindex RotateText @anchor{font} @deftypefn {MGL command} {} font 'fnt' [@code{val=6}] Font style for text and labels (see text). Initial style is 'fnt'=':rC' give Roman font with centering. Parameter @code{val} sets the size of font for tick and axis labels. Default font size of axis labels is 1.4 times large than for tick labels. For more detail, see @ref{Font styles}. @end deftypefn @anchor{rotatetext} @deftypefn {MGL command} {} rotatetext @code{val} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetRotatedText (@code{bool} val) @deftypefnx {C function} @code{void} mgl_set_rotated_text (@code{HMGL} gr, @code{int} val) @end ifclear Sets to use or not text rotation. @end deftypefn @anchor{scaletext} @deftypefn {MGL command} {} scaletext @code{val} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetScaleText (@code{bool} val) @deftypefnx {C function} @code{void} mgl_set_scale_text (@code{HMGL} gr, @code{int} val) @end ifclear Sets to scale text in relative @ref{inplot} (including @ref{columnplot}, @ref{gridplot}, @ref{stickplot}, @ref{shearplot}) or not. @end deftypefn @anchor{texparse} @deftypefn {MGL command} {} texparse @code{val} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetTeXparse (@code{bool} val) @deftypefnx {C function} @code{void} mgl_set_tex_parse (@code{HMGL} gr, @code{int} val) @end ifclear Enables/disables TeX-like command parsing at text output. @end deftypefn @anchor{loadfont} @deftypefn {MGL command} {} loadfont ['name'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} LoadFont (@code{const char *}name, @code{const char *}path=@code{""}) @deftypefnx {C function} @code{void} mgl_load_font (@code{HMGL} gr, @code{const char *}name, @code{const char *}path) @end ifclear Load font typeface from @var{path}/@var{name}. Empty name will load default font. @end deftypefn @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{void} SetFontDef (@code{const char *}fnt) @deftypefnx {C function} @code{void} mgl_set_font_def (@code{HMGL} gr, @code{const char *} val) Sets the font specification (see @ref{Text printing}). Default is @samp{rC} -- Roman font centering. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} SetFontSize (@code{mreal} val) @deftypefnx {C function} @code{void} mgl_set_font_size (@code{HMGL} gr, @code{mreal} val) Sets the size of font for tick and axis labels. Default font size of axis labels is 1.4 times large than for tick labels. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} SetFontSizePT (@code{mreal} cm, @code{int} dpi=@code{72}) Set FontSize by size in pt and picture DPI (default is 16 pt for dpi=72). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{inline void} SetFontSizeCM (@code{mreal} cm, @code{int} dpi=@code{72}) Set FontSize by size in centimeters and picture DPI (default is 0.56 cm = 16 pt). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{inline void} SetFontSizeIN (@code{mreal} cm, @code{int} dpi=@code{72}) Set FontSize by size in inch and picture DPI (default is 0.22 in = 16 pt). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} CopyFont (@code{mglGraph *} from) @deftypefnx {C function} @code{void} mgl_copy_font (@code{HMGL} gr, @code{HMGL} gr_from) Copy font data from another @code{mglGraph} object. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} RestoreFont () @deftypefnx {C function} @code{void} mgl_restore_font (@code{HMGL} gr) Restore font data to default typeface. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} SetDefFont (@code{const char *}name, @code{const char *}path=@code{""}) static @deftypefnx {C function} @code{void} mgl_def_font (@code{const char *}name, @code{const char *}path) Load default font typeface (for all newly created HMGL/mglGraph objects) from @var{path}/@var{name}. @end deftypefn @end ifclear @c ================================================================== @external{} @node Palette and colors, Masks, Font settings, Graphics setup @subsection Palette and colors @nav{} @ifclear UDAV @cindex SetPalette @end ifclear @cindex Palette @anchor{palette} @deftypefn {MGL command} {} palette 'colors' @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetPalette (@code{const char *}colors) @deftypefnx {C function} @code{void} mgl_set_palette (@code{HMGL} gr, @code{const char *}colors) @end ifclear Sets the palette as selected colors. Default value is @code{"Hbgrcmyhlnqeup"} that corresponds to colors: dark gray @samp{H}, blue @samp{b}, green @samp{g}, red @samp{r}, cyan @samp{c}, magenta @samp{m}, yellow @samp{y}, gray @samp{h}, blue-green @samp{l}, sky-blue @samp{n}, orange @samp{q}, yellow-green @samp{e}, blue-violet @samp{u}, purple @samp{p}. The palette is used mostly in 1D plots (see @ref{1D plotting}) for curves which styles are not specified. Internal color counter will be nullified by any change of palette. This includes even hidden change (for example, by @ref{box} or @ref{axis} functions). @end deftypefn @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{void} SetDefScheme (@code{const char *}sch) @deftypefnx {C function} @code{void} mgl_set_def_sch (@code{HMGL} gr, @code{const char *}sch) Sets the @var{sch} as default color scheme. Default value is @code{"BbcyrR"}. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} SetColor (@code{char} id, @code{mreal} r, @code{mreal} g, @code{mreal} b) static @deftypefnx {C function} @code{void} mgl_set_color (@code{char} id, @code{mreal} r, @code{mreal} g, @code{mreal} b) Sets RGB values for color with given @var{id}. This is global setting which influence on any later usage of symbol @var{id}. @end deftypefn @end ifclear @anchor{gray} @deftypefn {MGL command} {} gray [@code{val=on}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Gray (@code{bool} enable) @deftypefnx {C function} @code{void} mgl_set_gray (@code{HMGL} gr, @code{int} enable) @end ifclear Sets the gray-scale mode on/off. @end deftypefn @c ================================================================== @external{} @node Masks, Error handling, Palette and colors, Graphics setup @subsection Masks @nav{} @cindex SetMask @cindex SetMaskAngle @anchor{mask} @deftypefn {MGL command} {} mask 'id' 'hex' [angle] @deftypefnx {Команда MGL} {} mask 'id' hex [angle] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetMask (@code{char} id, @code{const char *}hex) @deftypefnx {Method on @code{mglGraph}} @code{void} SetMask (@code{char} id, @code{uint64_t} hex) @deftypefnx {C function} @code{void} mgl_set_mask (@code{HMGL} gr, @code{const char *}hex) @deftypefnx {C function} @code{void} mgl_set_mask_val (@code{HMGL} gr, @code{uint64_t} hex) @end ifclear Sets new bit matrix @var{hex} of size 8*8 for mask with given @var{id}. This is global setting which influence on any later usage of symbol @var{id}. The predefined masks are (see @ref{Color scheme}): @samp{-} give lines (@code{0x000000FF00000000}), @samp{+} give cross-lines (@code{080808FF08080808}), @samp{=} give double lines (@code{0000FF00FF000000}), @samp{;} give dash lines (@code{0x0000000F00000000}), @samp{o} give circles (@code{0000182424180000}), @samp{O} give filled circles (@code{0000183C3C180000}), @samp{s} give squares (@code{00003C24243C0000}), @samp{S} give solid squares (@code{00003C3C3C3C0000}), @samp{~} give waves (@code{0000060990600000}), @samp{<} give left triangles (@code{0060584658600000}), @samp{>} give right triangles (@code{00061A621A060000}), @samp{j} give dash-dot lines (@code{0000002700000000}), @samp{d} give pluses (@code{0x0008083E08080000}), @samp{D} give tacks (@code{0x0139010010931000}), @samp{*} give dots (@code{0x0000001818000000}), @samp{^} give bricks (@code{0x101010FF010101FF}). Parameter @var{angle} set the rotation angle too. IMPORTANT: the rotation angle will be replaced by a multiple of 45 degrees at export to EPS. @end deftypefn @deftypefn {MGL command} {} mask angle @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetMaskAngle (@code{int} angle) @deftypefnx {C function} @code{void} mgl_set_mask_angle (@code{HMGL} gr, @code{int} angle) @end ifclear Sets the default rotation angle (in degrees) for masks. Note, you can use symbols @samp{\}, @samp{/}, @samp{I} in color scheme for setting rotation angles as 45, -45 and 90 degrees correspondingly. IMPORTANT: the rotation angle will be replaced by a multiple of 45 degrees at export to EPS. @end deftypefn @c ================================================================== @external{} @node Error handling, Stop drawing, Masks, Graphics setup @subsection Error handling @nav{} @ifset UDAV All warnings will be displayed automatically in special tool-window or in console. @end ifset @ifclear UDAV @cindex Message @cindex SetWarn @cindex GetWarn Normally user should set it to zero by @code{SetWarn(0);} before plotting and check if @code{GetWarn()} or @code{Message()} return non zero after plotting. Only last warning will be saved. All warnings/errors produced by MathGL is not critical -- the plot just will not be drawn. By default, all warnings are printed in stderr. You can disable it by using @code{mgl_suppress_warn(true);}. @deftypefn {Method on @code{mglGraph}} @code{void} SetWarn (@code{int} code, @code{const char *}info=@code{""}) @deftypefnx {C function} @code{void} mgl_set_warn (@code{HMGL} gr, @code{int} code, @code{const char *}info) Set warning code. Normally you should call this function only for clearing the warning state, i.e. call @code{SetWarn(0);}. Text @var{info} will be printed as is if @var{code}<0. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{const char *}Message () @deftypefnx {C function only} @code{const char *}mgl_get_mess (@code{HMGL} gr) @deftypefnx {Fortran subroutine} @code{} mgl_get_mess (@code{long} gr, @code{char *}out, @code{int} len) Return messages about matters why some plot are not drawn. If returned string is empty then there are no messages. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{int} GetWarn () @deftypefnx {C function} @code{int} mgl_get_warn (@code{HMGL} gr) Return the numerical ID of warning about the not drawn plot. Possible values are: @table @code @item mglWarnNone=0 Everything OK @item mglWarnDim Data dimension(s) is incompatible @item mglWarnLow Data dimension(s) is too small @item mglWarnNeg Minimal data value is negative @item mglWarnFile No file or wrong data dimensions @item mglWarnMem Not enough memory @item mglWarnZero Data values are zero @item mglWarnLeg No legend entries @item mglWarnSlc Slice value is out of range @item mglWarnCnt Number of contours is zero or negative @item mglWarnOpen Couldn't open file @item mglWarnLId Light: ID is out of range @item mglWarnSize Setsize: size(s) is zero or negative @item mglWarnFmt Format is not supported for that build @item mglWarnTern Axis ranges are incompatible @item mglWarnNull Pointer is NULL @item mglWarnSpc Not enough space for plot @item mglScrArg Wrong argument(s) of a command in MGL script @item mglScrCmd Wrong command in MGL script @item mglScrLong Too long line in MGL script @item mglScrStr Unbalanced ' in MGL script @item mglScrTemp Change temporary data in MGL script @end table @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} SuppressWarn (@code{bool} state) static @deftypefnx {C function} @code{void} mgl_suppress_warn (@code{int} state) Disable printing warnings to @code{stderr} if @var{state} is nonzero. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} SetGlobalWarn (@code{const char *}info) static @deftypefnx {C function} @code{void} mgl_set_global_warn (@code{const char *}info) Set warning message @var{info} for global scope. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{const char *} GlobalWarn () static @deftypefnx {C function} @code{const char *} mgl_get_global_warn () Get warning message(s) for global scope. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} ClearGlobalWarn () static @deftypefnx {C function} @code{void} mgl_clear_global_warn () Clears global warning messages. @end deftypefn @end ifclear @c ================================================================== @external{} @node Stop drawing, , Error handling, Graphics setup @subsection Stop drawing @nav{} @ifset UDAV You can use @ref{stop} command or press corresponding toolbutton to stop drawing and script execution. @end ifset @ifclear UDAV @cindex Stop @cindex NeedStop @cindex SetEventFunc @deftypefn {Method on @code{mglGraph}} @code{void} Stop (@code{bool} stop=@code{true}) @deftypefnx {C function only} @code{void} mgl_ask_stop (@code{HMGL} gr, @code{int} stop) Ask to stop drawing if @var{stop} is non-zero, otherwise reset stop flag. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{bool} NeedStop () @deftypefnx {C function only} @code{void} mgl_need_stop (@code{HMGL} gr) Return @code{true} if drawing should be terminated. Also it process all events in GUI. User should call this function from time to time inside a long calculation to allow processing events for GUI. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{bool} SetEventFunc (@code{void (*}func@code{)(void *)}, @code{void *}par=@code{NULL}) @deftypefnx {C function only} @code{void} mgl_set_event_func (@code{HMGL} gr, @code{void (*}func@code{)(void *)}, @code{void *}par) Set callback function which will be called to process events of GUI library. @end deftypefn @end ifclear @c ================================================================== @external{} @node Axis settings, Subplots and rotation, Graphics setup, MathGL core @section Axis settings @nav{} These large set of variables and functions control how the axis and ticks will be drawn. Note that there is 3-step transformation of data coordinates are performed. Firstly, coordinates are projected if @code{Cut=true} (see @ref{Cutting}), after it transformation formulas are applied, and finally the data was normalized in bounding box. Note, that MathGL will produce warning if axis range and transformation formulas are not compatible. @menu * Ranges (bounding box):: * Curved coordinates:: * Ticks:: @end menu @c ------------------------------------------------------------------ @external{} @node Ranges (bounding box), Curved coordinates, , Axis settings @subsection Ranges (bounding box) @nav{} @cindex CRange @cindex XRange @cindex YRange @cindex ZRange @cindex Ranges @cindex Origin @ifclear UDAV @cindex SetRange @cindex SetRanges @cindex SetOrigin @end ifclear @anchor{xrange} @anchor{yrange} @anchor{zrange} @anchor{crange} @deftypefn {MGL command} {} xrange @code{v1 v2} [@code{add=off}] @deftypefnx {MGL command} {} yrange @code{v1 v2} [@code{add=off}] @deftypefnx {MGL command} {} zrange @code{v1 v2} [@code{add=off}] @deftypefnx {MGL command} {} crange @code{v1 v2} [@code{add=off}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetRange (@code{char} dir, @code{mreal} v1, @code{mreal} v2) @deftypefnx {Method on @code{mglGraph}} @code{void} AddRange (@code{char} dir, @code{mreal} v1, @code{mreal} v2) @deftypefnx {C function} @code{void} mgl_set_range_val (@code{HMGL} gr, @code{char} dir, @code{mreal} v1, @code{mreal} v2) @deftypefnx {C function} @code{void} mgl_add_range_val (@code{HMGL} gr, @code{char} dir, @code{mreal} v1, @code{mreal} v2) @end ifclear Sets or adds the range for @samp{x}-,@samp{y}-,@samp{z}- coordinate or coloring (@samp{c}). If one of values is @code{NAN} then it is ignored. See also @ref{ranges}. @end deftypefn @deftypefn {MGL command} {} xrange dat [@code{add=off}] @deftypefnx {MGL command} {} yrange dat [@code{add=off}] @deftypefnx {MGL command} {} zrange dat [@code{add=off}] @deftypefnx {MGL command} {} crange dat [@code{add=off}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetRange (@code{char} dir, @code{const mglDataA &}dat, @code{bool} add=@code{false}) @deftypefnx {C function} @code{void} mgl_set_range_dat (@code{HMGL} gr, @code{char} dir, @code{const HCDT} a, @code{int} add) @end ifclear Sets the range for @samp{x}-,@samp{y}-,@samp{z}- coordinate or coloring (@samp{c}) as minimal and maximal values of data @var{dat}. Parameter @code{add=on} shows that the new range will be joined to existed one (not replace it). @end deftypefn @anchor{ranges} @deftypefn {MGL command} {} ranges @code{x1 x2 y1 y2 [z1=0 z2=0]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{mglPoint} p1, @code{mglPoint} p2) @deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{double} x1, @code{double} x2, @code{double} y1, @code{double} y2, @code{double} z1=@code{0}, @code{double} z2=@code{0}) @deftypefnx {C function} @code{void} mgl_set_ranges (@code{HMGL} gr, @code{double} x1, @code{double} x2, @code{double} y1, @code{double} y2, @code{double} z1, @code{double} z2) @end ifclear Sets the ranges of coordinates. If minimal and maximal values of the coordinate are the same then they are ignored. Also it sets the range for coloring (analogous to @code{crange z1 z2}). This is default color range for 2d plots. Initial ranges are [-1, 1]. @end deftypefn @deftypefn {MGL command} {} ranges @code{xx yy [zz cc=zz]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy) @deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz) @deftypefnx {Method on @code{mglGraph}} @code{void} SetRanges (@code{const mglDataA &}xx, @code{const mglDataA &}yy, @code{const mglDataA &}zz, @code{const mglDataA &}cc) @end ifclear Sets the ranges of @samp{x}-,@samp{y}-,@samp{z}-,@samp{c}-coordinates and coloring as minimal and maximal values of data @var{xx}, @var{yy}, @var{zz}, @var{cc} correspondingly. @end deftypefn @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{void} SetAutoRanges (@code{mglPoint} p1, @code{mglPoint} p2) @deftypefnx {Method on @code{mglGraph}} @code{void} SetAutoRanges (@code{double} x1, @code{double} x2, @code{double} y1, @code{double} y2, @code{double} z1=@code{0}, @code{double} z2=@code{0}, @code{double} c1=@code{0}, @code{double} c2=@code{0}) @deftypefnx {C function} @code{void} mgl_set_auto_ranges (@code{HMGL} gr, @code{double} x1, @code{double} x2, @code{double} y1, @code{double} y2, @code{double} z1, @code{double} z2, @code{double} z1, @code{double} z2) Sets the ranges for automatic coordinates. If minimal and maximal values of the coordinate are the same then they are ignored. @end deftypefn @end ifclear @anchor{origin} @deftypefn {MGL command} {} origin @code{x0 y0 [z0=nan]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetOrigin (@code{mglPoint} p0) @deftypefnx {Method on @code{mglGraph}} @code{void} SetOrigin (@code{mreal} x0, @code{mreal} y0, @code{mreal} z0=@code{NAN}) @deftypefnx {C function} @code{void} mgl_set_origin (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0) @end ifclear Sets center of axis cross section. If one of values is NAN then MathGL try to select optimal axis position. @end deftypefn @anchor{zoomaxis} @deftypefn {MGL command} {} zoomaxis @code{x1 x2} @deftypefnx {MGL command} {} zoomaxis @code{x1 y1 x2 y2} @deftypefnx {MGL command} {} zoomaxis @code{x1 y1 z1 x2 y2 z2} @deftypefnx {MGL command} {} zoomaxis @code{x1 y1 z1 c1 x2 y2 z2 c2} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ZoomAxis (@code{mglPoint} p1, @code{mglPoint} p2) @deftypefnx {C function} @code{void} mgl_zoom_axis (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} c1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{mreal} c2) @end ifclear Additionally extend axis range for any settings made by @code{SetRange} or @code{SetRanges} functions according the formula @math{min += (max-min)*p1} and @math{max += (max-min)*p1} (or @math{min *= (max/min)^p1} and @math{max *= (max/min)^p1} for log-axis range when @math{inf>max/min>100} or @math{00 set relative length of subticks which is in @code{sqrt(1+stt)} times smaller. @end deftypefn @deftypefn {MGL command} {} axisstl 'stl' ['tck'='' 'sub'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetAxisStl (@code{const char *}stl=@code{"k"}, @code{const char *}tck=@code{0}, @code{const char *}sub=@code{0}) @deftypefnx {C function} @code{void} mgl_set_axis_stl (@code{HMGL} gr, @code{const char *}stl, @code{const char *}tck, @code{const char *}sub) @end ifclear The line style of axis (@var{stl}), ticks (@var{tck}) and subticks (@var{sub}). If @var{stl} is empty then default style is used (@samp{k} or @samp{w} depending on transparency type). If @var{tck} or @var{sub} is empty then axis style is used (i.e. @var{stl}). @end deftypefn @c ################################################################## @external{} @node Subplots and rotation, Export picture, Axis settings, MathGL core @section Subplots and rotation @nav{} @cindex Aspect @cindex Rotate @cindex RotateN @cindex SubPlot @cindex MultiPlot @cindex StickPlot @cindex ColumnPlot @cindex InPlot @cindex Title @cindex Perspective @cindex View @cindex Push @cindex Pop These functions control how and where further plotting will be placed. There is a certain calling order of these functions for the better plot appearance. First one should be @ref{subplot}, @ref{multiplot} or @ref{inplot} for specifying the place. Second one can be @ref{title} for adding title for the subplot. After it a @ref{rotate}, @ref{shear} and @ref{aspect}. And finally any other plotting functions may be called. Alternatively you can use @ref{columnplot}, @ref{gridplot}, @ref{stickplot}, @ref{shearplot} or relative @ref{inplot} for positioning plots in the column (or grid, or stick) one by another without gap between plot axis (bounding boxes). @sref{Subplots} @anchor{subplot} @deftypefn {MGL command} {} subplot @code{nx ny m} ['stl'='<>_^' @code{dx=0 dy=0}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SubPlot (@code{int} nx, @code{int} ny, @code{int} m, @code{const char *}stl=@code{"<>_^"}, @code{mreal} dx=@code{0}, @code{mreal} dy=@code{0}) @deftypefnx {C function} @code{void} mgl_subplot (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m, @code{const char *}stl) @deftypefnx {C function} @code{void} mgl_subplot_d (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m, @code{const char *}stl, @code{mreal} dx, @code{mreal} dy) @end ifclear Puts further plotting in a @var{m}-th cell of @var{nx}*@var{ny} grid of the whole frame area. The position of the cell can be shifted from its default position by relative size @var{dx}, @var{dy}. This function set off any aspects or rotations. So it should be used first for creating the subplot. Extra space will be reserved for axis/colorbar if @var{stl} contain: @itemize @bullet @item @samp{L} or @samp{<} -- at left side, @item @samp{R} or @samp{>} -- at right side, @item @samp{A} or @samp{^} -- at top side, @item @samp{U} or @samp{_} -- at bottom side, @item @samp{#} -- reserve none space (use whole region for axis range) -- axis and tick labels will be invisible by default. @end itemize From the aesthetical point of view it is not recommended to use this function with different matrices in the same frame. Note, colorbar can be invisible (be out of image borders) if you set empty style @samp{}. @end deftypefn @anchor{multiplot} @deftypefn {MGL command} {} multiplot @code{nx ny m dx dy} ['style'='<>_^' sx sy] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} MultiPlot (@code{int} nx, @code{int} ny, @code{int} m, @code{int} dx, @code{int} dy, @code{const char *}stl=@code{"<>_^"}) @deftypefnx {C function} @code{void} mgl_multiplot (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m, @code{int} dx, @code{int} dy, @code{const char *}stl) @end ifclear Puts further plotting in a rectangle of @var{dx}*@var{dy} cells starting from @var{m}-th cell of @var{nx}*@var{ny} grid of the whole frame area. The position of the rectangular area can be shifted from its default position by relative size @var{sx}, @var{sy}. This function set off any aspects or rotations. So it should be used first for creating subplot. Extra space will be reserved for axis/colorbar if @var{stl} contain: @itemize @bullet @item @samp{L} or @samp{<} -- at left side, @item @samp{R} or @samp{>} -- at right side, @item @samp{A} or @samp{^} -- at top side, @item @samp{U} or @samp{_} -- at bottom side. @samp{#} -- reserve none space (use whole region for axis range) -- axis and tick labels will be invisible by default. @end itemize @end deftypefn @anchor{inplot} @deftypefn {MGL command} {} inplot @code{x1 x2 y1 y2 [rel=on]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} InPlot (@code{mreal} x1, @code{mreal} x2, @code{mreal} y1, @code{mreal} y2, @code{bool} rel=@code{true}) @deftypefnx {C function} @code{void} mgl_inplot (@code{HMGL} gr, @code{mreal} x1, @code{mreal} x2, @code{mreal} y1, @code{mreal} y2) @deftypefnx {C function} @code{void} mgl_relplot (@code{HMGL} gr, @code{mreal} x1, @code{mreal} x2, @code{mreal} y1, @code{mreal} y2) @end ifclear Puts further plotting in some region of the whole frame surface. This function allows one to create a plot in arbitrary place of the screen. The position is defined by rectangular coordinates [@var{x1}, @var{x2}]*[@var{y1}, @var{y2}]. The coordinates @var{x1}, @var{x2}, @var{y1}, @var{y2} are normalized to interval [0, 1]. If parameter @var{rel}=@code{true} then the relative position to current @ref{subplot} (or @ref{inplot} with @var{rel}=@code{false}) is used. This function set off any aspects or rotations. So it should be used first for creating subplot. @end deftypefn @anchor{columnplot} @deftypefn {MGL command} {} columnplot @code{num ind [d=0]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ColumnPlot (@code{int} num, @code{int} ind, @code{mreal} d=@code{0}) @deftypefnx {C function} @code{void} mgl_columnplot (@code{HMGL} gr, @code{int} num, @code{int} ind) @deftypefnx {C function} @code{void} mgl_columnplot_d (@code{HMGL} gr, @code{int} num, @code{int} ind, @code{mreal} d) @end ifclear Puts further plotting in @var{ind}-th cell of column with @var{num} cells. The position is relative to previous @ref{subplot} (or @ref{inplot} with @var{rel}=@code{false}). Parameter @var{d} set extra gap between cells. @end deftypefn @anchor{gridplot} @deftypefn {MGL command} {} gridplot @code{nx ny ind [d=0]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} GridPlot (@code{int} nx, @code{int} ny, @code{int} ind, @code{mreal} d=@code{0}) @deftypefnx {C function} @code{void} mgl_gridplot (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} ind) @deftypefnx {C function} @code{void} mgl_gridplot_d (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} ind, @code{mreal} d) @end ifclear Puts further plotting in @var{ind}-th cell of @var{nx}*@var{ny} grid. The position is relative to previous @ref{subplot} (or @ref{inplot} with @var{rel}=@code{false}). Parameter @var{d} set extra gap between cells. @end deftypefn @anchor{stickplot} @deftypefn {MGL command} {} stickplot @code{num ind tet phi} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} StickPlot (@code{int} num, @code{int} ind, @code{mreal} tet, @code{mreal} phi) @deftypefnx {C function} @code{void} mgl_stickplot (@code{HMGL} gr, @code{int} num, @code{int} ind, @code{mreal} tet, @code{mreal} phi) @end ifclear Puts further plotting in @var{ind}-th cell of stick with @var{num} cells. At this, stick is rotated on angles @var{tet}, @var{phi}. The position is relative to previous @ref{subplot} (or @ref{inplot} with @var{rel}=@code{false}). @end deftypefn @anchor{shearplot} @deftypefn {MGL command} {} shearplot @code{num ind sx sy [xd yd]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ShearPlot (@code{int} num, @code{int} ind, @code{mreal} sx, @code{mreal} sy, @code{mreal} xd=@code{1}, @code{mreal} yd=@code{0}) @deftypefnx {C function} @code{void} mgl_shearplot (@code{HMGL} gr, @code{int} num, @code{int} ind, @code{mreal} sx, @code{mreal} sy, @code{mreal} xd, @code{mreal} yd) @end ifclear Puts further plotting in @var{ind}-th cell of stick with @var{num} cells. At this, cell is sheared on values @var{sx}, @var{sy}. Stick direction is specified be @var{xd} and @var{yd}. The position is relative to previous @ref{subplot} (or @ref{inplot} with @var{rel}=@code{false}). @end deftypefn @anchor{title} @deftypefn {MGL command} {} title 'title' ['stl'='' @code{size=-2}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Title (@code{const char *}txt, @code{const char *}stl=@code{""}, @code{mreal} size=@code{-2}) @deftypefnx {Method on @code{mglGraph}} @code{void} Title (@code{const wchar_t *}txt, @code{const char *}stl=@code{""}, @code{mreal} size=@code{-2}) @deftypefnx {C function} @code{void} mgl_title (@code{HMGL} gr, @code{const char *}txt, @code{const char *}stl, @code{mreal} size) @deftypefnx {C function} @code{void} mgl_titlew (@code{HMGL} gr, @code{const wchar_t *}txt, @code{const char *}stl, @code{mreal} size) @end ifclear Add text @var{title} for current subplot/inplot. Parameter @var{stl} can contain: @itemize @bullet @item font style (see, @ref{Font styles}); @item @samp{#} for box around the title. @end itemize Parameter @var{size} set font size. This function set off any aspects or rotations. So it should be used just after creating subplot. Note, that each call of this command will reserve extra space. So, you need to manually call @ref{subplot} command after @ref{rasterize} if you want to combine bitmap and vector graphics. @end deftypefn @anchor{rotate} @deftypefn {MGL command} {} rotate @code{tetx tetz [tety=0]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Rotate (@code{mreal} TetX, @code{mreal} TetZ, @code{mreal} TetY=@code{0}) @deftypefnx {C function} @code{void} mgl_rotate (@code{HMGL} gr, @code{mreal} TetX, @code{mreal} TetZ, @code{mreal} TetY) @end ifclear Rotates a further plotting relative to each axis @{x, z, y@} consecutively on angles @var{TetX}, @var{TetZ}, @var{TetY}. @end deftypefn @deftypefn {MGL command} {} rotate @code{tet x y z} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} RotateN (@code{mreal} Tet, @code{mreal} x, @code{mreal} y, @code{mreal} z) @deftypefnx {C function} @code{void} mgl_rotate_vector (@code{HMGL} gr, @code{mreal Tet}, @code{mreal x}, @code{mreal y}, @code{mreal z}) @end ifclear Rotates a further plotting around vector @{@var{x}, @var{y}, @var{z}@} on angle @var{Tet}. @end deftypefn @anchor{shear} @deftypefn {MGL command} {} shear @code{sx sy} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Shear (@code{mreal} sx, @code{mreal} sy) @deftypefnx {C function} @code{void} mgl_shear (@code{HMGL} gr, @code{mreal} sx, @code{mreal} sy) @end ifclear Shears a further plotting on values @var{sx}, @var{sy}. @end deftypefn @anchor{aspect} @deftypefn {MGL command} {} aspect @code{ax ay [az=1]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Aspect (@code{mreal} Ax, @code{mreal} Ay, @code{mreal} Az=@code{1}) @deftypefnx {C function} @code{void} mgl_aspect (@code{HMGL} gr, @code{mreal} Ax, @code{mreal} Ay, @code{mreal} Az) @end ifclear Defines aspect ratio for the plot. The viewable axes will be related one to another as the ratio @var{Ax:Ay:Az}. For the best effect it should be used after @ref{rotate} function. If @var{Ax} is @code{NAN} then function try to select optimal aspect ratio to keep equal ranges for x-y axis. At this, @var{Ay} will specify proportionality factor, or set to use automatic one if @var{Ay}=@code{NAN}. @end deftypefn @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{void} Push () @deftypefnx {C function} @code{void} mgl_mat_push (@code{HMGL} gr) Push transformation matrix into stack. Later you can restore its current state by Pop() function. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} Pop () @deftypefnx {C function} @code{void} mgl_mat_pop (@code{HMGL} gr) Pop (restore last 'pushed') transformation matrix into stack. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} SetPlotFactor (@code{mreal} val) @deftypefnx {C function} @code{void} mgl_set_plotfactor (@code{HMGL} gr, @code{mreal} val) Sets the factor of plot size. It is not recommended to set it lower then 1.5. This is some analogue of function Zoom() but applied not to overall image but for each InPlot. Use negative value or zero to enable automatic selection. @end deftypefn @end ifclear There are 3 functions @code{View()}, @code{Zoom()} and @code{Perspective()} which transform whole image. I.e. they act as secondary transformation matrix. They were introduced for rotating/zooming the whole plot by mouse. It is not recommended to call them for picture drawing. @anchor{perspective} @deftypefn {MGL command} {} perspective @code{val} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Perspective (@code{mreal} a) @deftypefnx {C function} @code{void} mgl_perspective (@code{HMGL} gr, @code{mreal} a) @end ifclear Add (switch on) the perspective to plot. The parameter @math{a = Depth/(Depth+dz) \in [0,1)}. By default (@code{a=0}) the perspective is off. @end deftypefn @anchor{view} @deftypefn {MGL command} {} view @code{tetx tetz [tety=0]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} View (@code{mreal} TetX, @code{mreal} TetZ, @code{mreal} TetY=@code{0}) @deftypefnx {C function} @code{void} mgl_view (@code{HMGL} gr, @code{mreal} TetX, @code{mreal} TetZ, @code{mreal} TetY) @end ifclear Rotates a further plotting relative to each axis @{x, z, y@} consecutively on angles @var{TetX}, @var{TetZ}, @var{TetY}. Rotation is done independently on @ref{rotate}. Attention! this settings can not be overwritten by @code{DefaultPlotParam()}. Use @code{Zoom(0,0,1,1)} to return default view. @end deftypefn @anchor{zoom} @deftypefn {MGL command} {} zoom @code{x1 y1 x2 y2} @ifclear UDAV @deftypefnx {Method on @code{mglGraph} (C++, Python)} @code{void} Zoom (@code{mreal} x1, @code{mreal} y1, @code{mreal} x2, @code{mreal} y2) @deftypefnx {C function} @code{void} mgl_set_zoom (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} x2, @code{mreal} y2) @end ifclear The function changes the scale of graphics that correspond to zoom in/out of the picture. After function call the current plot will be cleared and further the picture will contain plotting from its part [x1,x2]*[y1,y2]. Here picture coordinates @var{x1}, @var{x2}, @var{y1}, @var{y2} changes from 0 to 1. Attention! this settings can not be overwritten by any other functions, including @code{DefaultPlotParam()}. Use @code{Zoom(0,0,1,1)} to return default view. @end deftypefn @c ################################################################## @external{} @node Export picture, Background, Subplots and rotation, MathGL core @section Export picture @nav{} @cindex SetSize Functions in this group save or give access to produced picture. So, usually they should be called after plotting is done. @anchor{setsize} @deftypefn {MGL command} {} setsize @code{w h} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetSize (@code{int} width, @code{int} height, @code{bool} clear=@code{true}) @deftypefnx {C function} @code{void} mgl_set_size (@code{HMGL} gr, @code{int} width, @code{int} height) @deftypefnx {C function} @code{void} mgl_scale_size (@code{HMGL} gr, @code{int} width, @code{int} height) @end ifclear Sets size of picture in pixels. This function @strong{should be} called before any other plotting because it completely remove picture contents if @var{clear}=@code{true}. Function just clear pixels and scale all primitives if @var{clear}=@code{false}. @end deftypefn @anchor{setsizescl} @deftypefn {MGL command} {} setsizescl @code{factor} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetSizeScl (@code{double} factor) @deftypefnx {C function} @code{void} mgl_set_size_scl (@code{HMGL} gr, @code{double} factor) @end ifclear Set factor for width and height in all further calls of @ref{setsize}. This command is @strong{obsolete} since v.2.4.2. @end deftypefn @anchor{quality} @deftypefn {MGL command} {} quality [@code{val}=2] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetQuality (@code{int} val=@code{MGL_DRAW_NORM}) @deftypefnx {C function} @code{void} mgl_set_quality (@code{HMGL} gr, @code{int} val) @end ifclear Sets quality of the plot depending on value @var{val}: @code{MGL_DRAW_WIRE=0} -- no face drawing (fastest), @code{MGL_DRAW_FAST=1} -- no color interpolation (fast), @code{MGL_DRAW_NORM=2} -- high quality (normal), @code{MGL_DRAW_HIGH=3} -- high quality with 3d primitives (arrows and marks); @code{MGL_DRAW_LMEM=0x4} -- direct bitmap drawing (low memory usage); @code{MGL_DRAW_DOTS=0x8} -- for dots drawing instead of primitives (extremely fast). @end deftypefn @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{int} GetQuality () @deftypefnx {C function} @code{int} mgl_get_quality (@code{HMGL} gr) Gets quality of the plot: @code{MGL_DRAW_WIRE=0} -- no face drawing (fastest), @code{MGL_DRAW_FAST=1} -- no color interpolation (fast), @code{MGL_DRAW_NORM=2} -- high quality (normal), @code{MGL_DRAW_HIGH=3} -- high quality with 3d primitives (arrows and marks); @code{MGL_DRAW_LMEM=0x4} -- direct bitmap drawing (low memory usage); @code{MGL_DRAW_DOTS=0x8} -- for dots drawing instead of primitives (extremely fast). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} StartGroup (const char *name) @deftypefnx {C function} @code{void} mgl_start_group (@code{HMGL} gr, @code{const char *}name) Starts group definition. Groups contain objects and other groups, they are used to select a part of a model to zoom to or to make invisible or to make semitransparent and so on. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} EndGroup () @deftypefnx {C function} @code{void} mgl_end_group (@code{HMGL} gr) Ends group definition. @end deftypefn @end ifclear @menu * Export to file:: * Frames/Animation:: * Bitmap in memory:: * Parallelization:: @end menu @c ================================================================== @external{} @node Export to file, Frames/Animation, , Export picture @subsection Export to file @nav{} @cindex Write @ifclear UDAV @cindex WriteFrame @cindex WritePNG @cindex WriteGIF @c @cindex WriteIDTF @cindex WriteSVG @cindex WriteBMP @cindex WriteEPS @cindex WriteBPS @cindex WriteTGA @cindex WriteTEX @cindex WritePRC @cindex WriteOBJ @cindex WriteWGL @cindex WriteJPEG @cindex ShowImage @end ifclear These functions export current view to a graphic file. The filename @var{fname} should have appropriate extension. Parameter @var{descr} gives the short description of the picture. Just now the transparency is supported in PNG, SVG, OBJ and PRC files. @anchor{write} @deftypefn {MGL command} {} write ['fname'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} WriteFrame (@code{const char *}fname=@code{""}, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_frame (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) @end ifclear Exports current frame to a file @var{fname} which type is determined by the extension. Parameter @var{descr} adds description to file (can be @code{""}). If @var{fname}=@code{""} then the file @samp{frame####.jpg} is used, where @samp{####} is current frame id and name @samp{frame} is defined by @ref{plotid} class property. @end deftypefn @anchor{bbox} @deftypefn {MGL command} {} bbox x1 y1 [x2=@code{-1} y2=@code{-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetBBox (@code{int} x1=@code{0}, @code{int} y1=@code{0}, @code{int} x2=@code{-1}, @code{int} y2=@code{-1}) @deftypefnx {C function} @code{void} mgl_set_bbox (@code{HMGL} gr, @code{int} x1, @code{int} y1, @code{int} x2, @code{int} y2) @end ifclear Set boundary box for export graphics into 2D file formats. If @var{x2}<0 (@var{y2}<0) then original image width (height) will be used. If @var{x1}<0 or @var{y1}<0 or @var{x1}>=@var{x2}|Width or @var{y1}>=@var{y2}|Height then cropping will be disabled. @end deftypefn @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{void} WritePNG (@code{const char *}fname, @code{const char *}descr=@code{""}, @code{int} compr=@code{""}, @code{bool} alpha=@code{true}) @deftypefnx {C function} @code{void} mgl_write_png (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) @deftypefnx {C function} @code{void} mgl_write_png_solid (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to PNG file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file, @var{alpha} gives the transparency type. By default there are no description added and semitransparent image used. This function does nothing if HAVE_PNG isn't defined during compilation of MathGL library. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteJPEG (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_jpg (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to JPEG file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file. By default there is no description added. This function does nothing if HAVE_JPEG isn't defined during compilation of MathGL library. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteGIF (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_gif (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to GIF file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file. By default there is no description added. This function does nothing if HAVE_GIF isn't defined during compilation of MathGL library. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteBMP (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_bmp (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to BMP file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file. There is no compression used. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteTGA (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_tga (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to TGA file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file. There is no compression used. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteEPS (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_eps (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to EPS file using vector representation. So it is not recommended for the export of large data plot. It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file. By default there is no description added. If file name is terminated by @samp{z} (for example, @samp{fname.eps.gz}) then file will be compressed in gzip format. Note, that EPS format don't support color interpolation, and the resulting plot will look as you use @ref{quality}=1 for plotting. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteBPS (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_eps (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to EPS file using bitmap representation. Parameter @var{fname} specifies the file name, @var{descr} adds description to file. By default there is no description added. If file name is terminated by @samp{z} (for example, @samp{fname.eps.gz}) then file will be compressed in gzip format. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteSVG (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_svg (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to SVG (Scalable Vector Graphics) file using vector representation. In difference of EPS format, SVG format support transparency that allows one to correctly draw semitransparent plot (like @ref{surfa}, @ref{surf3a} or @ref{cloud}). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name). If file name is terminated by @samp{z} (for example, @samp{fname.svgz}) then file will be compressed in gzip format. Note, that SVG format don't support color interpolation, and the resulting plot will look as you use @ref{quality}=1 for plotting. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteTEX (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_tex (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to LaTeX (package Tikz/PGF) file using vector representation. Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name). Note, there is no text scaling now (for example, in subplots), what may produce miss-aligned labels. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WritePRC (@code{const char *}fname, @code{const char *}descr=@code{""}, @code{bool} make_pdf=@code{true}) @deftypefnx {C function} @code{void} mgl_write_prc (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr, @code{int} make_pdf) Exports current frame to PRC file using vector representation (see @url{http://en.wikipedia.org/wiki/PRC_%28file_format%29}). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name). If parameter @var{make_pdf}=@code{true} and PDF was enabled at MathGL configure then corresponding PDF file with 3D image will be created. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteOBJ (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_obj (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to OBJ/MTL file using vector representation (see @url{http://en.wikipedia.org/wiki/Wavefront_.obj_file, OBJ format} for details). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteXYZ (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_xyz (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to XYZ/XYZL/XYZF files using vector representation (see @url{http://people.sc.fsu.edu/~jburkardt/data/xyz/xyz.html, XYZ format} for details). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteSTL (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_stl (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to STL file using vector representation (see @url{http://en.wikipedia.org/wiki/STL_(file_format), STL format} for details). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteOFF (@code{const char *}fname, @code{const char *}descr=@code{""}, @code{bool} colored=@code{false}) @deftypefnx {C function} @code{void} mgl_write_off (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr, @code{bool} colored) Exports current frame to OFF file using vector representation (see @url{http://people.sc.fsu.edu/~jburkardt/data/off/off.html, OFF format} for details). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name). @end deftypefn @c @deftypefn {Method on @code{mglGraph}} @code{void} WriteX3D (@code{const char *}fname, @code{const char *}descr=@code{""}) @c @deftypefnx {C function} @code{void} mgl_write_x3d (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) @c Exports current frame to X3D file using vector representation (see @url{http://en.wikipedia.org/wiki/X3d, X3D format} for details). Note, the output file may be too large for graphic of large data array (especially for surfaces). It is better to use bitmap format (for example PNG or JPEG). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name). @c @end deftypefn @c @deftypefn {Method on @code{mglGraph}} @code{void} WriteIDTF (@code{const char *}fname, @code{const char *}descr=@code{""}) @c @deftypefnx {C function} @code{void} mgl_write_idtf (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) @c Exports current frame to IDTF file. Later this file can be converted to U3D format. The vector representation is used. So, the output file may be too large for graphic of large data array (especially for surfaces). However, program has no internal limitations for size of output file. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name). @c @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} ShowImage (@code{const char *}viewer, @code{bool} nowait=@code{false}) @deftypefnx {C function} @code{void} mgl_show_image (@code{const char *}viewer, @code{int} nowait) Displays the current picture using external program @var{viewer} for viewing. The function save the picture to temporary file and call @var{viewer} to display it. If @var{nowait}=@code{true} then the function return immediately (it will not wait while window will be closed). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} WriteJSON (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_write_json (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports current frame to textual file using @ref{JSON format}. Later this file can be used for faster loading and viewing by JavaScript script. Parameter @var{fname} specifies the file name, @var{descr} adds description to file. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} ExportMGLD (@code{const char *}fname, @code{const char *}descr=@code{""}) @deftypefnx {C function} @code{void} mgl_export_mgld (@code{HMGL} gr, @code{const char *}fname, @code{const char *}descr) Exports points and primitives in file using @ref{MGLD format}. Later this file can be used for faster loading and viewing by @code{mglview} utility. Parameter @var{fname} specifies the file name, @var{descr} adds description to file (default is file name). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} ImportMGLD (@code{const char *}fname, @code{bool} add=@code{false}) @deftypefnx {C function} @code{void} mgl_import_mgld (@code{HMGL} gr, @code{const char *}fname, @code{int} add) Imports points and primitives in file using @ref{MGLD format}. Later this file can be used for faster loading and viewing by @code{mglview} utility. Parameter @var{fname} specifies the file name, @var{add} sets to append or replace primitives to existed ones. @end deftypefn @end ifclear @c ################################################################## @external{} @node Frames/Animation, Bitmap in memory, Export to file, Export picture @subsection Frames/Animation @nav{} @ifset UDAV There are no commands for making animation in MGL. However you can use features of @code{mglconv} and @code{mglview} utilities. For example, by busing special comments @samp{##a } or @samp{##c }. @end ifset @ifclear UDAV @cindex NewFrame @cindex EndFrame @cindex GetNumFrame @cindex ResetFrames @cindex StartGIF @cindex CloseGIF These functions provide ability to create several pictures simultaneously. For most of cases it is useless but for widget classes (see @ref{Widget classes}) they can provide a way to show animation. Also you can write several frames into animated GIF file. @deftypefn {Method on @code{mglGraph}} @code{void} NewFrame () @deftypefnx {C function} @code{void} mgl_new_frame (@code{HMGL} gr) Creates new frame. Function returns current frame id. This is not thread safe function in OpenGL mode! Use direct list creation in multi-threading drawing. The function @code{EndFrame()} @strong{must} be call after the finishing of the frame drawing for each call of this function. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} EndFrame () @deftypefnx {C function} @code{void} mgl_end_frame (@code{HMGL} gr) Finishes the frame drawing. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{int} GetNumFrame () @deftypefnx {C function} @code{int} mgl_get_num_frame (@code{HMGL} gr) Gets the number of created frames. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} SetFrame (@code{int} i) @deftypefnx {C function} @code{void} mgl_set_frame (@code{HMGL} gr, @code{int} i) Finishes the frame drawing and sets drawing data to frame @var{i}, which should be in range [0, @code{GetNumFrame()}-1]. This function is similar to @code{EndFrame()} but don't add frame to the GIF image. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} GetFrame (@code{int} i) @deftypefnx {C function} @code{void} mgl_get_frame (@code{HMGL} gr, @code{int} i) Replaces drawing data by one from frame @var{i}. Function work if @code{MGL_VECT_FRAME} is set on (by default). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} ShowFrame (@code{int} i) @deftypefnx {C function} @code{void} mgl_show_frame (@code{HMGL} gr, @code{int} i) Appends drawing data from frame @var{i} to current one. Function work if @code{MGL_VECT_FRAME} is set on (by default). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} DelFrame (@code{int} i) @deftypefnx {C function} @code{void} mgl_del_frame (@code{HMGL} gr, @code{int} i) Deletes drawing data for frame @var{i} and shift all later frame indexes. Function work if @code{MGL_VECT_FRAME} is set on (by default). Do nothing in OpenGL mode. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} ResetFrames () @deftypefnx {C function} @code{void} mgl_reset_frames (@code{HMGL} gr) Reset frames counter (start it from zero). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} ClearFrame (@code{int} i) @deftypefnx {C function} @code{void} mgl_clear_frame (@code{HMGL} gr, @code{int} i) Clear list of primitives for current drawing. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} StartGIF (@code{const char *}fname, @code{int} ms=@code{100}) @deftypefnx {C function} @code{void} mgl_start_gif (@code{HMGL} gr, @code{const char *}fname, @code{int} ms) Start writing frames into animated GIF file @var{fname}. Parameter @var{ms} set the delay between frames in milliseconds. You @strong{should not} change the picture size during writing the cinema. Use @code{CloseGIF()} to finalize writing. Note, that this function is disabled in OpenGL mode. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} CloseGIF () @deftypefnx {C function} @code{void} mgl_close_gif (@code{HMGL} gr) Finish writing animated GIF and close connected pointers. @end deftypefn @end ifclear @c ------------------------------------------------------------------ @external{} @node Bitmap in memory, Parallelization, Frames/Animation, Export picture @subsection Bitmap in memory @nav{} @ifclear UDAV These functions return the created picture (bitmap), its width and height. You may display it by yourself in any graphical library (see also, @ref{Widget classes}) or save in file (see also, @ref{Export to file}). @deftypefn {Method on @code{mglGraph}} @code{const unsigned char *} GetRGB () @deftypefnx {Method on @code{mglGraph}} @code{void} GetRGB (@code{char *}buf, @code{int} size) @deftypefnx {Method on @code{mglGraph}} @code{void} GetBGRN (@code{char *}buf, @code{int} size) @deftypefnx {C function} @code{const unsigned char *} mgl_get_rgb (@code{HMGL} gr) Gets RGB bitmap of the current state of the image. Format of each element of bits is: @{red, green, blue@}. Number of elements is Width*Height. Position of element @{i,j@} is [3*i + 3*Width*j] (or is [4*i + 4*Width*j] for @code{GetBGRN()}). You have to provide the proper @var{size} of the buffer, @var{buf}, i.e. the code for Python should look like @verbatim from mathgl import * gr = mglGraph(); bits='\t'; bits=bits.expandtabs(4*gr.GetWidth()*gr.GetHeight()); gr.GetBGRN(bits, len(bits)); @end verbatim @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{const unsigned char *} GetRGBA () @deftypefnx {Method on @code{mglGraph}} @code{void} GetRGBA (@code{char *}buf, @code{int} size) @deftypefnx {C function} @code{const unsigned char *} mgl_get_rgba (@code{HMGL} gr) Gets RGBA bitmap of the current state of the image. Format of each element of bits is: @{red, green, blue, alpha@}. Number of elements is Width*Height. Position of element @{i,j@} is [4*i + 4*Width*j]. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{int} GetWidth () @deftypefnx {Method on @code{mglGraph}} @code{int} GetHeight () @deftypefnx {C function} @code{int} mgl_get_width (@code{HMGL} gr) @deftypefnx {C function} @code{int} mgl_get_height (@code{HMGL} gr) Gets width and height of the image. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{mglPoint} CalcXYZ (@code{int} xs, @code{int} ys) @deftypefnx {C function} @code{void} mgl_calc_xyz (@code{HMGL} gr, @code{int} xs, @code{int} ys, @code{mreal *}x, @code{mreal *}y, @code{mreal *}z) Calculate 3D coordinate @{x,y,z@} for screen point @{xs,ys@}. At this moment it ignore perspective and transformation formulas (curvilinear coordinates). The calculation are done for the last used InPlot (see @ref{Subplots and rotation}). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{mglPoint} CalcScr (@code{mglPoint} p) @deftypefnx {C function} @code{void} mgl_calc_scr (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{int *}xs, @code{int *}ys) Calculate screen point @{xs,ys@} for 3D coordinate @{x,y,z@}. The calculation are done for the last used InPlot (see @ref{Subplots and rotation}). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} SetObjId (@code{int} id) @deftypefnx {C function} @code{void} mgl_set_obj_id (@code{HMGL} gr, @code{int} id) Set the numeric id for object or subplot/inplot. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{int} GetObjId (@code{int} xs, @code{int} ys) @deftypefnx {C function} @code{int} mgl_get_obj_id (@code{HMGL} gr, @code{int} xs, @code{int} ys) Get the numeric id for most upper object at pixel @{xs, ys@} of the picture. Note, that all plots in the same line of MGL script have the same id. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{int} GetSplId (@code{int} xs, @code{int} ys) @deftypefnx {C function} @code{int} mgl_get_spl_id (@code{HMGL} gr, @code{int} xs, @code{int} ys) Get the numeric id for most subplot/inplot at pixel @{xs, ys@} of the picture. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{void} Highlight (@code{int} id) @deftypefnx {C function} @code{void} mgl_highlight (@code{HMGL} gr, @code{int} id) Highlight the object with given @var{id}. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{long} IsActive (@code{int} xs, @code{int} ys, @code{int} d=@code{1}) @deftypefnx {C function} @code{long} mgl_is_active (@code{HMGL} gr, @code{int} xs, @code{int} ys, @code{int} d) Checks if point @{@var{xs}, @var{ys}@} is close to one of active point (i.e. mglBase::Act) with accuracy @var{d} and return its index or @code{-1} if not found. Active points are special points which characterize primitives (like edges and so on). This function for advanced users only. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{long} SetDrawReg (@code{int} nx=@code{1}, @code{int} ny=@code{1}, @code{int} m=@code{0}) @deftypefnx {C function} @code{long} mgl_set_draw_reg (@code{HMGL} gr, @code{int} nx, @code{int} ny, @code{int} m) Limits drawing region by rectangular area of @var{m}-th cell of matrix with sizes @var{nx}*@var{ny} (like in @ref{subplot}). This function can be used to update only small region of the image for purposes of higher speed. This function for advanced users only. @end deftypefn @end ifclear @c ------------------------------------------------------------------ @external{} @node Parallelization, , Bitmap in memory, Export picture @subsection Parallelization @nav{} @ifclear UDAV @cindex Combine @cindex MPI_Send @cindex MPI_Recv Many of things MathGL do in parallel by default (if MathGL was built with pthread). However, there is function which set the number of threads to be used. @deftypefn {C function} @code{int} mgl_set_num_thr (@code{int} n) Set the number of threads to be used by MathGL. If @var{n}<1 then the number of threads is set as maximal number of processors (cores). If @var{n}=1 then single thread will be used (this is default if pthread was disabled). @end deftypefn Another option is combining bitmap image (taking into account Z-ordering) from different instances of @code{mglGraph}. This method is most appropriate for computer clusters when the data size is so large that it exceed the memory of single computer node. @deftypefn {Method on @code{mglGraph}} @code{int} Combine (@code{const mglGraph *}g) @deftypefnx {C function} @code{int} mgl_combine_gr (@code{HMGL} gr, @code{HMGL} g) Combine drawing from instance @var{g} with @var{gr} (or with this) taking into account Z-ordering of pixels. The width and height of both instances must be the same. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{int} MPI_Send (@code{int} id) @deftypefnx {C function} @code{int} mgl_mpi_send (@code{HMGL} gr, @code{int} id) Send graphical information from node @var{id} using MPI. The width and height in both nodes must be the same. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{int} MPI_Recv (@code{int} id) @deftypefnx {C function} @code{int} mgl_mpi_send (@code{HMGL} gr, @code{int} id) Receive graphical information from node @var{id} using MPI. The width and height in both nodes must be the same. @end deftypefn @end ifclear @c ################################################################## @external{} @node Background, Primitives, Export picture, MathGL core @section Background @nav{} @cindex LoadBackground @cindex Clf @cindex Rasterize These functions change background image. @anchor{clf} @deftypefn {MGL command} {} clf ['col'] @deftypefnx {MGL command} {} clf r g b @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Clf () @deftypefnx {Method on @code{mglGraph}} @code{void} Clf (@code{const char *} col) @deftypefnx {Method on @code{mglGraph}} @code{void} Clf (@code{char} col) @deftypefnx {Method on @code{mglGraph}} @code{void} Clf (@code{mreal} r, @code{mreal} g, @code{mreal} b) @deftypefnx {C function} @code{void} mgl_clf (@code{HMGL} gr) @deftypefnx {C function} @code{void} mgl_clf_str (@code{HMGL} gr, @code{const char *} col) @deftypefnx {C function} @code{void} mgl_clf_chr (@code{HMGL} gr, @code{char} col) @deftypefnx {C function} @code{void} mgl_clf_rgb (@code{HMGL} gr, @code{mreal} r, @code{mreal} g, @code{mreal} b) @deftypefnx {C function} @code{void} mgl_clf_rgba (@code{HMGL} gr, @code{mreal} r, @code{mreal} g, @code{mreal} b, @code{mreal} a) @end ifclear Clear the picture and fill background by specified color. @end deftypefn @anchor{rasterize} @deftypefn {MGL command} {} rasterize @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Rasterize () @deftypefnx {C function} @code{void} mgl_rasterize (@code{HMGL} gr) @end ifclear Force drawing the plot and use it as background. After it, function clear the list of primitives, like @ref{clf}. This function is useful if you want save part of plot as bitmap one (for example, large surfaces, isosurfaces or vector fields) and keep some parts as vector one (like annotation, curves, axis and so on). Often, you need to manually call @ref{subplot} command after @ref{rasterize} to avoid extra space allocation or plot rotation. @end deftypefn @anchor{background} @deftypefn {MGL command} {} background 'fname' [@code{alpha=1}] @deftypefnx {MGL command} {} background 'fname' 'how' [@code{alpha=1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} LoadBackground (@code{const char *} fname, @code{double} alpha=@code{1}) @deftypefnx {C function} @code{void} mgl_load_background (@code{HMGL} gr, @code{const char *} fname, @code{double} alpha) @deftypefnx {Method on @code{mglGraph}} @code{void} LoadBackground (@code{const char *} fname, @code{const char *} how, @code{double} alpha=@code{1}) @deftypefnx {C function} @code{void} mgl_load_background_ext (@code{HMGL} gr, @code{const char *} fname, @code{const char *} how, @code{double} alpha) @end ifclear Load PNG or JPEG file @var{fname} as background for the plot. Parameter @var{alpha} manually set transparency of the background. Parameter @var{how} can be: @samp{a} for filling current subplot only, @samp{s} for scaling (resizing) image to whole area, @samp{c} for centering image, @samp{m} for tessellate image as mosaic. @end deftypefn @deftypefn {MGL command} {} background @code{r g b} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} FillBackground (@code{const mglColor &}rgb) @deftypefnx {C function} @code{void} mgl_fill_background (@code{HMGL} gr, @code{double} r, @code{double} g, @code{double} b, @code{double} a) @end ifclear Fill background by the specified color. Values should be in range [0,1]. @end deftypefn @c ################################################################## @external{} @node Primitives, Text printing, Background, MathGL core @section Primitives @nav{} @cindex Ball @cindex Line @cindex Curve @cindex Glyph @cindex Face @cindex FaceX @cindex FaceY @cindex FaceZ @cindex Cone @cindex Drop @cindex Sphere @ifclear UDAV @cindex Mark @cindex Error @end ifclear These functions draw some simple objects like line, point, sphere, drop, cone and so on. @sref{Using primitives} @anchor{ball} @deftypefn {MGL command} {} ball @code{x y} ['col'='r.'] @deftypefnx {MGL command} {} ball @code{x y z} ['col'='r.'] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Ball (@code{mglPoint} p, @code{char} col=@code{'r'}) @deftypefnx {Method on @code{mglGraph}} @code{void} Mark (@code{mglPoint} p, @code{const char *}mark) @deftypefnx {C function} @code{void} mgl_mark (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{const char *}mark) @end ifclear Draws a mark (point @samp{.} by default) at position @var{p}=@{@var{x}, @var{y}, @var{z}@} with color @var{col}. @end deftypefn @anchor{errbox} @deftypefn {MGL command} {} errbox @code{x y ex ey} ['stl'=''] @deftypefnx {MGL command} {} errbox @code{x y z ex ey ez} ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Error (@code{mglPoint} p, @code{mglPoint} e, @code{char} *stl=@code{""}) @deftypefnx {C function} @code{void} mgl_error_box (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} ex, @code{mreal} ey, @code{mreal} ez, @code{char *}stl) @end ifclear Draws a 3d error box at position @var{p}=@{@var{x}, @var{y}, @var{z}@} with sizes @var{e}=@{@var{ex}, @var{ey}, @var{ez}@} and style @var{stl}. Use NAN for component of @var{e} to reduce number of drawn elements. @end deftypefn @anchor{line} @deftypefn {MGL command} {} line @code{x1 y1 x2 y2} ['stl'=''] @deftypefnx {MGL command} {} line @code{x1 y1 z1 x2 y2 z2} ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Line (@code{mglPoint} p1, @code{mglPoint} p2, @code{char *}stl=@code{"B"}, @code{int} num=@code{2}) @deftypefnx {C function} @code{void} mgl_line (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{char *}stl, @code{int} num) @end ifclear Draws a geodesic line (straight line in Cartesian coordinates) from point @var{p1} to @var{p2} using line style @var{stl}. Parameter @var{num} define the ``quality'' of the line. If @var{num}=@code{2} then the straight line will be drawn in all coordinate system (independently on transformation formulas (see @ref{Curved coordinates}). Contrary, for large values (for example, =@code{100}) the geodesic line will be drawn in corresponding coordinate system (straight line in Cartesian coordinates, circle in polar coordinates and so on). Line will be drawn even if it lies out of bounding box. @end deftypefn @anchor{curve} @deftypefn {MGL command} {} curve @code{x1 y1 dx1 dy1 x2 y2 dx2 dy2} ['stl'=''] @deftypefnx {MGL command} {} curve @code{x1 y1 z1 dx1 dy1 dz1 x2 y2 z2 dx2 dy2 dz2} ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Curve (@code{mglPoint} p1, @code{mglPoint} d1, @code{mglPoint} p2, @code{mglPoint} d2, @code{const char *}stl=@code{"B"}, @code{int} num=@code{100}) @deftypefnx {C function} @code{void} mgl_curve (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} dx1, @code{mreal} dy1, @code{mreal} dz1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{mreal} dx2, @code{mreal} dy2, @code{mreal} dz2, @code{const char *}stl, @code{int} num) @end ifclear Draws Bezier-like curve from point @var{p1} to @var{p2} using line style @var{stl}. At this tangent is codirected with @var{d1}, @var{d2} and proportional to its amplitude. Parameter @var{num} define the ``quality'' of the curve. If @var{num}=@code{2} then the straight line will be drawn in all coordinate system (independently on transformation formulas, see @ref{Curved coordinates}). Contrary, for large values (for example, =@code{100}) the spline like Bezier curve will be drawn in corresponding coordinate system. Curve will be drawn even if it lies out of bounding box. @end deftypefn @anchor{face} @deftypefn {MGL command} {} face @code{x1 y1 x2 y2 x3 y3 x4 y4} ['stl'=''] @deftypefnx {MGL command} {} face @code{x1 y1 z1 x2 y2 z2 x3 y3 z3 x4 y4 z4} ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Face (@code{mglPoint} p1, @code{mglPoint} p2, @code{mglPoint} p3, @code{mglPoint} p4, @code{const char *}stl=@code{"w"}) @deftypefnx {C function} @code{void} mgl_face (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{mreal} x3, @code{mreal} y3, @code{mreal} z3, @code{mreal} x4, @code{mreal} y4, @code{mreal} z4, @code{const char *}stl) @end ifclear Draws the solid quadrangle (face) with vertexes @var{p1}, @var{p2}, @var{p3}, @var{p4} and with color(s) @var{stl}. At this colors can be the same for all vertexes or different if all 4 colors are specified for each vertex. Face will be drawn even if it lies out of bounding box. Argument @var{stl} can also contain mask specification (see @ref{Color scheme}). @end deftypefn @anchor{rect} @deftypefn {MGL command} {} rect @code{x1 y1 x2 y2} ['stl'=''] @deftypefnx {MGL command} {} rect @code{x1 y1 z1 x2 y2 z2} ['stl'=''] Draws the solid rectangle (face) with vertexes @{@var{x1}, @var{y1}, @var{z1}@} and @{@var{x2}, @var{y2}, @var{z2}@} with color @var{stl}. At this colors can be the same for all vertexes or separately if all 4 colors are specified for each vertex. Face will be drawn even if it lies out of bounding box. Argument @var{stl} can also contain mask specification (see @ref{Color scheme}). @end deftypefn @anchor{facex} @anchor{facey} @anchor{facez} @deftypefn {MGL command} {} facex @code{x0 y0 z0 wy wz} ['stl'='' @code{d1=0 d2=0}] @deftypefnx {MGL command} {} facey @code{x0 y0 z0 wx wz} ['stl'='' @code{d1=0 d2=0}] @deftypefnx {MGL command} {} facez @code{x0 y0 z0 wx wy} ['stl'='' @code{d1=0 d2=0}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} FaceX (@code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} wy, @code{mreal} wz, @code{const char *}stl=@code{"w"}, @code{mreal} d1=@code{0}, @code{mreal} d2=@code{0}) @deftypefnx {Method on @code{mglGraph}} @code{void} FaceY (@code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} wx, @code{mreal} wz, @code{const char *}stl=@code{"w"}, @code{mreal} d1=@code{0}, @code{mreal} d2=@code{0}) @deftypefnx {Method on @code{mglGraph}} @code{void} FaceZ (@code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} wx, @code{mreal} wy, @code{const char *}stl=@code{"w"}, @code{mreal} d1=@code{0}, @code{mreal} d2=@code{0}) @deftypefnx {C function} @code{void} mgl_facex (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} wy, @code{mreal} wz, @code{const char *}stl, @code{mreal} d1, @code{mreal} d2) @deftypefnx {C function} @code{void} mgl_facey (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} wx, @code{mreal} wz, @code{const char *}stl, @code{mreal} d1, @code{mreal} d2) @deftypefnx {C function} @code{void} mgl_facez (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} wx, @code{mreal} wy, @code{const char *}stl, @code{mreal} d1, @code{mreal} d2) @end ifclear Draws the solid rectangle (face) perpendicular to [x,y,z]-axis correspondingly at position @{@var{x0}, @var{y0}, @var{z0}@} with color @var{stl} and with widths @var{wx}, @var{wy}, @var{wz} along corresponding directions. At this colors can be the same for all vertexes or separately if all 4 colors are specified for each vertex. Argument @var{stl} can also contain mask specification (see @ref{Color scheme}). Parameters @var{d1}!=0, @var{d2}!=0 set additional shift of the last vertex (i.e. to draw quadrangle). Face will be drawn even if it lies out of bounding box. @end deftypefn @anchor{sphere} @deftypefn {MGL command} {} sphere @code{x0 y0 r} ['col'='r'] @deftypefnx {MGL command} {} sphere @code{x0 y0 z0 r} ['col'='r'] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Sphere (@code{mglPoint} p, @code{mreal} r, @code{const char *}stl=@code{"r"}) @deftypefnx {C function} @code{void} mgl_sphere (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} r, @code{const char *}stl) @end ifclear Draw the sphere with radius @var{r} and center at point @var{p}=@{@var{x0}, @var{y0}, @var{z0}@} and color @var{stl}. @end deftypefn @anchor{drop} @deftypefn {MGL command} {} drop @code{x0 y0 dx dy r} ['col'='r' @code{sh=1 asp=1}] @deftypefnx {MGL command} {} drop @code{x0 y0 z0 dx dy dz r} ['col'='r' @code{sh=1 asp=1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Drop (@code{mglPoint} p, @code{mglPoint} d, @code{mreal} r, @code{const char *}col=@code{"r"}, @code{mreal} shift=@code{1}, @code{mreal} ap=@code{1}) @deftypefnx {C function} @code{void} mgl_drop (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{mreal} r, @code{const char *}col, @code{mreal} shift, @code{mreal} ap) @end ifclear Draw the drop with radius @var{r} at point @var{p} elongated in direction @var{d} and with color @var{col}. Parameter @var{shift} set the degree of drop oblongness: @samp{0} is sphere, @samp{1} is maximally oblongness drop. Parameter @var{ap} set relative width of the drop (this is analogue of ``ellipticity'' for the sphere). @end deftypefn @anchor{cone} @deftypefn {MGL command} {} cone @code{x1 y1 z1 x2 y2 z2 r1} [@code{r2=-1} 'stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Cone (@code{mglPoint} p1, @code{mglPoint} p2, @code{mreal} r1, @code{mreal} r2=@code{-1}, @code{const char *}stl=@code{"B"}) @deftypefnx {C function} @code{void} mgl_cone (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{mreal} r1, @code{mreal} r2, @code{const char *}stl) @end ifclear Draw tube (or truncated cone if @var{edge}=@code{false}) between points @var{p1}, @var{p2} with radius at the edges @var{r1}, @var{r2}. If @var{r2}<0 then it is supposed that @var{r2}=@var{r1}. The cone color is defined by string @var{stl}. Parameter @var{stl} can contain: @itemize @bullet @item @samp{@@} for drawing edges; @item @samp{#} for wired cones; @item @samp{t} for drawing tubes/cylinder instead of cones/prisms; @item @samp{4}, @samp{6}, @samp{8} for drawing square, hex- or octo-prism instead of cones. @end itemize @end deftypefn @anchor{circle} @deftypefn {MGL command} {} circle @code{x0 y0 r} ['col'='r'] @deftypefnx {MGL command} {} circle @code{x0 y0 z0 r} ['col'='r'] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Circle (@code{mglPoint} p, @code{mreal} r, @code{const char *}stl=@code{"r"}) @end ifclear Draw the circle with radius @var{r} and center at point @var{p}=@{@var{x0}, @var{y0}, @var{z0}@}. Parameter @var{col} may contain @itemize @bullet @item colors for filling and boundary (second one if style @samp{@@} is used, black color is used by default); @item @samp{#} for wire figure (boundary only); @item @samp{@@} for filling and boundary; @item mask specification (see @ref{Color scheme}). @end itemize @end deftypefn @anchor{ellipse} @deftypefn {MGL command} {} ellipse @code{x1 y1 x2 y2 r} ['col'='r'] @deftypefnx {MGL command} {} ellipse @code{x1 y1 z1 x2 y2 z2 r} ['col'='r'] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Ellipse (@code{mglPoint} p1, @code{mglPoint} p2, @code{mreal} r, @code{const char *}col=@code{"r"}) @deftypefnx {C function} @code{void} mgl_ellipse (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{mreal} r, @code{const char *}col) @end ifclear Draw the ellipse with radius @var{r} and focal points @var{p1}, @var{p2}. Parameter @var{col} may contain @itemize @bullet @item colors for filling and boundary (second one if style @samp{@@} is used, black color is used by default); @item @samp{#} for wire figure (boundary only); @item @samp{@@} for filling and boundary; @item mask specification (see @ref{Color scheme}). @end itemize @end deftypefn @anchor{rhomb} @deftypefn {MGL command} {} rhomb @code{x1 y1 x2 y2 r} ['col'='r'] @deftypefnx {MGL command} {} rhomb @code{x1 y1 z1 x2 y2 z2 r} ['col'='r'] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Rhomb (@code{mglPoint} p1, @code{mglPoint} p2, @code{mreal} r, @code{const char *}col=@code{"r"}) @deftypefnx {C function} @code{void} mgl_rhomb (@code{HMGL} gr, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} x2, @code{mreal} y2, @code{mreal} z2, @code{mreal} r, @code{const char *}col) @end ifclear Draw the rhombus with width @var{r} and edge points @var{p1}, @var{p2}. Parameter @var{col} may contain @itemize @bullet @item colors for filling and boundary (second one if style @samp{@@} is used, black color is used by default); @item @samp{#} for wire figure (boundary only); @item @samp{@@} for filling and boundary; @item mask specification (see @ref{Color scheme}). @end itemize @end deftypefn @anchor{arc} @deftypefn {MGL command} {} arc @code{x0 y0 x1 y1 a} ['col'='r'] @deftypefnx {MGL command} {} arc @code{x0 y0 z0 x1 y1 a} ['col'='r'] @deftypefnx {MGL command} {} arc @code{x0 y0 z0 xa ya za x1 y1 z1 a} ['col'='r'] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Arc (@code{mglPoint} p0, @code{mglPoint} p1, @code{mreal} a, @code{const char *}col=@code{"r"}) @deftypefnx {Method on @code{mglGraph}} @code{void} Arc (@code{mglPoint} p0, @code{mglPoint} pa, @code{mglPoint} p1, @code{mreal} a, @code{const char *}col=@code{"r"}) @deftypefnx {C function} @code{void} mgl_arc (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} x1, @code{mreal} y1, @code{mreal} a, @code{const char *}col) @deftypefnx {C function} @code{void} mgl_arc_ext (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} xa, @code{mreal} ya, @code{mreal} za, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{mreal} a, @code{const char *}col) @end ifclear Draw the arc around axis @var{pa} (default is z-axis @var{pa}=@{0,0,1@}) with center at @var{p0} and starting from point @var{p1}. Parameter @var{a} set the angle of arc in degree. Parameter @var{col} may contain color of the arc and arrow style for arc edges. @end deftypefn @anchor{polygon} @deftypefn {MGL command} {} polygon @code{x0 y0 x1 y1 num} ['col'='r'] @deftypefnx {MGL command} {} polygon @code{x0 y0 z0 x1 y1 z1 num} ['col'='r'] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Polygon (@code{mglPoint} p0, @code{mglPoint} p1, @code{int} num, @code{const char *}col=@code{"r"}) @deftypefnx {C function} @code{void} mgl_polygon (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{mreal} x1, @code{mreal} y1, @code{mreal} z1, @code{int} num, @code{const char *}col) @end ifclear Draw the polygon with @var{num} edges starting from @var{p1}. The center of polygon is located in @var{p0}. Parameter @var{col} may contain @itemize @bullet @item colors for filling and boundary (second one if style @samp{@@} is used, black color is used by default); @item @samp{#} for wire figure (boundary only); @item @samp{@@} for filling and boundary; @item mask specification (see @ref{Color scheme}). @end itemize @end deftypefn @anchor{logo} @deftypefn {MGL command} {} logo 'fname' [smooth=off] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Logo (@code{const char *}fname, @code{bool} smooth=@code{false}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Logo (@code{long} w, @code{long} h, @code{const unsigned char *}rgba, @code{bool} smooth=@code{false}, @code{const char *}opt=@code{""}) @deftypefnx {C function only} @code{void} mgl_logo (@code{HMGL} gr, @code{long} w, @code{long} h, @code{const unsigned char *}rgba, @code{bool} smooth, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_logo_file (@code{HMGL} gr, @code{const char *}fname, @code{bool} smooth, @code{const char *}opt) @end ifclear Draw bitmap (logo) along whole axis range, which can be changed by @ref{Command options}. Bitmap can be loaded from file or specified as RGBA values for pixels. Parameter @var{smooth} set to draw bitmap without or with color interpolation. @end deftypefn @anchor{symbol} @deftypefn {MGL command} {} symbol @code{x y} 'id' ['fnt'='' @code{size=-1}] @deftypefnx {MGL command} {} symbol @code{x y z} 'id' ['fnt'='' @code{size=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Symbol (@code{mglPoint} p, @code{char} id, @code{const char *}fnt=@code{""}, @code{mreal} size=@code{-1}) @deftypefnx {C function} @code{void} mgl_symbol (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{char} id, @code{const char *}fnt, @code{mreal} size) @end ifclear Draws user-defined symbol with name @var{id} at position @var{p} with style specifying by @var{fnt}. The size of font is set by @var{size} parameter (default is @code{-1}). The string @var{fnt} may contain color specification ended by @samp{:} symbol; styles @samp{a}, @samp{A} to draw at absolute position @{@var{x}, @var{y}@} (supposed to be in range [0,1]) of picture (for @samp{A}) or subplot/inplot (for @samp{a}); and style @samp{w} to draw wired symbol. @end deftypefn @deftypefn {MGL command} {} symbol @code{x y dx dy} 'id' ['fnt'=':L' @code{size=-1}] @deftypefnx {MGL command} {} symbol @code{x y z dx dy dz} 'id' ['fnt'=':L' @code{size=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Symbol (@code{mglPoint} p, @code{mglPoint} d, @code{char} id, @code{const char *}fnt=@code{""}, @code{mreal} size=@code{-1}) @deftypefnx {C function} @code{void} mgl_symbol_dir (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{const char *}text, @code{const char *}fnt, @code{mreal} size) @end ifclear The same as previous but symbol will be drawn rotated along direction @var{d}. @end deftypefn @anchor{addsymbol} @deftypefn {MGL command} {} addsymbol 'id' xdat ydat @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} DefineSymbol (@code{char} id, @code{const mglDataA &}xdat, @code{const mglDataA &}ydat) @deftypefnx {C function} @code{void} mgl_define_symbol (@code{HMGL} gr, @code{HCDT} xdat, @code{HCDT} ydat) @end ifclear Add user-defined symbol with name @var{id} and contour @{@var{xdat}, @var{ydat}@}. You can use @code{NAN} values to set break (jump) of contour curve. @end deftypefn @c ################################################################## @external{} @node Text printing, Axis and Colorbar, Primitives, MathGL core @section Text printing @nav{} @ifclear UDAV @cindex Puts @cindex Putsw @end ifclear @cindex Text @cindex Label @cindex fgets These functions draw the text. There are functions for drawing text in arbitrary place, in arbitrary direction and along arbitrary curve. MathGL can use arbitrary font-faces and parse many TeX commands (for more details see @ref{Font styles}). All these functions have 2 variant: for printing 8-bit text (@code{char *}) and for printing Unicode text (@code{wchar_t *}). In first case the conversion into the current locale is used. So sometimes you need to specify it by @code{setlocale()} function. The @var{size} argument control the size of text: if positive it give the value, if negative it give the value relative to @code{SetFontSize()}. The font type (STIX, arial, courier, times and so on) can be selected by function LoadFont(). @xref{Font settings}. The font parameters are described by string. This string may set the text color @samp{wkrgbcymhRGBCYMHW} (see @ref{Color styles}). Starting from MathGL v.2.3, you can set color gradient for text (see @ref{Color scheme}). Also, after delimiter symbol @samp{:}, it can contain characters of font type (@samp{rbiwou}) and/or align (@samp{LRCTV}) specification. The font types are: @samp{r} -- roman (or regular) font, @samp{i} -- italic style, @samp{b} -- bold style, @samp{w} -- wired style, @samp{o} -- over-lined text, @samp{u} -- underlined text. By default roman font is used. The align types are: @samp{L} -- align left (default), @samp{C} -- align center, @samp{R} -- align right, @samp{T} -- align under, @samp{V} -- align center vertical. For example, string @samp{b:iC} correspond to italic font style for centered text which printed by blue color. If string contains symbols @samp{aA} then text is printed at absolute position @{@var{x}, @var{y}@} (supposed to be in range [0,1]) of picture (for @samp{A}) or subplot/inplot (for @samp{a}). If string contains symbol @samp{@@} then box around text is drawn. @sref{Text features} @anchor{text} @deftypefn {MGL command} {} text @code{x y} 'text' ['fnt'='' @code{size=-1}] @deftypefnx {MGL command} {} text @code{x y z} 'text' ['fnt'='' @code{size=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Puts (@code{mglPoint} p, @code{const char *}text, @code{const char *}fnt=@code{":C"}, @code{mreal} size=@code{-1}) @deftypefnx {Method on @code{mglGraph}} @code{void} Putsw (@code{mglPoint} p, @code{const wchar_t *}text, @code{const char *}fnt=@code{":C"}, @code{mreal} size=@code{-1}) @deftypefnx {Method on @code{mglGraph}} @code{void} Puts (@code{mreal} x, @code{mreal} y, @code{const char *}text, @code{const char *}fnt=@code{":AC"}, @code{mreal} size=@code{-1}) @deftypefnx {Method on @code{mglGraph}} @code{void} Putsw (@code{mreal} x, @code{mreal} y, @code{const wchar_t *}text, @code{const char *}fnt=@code{":AC"}, @code{mreal} size=@code{-1}) @deftypefnx {C function} @code{void} mgl_puts (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{const char *}text, @code{const char *}fnt, @code{mreal} size) @deftypefnx {C function} @code{void} mgl_putsw (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{const wchar_t *}text, @code{const char *}fnt, @code{mreal} size) @end ifclear Draws the string @var{text} at position @var{p} with fonts specifying by the criteria @var{fnt}. The size of font is set by @var{size} parameter (default is @code{-1}). @end deftypefn @deftypefn {MGL command} {} text @code{x y dx dy} 'text' ['fnt'=':L' @code{size=-1}] @deftypefnx {MGL command} {} text @code{x y z dx dy dz} 'text' ['fnt'=':L' @code{size=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Puts (@code{mglPoint} p, @code{mglPoint} d, @code{const char *}text, @code{const char *}fnt=@code{":L"}, @code{mreal} size=@code{-1}) @deftypefnx {Method on @code{mglGraph}} @code{void} Putsw (@code{mglPoint} p, @code{mglPoint} d, @code{const wchar_t *}text, @code{const char *}fnt=@code{":L"}, @code{mreal} size=@code{-1}) @deftypefnx {C function} @code{void} mgl_puts_dir (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{const char *}text, @code{const char *}fnt, @code{mreal} size) @deftypefnx {C function} @code{void} mgl_putsw_dir (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{mreal} dx, @code{mreal} dy, @code{mreal} dz, @code{const wchar_t *}text, @code{const char *}fnt, @code{mreal} size) @end ifclear Draws the string @var{text} at position @var{p} along direction @var{d} with specified @var{size}. Parameter @var{fnt} set text style and text position: under (@samp{T}) or above (@samp{t}) the line. @end deftypefn @anchor{fgets} @deftypefn {MGL command} {} fgets @code{x y} 'fname' [@code{n=0} 'fnt'='' @code{size=-1.4}] @deftypefnx {MGL command} {} fgets @code{x y z} 'fname' [@code{n=0} 'fnt'='' @code{size=-1.4}] Draws unrotated @var{n}-th line of file @var{fname} at position @{@var{x},@var{y},@var{z}@} with specified @var{size}. By default parameters from @ref{font} command are used. @end deftypefn @deftypefn {MGL command} {} text ydat 'text' ['fnt'=''] @deftypefnx {MGL command} {} text xdat ydat 'text' ['fnt'=''] @deftypefnx {MGL command} {} text xdat ydat zdat 'text' ['fnt'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Text (@code{const mglDataA &}y, @code{const char *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Text (@code{const mglDataA &}y, @code{const wchar_t *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Text (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Text (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const wchar_t *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Text (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Text (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const wchar_t *}text, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_text_y (@code{HMGL} gr, @code{HCDT} y, @code{const char *}text, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textw_y (@code{HMGL} gr, @code{HCDT} y, @code{const wchar_t *}text, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_text_xy (@code{HCDT} x, @code{HCDT} y, @code{const char *}text, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textw_xy (@code{HCDT} x, @code{HCDT} y, @code{const wchar_t *}text, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_text_xyz (@code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}text, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textw_xyz (@code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const wchar_t *}text, @code{const char *}fnt, @code{const char *}opt) @end ifclear The function draws @var{text} along the curve between points @{@var{x}[i], @var{y}[i], @var{z}[i]@} by font style @var{fnt}. The string @var{fnt} may contain symbols @samp{t} for printing the text under the curve (default), or @samp{T} for printing the text under the curve. The sizes of 1st dimension must be equal for all arrays @code{x.nx=y.nx=z.nx}. If array @var{x} is not specified then its an automatic array is used with values equidistantly distributed in x-axis range (see @ref{Ranges (bounding box)}). If array @var{z} is not specified then @var{z}[i] equal to minimal z-axis value is used. String @var{opt} contain command options (see @ref{Command options}). @end deftypefn @c ################################################################## @external{} @node Axis and Colorbar, Legend, Text printing, MathGL core @section Axis and Colorbar @nav{} @cindex Axis @cindex Box @cindex Grid @cindex Colorbar @cindex Label These functions draw the ``things for measuring'', like axis with ticks, colorbar with ticks, grid along axis, bounding box and labels for axis. For more information see @ref{Axis settings}. @anchor{axis} @deftypefn {MGL command} {} axis ['dir'='xyz' 'stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Axis (@code{const char *}dir=@code{"xyz"}, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_axis (@code{HMGL} gr, @code{const char *}dir, @code{const char *}stl, @code{const char *}opt) @end ifclear Draws axes with ticks (see @ref{Axis settings}). Parameter @var{dir} may contain: @itemize @bullet @item @samp{xyz} for drawing axis in corresponding direction; @item @samp{XYZ} for drawing axis in corresponding direction but with inverted positions of labels; @item @samp{~} or @samp{_} for disabling tick labels; @item @samp{U} for disabling rotation of tick labels; @item @samp{^} for inverting default axis origin; @item @samp{!} for disabling ticks tuning (see @ref{tuneticks}); @item @samp{AKDTVISO} for drawing arrow at the end of axis; @item @samp{a} for forced adjusting of axis ticks; @item @samp{:} for drawing lines through point (0,0,0); @item @samp{f} for printing ticks labels in fixed format; @item @samp{E} for using @samp{E} instead of @samp{e} in ticks labels; @item @samp{F} for printing ticks labels in LaTeX format; @item @samp{+} for printing @samp{+} for positive ticks; @item @samp{-} for printing usual @samp{-} in ticks labels; @item @samp{0123456789} for precision at printing ticks labels. @end itemize Styles of ticks and axis can be overrided by using @var{stl} string. Option @code{value} set the manual rotation angle for the ticks. @sref{Axis and ticks} @end deftypefn @anchor{colorbar} @deftypefn {MGL command} {} colorbar ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Colorbar (@code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_colorbar (@code{HMGL} gr, @code{const char *}sch, @code{const char *}opt) @end ifclear Draws colorbar. Parameter @var{sch} may contain: @itemize @bullet @item color scheme (see @ref{Color scheme}); @item @samp{<>^_} for positioning at left, at right, at top or at bottom correspondingly; @item @samp{I} for positioning near bounding (by default, is positioned at edges of subplot); @item @samp{A} for using absolute coordinates; @item @samp{~} for disabling tick labels. @item @samp{!} for disabling ticks tuning (see @ref{tuneticks}); @item @samp{f} for printing ticks labels in fixed format; @item @samp{E} for using @samp{E} instead of @samp{e} in ticks labels; @item @samp{F} for printing ticks labels in LaTeX format; @item @samp{+} for printing @samp{+} for positive ticks; @item @samp{-} for printing usual @samp{-} in ticks labels; @item @samp{0123456789} for precision at printing ticks labels. @end itemize @sref{Colorbars} @end deftypefn @deftypefn {MGL command} {} colorbar vdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Colorbar (@code{const mglDataA &}v, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_colorbar_val (@code{HMGL} gr, @code{HCDT} v, @code{const char *}sch, @code{const char *}opt) @end ifclear The same as previous but with sharp colors @var{sch} (current palette if @code{sch=""}) for values @var{v}. @sref{contd sample} @end deftypefn @deftypefn {MGL command} {} colorbar 'sch' @code{x y [w=1 h=1]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Colorbar (@code{const char *}sch, @code{mreal} x, @code{mreal} y, @code{mreal} w=@code{1}, @code{mreal} h=@code{1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_colorbar_ext (@code{HMGL} gr, @code{const char *}sch, @code{mreal} x, @code{mreal} y, @code{mreal} w, @code{mreal} h, @code{const char *}opt) @end ifclear The same as first one but at arbitrary position of subplot @{@var{x}, @var{y}@} (supposed to be in range [0,1]). Parameters @var{w}, @var{h} set the relative width and height of the colorbar. @end deftypefn @deftypefn {MGL command} {} colorbar vdat 'sch' @code{x y [w=1 h=1]} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Colorbar (@code{const mglDataA &}v, @code{const char *}sch, @code{mreal} x, @code{mreal} y, @code{mreal} w=@code{1}, @code{mreal} h=@code{1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_colorbar_val_ext (@code{HMGL} gr, @code{HCDT} v, @code{const char *}sch, @code{mreal} x, @code{mreal} y, @code{mreal} w, @code{mreal} h, @code{const char *}opt) @end ifclear The same as previous but with sharp colors @var{sch} (current palette if @code{sch=""}) for values @var{v}. @sref{contd sample} @end deftypefn @anchor{grid} @deftypefn {MGL command} {} grid ['dir'='xyz' 'pen'='B'] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Grid (@code{const char *}dir=@code{"xyz"}, @code{const char *}pen=@code{"B"}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_axis_grid (@code{HMGL} gr, @code{const char *}dir, @code{const char *}pen, @code{const char *}opt) @end ifclear Draws grid lines perpendicular to direction determined by string parameter @var{dir}. If @var{dir} contain @samp{!} then grid lines will be drawn at coordinates of subticks also. The step of grid lines is the same as tick step for @ref{axis}. The style of lines is determined by @var{pen} parameter (default value is dark blue solid line @samp{B-}). @end deftypefn @anchor{box} @deftypefn {MGL command} {} box ['stl'='k' @code{ticks=on}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Box (@code{const char *}col=@code{""}, @code{bool} ticks=@code{true}) @deftypefnx {C function} @code{void} mgl_box (@code{HMGL} gr) @deftypefnx {C function} @code{void} mgl_box_str (@code{HMGL} gr, @code{const char *}col, @code{int} ticks) @end ifclear Draws bounding box outside the plotting volume with color @var{col}. If @var{col} contain @samp{@@} then filled faces are drawn. At this first color is used for faces (default is light yellow), last one for edges. @sref{Bounding box} @end deftypefn @anchor{xlabel} @anchor{ylabel} @anchor{zlabel} @anchor{tlabel} @anchor{clabel} @deftypefn {MGL command} {} xlabel 'text' [@code{pos=1}] @deftypefnx {MGL command} {} ylabel 'text' [@code{pos=1}] @deftypefnx {MGL command} {} zlabel 'text' [@code{pos=1}] @deftypefnx {MGL command} {} tlabel 'text' [@code{pos=1}] @deftypefnx {MGL command} {} clabel 'text' [@code{pos=1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{char} dir, @code{const char *}text, @code{mreal} pos=@code{1}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{char} dir, @code{const wchar_t *}text, @code{mreal} pos=@code{1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_label (@code{HMGL} gr, @code{char} dir, @code{const char *}text, @code{mreal} pos, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_labelw (@code{HMGL} gr, @code{char} dir, @code{const wchar_t *}text, @code{mreal} pos, @code{const char *}opt) @end ifclear Prints the label @var{text} for axis @var{dir}=@samp{x},@samp{y},@samp{z},@samp{t},@samp{c}, where @samp{t} is ``ternary'' axis @math{t=1-x-y}; @samp{c} is color axis (should be called after @ref{colorbar}). The position of label is determined by @var{pos} parameter. If @var{pos}=0 then label is printed at the center of axis. If @var{pos}>0 then label is printed at the maximum of axis. If @var{pos}<0 then label is printed at the minimum of axis. Option @code{value} set additional shifting of the label. @xref{Text printing}. @end deftypefn @c ################################################################## @external{} @node Legend, 1D plotting, Axis and Colorbar, MathGL core @section Legend @nav{} @cindex Legend @cindex AddLegend @cindex ClearLegend @cindex SetLegendBox @cindex SetLegendMarks These functions draw legend to the graph (useful for @ref{1D plotting}). Legend entry is a pair of strings: one for style of the line, another one with description text (with included TeX parsing). The arrays of strings may be used directly or by accumulating first to the internal arrays (by function @ref{addlegend}) and further plotting it. The position of the legend can be selected automatic or manually (even out of bounding box). Parameters @var{fnt} and @var{size} specify the font style and size (see @ref{Font settings}). Option @code{value} set the relative width of the line sample and the text indent. If line style string for entry is empty then the corresponding text is printed without indent. Parameter @var{fnt} may contain: @itemize @bullet @item font style for legend text; @item @samp{A} for positioning in absolute coordinates; @item @samp{^} for positioning outside of specified point; @item @samp{#} for drawing box around legend; @item @samp{-} for arranging legend entries horizontally; @item colors for face (1st one), for border (2nd one) and for text (last one). If less than 3 colors are specified then the color for border is black (for 2 and less colors), and the color for face is white (for 1 or none colors). @end itemize @sref{Legend sample} @anchor{legend} @deftypefn {MGL command} {} legend [@code{pos=3} 'fnt'='#'] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Legend (@code{int} pos=@code{0x3}, @code{const char *}fnt=@code{"#"}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_legend (@code{HMGL} gr, @code{int} pos, @code{const char *}fnt, @code{const char *}opt) @end ifclear Draws legend of accumulated legend entries by font @var{fnt} with @var{size}. Parameter @var{pos} sets the position of the legend: @samp{0} is bottom left corner, @samp{1} is bottom right corner, @samp{2} is top left corner, @samp{3} is top right corner (is default). Option @code{value} set the space between line samples and text (default is 0.1). @end deftypefn @deftypefn {MGL command} {} legend @code{x y} ['fnt'='#'] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Legend (@code{mreal} x, @code{mreal} y, @code{const char *}fnt=@code{"#"}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_legend_pos (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{const char *}fnt, @code{const char *}opt) @end ifclear Draws legend of accumulated legend entries by font @var{fnt} with @var{size}. Position of legend is determined by parameter @var{x}, @var{y} which supposed to be normalized to interval [0,1]. Option @code{value} set the space between line samples and text (default is 0.1). @end deftypefn @anchor{addlegend} @deftypefn {MGL command} {} addlegend 'text' 'stl' @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} AddLegend (@code{const char *}text, @code{const char *}style) @deftypefnx {Method on @code{mglGraph}} @code{void} AddLegend (@code{const wchar_t *}text, @code{const char *}style) @deftypefnx {C function} @code{void} mgl_add_legend (@code{HMGL} gr, @code{const char *}text, @code{const char *}style) @deftypefnx {C function} @code{void} mgl_add_legendw (@code{HMGL} gr, @code{const wchar_t *}text, @code{const char *}style) @end ifclear Adds string @var{text} to internal legend accumulator. The style of described line and mark is specified in string @var{style} (see @ref{Line styles}). @end deftypefn @anchor{clearlegend} @deftypefn {MGL command} {} clearlegend @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ClearLegend () @deftypefnx {C function} @code{void} mgl_clear_legend (@code{HMGL} gr) @end ifclear Clears saved legend strings. @end deftypefn @anchor{legendmarks} @deftypefn {MGL command} {} legendmarks @code{val} @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SetLegendMarks (@code{int} num) @deftypefnx {C function} @code{void} mgl_set_legend_marks (@code{HMGL} gr, @code{int} num) @end ifclear Set the number of marks in the legend. By default 1 mark is used. @end deftypefn @c ################################################################## @external{} @node 1D plotting, 2D plotting, Legend, MathGL core @section 1D plotting @nav{} @cindex Plot @cindex Radar @cindex Tens @cindex Area @cindex Region @cindex Stem @cindex Bars @cindex Barh @cindex Chart @cindex Step @cindex Torus @cindex Tube @cindex Mark @cindex TextMark @cindex Error @cindex BoxPlot @cindex Candle @cindex Tape @cindex Label @cindex Cones These functions perform plotting of 1D data. 1D means that data depended from only 1 parameter like parametric curve @{x[i],y[i],z[i]@}, i=1...n. By default (if absent) values of @var{x}[i] are equidistantly distributed in axis range, and @var{z}[i] equal to minimal z-axis value. The plots are drawn for each row if one of the data is the matrix. By any case the sizes of 1st dimension @strong{must be equal} for all arrays @code{x.nx=y.nx=z.nx}. String @var{pen} specifies the color and style of line and marks (see @ref{Line styles}). By default (@code{pen=""}) solid line with color from palette is used (see @ref{Palette and colors}). Symbol @samp{!} set to use new color from palette for each point (not for each curve, as default). String @var{opt} contain command options (see @ref{Command options}). @anchor{plot} @deftypefn {MGL command} {} plot ydat ['stl'=''] @deftypefnx {MGL command} {} plot xdat ydat ['stl'=''] @deftypefnx {MGL command} {} plot xdat ydat zdat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Plot (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Plot (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Plot (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_plot (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_plot_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_plot_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw continuous lines between points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. If @var{pen} contain @samp{a} then segments between points outside of axis range are drawn too. If @var{pen} contain @samp{~} then number of segments is reduce for quasi-straight curves. See also @ref{area}, @ref{step}, @ref{stem}, @ref{tube}, @ref{mark}, @ref{error}, @ref{belt}, @ref{tens}, @ref{tape}, @ref{meshnum}. @sref{plot sample} @end deftypefn @anchor{radar} @deftypefn {MGL command} {} radar adat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Radar (@code{const mglDataA &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_radar (@code{HMGL} gr, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt) @end ifclear This functions draws radar chart which is continuous lines between points located on an radial lines (like plot in Polar coordinates). Option @code{value} set the additional shift of data (i.e. the data @var{a}+@code{value} is used instead of @var{a}). If @code{value<0} then @code{r=max(0, -min(value)}. If @var{pen} containt @samp{#} symbol then "grid" (radial lines and circle for @var{r}) is drawn. If @var{pen} contain @samp{a} then segments between points outside of axis range are drawn too. See also @ref{plot}, @ref{meshnum}. @sref{radar sample} @end deftypefn @anchor{step} @deftypefn {MGL command} {} step ydat ['stl'=''] @deftypefnx {MGL command} {} step xdat ydat ['stl'=''] @deftypefnx {MGL command} {} step xdat ydat zdat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Step (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Step (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Step (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_step (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_step_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_step_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw continuous stairs for points to axis plane. If @var{x}.nx>@var{y}.nx then @var{x} set the edges of bars, rather than its central positions. See also @ref{plot}, @ref{stem}, @ref{tile}, @ref{boxs}, @ref{meshnum}. @sref{step sample} @end deftypefn @anchor{tens} @deftypefn {MGL command} {} tens ydat cdat ['stl'=''] @deftypefnx {MGL command} {} tens xdat ydat cdat ['stl'=''] @deftypefnx {MGL command} {} tens xdat ydat zdat cdat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Tens (@code{const mglDataA &}y, @code{const mglDataA &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Tens (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Tens (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tens (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tens_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tens_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw continuous lines between points @{@var{x}[i], @var{y}[i], @var{z}[i]@} with color defined by the special array @var{c}[i] (look like tension plot). String @var{pen} specifies the color scheme (see @ref{Color scheme}) and style and/or width of line (see @ref{Line styles}). If @var{pen} contain @samp{a} then segments between points outside of axis range are drawn too. If @var{pen} contain @samp{~} then number of segments is reduce for quasi-straight curves. See also @ref{plot}, @ref{mesh}, @ref{fall}, @ref{meshnum}. @sref{tens sample} @end deftypefn @anchor{tape} @deftypefn {MGL command} {} tape ydat ['stl'=''] @deftypefnx {MGL command} {} tape xdat ydat ['stl'=''] @deftypefnx {MGL command} {} tape xdat ydat zdat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Tape (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Tape (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Tape (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tape (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tape_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tape_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw tapes of normals for curve between points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Initial tape(s) was selected in x-y plane (for @samp{x} in @var{pen}) and/or y-z plane (for @samp{x} in @var{pen}). Argument @var{pen} can also contain mask specification (see @ref{Color scheme}). The width of tape is proportional to @ref{barwidth} and can be changed by option @code{value}. See also @ref{plot}, @ref{flow}, @ref{barwidth}. @sref{tape sample} @end deftypefn @anchor{area} @deftypefn {MGL command} {} area ydat ['stl'=''] @deftypefnx {MGL command} {} area xdat ydat ['stl'=''] @deftypefnx {MGL command} {} area xdat ydat zdat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Area (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Area (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Area (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_area (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_area_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_area_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw continuous lines between points and fills it to axis plane. Also you can use gradient filling if number of specified colors is equal to 2*number of curves. If @var{pen} contain @samp{#} then wired plot is drawn. If @var{pen} contain @samp{a} then segments between points outside of axis range are drawn too. Argument @var{pen} can also contain mask specification (see @ref{Color scheme}). See also @ref{plot}, @ref{bars}, @ref{stem}, @ref{region}. @sref{area sample} @end deftypefn @anchor{region} @deftypefn {MGL command} {} region ydat1 ydat2 ['stl'=''] @deftypefnx {MGL command} {} region xdat ydat1 ydat2 ['stl'=''] @deftypefnx {MGL command} {} region xdat1 ydat1 xdat2 ydat2 ['stl'=''] @deftypefnx {MGL command} {} region xdat1 ydat1 zdat1 xdat2 ydat2 zdat2 ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Region (@code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Region (@code{const mglDataA &}x, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Region (@code{const mglDataA &}x1, @code{const mglDataA &}y1, @code{const mglDataA &}x2, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Region (@code{const mglDataA &}x1, @code{const mglDataA &}y1, @code{const mglDataA &}z1, @code{const mglDataA &}x2, @code{const mglDataA &}y2, @code{const mglDataA &}z2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_region (@code{HMGL} gr, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_region_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_region_3d (@code{HMGL} gr, @code{HCDT} x1, @code{HCDT} y1, @code{HCDT} z1, @code{HCDT} x2, @code{HCDT} y2, @code{HCDT} z2, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions fill area between 2 curves. Dimensions of arrays @var{y1} and @var{y2} must be equal. Also you can use gradient filling if number of specified colors is equal to 2*number of curves. If for 2D version @var{pen} contain symbol @samp{i} then only area with y1} for aligning boxes left, right or centering them at its x-coordinates; @item mask specification (see @ref{Color scheme}). @end itemize You can give different colors for positive and negative values if number of specified colors is equal to 2*number of curves. If @var{x}.nx>@var{y}.nx then @var{x} set the edges of bars, rather than its central positions. See also @ref{barh}, @ref{cones}, @ref{area}, @ref{stem}, @ref{chart}, @ref{barwidth}. @sref{bars sample} @end deftypefn @anchor{barh} @deftypefn {MGL command} {} barh vdat ['stl'=''] @deftypefnx {MGL command} {} barh ydat vdat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Barh (@code{const mglDataA &}v, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Barh (@code{const mglDataA &}y, @code{const mglDataA &}v, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_barh (@code{HMGL} gr, @code{HCDT} v, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_barh_xy (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} v, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw horizontal bars from points to axis plane. Parameter @var{pen} can contain: @itemize @bullet @item @samp{a} for drawing lines one above another (like summation); @item @samp{f} for drawing waterfall chart, which show the cumulative effect of sequential positive or negative values; @item @samp{F} for using fixed (minimal) width for all bars; @item @samp{<}, @samp{^} or @samp{>} for aligning boxes left, right or centering them at its x-coordinates; @item mask specification (see @ref{Color scheme}). @end itemize You can give different colors for positive and negative values if number of specified colors is equal to 2*number of curves. If @var{x}.nx>@var{y}.nx then @var{x} set the edges of bars, rather than its central positions. See also @ref{bars}, @ref{barwidth}. @sref{barh sample} @end deftypefn @anchor{cones} @deftypefn {MGL command} {} cones ydat ['stl'=''] @deftypefnx {MGL command} {} cones xdat ydat ['stl'=''] @deftypefnx {MGL command} {} cones xdat ydat zdat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Cones (@code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Cones (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Cones (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cones (@code{HMGL} gr, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cones_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cones_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw cones from points to axis plane. If string contain symbol @samp{a} then cones are drawn one above another (like summation). You can give different colors for positive and negative values if number of specified colors is equal to 2*number of curves. Parameter @var{pen} can contain: @itemize @bullet @item @samp{@@} for drawing edges; @item @samp{#} for wired cones; @item @samp{t} for drawing tubes/cylinders instead of cones/prisms; @item @samp{4}, @samp{6}, @samp{8} for drawing square, hex- or octo-prism instead of cones; @item @samp{<}, @samp{^} or @samp{>} for aligning boxes left, right or centering them at its x-coordinates. @end itemize See also @ref{bars}, @ref{cone}, @ref{barwidth}. @sref{cones sample} @end deftypefn @anchor{chart} @deftypefn {MGL command} {} chart adat ['col'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Chart (@code{const mglDataA &}a, @code{const char *}col=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_chart (@code{HMGL} gr, @code{HCDT} a, @code{const char *}col, @code{const char *}opt) @end ifclear The function draws colored stripes (boxes) for data in array @var{a}. The number of stripes is equal to the number of rows in @var{a} (equal to @var{a.ny}). The color of each next stripe is cyclically changed from colors specified in string @var{col} or in palette Pal (see @ref{Palette and colors}). Argument @var{col} can also contain mask specification (see @ref{Color scheme}). Spaces in colors denote transparent ``color'' (i.e. corresponding stripe(s) are not drawn). The stripe width is proportional to value of element in @var{a}. Chart is plotted only for data with non-negative elements. If string @var{col} have symbol @samp{#} then black border lines are drawn. The most nice form the chart have in 3d (after rotation of coordinates) or in cylindrical coordinates (becomes so called Pie chart). @sref{chart sample} @end deftypefn @anchor{boxplot} @deftypefn {MGL command} {} boxplot adat ['stl'=''] @deftypefnx {MGL command} {} boxplot xdat adat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} BoxPlot (@code{const mglDataA &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} BoxPlot (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_boxplot (@code{HMGL} gr, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_boxplot_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw boxplot (also known as a box-and-whisker diagram) at points @var{x}[i]. This is five-number summaries of data @var{a}[i,j] (minimum, lower quartile (Q1), median (Q2), upper quartile (Q3) and maximum) along second (j-th) direction. If @var{pen} contain @samp{<}, @samp{^} or @samp{>} then boxes will be aligned left, right or centered at its x-coordinates. See also @ref{plot}, @ref{error}, @ref{bars}, @ref{barwidth}. @sref{boxplot sample} @end deftypefn @anchor{candle} @deftypefn {MGL command} {} candle vdat1 ['stl'=''] @deftypefnx {MGL command} {} candle vdat1 vdat2 ['stl'=''] @deftypefnx {MGL command} {} candle vdat1 ydat1 ydat2 ['stl'=''] @deftypefnx {MGL command} {} candle vdat1 vdat2 ydat1 ydat2 ['stl'=''] @deftypefnx {MGL command} {} candle xdat vdat1 vdat2 ydat1 ydat2 ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const mglDataA &}v2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}v1, @code{const mglDataA &}v2, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Candle (@code{const mglDataA &}x, @code{const mglDataA &}v1, @code{const mglDataA &}v2, @code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_candle (@code{HMGL} gr, @code{HCDT} v1, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_candle_yv (@code{HMGL} gr, @code{HCDT} v1, @code{HCDT} v2, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_candle_xyv (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} v1, @code{HCDT} v2, @code{HCDT} y1, @code{HCDT} y2, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw candlestick chart at points @var{x}[i]. This is a combination of a line-chart and a bar-chart, in that each bar represents the range of price movement over a given time interval. Wire (or white) candle correspond to price growth @var{v1}[i]<@var{v2}[i], opposite case -- solid (or dark) candle. You can give different colors for growth and decrease values if number of specified colors is equal to 2. If @var{pen} contain @samp{#} then the wire candle will be used even for 2-color scheme. Argument @var{pen} can also contain mask specification (see @ref{Color scheme}). "Shadows" show the minimal @var{y1} and maximal @var{y2} prices. If @var{v2} is absent then it is determined as @var{v2}[i]=@var{v1}[i+1]. See also @ref{plot}, @ref{bars}, @ref{ohlc}, @ref{barwidth}. @sref{candle sample} @end deftypefn @anchor{ohlc} @deftypefn {MGL command} {} ohlc odat hdat ldat cdat ['stl'=''] @deftypefnx {MGL command} {} ohlc xdat odat hdat ldat cdat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} OHLC (@code{const mglDataA &}o, @code{const mglDataA &}h, @code{const mglDataA &}l, @code{const mglDataA &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} OHLC (@code{const mglDataA &}x, @code{const mglDataA &}o, @code{const mglDataA &}h, @code{const mglDataA &}l, @code{const mglDataA &}c, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_ohlc (@code{HMGL} gr, @code{HCDT} o, @code{HCDT} h, @code{HCDT} l, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_ohlc_x (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} o, @code{HCDT} h, @code{HCDT} l, @code{HCDT} c, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw Open-High-Low-Close diagram. This diagram show vertical line for between maximal(high @var{h}) and minimal(low @var{l}) values, as well as horizontal lines before/after vertical line for initial(open @var{o})/final(close @var{c}) values of some process (usually price). You can give different colors for up and down values (when closing values higher or not as in previous point) if number of specified colors is equal to 2*number of curves. See also @ref{candle}, @ref{plot}, @ref{barwidth}. @sref{ohlc sample} @end deftypefn @anchor{error} @deftypefn {MGL command} {} error ydat yerr ['stl'=''] @deftypefnx {MGL command} {} error xdat ydat yerr ['stl'=''] @deftypefnx {MGL command} {} error xdat ydat xerr yerr ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Error (@code{const mglDataA &}y, @code{const mglDataA &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Error (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Error (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ex, @code{const mglDataA &}ey, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_error (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_error_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_error_exy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ex, @code{HCDT} ey, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw error boxes @{@var{ex}[i], @var{ey}[i]@} at points @{@var{x}[i], @var{y}[i]@}. This can be useful, for example, in experimental points, or to show numeric error or some estimations and so on. If string @var{pen} contain symbol @samp{@@} than large semitransparent mark is used instead of error box. See also @ref{plot}, @ref{mark}. @sref{error sample} @end deftypefn @anchor{mark} @deftypefn {MGL command} {} mark ydat rdat ['stl'=''] @deftypefnx {MGL command} {} mark xdat ydat rdat ['stl'=''] @deftypefnx {MGL command} {} mark xdat ydat zdat rdat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Mark (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Mark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Mark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_mark_y (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_mark_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_mark_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw marks with size @var{r}[i]*@ref{marksize} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. If you need to draw markers of the same size then you can use @ref{plot} function with empty line style @samp{ }. For markers with size in axis range use @ref{error} with style @samp{@@}. See also @ref{plot}, @ref{textmark}, @ref{error}, @ref{stem}, @ref{meshnum}. @sref{mark sample} @end deftypefn @anchor{textmark} @deftypefn {MGL command} {} textmark ydat 'txt' ['stl'=''] @deftypefnx {MGL command} {} textmark ydat rdat 'txt' ['stl'=''] @deftypefnx {MGL command} {} textmark xdat ydat rdat 'txt' ['stl'=''] @deftypefnx {MGL command} {} textmark xdat ydat zdat rdat 'txt' ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TextMark (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_textmark (@code{HMGL} gr, @code{HCDT} y, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textmarkw (@code{HMGL} gr, @code{HCDT} y, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textmark_yr (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} r, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textmarkw_yr (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} r, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textmark_xyr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} r, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textmarkw_xyr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} r, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textmark_xyzr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_textmarkw_xyzr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @end ifclear These functions draw string @var{txt} as marks with size proportional to @var{r}[i]*@var{marksize} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. By default (if omitted) @var{r}[i]=1. See also @ref{plot}, @ref{mark}, @ref{stem}, @ref{meshnum}. @sref{textmark sample} @end deftypefn @anchor{label} @deftypefn {MGL command} {} label ydat 'txt' ['stl'=''] @deftypefnx {MGL command} {} label xdat ydat 'txt' ['stl'=''] @deftypefnx {MGL command} {} label xdat ydat zdat 'txt' ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Label (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_label (@code{HMGL} gr, @code{HCDT} y, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_labelw (@code{HMGL} gr, @code{HCDT} y, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_label_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_labelw_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_label_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_labelw_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @end ifclear These functions draw string @var{txt} at points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. If string @var{txt} contain @samp{%x}, @samp{%y}, @samp{%z} or @samp{%n} then it will be replaced by the value of x-,y-,z-coordinate of the point or its index. String @var{fnt} may contain: @itemize @item font style @ref{Font styles}; @item @samp{f} for fixed format of printed numbers; @item @samp{E} for using @samp{E} instead of @samp{e}; @item @samp{F} for printing in LaTeX format; @item @samp{+} for printing @samp{+} for positive numbers; @item @samp{-} for printing usual @samp{-}; @item @samp{0123456789} for precision at printing numbers. @end itemize See also @ref{plot}, @ref{mark}, @ref{textmark}, @ref{table}. @sref{label sample} @end deftypefn @anchor{table} @deftypefn {MGL command} {} table vdat 'txt' ['stl'='#'] @deftypefnx {MGL command} {} table x y vdat 'txt' ['stl'='#'] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{const mglDataA &}val, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{const mglDataA &}val, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{mreal} x, @code{mreal} y, @code{const mglDataA &}val, @code{const char *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Table (@code{mreal} x, @code{mreal} y, @code{const mglDataA &}val, @code{const wchar_t *}txt, @code{const char *}fnt=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_table (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{HCDT} val, @code{const char *}txt, @code{const char *}fnt, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tablew (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{HCDT} val, @code{const wchar_t *}txt, @code{const char *}fnt, @code{const char *}opt) @end ifclear These functions draw table with values of @var{val} and captions from string @var{txt} (separated by newline symbol @samp{\n}) at points @{@var{x}, @var{y}@} (default at @{0,0@}) related to current subplot. String @var{fnt} may contain: @itemize @item font style @ref{Font styles}; @item @samp{#} for drawing cell borders; @item @samp{|} for limiting table widh by subplot one (equal to option @samp{value 1}); @item @samp{=} for equal width of all cells; @item @samp{f} for fixed format of printed numbers; @item @samp{E} for using @samp{E} instead of @samp{e}; @item @samp{F} for printing in LaTeX format; @item @samp{+} for printing @samp{+} for positive numbers; @item @samp{-} for printing usual @samp{-}; @item @samp{0123456789} for precision at printing numbers. @end itemize Option @code{value} set the width of the table (default is 1). See also @ref{plot}, @ref{label}. @sref{table sample} @end deftypefn @anchor{iris} @deftypefn {MGL command} {} iris dats 'ids' ['stl'=''] @deftypefnx {MGL command} {} iris dats rngs 'ids' ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const char *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const wchar_t *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const mglDataA &}rngs, @code{const char *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Iris (@code{const mglDataA &}dats, @code{const mglDataA &}rngs, @code{const wchar_t *}ids, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_iris_1 (@code{HMGL} gr, @code{HCDT} dats, @code{const char *}ids, @code{const char *}stl, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_irisw_1 (@code{HMGL} gr, @code{HCDT} dats, @code{const wchar_t *}ids, @code{const char *}stl, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_iris (@code{HMGL} gr, @code{HCDT} dats, @code{HCDT} rngs, @code{const char *}ids, @code{const char *}stl, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_irisw (@code{HMGL} gr, @code{HCDT} dats, @code{HCDT} rngs, @code{const wchar_t *}ids, @code{const char *}stl, @code{const char *}opt) @end ifclear Draws Iris plots for determining cross-dependences of data arrays @var{dats} (see @uref{http://en.wikipedia.org/wiki/Iris_flower_data_set}). Data @var{rngs} of size 2*@var{dats}.nx provide manual axis ranges for each column. String @var{ids} contain column names, separated by @samp{;} symbol. Option @code{value} set the text size for column names. You can add another data set to existing Iris plot by providing the same ranges @var{rngs} and empty column names @var{ids}. See also @ref{plot}. @sref{iris sample} @end deftypefn @anchor{tube} @deftypefn {MGL command} {} tube ydat rdat ['stl'=''] @deftypefnx {MGL command} {} tube ydat @code{rval} ['stl'=''] @deftypefnx {MGL command} {} tube xdat ydat rdat ['stl'=''] @deftypefnx {MGL command} {} tube xdat ydat @code{rval} ['stl'=''] @deftypefnx {MGL command} {} tube xdat ydat zdat rdat ['stl'=''] @deftypefnx {MGL command} {} tube xdat ydat zdat @code{rval} ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}y, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Tube (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{mreal} r, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tube_r (@code{HMGL} gr, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tube (@code{HMGL} gr, @code{HCDT} y, @code{mreal} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tube_xyr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tube_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{mreal} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tube_xyzr (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}pen, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tube_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{mreal} r, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw the tube with variable radius @var{r}[i] along the curve between points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Option @code{value} set the number of segments at cross-section (default is 25). See also @ref{plot}. @sref{tube sample} @end deftypefn @anchor{torus} @deftypefn {MGL command} {} torus rdat zdat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Torus (@code{const mglDataA &}r, @code{const mglDataA &}z, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_torus (@code{HMGL} gr, @code{HCDT} r, @code{HCDT} z, @code{const char *}pen, @code{const char *}opt) @end ifclear These functions draw surface which is result of curve @{@var{r}, @var{z}@} rotation around axis. If string @var{pen} contain symbols @samp{x} or @samp{z} then rotation axis will be set to specified direction (default is @samp{y}). If string @var{pen} have symbol @samp{#} then wire plot is produced. If string @var{pen} have symbol @samp{.} then plot by dots is produced. See also @ref{plot}, @ref{axial}. @sref{torus sample} @end deftypefn @anchor{lamerey} @deftypefn {MGL command} {} lamerey @code{x0} ydat ['stl'=''] @deftypefnx {MGL command} {} lamerey @code{x0} 'y(x)' ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Lamerey (@code{double} x0, @code{const mglDataA &}y, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Lamerey (@code{double} x0, @code{const char *}y, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_lamerey_dat (@code{HMGL} gr, @code{double} x0, @code{HCDT} y, @code{const char *}stl, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_lamerey_str (@code{HMGL} gr, @code{double} x0, @code{const char *}y, @code{const char *}stl, @code{const char *}opt) @end ifclear These functions draw Lamerey diagram for mapping x_new = y(x_old) starting from point @var{x0}. String @var{stl} may contain line style, symbol @samp{v} for drawing arrows, symbol @samp{~} for disabling first segment. Option @code{value} set the number of segments to be drawn (default is 20). See also @ref{plot}, @ref{fplot}, @ref{bifurcation}, @ref{pmap}. @sref{lamerey sample} @end deftypefn @anchor{bifurcation} @deftypefn {MGL command} {} bifurcation @code{dx} ydat ['stl'=''] @deftypefnx {MGL command} {} bifurcation @code{dx} 'y(x)' ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Bifurcation (@code{double} dx, @code{const mglDataA &}y, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Bifurcation (@code{double} dx, @code{const char *}y, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_bifurcation_dat (@code{HMGL} gr, @code{double} dx, @code{HCDT} y, @code{const char *}stl, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_bifurcation_str (@code{HMGL} gr, @code{double} dx, @code{const char *}y, @code{const char *}stl, @code{const char *}opt) @end ifclear These functions draw bifurcation diagram for mapping x_new = y(x_old). Parameter @var{dx} set the accuracy along x-direction. String @var{stl} set color. Option @code{value} set the number of stationary points (default is 1024). See also @ref{plot}, @ref{fplot}, @ref{lamerey}. @sref{bifurcation sample} @end deftypefn @anchor{pmap} @deftypefn {MGL command} {} pmap ydat sdat ['stl'=''] @deftypefnx {MGL command} {} pmap xdat ydat sdat ['stl'=''] @deftypefnx {MGL command} {} pmap xdat ydat zdat sdat ['stl'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Pmap (@code{const mglDataA &}y, @code{const mglDataA &}s, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Pmap (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}s, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Pmap (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}s, @code{const char *}stl=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_pmap (@code{HMGL} gr, @code{HMDT} y, @code{HCDT} s, @code{const char *}stl, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_pmap_xy (@code{HMGL} gr, @code{HCDT} x, @code{HMDT} y, @code{HCDT} s, @code{const char *}stl, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_pmap_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HMDT} y, @code{HCDT} z, @code{HCDT} s, @code{const char *}stl, @code{const char *}opt) @end ifclear These functions draw Poincare map for curve @{@var{x}, @var{y}, @var{z}@} at surface @var{s}=0. Basically, it show intersections of the curve and the surface. String @var{stl} set the style of marks. See also @ref{plot}, @ref{mark}, @ref{lamerey}. @sref{pmap sample} @end deftypefn @c ################################################################## @external{} @node 2D plotting, 3D plotting, 1D plotting, MathGL core @section 2D plotting @nav{} @cindex Mesh @cindex Fall @cindex Belt @cindex Surf @cindex Boxs @cindex Tile @cindex Dens @cindex Cont @cindex ContF @cindex ContD @cindex Axial @cindex Grad @cindex Grid These functions perform plotting of 2D data. 2D means that data depend from 2 independent parameters like matrix @math{f(x_i,y_j), i=1...n, j=1...m}. By default (if absent) values of @var{x}, @var{y} are equidistantly distributed in axis range. The plots are drawn for each z slice of the data. The minor dimensions of arrays @var{x}, @var{y}, @var{z} should be equal @code{x.nx=z.nx && y.nx=z.ny} or @code{x.nx=y.nx=z.nx && x.ny=y.ny=z.ny}. Arrays @var{x} and @var{y} can be vectors (not matrices as @var{z}). String @var{sch} sets the color scheme (see @ref{Color scheme}) for plot. String @var{opt} contain command options (see @ref{Command options}). @anchor{surf} @deftypefn {MGL command} {} surf zdat ['sch'=''] @deftypefnx {MGL command} {} surf xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Surf (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Surf (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{mesh}, @ref{dens}, @ref{belt}, @ref{tile}, @ref{boxs}, @ref{surfc}, @ref{surfa}. @sref{surf sample} @end deftypefn @anchor{mesh} @deftypefn {MGL command} {} mesh zdat ['sch'=''] @deftypefnx {MGL command} {} mesh xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Mesh (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Mesh (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_mesh (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_mesh_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws mesh lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. See also @ref{surf}, @ref{fall}, @ref{meshnum}, @ref{cont}, @ref{tens}. @sref{mesh sample} @end deftypefn @anchor{fall} @deftypefn {MGL command} {} fall zdat ['sch'=''] @deftypefnx {MGL command} {} fall xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Fall (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Fall (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_fall (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_fall_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws fall lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. This plot can be used for plotting several curves shifted in depth one from another. If @var{sch} contain @samp{x} then lines are drawn along x-direction else (by default) lines are drawn along y-direction. See also @ref{belt}, @ref{mesh}, @ref{tens}, @ref{meshnum}. @sref{fall sample} @end deftypefn @anchor{belt} @deftypefn {MGL command} {} belt zdat ['sch'=''] @deftypefnx {MGL command} {} belt xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Belt (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Belt (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_belt (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_belt_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws belts for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. This plot can be used as 3d generalization of @ref{plot}). If @var{sch} contain @samp{x} then belts are drawn along x-direction else (by default) belts are drawn along y-direction. See also @ref{fall}, @ref{surf}, @ref{beltc}, @ref{plot}, @ref{meshnum}. @sref{belt sample} @end deftypefn @anchor{boxs} @deftypefn {MGL command} {} boxs zdat ['sch'=''] @deftypefnx {MGL command} {} boxs xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Boxs (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Boxs (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_boxs (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_boxs_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws vertical boxes for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Symbol @samp{@@} in @var{sch} set to draw filled boxes. See also @ref{surf}, @ref{dens}, @ref{tile}, @ref{step}. @sref{boxs sample} @end deftypefn @anchor{tile} @deftypefn {MGL command} {} tile zdat ['sch'=''] @deftypefnx {MGL command} {} tile xdat ydat zdat ['sch'=''] @deftypefnx {MGL command} {} tile xdat ydat zdat cdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Tile (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tile (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tile_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tile_xyc (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws horizontal tiles for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j] (@var{c}=@var{z} if @var{c} is not provided). If string @var{sch} contain style @samp{x} or @samp{y} then tiles will be oriented perpendicular to x- or y-axis. Such plot can be used as 3d generalization of @ref{step}. See also @ref{surf}, @ref{boxs}, @ref{step}, @ref{tiles}. @sref{tile sample} @end deftypefn @anchor{dens} @deftypefn {MGL command} {} dens zdat ['sch'=''] @deftypefnx {MGL command} {} dens xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Dens (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{mreal} zVal=@code{NAN}) @deftypefnx {Method on @code{mglGraph}} @code{void} Dens (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{mreal} zVal=@code{NAN}) @deftypefnx {C function} @code{void} mgl_dens (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dens_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws density plot for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z} equal to minimal z-axis value. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{tile}, @code{dens[xyz]}. @sref{dens sample} @end deftypefn @anchor{cont} @deftypefn {MGL command} {} cont vdat zdat ['sch'=''] @deftypefnx {MGL command} {} cont vdat xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k], or at @var{z} equal to minimal z-axis value if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If string @var{sch} have symbol @samp{t} or @samp{T} then contour labels @var{v}[k] will be drawn below (or above) the contours. See also @ref{dens}, @ref{contf}, @ref{contd}, @ref{axial}, @code{cont[xyz]}. @sref{cont sample} @end deftypefn @deftypefn {MGL command} {} cont zdat ['sch'=''] @deftypefnx {MGL command} {} cont xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Cont (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The same as previous with vector @var{v} of @var{num}-th elements equidistantly distributed in color range. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 7). If string @var{sch} contain symbol @samp{.} then only contours at levels with saddle points will be drawn. @end deftypefn @deftypefn {MGL command} {} cont @code{val} adat xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContGen (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont_gen (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear Draws contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{a}[i,j]=@var{val}. If string @var{sch} have symbol @samp{t} or @samp{T} then contour labels @var{v}[k] will be drawn below (or above) the contours. @end deftypefn @anchor{contf} @deftypefn {MGL command} {} contf vdat zdat ['sch'=''] @deftypefnx {MGL command} {} contf vdat xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws solid (or filled) contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k], or at @var{z} equal to minimal z-axis value if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v} (must be @code{v.nx>2}). See also @ref{dens}, @ref{cont}, @ref{contd}, @code{contf[xyz]}. @sref{contf sample} @end deftypefn @deftypefn {MGL command} {} contf zdat ['sch'=''] @deftypefnx {MGL command} {} contf xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContF (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The same as previous with vector @var{v} of @var{num}-th elements equidistantly distributed in color range. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 7). @end deftypefn @deftypefn {MGL command} {} contf @code{v1 v2} adat xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContFGen (@code{mreal} v1, @code{mreal} v2, @code{const mglDataA &}a, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf_gen (@code{HMGL} gr, @code{mreal} v1, @code{mreal} v2, @code{HCDT} a, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear Draws solid (or filled) contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} between @var{a}[i,j]=@var{v1} and @var{a}[i,j]=@var{v2}. @end deftypefn @anchor{contd} @deftypefn {MGL command} {} contd vdat zdat ['sch'=''] @deftypefnx {MGL command} {} contd vdat xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contd_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contd_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws solid (or filled) contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k] (or at @var{z} equal to minimal z-axis value if @var{sch} contain symbol @samp{_}) with manual colors. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v} (must be @code{v.nx>2}). String @var{sch} sets the contour colors: the color of k-th contour is determined by character @code{sch[k%strlen(sch)]}. See also @ref{dens}, @ref{cont}, @ref{contf}. @sref{contd sample} @end deftypefn @deftypefn {MGL command} {} contd zdat ['sch'=''] @deftypefnx {MGL command} {} contd xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContD (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contd (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contd_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The same as previous with vector @var{v} of @var{num}-th elements equidistantly distributed in color range. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 7). @end deftypefn @anchor{contp} @deftypefn {MGL command} {} contp vdat xdat ydat zdat adat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContP (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contp_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws contour lines on surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Contours are plotted for @var{a}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If string @var{sch} have symbol @samp{t} or @samp{T} then contour labels @var{v}[k] will be drawn below (or above) the contours. If string @var{sch} have symbol @samp{f} then solid contours will be drawn. See also @ref{cont}, @ref{contf}, @ref{surfc}, @code{cont[xyz]}. @c TODO @sref{contp sample} @end deftypefn @deftypefn {MGL command} {} contp xdat ydat zdat adat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContP (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contp (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear The same as previous with vector @var{v} of @var{num}-th elements equidistantly distributed in color range. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 7). @end deftypefn @anchor{contv} @deftypefn {MGL command} {} contv vdat zdat ['sch'=''] @deftypefnx {MGL command} {} contv vdat xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contv_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contv_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws vertical cylinder (tube) at contour lines for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z}=@var{v}[k], or at @var{z} equal to minimal z-axis value if @var{sch} contain symbol @samp{_}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. See also @ref{cont}, @ref{contf}. @sref{contv sample} @end deftypefn @deftypefn {MGL command} {} contv zdat ['sch'=''] @deftypefnx {MGL command} {} contv xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContV (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contv (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contv_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The same as previous with vector @var{v} of @var{num}-th elements equidistantly distributed in color range. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 7). @end deftypefn @anchor{axial} @deftypefn {MGL command} {} axial vdat zdat ['sch'=''] @deftypefnx {MGL command} {} axial vdat xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}v, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_axial_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_axial_xy_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws surface which is result of contour plot rotation for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If string @var{sch} have symbol @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. If string contain symbols @samp{x} or @samp{z} then rotation axis will be set to specified direction (default is @samp{y}). See also @ref{cont}, @ref{contf}, @ref{torus}, @ref{surf3}. @sref{axial sample} @end deftypefn @deftypefn {MGL command} {} axial zdat ['sch'=''] @deftypefnx {MGL command} {} axial xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{int} num=@code{3}) @deftypefnx {Method on @code{mglGraph}} @code{void} Axial (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}, @code{int} num=@code{3}) @deftypefnx {C function} @code{void} mgl_axial (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_axial_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The same as previous with vector @var{v} of @var{num}-th elements equidistantly distributed in color range. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 3). @end deftypefn @anchor{grid2} @deftypefn {MGL command} {} grid2 zdat ['sch'=''] @deftypefnx {MGL command} {} grid2 xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Grid (@code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Grid (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_grid (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_grid_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws grid lines for density plot of surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} at @var{z} equal to minimal z-axis value. See also @ref{dens}, @ref{cont}, @ref{contf}, @ref{grid3}, @ref{meshnum}. @end deftypefn @c ################################################################## @external{} @node 3D plotting, Dual plotting, 2D plotting, MathGL core @section 3D plotting @nav{} @cindex Surf3 @cindex Dens3 @cindex Cont3 @cindex ContF3 @cindex Grid3 @cindex Cloud @cindex Beam These functions perform plotting of 3D data. 3D means that data depend from 3 independent parameters like matrix @math{f(x_i,y_j,z_k), i=1...n, j=1...m, k=1...l}. By default (if absent) values of @var{x}, @var{y}, @var{z} are equidistantly distributed in axis range. The minor dimensions of arrays @var{x}, @var{y}, @var{z}, @var{a} should be equal @code{x.nx=a.nx && y.nx=a.ny && z.nz=a.nz} or @code{x.nx=y.nx=z.nx=a.nx && x.ny=y.ny=z.ny=a.ny && x.nz=y.nz=z.nz=a.nz}. Arrays @var{x}, @var{y} and @var{z} can be vectors (not matrices as @var{a}). String @var{sch} sets the color scheme (see @ref{Color scheme}) for plot. String @var{opt} contain command options (see @ref{Command options}). @anchor{surf3} @deftypefn {MGL command} {} surf3 adat @code{val} ['sch'=''] @deftypefnx {MGL command} {} surf3 xdat ydat zdat adat @code{val} ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{mreal} val, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. If string contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. Note, that there is possibility of incorrect plotting due to uncertainty of cross-section defining if there are two or more isosurface intersections inside one cell. See also @ref{cloud}, @ref{dens3}, @ref{surf3c}, @ref{surf3a}, @ref{axial}. @sref{surf3 sample} @end deftypefn @deftypefn {MGL command} {} surf3 adat ['sch'=''] @deftypefnx {MGL command} {} surf3 xdat ydat zdat adat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 3). @end deftypefn @anchor{cloud} @deftypefn {MGL command} {} cloud adat ['sch'=''] @deftypefnx {MGL command} {} cloud xdat ydat zdat adat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Cloud (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Cloud (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cloud (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cloud_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws cloud plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). This plot is a set of cubes with color and transparency proportional to value of @var{a}. The resulting plot is like cloud -- low value is transparent but higher ones are not. The number of plotting cells depend on @ref{meshnum}. If string @var{sch} contain symbol @samp{.} then lower quality plot will produced with much low memory usage. If string @var{sch} contain symbol @samp{i} then transparency will be inversed, i.e. higher become transparent and lower become not transparent. See also @ref{surf3}, @ref{meshnum}. @sref{cloud sample} @end deftypefn @anchor{dens3} @deftypefn {MGL command} {} dens3 adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} dens3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Dens3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Dens3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_dens3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dens3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear The function draws density plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Density is plotted at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). If string @var{stl} have symbol @samp{#} then grid lines are drawn. See also @ref{cont3}, @ref{contf3}, @ref{dens}, @ref{grid3}. @sref{dens3 sample} @end deftypefn @anchor{cont3} @deftypefn {MGL command} {} cont3 vdat adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} cont3 vdat xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont3_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont3_xyz_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear The function draws contour plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Contours are plotted for values specified in array @var{v} at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{t} or @samp{T} then contour labels will be drawn below (or above) the contours. See also @ref{dens3}, @ref{contf3}, @ref{cont}, @ref{grid3}. @sref{cont3 sample} @end deftypefn @deftypefn {MGL command} {} cont3 adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} cont3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Cont3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear The same as previous with vector @var{v} of @var{num}-th elements equidistantly distributed in color range. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 7). @end deftypefn @anchor{contf3} @deftypefn {MGL command} {} contf3 vdat adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} contf3 vdat xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf3_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf3_xyz_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear The function draws solid (or filled) contour plot for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Contours are plotted for values specified in array @var{v} at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). If string @var{sch} have symbol @samp{#} then grid lines are drawn. See also @ref{dens3}, @ref{cont3}, @ref{contf}, @ref{grid3}. @sref{contf3 sample} @end deftypefn @deftypefn {MGL command} {} contf3 adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} contf3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Contf3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear The same as previous with vector @var{v} of @var{num}-th elements equidistantly distributed in color range. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 7). @end deftypefn @anchor{grid3} @deftypefn {MGL command} {} grid3 adat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} grid3 xdat ydat zdat adat ['sch'='' @code{sval=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Grid3 (@code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Grid3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_grid3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_grid3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear The function draws grid for 3d data specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Grid is plotted at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). See also @ref{cont3}, @ref{contf3}, @ref{dens3}, @ref{grid2}, @ref{meshnum}. @end deftypefn @anchor{dcont} @deftypefn {MGL command} {} dcont vdat adat bdat ['sch'=''] @deftypefnx {MGL command} {} dcont vdat xdat ydat zdat adat bdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} DCont (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} DCont (@code{const mglDataA &}v, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_dcont_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dcont_xyz_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws lines at intersections of isosurfaces for 3d data @var{a}, @var{b} specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]). Isosurfaces are taken for values specified in array @var{v}. See also @ref{cont}, @ref{cont3}. @sref{dcont sample} @end deftypefn @deftypefn {MGL command} {} dcont adat bdat ['sch'='' @code{sval=-1}] @deftypefnx {MGL command} {} dcont xdat ydat zdat adat bdat ['sch'='' @code{sval=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} DCont (@code{const mglDataA &}a, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} DCont (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_dcont (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} b, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_@code{HCDT} b, cont_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) @end ifclear The same as previous with vector @var{v} of @var{num}-th elements equidistantly distributed in color range. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 7). @end deftypefn @anchor{beam} @deftypefn {MGL command} {} beam tr g1 g2 adat @code{rval} ['sch'='' @code{flag=0 num=3}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Beam (@code{const mglDataA &}tr, @code{const mglDataA &}g1, @code{const mglDataA &}g2, @code{const mglDataA &}a, @code{mreal} r, @code{const char *}stl=@code{""}, @code{int} flag=@code{0}, @code{int} num=@code{3}) @deftypefnx {Method on @code{mglGraph}} @code{void} Beam (@code{mreal} val, @code{const mglDataA &}tr, @code{const mglDataA &}g1, @code{const mglDataA &}g2, @code{const mglDataA &}a, @code{mreal} r, @code{const char *}stl=@code{""}, @code{int} flag=@code{0}) @deftypefnx {C function} @code{void} mgl_beam (@code{HMGL} gr, @code{HCDT} tr, @code{HCDT} g1, @code{HCDT} g2, @code{HCDT} a, @code{mreal} r, @code{const char *}stl, @code{int} flag, @code{int} num) @deftypefnx {C function} @code{void} mgl_beam_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} tr, @code{HCDT} g1, @code{HCDT} g2, @code{HCDT} a, @code{mreal} r, @code{const char *}stl, @code{int} flag) @end ifclear Draws the isosurface for 3d array @var{a} at constant values of @var{a}=@var{val}. This is special kind of plot for @var{a} specified in accompanied coordinates along curve @var{tr} with orts @var{g1}, @var{g2} and with transverse scale @var{r}. Variable @var{flag} is bitwise: @samp{0x1} - draw in accompanied (not laboratory) coordinates; @samp{0x2} - draw projection to @math{\rho-z} plane; @samp{0x4} - draw normalized in each slice field. The x-size of data arrays @var{tr}, @var{g1}, @var{g2} must be nx>2. The y-size of data arrays @var{tr}, @var{g1}, @var{g2} and z-size of the data array @var{a} must be equal. See also @ref{surf3}. @end deftypefn @c ################################################################## @external{} @node Dual plotting, Vector fields, 3D plotting, MathGL core @section Dual plotting @nav{} @cindex SurfC @cindex SurfA @cindex Surf3C @cindex Surf3A @cindex TileS @cindex Map @cindex STFA These plotting functions draw @emph{two matrix} simultaneously. There are 5 generally different types of data representations: surface or isosurface colored by other data (SurfC, Surf3C), surface or isosurface transpared by other data (SurfA, Surf3A), tiles with variable size (TileS), mapping diagram (Map), STFA diagram (STFA). By default (if absent) values of @var{x}, @var{y}, @var{z} are equidistantly distributed in axis range. The minor dimensions of arrays @var{x}, @var{y}, @var{z}, @var{c} should be equal. Arrays @var{x}, @var{y} (and @var{z} for @code{Surf3C, Surf3A}) can be vectors (not matrices as @var{c}). String @var{sch} sets the color scheme (see @ref{Color scheme}) for plot. String @var{opt} contain command options (see @ref{Command options}). @anchor{surfc} @deftypefn {MGL command} {} surfc zdat cdat ['sch'=''] @deftypefnx {MGL command} {} surfc xdat ydat zdat cdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SurfC (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} SurfC (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surfc (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surfc_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfa}, @ref{surfca}, @ref{beltc}, @ref{surf3c}. @sref{surfc sample} @end deftypefn @anchor{beltc} @deftypefn {MGL command} {} beltc zdat cdat ['sch'=''] @deftypefnx {MGL command} {} beltc xdat ydat zdat cdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} BeltC (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} BeltC (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_beltc (@code{HMGL} gr, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_beltc_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws belts for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. This plot can be used as 3d generalization of @ref{plot}). If @var{sch} contain @samp{x} then belts are drawn along x-direction else (by default) belts are drawn along y-direction. See also @ref{belt}, @ref{surfc}, @ref{meshnum}. @sref{beltc sample} @end deftypefn @anchor{surf3c} @deftypefn {MGL command} {} surf3c adat cdat @code{val} ['sch'=''] @deftypefnx {MGL command} {} surf3c xdat ydat zdat adat cdat @code{val} ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3c_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3c_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}, @ref{surf3ca}. @sref{surf3c sample} @end deftypefn @deftypefn {MGL command} {} surf3c adat cdat ['sch'=''] @deftypefnx {MGL command} {} surf3c xdat ydat zdat adat cdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3C (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3c (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3c_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. Here @var{num} is equal to parameter @code{value} in options @var{opt} (default is 3). @end deftypefn @anchor{surfa} @deftypefn {MGL command} {} surfa zdat cdat ['sch'=''] @deftypefnx {MGL command} {} surfa xdat ydat zdat cdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SurfA (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} SurfA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surfa (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and transparent it by matrix @var{c}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. See also @ref{surf}, @ref{surfc}, @ref{surfca}, @ref{surf3a}. @sref{surfa sample} @end deftypefn @anchor{surf3a} @deftypefn {MGL command} {} surf3a adat cdat @code{val} ['sch'=''] @deftypefnx {MGL command} {} surf3a xdat ydat zdat adat cdat @code{val} ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3a_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3a_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the transparency of isosurface depends on values of array @var{c}. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. See also @ref{surf3}, @ref{surfc}, @ref{surf3a}, @ref{surf3ca}. @sref{surf3a sample} @end deftypefn @deftypefn {MGL command} {} surf3a adat cdat ['sch'=''] @deftypefnx {MGL command} {} surf3a xdat ydat zdat adat cdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3A (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3a (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3a_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. At this array @var{c} can be vector with values of transparency and @var{num}=@var{c}.nx. In opposite case @var{num} is equal to parameter @code{value} in options @var{opt} (default is 3). @end deftypefn @anchor{surfca} @deftypefn {MGL command} {} surfca zdat cdat adat ['sch'=''] @deftypefnx {MGL command} {} surfca xdat ydat zdat cdat adat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} SurfCA (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} SurfCA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surfca (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surfca_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@}, color it by matrix @var{c}[i,j] and transparent it by matrix @var{a}[i,j]. If string @var{sch} have symbol @samp{#} then grid lines are drawn. If string @var{sch} have symbol @samp{.} then plot by dots is produced. All dimensions of arrays @var{z} and @var{c} must be equal. Surface is plotted for each z slice of the data. Note, you can use @ref{map}-like coloring if use @samp{%} in color scheme. See also @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{surf3ca}. @sref{surfca sample} @end deftypefn @anchor{surf3ca} @deftypefn {MGL command} {} surf3ca adat cdat bdat @code{val} ['sch'=''] @deftypefnx {MGL command} {} surf3ca xdat ydat zdat adat cdat bdat @code{val} ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{mreal} val, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{mreal} val, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3ca_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3ca_xyz_val (@code{HMGL} gr, @code{mreal} val, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b,@code{const char *}sch, @code{const char *}opt) @end ifclear The function draws isosurface plot for 3d array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) at @var{a}(x,y,z)=@var{val}. It is mostly the same as @ref{surf3} function but the color and the transparency of isosurface depends on values of array @var{c} and @var{b} correspondingly. If string @var{sch} contain @samp{#} then wire plot is produced. If string @var{sch} have symbol @samp{.} then plot by dots is produced. Note, you can use @ref{map}-like coloring if use @samp{%} in color scheme. See also @ref{surf3}, @ref{surfca}, @ref{surf3c}, @ref{surf3a}. @sref{surf3ca sample} @end deftypefn @deftypefn {MGL command} {} surf3ca adat cdat bdat ['sch'=''] @deftypefnx {MGL command} {} surf3ca xdat ydat zdat adat cdat bdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Surf3CA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}c, @code{const mglDataA &}b, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_surf3ca (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_surf3ca_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} c, @code{HCDT} b, @code{const char *}sch, @code{const char *}opt) @end ifclear Draws @var{num}-th uniformly distributed in color range isosurfaces for 3d data. Here parameter @var{num} is equal to parameter @code{value} in options @var{opt} (default is 3). @end deftypefn @anchor{tiles} @deftypefn {MGL command} {} tiles zdat rdat ['sch'=''] @deftypefnx {MGL command} {} tiles xdat ydat zdat rdat ['sch'=''] @deftypefnx {MGL command} {} tiles xdat ydat zdat rdat cdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TileS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}r, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tiles (@code{HMGL} gr, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tiles_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tiles_xyc (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} r, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws horizontal tiles for surface specified parametrically @{@var{x}[i,j], @var{y}[i,j], @var{z}[i,j]@} and color it by matrix @var{c}[i,j]. It is mostly the same as @ref{tile} but the size of tiles is determined by @var{r} array. If string @var{sch} contain style @samp{x} or @samp{y} then tiles will be oriented perpendicular to x- or y-axis. This is some kind of ``transparency'' useful for exporting to EPS files. Tiles is plotted for each z slice of the data. See also @ref{surfa}, @ref{tile}. @sref{tiles sample} @end deftypefn @anchor{map} @deftypefn {MGL command} {} map udat vdat ['sch'=''] @deftypefnx {MGL command} {} map xdat ydat udat vdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Map (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Map (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_map (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_map_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws mapping plot for matrices @{@var{ax}, @var{ay} @} which parametrically depend on coordinates @var{x}, @var{y}. The initial position of the cell (point) is marked by color. Height is proportional to Jacobian(ax,ay). This plot is like Arnold diagram ??? If string @var{sch} contain symbol @samp{.} then the color ball at matrix knots are drawn otherwise face is drawn. @sref{Mapping visualization} @end deftypefn @anchor{stfa} @deftypefn {MGL command} {} stfa re im @code{dn} ['sch'=''] @deftypefnx {MGL command} {} stfa xdat ydat re im @code{dn} ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} STFA (@code{const mglDataA &}re, @code{const mglDataA &}im, @code{int} dn, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} STFA (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}re, @code{const mglDataA &}im, @code{int} dn, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_stfa (@code{HMGL} gr, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_stfa_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} re, @code{HCDT} im, @code{int} dn, @code{const char *}sch, @code{const char *}opt) @end ifclear Draws spectrogram of complex array @var{re}+i*@var{im} for Fourier size of @var{dn} points at plane @var{z} equal to minimal z-axis value. For example in 1D case, result is density plot of data @math{res[i,j]=|\sum_d^dn exp(I*j*d)*(re[i*dn+d]+I*im[i*dn+d])|/dn} with size @{int(nx/dn), dn, ny@}. At this array @var{re}, @var{im} parametrically depend on coordinates @var{x}, @var{y}. The size of @var{re} and @var{im} must be the same. The minor dimensions of arrays @var{x}, @var{y}, @var{re} should be equal. Arrays @var{x}, @var{y} can be vectors (not matrix as @var{re}). @sref{stfa sample} @end deftypefn @c ################################################################## @external{} @node Vector fields, Other plotting, Dual plotting, MathGL core @section Vector fields @nav{} @cindex Lines @cindex Traj @cindex Vect @cindex Dew @cindex Flow @cindex FlowP @cindex Pipe These functions perform plotting of 2D and 3D vector fields. There are 5 generally different types of vector fields representations: simple vector field (Vect), vectors along the curve (Traj), vector field by dew-drops (Dew), flow threads (Flow, FlowP), flow pipes (Pipe). By default (if absent) values of @var{x}, @var{y}, @var{z} are equidistantly distributed in axis range. The minor dimensions of arrays @var{x}, @var{y}, @var{z}, @var{ax} should be equal. The size of @var{ax}, @var{ay} and @var{az} must be equal. Arrays @var{x}, @var{y}, @var{z} can be vectors (not matrices as @var{ax}). String @var{sch} sets the color scheme (see @ref{Color scheme}) for plot. String @var{opt} contain command options (see @ref{Command options}). @anchor{lines} @deftypefn {MGL command} {} lines y1dat y2dat ['sch'=''] @deftypefnx {MGL command} {} lines x1dat y1dat x2dat y2dat ['sch'=''] @deftypefnx {MGL command} {} lines x1dat y1dat z1dat x2dat y2dat z2dat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Lines (@code{const mglDataA &}y1, @code{const mglDataA &}y2, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Lines (@code{const mglDataA &}x1, @code{const mglDataA &}y1, @code{const mglDataA &}x2, @code{const mglDataA &}y2, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Lines (@code{const mglDataA &}x1, @code{const mglDataA &}y1, @code{const mglDataA &}z1, @code{const mglDataA &}x2, @code{const mglDataA &}y2, @code{const mglDataA &}z2, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_lines_xyz (@code{HMGL} gr, @code{HCDT}x1, @code{HCDT}y1, @code{HCDT}z1, @code{HCDT}x2, @code{HCDT}y2, @code{HCDT}z2, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_lines_xy (@code{HMGL} gr, @code{HCDT}x1, @code{HCDT}y1, @code{HCDT}x2, @code{HCDT}y2, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_lines (@code{HMGL} gr, @code{HCDT}y1, @code{HCDT}y2, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws lines between points @{@var{x1}, @var{y1}, @var{z1}@} and @{@var{x2}, @var{y2}, @var{z2}@}. String @var{pen} specifies the color (see @ref{Line styles}). By default (@code{pen=""}) color from palette is used (see @ref{Palette and colors}). The minor sizes of all arrays must be the same. The plots are drawn for each row if one of the data is the matrix. See also @ref{plot}, @ref{traj}. @sref{lines sample} @end deftypefn @anchor{traj} @deftypefn {MGL command} {} traj xdat ydat udat vdat ['sch'=''] @deftypefnx {MGL command} {} traj xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Traj (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Traj (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_traj_xyz (@code{HMGL} gr, @code{HCDT}x, @code{HCDT}y, @code{HCDT}z, @code{HCDT}ax, @code{HCDT}ay, @code{HCDT}az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_traj_xy (@code{HMGL} gr, @code{HCDT}x, @code{HCDT}y, @code{HCDT}ax, @code{HCDT}ay, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws vectors @{@var{ax}, @var{ay}, @var{az}@} along a curve @{@var{x}, @var{y}, @var{z}@}. The length of arrows are proportional to @math{\sqrt@{ax^2+ay^2+az^2@}}. String @var{pen} specifies the color (see @ref{Line styles}). By default (@code{pen=""}) color from palette is used (see @ref{Palette and colors}). Option @code{value} set the vector length factor (if non-zero) or vector length to be proportional the distance between curve points (if @code{value=0}). The minor sizes of all arrays must be equal and large 2. The plots are drawn for each row if one of the data is the matrix. See also @ref{vect}. @sref{traj sample} @end deftypefn @anchor{vect} @deftypefn {MGL command} {} vect udat vdat ['sch'=''] @deftypefnx {MGL command} {} vect xdat ydat udat vdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_vect_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_vect_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws plane vector field plot for the field @{@var{ax}, @var{ay}@} depending parametrically on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. The length and color of arrows are proportional to @math{\sqrt@{ax^2+ay^2@}}. The number of arrows depend on @ref{meshnum}. The appearance of the hachures (arrows) can be changed by symbols: @itemize @bullet @item @samp{f} for drawing arrows with fixed lengths, @item @samp{>}, @samp{<} for drawing arrows to or from the cell point (default is centering), @item @samp{.} for drawing hachures with dots instead of arrows, @item @samp{=} for enabling color gradient along arrows. @end itemize See also @ref{flow}, @ref{dew}. @sref{vect sample} @end deftypefn @deftypefn {MGL command} {} vect udat vdat wdat ['sch'=''] @deftypefnx {MGL command} {} vect xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Vect (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_vect_3d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_vect_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @end ifclear This is 3D version of the first functions. Here arrays @var{ax}, @var{ay}, @var{az} must be 3-ranged tensors with equal sizes and the length and color of arrows is proportional to @math{\sqrt@{ax^2+ay^2+az^2@}}. @end deftypefn @anchor{vect3} @deftypefn {MGL command} {} vect3 udat vdat wdat ['sch'='' sval] @deftypefnx {MGL command} {} vect3 xdat ydat zdat udat vdat wdat ['sch'='' sval] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Vect3 (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Vect3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_vect3 (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_vect3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} sVal, @code{const char *}opt) @end ifclear The function draws 3D vector field plot for the field @{@var{ax}, @var{ay}, @var{az}@} depending parametrically on coordinates @var{x}, @var{y}, @var{z}. Vector field is drawn at slice @var{sVal} in direction @{@samp{x}, @samp{y}, @samp{z}@} if @var{sch} contain corresponding symbol (by default, @samp{y} direction is used). The length and color of arrows are proportional to @math{\sqrt@{ax^2+ay^2+az^2@}}. The number of arrows depend on @ref{meshnum}. The appearance of the hachures (arrows) can be changed by symbols: @itemize @bullet @item @samp{f} for drawing arrows with fixed lengths, @item @samp{>}, @samp{<} for drawing arrows to or from the cell point (default is centering), @item @samp{.} for drawing hachures with dots instead of arrows, @item @samp{=} for enabling color gradient along arrows. @end itemize See also @ref{vect}, @ref{flow}, @ref{dew}. @sref{vect3 sample} @end deftypefn @anchor{dew} @deftypefn {MGL command} {} dew udat vdat ['sch'=''] @deftypefnx {MGL command} {} dew xdat ydat udat vdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Dew (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Dew (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_dew (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dew_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws dew-drops for plane vector field @{@var{ax}, @var{ay}@} depending parametrically on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Note that this is very expensive plot in memory usage and creation time! The color of drops is proportional to @math{\sqrt@{ax^2+ay^2@}}. The number of drops depend on @ref{meshnum}. See also @ref{vect}. @sref{dew sample} @end deftypefn @anchor{flow} @deftypefn {MGL command} {} flow udat vdat ['sch'=''] @deftypefnx {MGL command} {} flow xdat ydat udat vdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_flow_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_flow_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws flow threads for the plane vector field @{@var{ax}, @var{ay}@} parametrically depending on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Option @code{value} set the approximate number of threads (default is 5), or accuracy for stationary points (if style @samp{.} is used) . String @var{sch} may contain: @itemize @bullet @item color scheme -- up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); @item @samp{#} for starting threads from edges only; @item @samp{.} for drawing separatrices only (flow threads to/from stationary points). @item @samp{*} for starting threads from a 2D array of points inside the data; @item @samp{v} for drawing arrows on the threads; @item @samp{x}, @samp{z} for drawing tapes of normals in x-y and y-z planes correspondingly. @end itemize See also @ref{pipe}, @ref{vect}, @ref{tape}, @ref{flow3}, @ref{barwidth}. @sref{flow sample} @end deftypefn @deftypefn {MGL command} {} flow udat vdat wdat ['sch'=''] @deftypefnx {MGL command} {} flow xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Flow (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_flow_3d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_flow_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @end ifclear This is 3D version of the first functions. Here arrays @var{ax}, @var{ay}, @var{az} must be 3-ranged tensors with equal sizes and the color of line is proportional to @math{\sqrt@{ax^2+ay^2+az^2@}}. @end deftypefn @deftypefn {MGL command} {} flow @code{x0 y0} udat vdat ['sch'=''] @deftypefnx {MGL command} {} flow @code{x0 y0} xdat ydat udat vdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_flowp_2d (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_flowp_xy (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{const char *}opt) @end ifclear The same as first one (@ref{flow}) but draws single flow thread starting from point @var{p0}=@{@var{x0},@var{y0},@var{z0}@}. String @var{sch} may also contain: @samp{>} or @samp{<} for drawing in forward or backward direction only (default is both). @end deftypefn @deftypefn {MGL command} {} flow @code{x0 y0 z0} udat vdat wdat ['sch'=''] @deftypefnx {MGL command} {} flow @code{x0 y0 z0} xdat ydat zdat udat vdat wdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} FlowP (@code{mglPoint} p0, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_flowp_3d (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_flowp_xyz (@code{HMGL} gr, @code{mreal} x0, @code{mreal} y0, @code{mreal} z0, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{const char *}opt) @end ifclear This is 3D version of the previous functions. @end deftypefn @anchor{flow3} @deftypefn {MGL command} {} flow3 udat vdat wdat ['sch'=''] @deftypefnx {MGL command} {} flow3 xdat ydat zdat udat vdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Flow3 (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{double} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Flow3 (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{double} sVal=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_flow3 (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{double} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_flow3_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{double} sVal, @code{const char *}opt) @end ifclear The function draws flow threads for the 3D vector field @{@var{ax}, @var{ay}, @var{az}@} parametrically depending on coordinates @var{x}, @var{y}, @var{z}. Flow threads starts from given plane. Option @code{value} set the approximate number of threads (default is 5). String @var{sch} may contain: @itemize @bullet @item color scheme -- up-half (warm) corresponds to normal flow (like attractor), bottom-half (cold) corresponds to inverse flow (like source); @item @samp{x}, @samp{z} for normal of starting plane (default is y-direction); @item @samp{v} for drawing arrows on the threads; @item @samp{t} for drawing tapes of normals in x-y and y-z planes. @end itemize See also @ref{flow}, @ref{pipe}, @ref{vect}. @sref{flow3 sample} @end deftypefn @anchor{grad} @deftypefn {MGL command} {} grad pdat ['sch'=''] @deftypefnx {MGL command} {} grad xdat ydat pdat ['sch'=''] @deftypefnx {MGL command} {} grad xdat ydat zdat pdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Grad (@code{const mglDataA &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Grad (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Grad (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}phi, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_grad (@code{HMGL} gr, @code{HCDT} phi, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_grad_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} phi, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_grad_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} phi, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws gradient lines for scalar field @var{phi}[i,j] (or @var{phi}[i,j,k] in 3d case) specified parametrically @{@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]@}. Number of lines is proportional to @code{value} option (default is 5). See also @ref{dens}, @ref{cont}, @ref{flow}. @end deftypefn @anchor{pipe} @deftypefn {MGL command} {} pipe udat vdat ['sch'='' @code{r0=0.05}] @deftypefnx {MGL command} {} pipe xdat ydat udat vdat ['sch'='' @code{r0=0.05}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_pipe_2d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_pipe_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} ax, @code{HCDT} ay, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @end ifclear The function draws flow pipes for the plane vector field @{@var{ax}, @var{ay}@} parametrically depending on coordinates @var{x}, @var{y} at level @var{z} equal to minimal z-axis value. Number of pipes is proportional to @code{value} option (default is 5). If @samp{#} symbol is specified then pipes start only from edges of axis range. The color of lines is proportional to @math{\sqrt@{ax^2+ay^2@}}. Warm color corresponds to normal flow (like attractor). Cold one corresponds to inverse flow (like source). Parameter @var{r0} set the base pipe radius. If @var{r0}<0 or symbol @samp{i} is specified then pipe radius is inverse proportional to amplitude. The vector field is plotted for each z slice of @var{ax}, @var{ay}. See also @ref{flow}, @ref{vect}. @sref{pipe sample} @end deftypefn @deftypefn {MGL command} {} pipe udat vdat wdat ['sch'='' @code{r0=0.05}] @deftypefnx {MGL command} {} pipe xdat ydat zdat udat vdat wdat ['sch'='' @code{r0=0.05}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Pipe (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}ax, @code{const mglDataA &}ay, @code{const mglDataA &}az, @code{const char *}sch=@code{""}, @code{mreal} r0=@code{0.05}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_pipe_3d (@code{HMGL} gr, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_pipe_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} ax, @code{HCDT} ay, @code{HCDT} az, @code{const char *}sch, @code{mreal} r0, @code{const char *}opt) @end ifclear This is 3D version of the first functions. Here arrays @var{ax}, @var{ay}, @var{az} must be 3-ranged tensors with equal sizes and the color of line is proportional to @math{\sqrt@{ax^2+ay^2+az^2@}}. @end deftypefn @c ################################################################## @external{} @node Other plotting, Nonlinear fitting, Vector fields, MathGL core @section Other plotting @nav{} @cindex DensXYZ @cindex ContXYZ @cindex ContFXYZ @cindex Dots @cindex Crust @cindex TriPlot @cindex TriCont @cindex QuadPlot @cindex FPlot @cindex FSurf These functions perform miscellaneous plotting. There is unstructured data points plots (Dots), surface reconstruction (Crust), surfaces on the triangular or quadrangular mesh (TriPlot, TriCont, QuadPlot), textual formula plotting (Plots by formula), data plots at edges (Dens[XYZ], Cont[XYZ], ContF[XYZ]). Each type of plotting has similar interface. There are 2 kind of versions which handle the arrays of data and coordinates or only single data array. Parameters of color scheme are specified by the string argument. @xref{Color scheme}. @anchor{densz} @anchor{densy} @anchor{densx} @anchor{DensXYZ} @deftypefn {MGL command} {} densx dat ['sch'='' @code{sval=nan}] @deftypefnx {MGL command} {} densy dat ['sch'='' @code{sval=nan}] @deftypefnx {MGL command} {} densz dat ['sch'='' @code{sval=nan}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} DensX (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} DensY (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} DensZ (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_dens_x (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dens_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dens_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @end ifclear These plotting functions draw density plot in x, y, or z plain. If @var{a} is a tensor (3-dimensional data) then interpolation to a given @var{sVal} is performed. These functions are useful for creating projections of the 3D data array to the bounding box. See also @ref{ContXYZ}, @ref{ContFXYZ}, @ref{dens}, @ref{Data manipulation}. @sref{dens_xyz sample} @end deftypefn @anchor{contz} @anchor{conty} @anchor{contx} @anchor{ContXYZ} @deftypefn {MGL command} {} contx dat ['sch'='' @code{sval=nan}] @deftypefnx {MGL command} {} conty dat ['sch'='' @code{sval=nan}] @deftypefnx {MGL command} {} contz dat ['sch'='' @code{sval=nan}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContX (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContY (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContZ (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont_x (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @end ifclear These plotting functions draw contour lines in x, y, or z plain. If @var{a} is a tensor (3-dimensional data) then interpolation to a given @var{sVal} is performed. These functions are useful for creating projections of the 3D data array to the bounding box. Option @code{value} set the number of contours. See also @ref{ContFXYZ}, @ref{DensXYZ}, @ref{cont}, @ref{Data manipulation}. @sref{cont_xyz sample} @end deftypefn @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{void} ContX (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContY (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContZ (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_cont_x_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_y_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_cont_z_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) The same as previous with manual contour levels. @end deftypefn @end ifclear @anchor{contfz} @anchor{contfy} @anchor{contfx} @anchor{ContFXYZ} @deftypefn {MGL command} {} contfx dat ['sch'='' @code{sval=nan}] @deftypefnx {MGL command} {} contfy dat ['sch'='' @code{sval=nan}] @deftypefnx {MGL command} {} contfz dat ['sch'='' @code{sval=nan}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} ContFX (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContFY (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContFZ (@code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf_x (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_z (@code{HMGL} gr, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @end ifclear These plotting functions draw solid contours in x, y, or z plain. If @var{a} is a tensor (3-dimensional data) then interpolation to a given @var{sVal} is performed. These functions are useful for creating projections of the 3D data array to the bounding box. Option @code{value} set the number of contours. See also @ref{ContFXYZ}, @ref{DensXYZ}, @ref{cont}, @ref{Data manipulation}. @sref{contf_xyz sample} @end deftypefn @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{void} ContFX (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContFY (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} ContFZ (@code{const mglDataA &}v, @code{const mglDataA &}a, @code{const char *}stl=@code{""}, @code{mreal} sVal=@code{NAN}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_contf_x_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_y_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_contf_z_val (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} a, @code{const char *}stl, @code{mreal} sVal, @code{const char *}opt) The same as previous with manual contour levels. @end deftypefn @end ifclear @anchor{fplot} @deftypefn {MGL command} {} fplot 'y(x)' ['pen'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} FPlot (@code{const char *}eqY, @code{const char *}pen=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_fplot (@code{HMGL} gr, @code{const char *}eqY, @code{const char *}pen, @code{const char *}opt) @end ifclear Draws command function @samp{y(x)} at plane @var{z} equal to minimal z-axis value, where @samp{x} variable is changed in @code{xrange}. You do not need to create the data arrays to plot it. Option @code{value} set initial number of points. See also @ref{plot}. @end deftypefn @deftypefn {MGL command} {} fplot 'x(t)' 'y(t)' 'z(t)' ['pen'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} FPlot (@code{const char *}eqX, @code{const char *}eqY, @code{const char *}eqZ, @code{const char *}pen, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_fplot_xyz (@code{HMGL} gr, @code{const char *}eqX, @code{const char *}eqY, @code{const char *}eqZ, @code{const char *}pen, @code{const char *}opt) @end ifclear Draws command parametrical curve @{@samp{x(t)}, @samp{y(t)}, @samp{z(t)}@} where @samp{t} variable is changed in range [0, 1]. You do not need to create the data arrays to plot it. Option @code{value} set number of points. See also @ref{plot}. @end deftypefn @anchor{fsurf} @deftypefn {MGL command} {} fsurf 'z(x,y)' ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} FSurf (@code{const char *}eqZ, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}); @deftypefnx {C function} @code{void} mgl_fsurf (@code{HMGL} gr, @code{const char *}eqZ, @code{const char *}sch, @code{const char *}opt); @end ifclear Draws command surface for function @samp{z(x,y)} where @samp{x}, @samp{y} variable are changed in @code{xrange, yrange}. You do not need to create the data arrays to plot it. Option @code{value} set number of points. See also @ref{surf}. @end deftypefn @deftypefn {MGL command} {} fsurf 'x(u,v)' 'y(u,v)' 'z(u,v)' ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} FSurf (@code{const char *}eqX, @code{const char *}eqY, @code{const char *}eqZ, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_fsurf_xyz (@code{HMGL} gr, @code{const char *}eqX, @code{const char *}eqY, @code{const char *}eqZ, @code{const char *}sch, @code{const char *}opt) @end ifclear Draws command parametrical surface @{@samp{x(u,v)}, @samp{y(u,v)}, @samp{z(u,v)}@} where @samp{u}, @samp{v} variable are changed in range [0, 1]. You do not need to create the data arrays to plot it. Option @code{value} set number of points. See also @ref{surf}. @end deftypefn @anchor{triplot} @deftypefn {MGL command} {} triplot idat xdat ydat ['sch'=''] @deftypefnx {MGL command} {} triplot idat xdat ydat zdat ['sch'=''] @deftypefnx {MGL command} {} triplot idat xdat ydat zdat cdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} TriPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TriPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TriPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_triplot_xy (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_triplot_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_triplot_xyzc (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws the surface of triangles. Triangle vertexes are set by indexes @var{id} of data points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme. If string contain @samp{#} then wire plot is produced. First dimensions of @var{id} must be 3 or greater. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. Parameter @var{c} set the colors of triangles (if @var{id}.ny=@var{c}.nx) or colors of vertexes (if @var{x}.nx=@var{c}.nx). See also @ref{dots}, @ref{crust}, @ref{quadplot}, @ref{triangulation}. @sref{triplot sample} @end deftypefn @anchor{tricont} @deftypefn {MGL command} {} tricont vdat idat xdat ydat zdat cdat ['sch'=''] @deftypefnx {MGL command} {} tricont vdat idat xdat ydat zdat ['sch'=''] @deftypefnx {MGL command} {} tricont idat xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} TriCont (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TriCont (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TriContV (@code{const mglDataA &}v, @code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} TriContV (@code{const mglDataA &}v, @code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_tricont_xyzc (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tricont_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tricont_xyzcv (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_tricont_xyzv (@code{HMGL} gr, @code{HCDT} v, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws contour lines for surface of triangles at @var{z}=@var{v}[k] (or at @var{z} equal to minimal z-axis value if @var{sch} contain symbol @samp{_}). Triangle vertexes are set by indexes @var{id} of data points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. Contours are plotted for @var{z}[i,j]=@var{v}[k] where @var{v}[k] are values of data array @var{v}. If @var{v} is absent then arrays of option @code{value} elements equidistantly distributed in color range is used. String @var{sch} sets the color scheme. Array @var{c} (if specified) is used for contour coloring. First dimensions of @var{id} must be 3 or greater. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. Parameter @var{c} set the colors of triangles (if @var{id}.ny=@var{c}.nx) or colors of vertexes (if @var{x}.nx=@var{c}.nx). See also @ref{triplot}, @ref{cont}, @ref{triangulation}. @end deftypefn @anchor{quadplot} @deftypefn {MGL command} {} quadplot idat xdat ydat ['sch'=''] @deftypefnx {MGL command} {} quadplot idat xdat ydat zdat ['sch'=''] @deftypefnx {MGL command} {} quadplot idat xdat ydat zdat cdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} QuadPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} QuadPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} QuadPlot (@code{const mglDataA &}id, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_quadplot_xy (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_quadplot_xyz (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_quadplot_xyzc (@code{HMGL} gr, @code{HCDT} id, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws the surface of quadrangles. Quadrangles vertexes are set by indexes @var{id} of data points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme. If string contain @samp{#} then wire plot is produced. First dimensions of @var{id} must be 4 or greater. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. Parameter @var{c} set the colors of quadrangles (if @var{id}.ny=@var{c}.nx) or colors of vertexes (if @var{x}.nx=@var{c}.nx). See also @ref{triplot}. @sref{triplot sample} @end deftypefn @anchor{dots} @deftypefn {MGL command} {} dots xdat ydat zdat ['sch'=''] @deftypefnx {MGL command} {} dots xdat ydat zdat adat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Dots (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Dots (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Dots (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}c, @code{const mglDataA &}a, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_dots (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dots_a (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @deftypefnx {C function} @code{void} mgl_dots_ca (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} c, @code{HCDT} a, @code{const char *}sch, @code{const char *}opt) @end ifclear The function draws the arbitrary placed points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme and kind of marks. If arrays @var{c}, @var{a} are specified then they define colors and transparencies of dots. You can use @ref{tens} plot with style @samp{ .} to draw non-transparent dots with specified colors. Arrays @var{x}, @var{y}, @var{z}, @var{a} must have equal sizes. See also @ref{crust}, @ref{tens}, @ref{mark}, @ref{plot}. @sref{dots sample} @end deftypefn @anchor{crust} @deftypefn {MGL command} {} crust xdat ydat zdat ['sch'=''] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Crust (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}sch=@code{""}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_crust (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}sch, @code{const char *}opt) @end ifclear The function reconstruct and draws the surface for arbitrary placed points @{@var{x}[i], @var{y}[i], @var{z}[i]@}. String @var{sch} sets the color scheme. If string contain @samp{#} then wire plot is produced. Arrays @var{x}, @var{y}, @var{z} must have equal sizes. See also @ref{dots}, @ref{triplot}. @c @sref{crust sample} @end deftypefn @c ################################################################## @external{} @node Nonlinear fitting, Data manipulation, Other plotting, MathGL core @section Nonlinear fitting @nav{} @cindex Fit @cindex FitS @cindex PutsFit @cindex mglFitPnts @cindex Fit2 @cindex Fit3 These functions fit data to formula. Fitting goal is to find formula parameters for the best fit the data points, i.e. to minimize the sum @math{\sum_i (f(x_i, y_i, z_i) - a_i)^2/s_i^2}. At this, approximation function @samp{f} can depend only on one argument @samp{x} (1D case), on two arguments @samp{x,y} (2D case) and on three arguments @samp{x,y,z} (3D case). The function @samp{f} also may depend on parameters. Normally the list of fitted parameters is specified by @var{var} string (like, @samp{abcd}). Usually user should supply initial values for fitted parameters by @var{ini} variable. But if he/she don't supply it then the zeros are used. Parameter @var{print}=@code{true} switch on printing the found coefficients to @var{Message} (see @ref{Error handling}). Functions Fit() and FitS() do not draw the obtained data themselves. They fill the data @var{fit} by formula @samp{f} with found coefficients and return it. At this, the @samp{x,y,z} coordinates are equidistantly distributed in the axis range. Number of points in @var{fit} is defined by option @code{value} (default is @var{mglFitPnts}=100). Note, that this functions use GSL library and do something only if MathGL was compiled with GSL support. @sref{Nonlinear fitting hints} @anchor{fits} @deftypefn {MGL command} {} fits res adat sdat 'func' 'var' [ini=0] @deftypefnx {MGL command} {} fits res xdat adat sdat 'func' 'var' [ini=0] @deftypefnx {MGL command} {} fits res xdat ydat adat sdat 'func' 'var' [ini=0] @deftypefnx {MGL command} {} fits res xdat ydat zdat adat sdat 'func' 'var' [ini=0] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} FitS (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const mglDataA &}s, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_fit_ys (@code{HMGL} gr, @code{HCDT} a, @code{HCDT} s, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_xys (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{HCDT} s, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_xyzs (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} a, @code{HCDT} s, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_xyzas (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{HCDT} s, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @end ifclear Fit data along x-, y- and z-directions for array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) with weight factor @var{s}[i,j,k]. @end deftypefn @anchor{fit} @deftypefn {MGL command} {} fit res adat 'func' 'var' [ini=0] @deftypefnx {MGL command} {} fit res xdat adat 'func' 'var' [ini=0] @deftypefnx {MGL command} {} fit res xdat ydat adat 'func' 'var' [ini=0] @deftypefnx {MGL command} {} fit res xdat ydat zdat adat 'func' 'var' [ini=0] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_fit_y (@code{HMGL} gr, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_xyza (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @end ifclear Fit data along x-, y- and z-directions for array specified parametrically @var{a}[i,j,k](@var{x}[i,j,k], @var{y}[i,j,k], @var{z}[i,j,k]) with weight factor 1. @end deftypefn @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{mglData} Fit2 (@code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit2 (@code{mglData &}fit, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit3 (@code{mglData &}fit, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Fit3 (@code{mglData &}fit, @code{const mglDataA &}a, @code{const char *}func, @code{const char *}var, @code{mglData &}ini, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_fit_2 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_fit_3 (@code{HMGL} gr, @code{HCDT} a, @code{const char *}func, @code{const char *}var, @code{HMDT} ini, @code{const char *}opt) Fit data along all directions for 2d or 3d arrays @var{a} with @var{s}=1 and @var{x}, @var{y}, @var{z} equidistantly distributed in axis range. @end deftypefn @end ifclear @anchor{putsfit} @deftypefn {MGL command} {} putsfit @code{x y} ['pre'='' 'fnt'='' @code{size=-1}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} PutsFit (@code{mglPoint} p, @code{const char *}prefix=@code{""}, @code{const char *}font=@code{""}, @code{mreal} size=@code{-1}) @deftypefnx {C function} @code{void} mgl_puts_fit (@code{HMGL} gr, @code{mreal} x, @code{mreal} y, @code{mreal} z, @code{const char *}prefix, @code{const char *}font, @code{mreal} size) @end ifclear Print last fitted formula with found coefficients (as numbers) at position @var{p0}. The string @var{prefix} will be printed before formula. All other parameters are the same as in @ref{Text printing}. @end deftypefn @ifclear UDAV @deftypefn {Method on @code{mglGraph}} @code{const char *}GetFit () @deftypefnx {C function only} @code{const char *} mgl_get_fit (@code{HMGL} gr) @deftypefnx {Fortran subroutine} @code{} mgl_get_fit (@code{long} gr, @code{char *}out, @code{int} len) Get last fitted formula with found coefficients (as numbers). @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{mreal} GetFitChi () @deftypefnx {C function} @code{mreal} mgl_get_fit_chi () Get \chi for last fitted formula. @end deftypefn @deftypefn {Method on @code{mglGraph}} @code{mreal} GetFitCovar () @deftypefnx {C function} @code{mreal} mgl_get_fit_covar () Get covariance matrix for last fitted formula. @end deftypefn @end ifclear @c ################################################################## @external{} @node Data manipulation, , Nonlinear fitting, MathGL core @section Data manipulation @nav{} @cindex Hist @cindex Fill @cindex DataGrid @deftypefn {MGL command} {} hist @sc{res} xdat adat @deftypefnx {MGL command} {} hist @sc{res} xdat ydat adat @deftypefnx {MGL command} {} hist @sc{res} xdat ydat zdat adat @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{mglData} Hist (@code{const mglDataA &}x, @code{const mglDataA &}a, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Hist (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}a, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{mglData} Hist (@code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}a, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_hist_x (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} a, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_hist_xy (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} a, @code{const char *}opt) @deftypefnx {C function} @code{HMDT} mgl_hist_xyz (@code{HMGL} gr, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} a, @code{const char *}opt) @end ifclear These functions make distribution (histogram) of data. They do not draw the obtained data themselves. These functions can be useful if user have data defined for random points (for example, after PIC simulation) and he want to produce a plot which require regular data (defined on grid(s)). The range for grids is always selected as axis range. Arrays @var{x}, @var{y}, @var{z} define the positions (coordinates) of random points. Array @var{a} define the data value. Number of points in output array @var{res} is defined by option @code{value} (default is @var{mglFitPnts}=100). @end deftypefn @deftypefn {MGL command} {} fill dat 'eq' @deftypefnx {MGL command} {} fill dat 'eq' vdat @deftypefnx {MGL command} {} fill dat 'eq' vdat wdat @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const mglDataA &}v, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglGraph}} @code{void} Fill (@code{mglData &}u, @code{const char *}eq, @code{const mglDataA &}v, @code{const mglDataA &}w, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_data_fill_eq (@code{HMGL} gr, @code{HMDT} u, @code{const char *}eq, @code{HCDT}v, @code{HCDT}w, @code{const char *}opt) @end ifclear Fills the value of array @samp{u} according to the formula in string @var{eq}. Formula is an arbitrary expression depending on variables @samp{x}, @samp{y}, @samp{z}, @samp{u}, @samp{v}, @samp{w}. Coordinates @samp{x}, @samp{y}, @samp{z} are supposed to be normalized in axis range. Variable @samp{u} is the original value of the array. Variables @samp{v} and @samp{w} are values of arrays @var{v}, @var{w} which can be @code{NULL} (i.e. can be omitted). @end deftypefn @deftypefn {MGL command} {} datagrid dat xdat ydat zdat @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{void} DataGrid (@code{mglData &}u, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_data_grid (@code{HMGL} gr, @code{HMDT} u, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{const char *}opt) @end ifclear Fills the value of array @samp{u} according to the linear interpolation of triangulated surface, found for arbitrary placed points @samp{x}, @samp{y}, @samp{z}. Interpolation is done at points equidistantly distributed in axis range. NAN value is used for grid points placed outside of triangulated surface. @sref{Making regular data} @end deftypefn @deftypefn {MGL command} {} refill dat xdat vdat [sl=-1] @deftypefnx {MGL command} {} refill dat xdat ydat vdat [sl=-1] @deftypefnx {MGL command} {} refill dat xdat ydat zdat vdat @ifclear UDAV @deftypefnx {Method on @code{mglData}} @code{void} Refill (@code{mglDataA &}dat, @code{const mglDataA &}x, @code{const mglDataA &}v, @code{long} sl=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglData}} @code{void} Refill (@code{mglDataA &}dat, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}v, @code{long} sl=@code{-1}, @code{const char *}opt=@code{""}) @deftypefnx {Method on @code{mglData}} @code{void} Refill (@code{mglDataA &}dat, @code{const mglDataA &}x, @code{const mglDataA &}y, @code{const mglDataA &}z, @code{const mglDataA &}v, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{void} mgl_data_refill_gr (@code{HMGL} gr, @code{HMDT} a, @code{HCDT} x, @code{HCDT} y, @code{HCDT} z, @code{HCDT} v, @code{long} sl, @code{const char *}opt) @end ifclear Fills by interpolated values of array @var{v} at the point @{@var{x}, @var{y}, @var{z}@}=@{@code{X[i], Y[j], Z[k]}@} (or @{@var{x}, @var{y}, @var{z}@}=@{@code{X[i,j,k], Y[i,j,k], Z[i,j,k]}@} if @var{x}, @var{y}, @var{z} are not 1d arrays), where @code{X,Y,Z} are equidistantly distributed in axis range and have the same sizes as array @var{dat}. If parameter @var{sl} is 0 or positive then changes will be applied only for slice @var{sl}. @end deftypefn @deftypefn {MGL command} {} pde @sc{res} 'ham' ini_re ini_im [@code{dz=0.1 k0=100}] @ifclear UDAV @deftypefnx {Method on @code{mglGraph}} @code{mglData} PDE (@code{const char *}ham, @code{const mglDataA &}ini_re, @code{const mglDataA &}ini_im, @code{mreal} dz=@code{0.1}, @code{mreal} k0=@code{100}, @code{const char *}opt=@code{""}) @deftypefnx {C function} @code{HMDT} mgl_pde_solve (@code{HMGL} gr, @code{const char *}ham, @code{HCDT} ini_re, @code{HCDT} ini_im, @code{mreal} dz, @code{mreal} k0, @code{const char *}opt) @end ifclear Solves equation du/dz = i*k0*@var{ham}(p,q,x,y,z,|u|)[u], where p=-i/k0*d/dx, q=-i/k0*d/dy are pseudo-differential operators. Parameters @var{ini_re}, @var{ini_im} specify real and imaginary part of initial field distribution. Coordinates @samp{x}, @samp{y}, @samp{z} are supposed to be normalized in axis range. Note, that really this ranges are increased by factor 3/2 for purpose of reducing reflection from boundaries. Parameter @var{dz} set the step along evolutionary coordinate z. At this moment, simplified form of function @var{ham} is supported -- all ``mixed'' terms (like @samp{x*p}->x*d/dx) are excluded. For example, in 2D case this function is effectively @math{ham = f(p,z) + g(x,z,u)}. However commutable combinations (like @samp{x*q}->x*d/dy) are allowed. Here variable @samp{u} is used for field amplitude |u|. This allow one solve nonlinear problems -- for example, for nonlinear Shrodinger equation you may set @code{ham="p^2 + q^2 - u^2"}. You may specify imaginary part for wave absorption, like @code{ham = "p^2 + i*x*(x>0)"}, but only if dependence on variable @samp{i} is linear (i.e. @math{ham = hre+i*him}). @sref{PDE solving hints} @end deftypefn @c ################################################################## @c @external{} @c @node IDTF functions, , Data manipulation, MathGL core @c @section IDTF functions @c @nav{} @c These functions provide IDTF specific features. In all other cases they do nothing. @c @ifclear UDAV @c @deftypefn {Method on @code{mglGraph}} @code{void} VertexColor (@code{bool} enable) @c Enables smooth color change. @c @end deftypefn @c @deftypefn {Method on @code{mglGraph}} @code{void} Compression (@code{bool} enable) @c Gives smaller files, but quality degrades. @c @end deftypefn @c inline void DoubleSided(bool){} // NOTE: Add later -- IDTF @c inline void TextureColor(bool){} // NOTE: Add later -- IDTF @c @end ifclear @external{} mathgl-8.0.1/texinfo/web_en.texi0000664000175000017500000007242714167366465016426 0ustar balakinbalakin@c ------------------------------------------------------------------ @chapter Website @nav{} @menu * Main:: * News:: * Features:: * Pictures:: @c * MGL scripts:: * Download:: * Other projects:: @end menu @external{} @node Main, News, , Website @section MathGL is ... @nav{} @ifhtml @html Surface in fog @end html @end ifhtml @itemize @bullet @item a library for making high-quality scientific graphics under Linux and Windows; @item a library for the fast data plotting and data processing of large data arrays; @item a library for working in window and console modes and for easy embedding into other programs; @item a library with large and growing set of graphics. @end itemize Now MathGL has more than 35000 lines of code, more than 55 general types of graphics for 1d, 2d and 3d data arrays, including special ones for chemical and statistical graphics. It can export graphics to raster and vector (EPS or SVG) formats. It has Qt, FLTK, OpenGL interfaces and can be used even from console programs. It has functions for data processing and script MGL language for simplification of data plotting. Also it has several types of transparency and smoothed lightning, vector fonts and TeX-like symbol parsing, arbitrary curvilinear coordinate system and many over useful things. It can be used from code written on C++/C/Fortran/Python/Octave and many other languages. Finally it is platform independent and free (under GPL v.2.0 license). There is a @uref{http://sourceforge.net/forum/?group_id=152187, forum} where you can ask a question or suggest an improvement. However the @uref{http://groups.google.com/group/mathgl, MathGL group} is preferable for quicker answer. For subscribing to @uref{http://groups.google.com/group/mathgl, MathGL group} you can use form below @ifhtml @html
Email:
@end html @end ifhtml @strong{About LGPL and GPL licenses.} Generally, MathGL is GPL library. However, you can use LGPL license for MathGL core and widgets if you don't use SWIG-based interfaces and disable GSL features. This can be done by using @code{lgpl} option at build time. According this, I've added the LGPL win32 binaries into @ref{Download} page. @strong{Latest news} @itemize @item @strong{12 January 2022} New version (v.8.0.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are increase accuracy at line segment skipping, changes in SOVERSION numbering, minor spelling fix (thanks to Rafael Laboissière). @item @strong{1 January 2022.} New version (v.8.0) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are change version numbering according Debian rules, and add accurate line segment and quadrangle/triangle face cutting at axis border crossing. @item @strong{8 December 2021.} New version (v.2.5) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are big improve in formula evaluation (user-defined function, summation and product, new functions for data interpolation), new plot kind @ref{dcont} and @ref{lines}, set of functions for random distributions, new data handling functions (like, @ref{keep}), extend @ref{ode} to solve PDE/cascade/etc, add mask for most of plotting functions and bugfixes, which denoted @ref{News, here}. @item @strong{8 July 2019.} New version (v.2.4.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are new @ref{minmax} for positions of local minimums and maximums, add @ref{conts} for coordinates of contour lines, extend formula evaluation to read and interpolate data files. @item @emph{17 May 2017.} New version (v.2.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are @code{mgllab} executable, string manipulation in MGL, new functions, plot types and styles, translation to Russian using @code{gettext} and bugfixes, which denoted @ref{News, here}. @end itemize There is detailed @ref{News, news list}. Sourceforge project page @uref{http://sourceforge.net/projects/mathgl/, here}. @ifhtml @html DATADVANCE @end html @end ifhtml Javascript interface was developed with support of @url{http://www.datadvance.net, DATADVANCE} company. @external{} @node News, Features, Main, Website @section News @nav{} @itemize @item @strong{12 January 2022} New version (v.8.0.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. @itemize @bullet @item Increase accuracy at line segment skipping. @item Changes in SOVERSION numbering. @item Minor spelling fix (thanks to Rafael Laboissière). @end itemize @item @strong{1 January 2022} New version (v.8.0) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. @itemize @bullet @item Change version numbering according Debian rules. @item Add accurate line segment and quadrangle/triangle face cutting at axis border crossing. @item Add @ref{fastcut} for disable accurate but slow line/trig/quad primitives cutting at axis borders. @item Restore back transparent background by default. You can set non-transparent background by using @ref{clf} or @ref{background} functions. @item Compatibility changes for Qt5.15 and MSVC. @strong{INCOMPATIBLE:} @item Change @ref{colorbar} C-functions by adding last argument for options. @item Add alpha-value in @ref{background}. @item Disable Qt4 interface by default. @end itemize @item @strong{8 December 2021} New version (v.2.5) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. @itemize @bullet @item Add functions @samp{sum}, @samp{prod} at formula evaluation, like @samp{sum(_i^2,5)} will produce @code{30=0+1^2+2^2+3^2+4^2}, and @samp{prod(1+_i,5)} will produce @code{120=5!}. You can nest them for variables @samp{_i},@samp{_j},...,@samp{_z}, like @samp{sum(sum(_j+_i^2,5),5)} will give @code{200}. @item Add user-defined functions @samp{fn1()}...@samp{fn9()} at formula evaluation, like @samp{fn1(3)\x^_1} will produce @code{x^3}. @item Add functions @samp{value}, @samp{spline} at formula evaluation, like @samp{value(a,5)} will give value of 6-th element of a, i.e. a[5]. @item Add @ref{keep} for keeping the data phase/sign or value along line @var{i} and @var{j} in given direction @item Add mglODEs() (i.e. extend @ref{ode}) for solving PDE, cascades and etc. @item Add @ref{dcont} to draw a set of curves, which are intersection of two isosurfaces at given level. @item Add @ref{lines} to draw a set of lines with arrows between points. @item Add @ref{first}, @ref{last} to get array of first/last indexes of values larger specified one along given direction. @item Add @ref{bernoulli}, @ref{binomial}, @ref{brownian}, @ref{discrete}, @ref{exponential}, @ref{gaussian}, @ref{shuffle}, @ref{uniform}, @ref{uniformint} for data filling by random numbers with different distributions. @item Add @ref{readbin} to read data from binary files. @item Add @ref{texparse} to enable/disable TeX-like command parsing at text output. @item Update @ref{ode}: regularization is used if dt*tmax<0 (total time may differ, but number of steps still the same). @item Add mgl_default_graph() -- the global (default) pointer to HMGL for keeping plot settings, simplifying external scripts and capture it in GUI. @item Add style @samp{p} in command @ref{smooth} to use parabolic smoothing of arbitrary points. @item Allow @ref{background} for scaling image, centering image and tessellate image as mosaic. @item Allow filling @ref{background} by the specified color. @item Allow masks for @ref{candle}, @ref{area}, @ref{region}, @ref{bars}, @ref{barh}, @ref{chart}, @ref{tape}, @ref{face}, @ref{polygon}, @ref{ellipse}, @ref{rhomb}. @item Allow single value specification for contour level in @ref{cont}, @ref{contd}, @ref{contp}, @ref{contv}, @ref{cont3}, @ref{dcont}, @ref{tricont}. @item Add mgl_dual_save_hdf(), mgl_real_save_hdf(), mgl_int_save_hdf() for saving single number in HDF5 file. Correspondingly, commands @ref{save} and @ref{savehdf} can save single value now. @item Add mgl_formula_calc(), mgl_formula_calc_c() for evaluating textual formulas of arbitrary set of data arrays. @item Add mglDataList -- global mglDataA* collection for viewing/changing in GUI data from external languages (like, Python, ...). @item Add Armadillo interface for mglData and mglDataC. @item If nsub parameter of command @ref{hist} is negative (nsub<0) then the linear interpolation is used instead of spline one. @item Add dark text colors for mgllab. @item Minor bugfixes. @item OBSOLETE: Qt4 interface will be disabled in the next release. @item OBSOLETE: Functions @ref{colorbar} will have extra argument @var{opt} for options, similarly to @ref{axis} and other plotting functions. In C++ and SWIG-based interfaces this change "masked" by providing the default value for the argument. @end itemize @item @strong{8 July 2019} New version (v.2.4.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. @itemize @bullet @item Add @ref{minmax} for positions of local maximums and minimums. @item Add ContGen() and ContFGen() to draw contour lines manually. Correspondingly @ref{cont} and @ref{contf} commands are extended. @item Add @ref{conts} for coordinate of contour lines. @item Extend @ref{put} for partial filling if data size(s) are smaller as destination. @item Classes mglFormula and mglFormulaC now can read file with given sizes if string have the format ":fname:x1:x2:y1:y2:z1:z2". Here data is supposed in range [x1,x2]*[y1,y2]*[z1,z2] (by default [0,1]*[0,1]*[0,1]). Calc() in this case return the interpolated values. @item mglData now have operator() which work as SubData() function. @item Minor bugfixes. @end itemize @item @strong{14 March 2019} New version (v.2.4.3) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. @itemize @bullet @item Add @ref{clabel} command for drawing colorbar labels. Should be used @strong{after} drawing colorbar! @item Extend @ref{ctick} command. @item Add subpixel smoothing for @ref{mask}. @item Boxes around @ref{text} (style @samp{@@}) now use actual height and position of the text. @item Add mask to EPS export. Note, @ref{mask} angles are reduced to 45*(0,1,...7) degrees for decreasing pattern size in the EPS. @item Update default masks: @samp{*} become dot, @samp{^} become bricks, @samp{d} become plus, @samp{D} become tacks, @samp{;} and @samp{j} change lengths. Note, you can use @code{brush.ods} to prepare user-defined masks. @item Add styles @samp{^} and @samp{_} for command @ref{smooth} to find upper/lower bound of the data. @item Improve @code{FlowP()} to draw both branches (in positive and negative time direction). @item Improve CGI interface and update website. @item Introduce struct @code{mdual} as interface for C and C++ complex numbers. It is implicitly converted to @code{std::complex<>} in C++. And need to call @code{c2mdual()} and @code{mdual2c()} in pure C. However @code{mdual} is binary compatible with C @code{_Complex} numbers. @item Add flag in CMake to manually disable support of C99 complex numbers. @item Bypass user-specified extension in base font family name. @item Improve hints in @code{mgllab} and @code{udav}. @item Add utility @code{mgltask} for making output file with a set of copies of mask-file. It useful for making set of initial conditions with a few parameters varied in specified range. @item Add example of @ref{OpenGL output}. @item Bugfix for approximate min and max position. @item Bugfix for position of SVG output. @item Compatibility fixes for new versions of CMake, compilers and libraries. @strong{INCOMPATIBLE:} @item Formally pure C interface handle complex numbers by new way due to strict following of C/C++ standards. However, the MathGL library is binary compatible with previous version(s). @end itemize @item @strong{31 March 2018.} Bugfix version (v.2.4.2.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. @item @strong{21 March 2018.} New version (v.2.4.2) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. @itemize @bullet @item Add custom dialog for FLTK widgets. This can be constructed from C/C++ code, or from MGL script using @ref{Special comments}. @item Add @ref{progress} for displaying the progress of execution (by '#' symbols in console, or by progress-bar widget). @item Add @ref{contp} for contour lines on parametrically specified surface. @item Add @ref{flow3} for flow threads of 3D vector field, which start from the plain. @item Add variant of @ref{flow} for drawing a flow thread, starting from specified point. @item Add @ref{scaletext} for disabling text size scaling in relative @ref{inplot}-s (like @ref{columnplot}, ...). @item Add @ref{setup} for setting all low-level flags. @item Add @ref{coil} for projecting periodical data. @item Add modulo operation @samp{@code{%}} (@code{x%y=fmod(x,y)}) to the list of known operations in real-valued formulas. @item Add style @samp{.} for @ref{cont} to draw contour lines from saddle points. @item Add style @samp{.} for @ref{flow} to draw flow thread from saddle points. @item Add option @code{value} in @ref{tube} for setting number of edges manually. @item Crop output of @ref{ode} if NAN or INFINITY value occurs. @item Remove style @samp{~} for @ref{plot} and @ref{tens}. Now, all curves try to omit points. @item Add setup flag @code{MGL_FULL_CURV} which disable omitting points of curve. @item Shift axis labels closer to @ref{axis}. @item Change size of LaTeX-like commands @code{\sup, \sub} to be the same as @code{\overset, \underset}. @item Change ticks drawing in @ref{colorbar}. @item Add new section @ref{All samples} of documentation with large set of samples for most of MathGL features. @item Samples in documentation are generated automatically now (from @code{sample.cpp}). @item @strong{INCOMPATIBLE:} Make obsolete MGL command @ref{setsizescl}. At this, the similar C/C++/Fortran/... functions still working. @item Bugfixes. @end itemize @item @strong{20 July 2017.} New version (v.2.4.1) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. @itemize @bullet @item Add @ref{beltc} plot, which is @ref{belt} with manual coloring. @item Add style @samp{~} for @ref{plot} and @ref{tens} to omit some points at output. @item Add style @samp{:} for @ref{axis} to draw lines through point (0,0,0). @item Bugfixes. @end itemize @item @strong{17 May 2017.} New version (v.2.4) of @uref{http://sourceforge.net/projects/mathgl, MathGL} is released. There are @code{mgllab} executable, string manipulation in MGL, new functions, plot types and styles, translation to Russian using @code{gettext} and bugfixes: @itemize @bullet @item Add @code{mgllab} executable, which is FLTK based version of @code{UDAV}. So, most things @code{mgllab} do faster. @item Add string manipulation in MGL language: @itemize @bullet @item 'str'[n] -- get string of only n-th symbol; @item 'str'+v -- add value v to the last character of the string; @item 'str',val or 'str',!val -- append numeric value to the string (as before). @end itemize @item Add time value to MGL language in format: @samp{hh-mm-ss_DD.MM.YYYY} or @samp{hh-mm-ss} or @samp{DD.MM.YYYY}. @item Add @ref{iris} plot to show cross-dependencies of several data arrays. @item Add @ref{flame2d} to draw flame fractals. @item Add @ref{bbox} to set bounding box for 2D output. @item Add @ref{section} to get part of data between specified values. @item Add @ref{detect} to found curves along data maximums. @item Add @ref{dilate} to extend the region of 1-th value. @item Add @ref{erode} to narrow the region of 1-th value. @item Add @ref{apde} to solve PDE equation in inhomogeneous nonlinear media with spatial dispersion. @item Add @ref{symbol} to draw the glyphs defined by @ref{addsymbol}. @item Add @ref{addsymbol} to declare user-defined symbol (or glyph), which can be used as markers for plot (with style '&') or drawn itself by @ref{symbol} command. @item Add @ref{openhdf} to open all data arrays from HDF file. @item Extend @ref{crop} to cut to optimal size for FFT (i.e. to closest of 2^n*3^m*5^l). @item Add function mgl_data_max_first() and data suffixes .m[xyz][fl] to find first/last maximum along direction (see @ref{Data information}). @item Add function mgl_datac_diff_par() to parametric derivative of complex data (see @ref{diff}). @item Add style @samp{F} for @ref{bars} and @ref{barh} to set fixed bar widths. @item Add style @samp{a} for @ref{plot}, @ref{tens}, @ref{area} and @ref{region} to accurate drawing of data, which partially lie out of axis range. @item Add style @samp{#} for @ref{region} to draw wired plot. @item Add possibility of manual shift in @ref{multiplot}. @item Add parsing arguments of options for MGL commands. @item MGL command @ref{correl} now can perform 2d and 3d correlations. @item Option @ref{meshnum} now change the number of drawn markers for @ref{plot}, @ref{tens}, @ref{step}, @ref{mark} and @ref{textmark}. @item Function @ref{step} handle data with x.nx>y.nx similarly to @ref{bars}. @item Extend @ref{tile} and @ref{tiles} by adding manual coloring and face orientation. @item Add variant of MGL command @ref{copy} to copy data with "incorrect" names. @item Improve tick labels drawing. @item Improve time-ticks (add weeks) and add subticks to its. @item Improve @ref{fplot} to handle several singularities. @item Add LaTeX command \dfrac@{@}@{@}. This is full-sized version of \frac@{@}@{@}. Unfortunately, there is no support of nesting. Contrary, \frac allow nesting. @item Add mglODEc() -- ODE solver for complex variables (see @ref{ode}). @item Add cmplx(a,b)=a+i*b to the list of known functions in formula parsing @item Update CMake find_package to find MathGL. @item Increase line width for wired text. @item Update documentation: add description of new commands, add hint @ref{Mixing bitmap and vector output}. @item Add translation to Russian for most of labels and messages. @item Name @code{all} are reserved in MGL scripts now as synonym of -1. @item INCOMPATIBLE: Replace libmgl-qt by libmgl-qt4 and libmgl-qt5 for resolving conflicts of simultaneously installed both Qt4 and Qt5. @item Minor bugfixes. @end itemize @item @strong{20 June 2016.} Version 2.3.5.1 was released. @item @strong{16 May 2016.} Version 2.3.5 was released. @item @strong{13 February 2016.} Version 2.3.4 was released. @item @strong{1 June 2015.} Version 2.3.3 was released. @item @strong{2 February 2015.} Version 2.3.2 was released. @item @strong{21 October 2014.} Version 2.3.1 was released. @item @strong{7 August 2014.} Version 2.3 was released. @item @strong{19 March 2014.} Version 2.2.2.1 was released. @item @strong{10 March 2014.} Version 2.2.2 was released. @item @strong{22 January 2014.} Version 2.2.1 was released. @item @strong{11 November 2013.} Version 2.2 was released. @item @strong{8 May 2013.} Version 2.1.3.1 was released. @item @strong{2 May 2013.} Version 2.1.3 was released. @item @strong{28 January 2013.} Version 2.1.2 was released. @item @strong{24 December 2012.} Version 2.1.1 was released. @item @strong{13 December 2012.} Version 2.1 was released. @item @strong{23 August 2011.} Version 2.0.beta was released. @item @strong{30 May 2011.} Version 1.11.2 was released. @item @strong{8 November 2010.} Version 1.11 was released. @item @strong{28 December 2009.} Version 1.10 was released. @item @strong{8 July 2009.} Version 1.9 was released. @item @strong{27 November 2008.} Version 1.8 was released. @item @strong{5 June 2008.} Version 1.7 was released. @item @strong{17 March 2008.} Version 1.6 was released. @item @strong{11 January 2008.} Version 1.5 was released. @item @strong{30 October 2007.} Version 1.4 was released. @item @strong{15 October 2007.} Version 1.3 was released. @item @strong{10 September 2007.} Version 1.2 was released. @item @strong{23 May 2007.} Version 1.1 was released. @item @strong{2 April 2007.} Version 1.0 was released. @item @strong{24 January 2007.} First public release (v.0.8). @end itemize @external{} @node Features, Pictures, News, Website @section Features @nav{} MathGL can plot a wide range of graphics. It includes: @itemize @bullet @item one-dimensional: @ref{plot}, @ref{area}, @ref{bars}, @ref{step}, @ref{stem}, @ref{torus}, @ref{chart}, @ref{error}, @ref{tube}, @ref{mark}, (@ref{1D plotting}); @item two-dimensional plots: @ref{mesh}, @ref{surf}, @ref{dens}, @ref{cont}, @ref{contf}, @ref{boxs}, @ref{axial}, @ref{fall}, @ref{belt}, @ref{tile}, including surfaces transparent (@ref{surfa}) or colored (@ref{surfc}) by another data (@ref{2D plotting}); @item three-dimensional plots: @ref{surf3}, @ref{dens3}, @ref{cont3}, @ref{contf3}, @ref{cloud}-like, including isosurfaces transparent (@ref{surf3a}) or colored (@ref{surf3c}) by another data (@ref{3D plotting}); @item vector fields plots: vector fields @ref{vect}, @ref{vect3} and @ref{traj}, @ref{flow} threads, flow @ref{pipe}, @ref{map} chart, and so on (@ref{Vector fields}); @item and so on. See also @ref{All samples}. @end itemize In fact, I created the functions for drawing of all the types of scientific plots that I know. The list of plots is growing; if you need some special type of a plot then please email me @email{mathgl.abalakin@@gmail.com, e-mail} and it will appear in the new version. I tried to make plots as nice looking as possible: e.g., a surface can be transparent and highlighted by several (up to 10) light sources. Most of the drawing functions have 2 variants: simple one for the fast plotting of data, complex one for specifying of the exact position of the plot (including parametric representation). Resulting image can be saved in bitmap PNG, JPEG, TGA, BMP format, or in vector EPS, SVG or TeX format, or in 3D formats OBJ, OFF, STL or in PRC format. All texts are drawn by vector fonts, which allows for high scalability and portability. Texts may contain commands for: some of the TeX-like symbols, changing index (upper or lower indexes) and the style of font inside the text string. Texts of ticks are rotated with axis rotation. It is possible to create a legend of plot and put text in an arbitrary position on the plot. Arbitrary text encoding (by the help of function @code{setlocale()}) and UTF-16 encoding are supported. Special class mglData is used for data encapsulation. In addition to a safe creation and deletion of data arrays it includes functions for data processing (smoothing, differentiating, integrating, interpolating and so on) and reading of data files with automatic size determination. Class mglData can handle arrays with up to three dimensions (arrays which depend on up to 3 independent indexes @math{a_@{ijk@}}). Using an array with higher number of dimensions is not meaningful, because I do not know how it can be plotted. Data filling and modification may be done manually or by textual formulas. There is fast evaluation of a textual mathematical expression. It is based on string precompilation to tree-like code at the creation of class instance. At evaluation stage code performs only fast tree-walk and returns the value of the expression. In addition to changing data values, textual formulas are also used for drawing in @emph{arbitrary} curvilinear coordinates. A set of such curvilinear coordinates is limited only by user's imagination rather than a fixed list like: polar, parabolic, spherical, and so on. @external{} @node Pictures, Download, Features, Website @section Pictures @nav{} @include samples_list.texi @external{} @node Download, Other projects, Pictures, Website @section Download @nav{} @strong{Stable version (v.@value{VERSION})} You may download current version of MathGL for following configurations: @itemize @bullet @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.tar.gz, Source} file with cmake build system. @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.win32.7z,GPL} or @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-mingw.win32.7z,LGPL} binaries for MinGW, 32-bit build for Pentium IV. @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}-mingw.win64.7z,GPL} or @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.LGPL-mingw.win64.7z,LGPL} binaries for MinGW, 64-bit build. @item MathGL utilities with all required DLL files for @uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.win32.7z,32-bit} and @uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.win64.7z,64-bit} versions of MS Windows. MathGL utilities with all required DLL files for @uref{http://downloads.sourceforge.net/mathgl/mgl_scripts-@value{VERSION}.win64.7z,64-bit} versions of MS Windows. @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-@value{VERSION}@value{MINVER}.eng.pdf,PDF} documentation in English. @item @uref{http://downloads.sourceforge.net/mathgl/mathgl-doc-html-@value{VERSION}@value{MINVER}.7z, Archive} with HTML documentation and figures. @c @item @c @uref{http://downloads.sourceforge.net/mathgl/mathgl_slides-1.9.pdf,PDF} slideshow of main features @end itemize @strong{Font files} There are a set of @uref{http://sourceforge.net/project/showfiles.php?group_id=152187&package_id=267177,font files} for MathGL with following typefaces. Note, that the set of glyphs can be less than in default font. As result not all TeX symbols can be displayed. @itemize @bullet @item @uref{http://downloads.sourceforge.net/mathgl/STIX_font.tgz,STIX} font -- default font for MathGL. @item @uref{http://downloads.sourceforge.net/mathgl/adventor_font.tgz,Adventor font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} sansserif font based on the URW Gothic L family (like Avant Garde Gothic). @item @uref{http://downloads.sourceforge.net/mathgl/bonum_font.tgz,Bonum font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} serif font based on the URW Bookman L family. @item @uref{http://downloads.sourceforge.net/mathgl/chorus_font.tgz,Chorus font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} font based on the URW Chancery L Medium Italic. @item @uref{http://downloads.sourceforge.net/mathgl/cursor_font.tgz,Cursor font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} monospaced serif font based on the URW Nimbus Mono L (like Courier). @item @uref{http://downloads.sourceforge.net/mathgl/heros_font.tgz,Heros font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} sansserif font based on the URW Nimbus Sans L (like Helvetica). @item @uref{http://downloads.sourceforge.net/mathgl/heroscn_font.tgz,HerosCN font} -- the "compressed" version of previous one. @item @uref{http://downloads.sourceforge.net/mathgl/pagella_font.tgz,Pagella font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} serif font based on the URW Palladio L (like Palatino). @item @uref{http://downloads.sourceforge.net/mathgl/schola_font.tgz,Schola font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} serif fonts is based on the URW Century Schoolbook L. @item @uref{http://downloads.sourceforge.net/mathgl/termes_font.tgz,Termes font} -- the @uref{http://www.gust.org.pl/projects/e-foundry/tex-gyre/index_html,TeX Gyre} serif fonts is based on the Nimbus Roman No9 L (like Times). @end itemize @external{} @node Other projects, , Download, Website @section Other projects @nav{} Except scientific (non public) projects I also have some general interest projects: @itemize @bullet @item @uref{http://sourceforge.net/projects/pocketmk/, PocketMK} is small program for PocketPC which simulate famous Russian calculators MK-61 and slightly extend it. @item @uref{http://udav.sourceforge.net/,UDAV} is front-end for MGL scripts. It has windows interface for data viewing, changing and plotting. Also it can execute MGL scripts, setup and rotating graphics and so on. @end itemize Also I recommend to look at: @itemize @bullet @item @uref{http://englab.bugfest.net/,EngLab} is a cross-compile mathematical platform with a C like syntax intended to be used both by engineers and users with small programming knowledge. It is extremely scalable and allows users and the community to easily compile their own functions as shared objects. @item @uref{http://threedepict.sourceforge.net/,3Depict} is software for analysis of scientific datasets commonly encountered in atom probe tomography. You can manipulate, interact with and analyse point based datasets. @item @uref{http://www.sourceforge.net/projects/graphplot/,Graphplot} is function plotter based on MathGL. @item @uref{http://www.sourceforge.net/projects/graphplot/,OscillViewer} is oscilloscope monitoring program. Working with L-Card 14-140 AD-Convertor. Based on Qt and MathGL libraries. @end itemize Finally, few links to free software and libraries: @itemize @bullet @item @uref{http://www.thefreecountry.com/,thefreecountry.com} have a lot of Free Programmers', Webmasters' and Security Resources @item @uref{http://gnuwin32.sourceforge.net/,GnuWin} provides ports of tools with a GNU or similar open source license, to modern MS-Windows. @item @uref{http://loll.sourceforge.net/,LLoL} is project collecting, organising, classifying, and maintaining important URLs about Linux and the Open Source movement for all levels of Linux users. The LoLL project now has 4000+ links which are updated usually on a daily basis. @end itemize @external{} mathgl-8.0.1/texinfo/filter.py0000775000175000017500000000152714167366465016127 0ustar balakinbalakin#!/usr/bin/python import os,string,re,glob print 'Tuning resulting html files for Qt\n' beginskip=0 for filename in glob.glob('./*ru.html/*html'): fpin=open(filename,'r') fpout=open(filename+'.tmp','w') for line in fpin.readlines(): if re.search('',line): beginskip=1 fpout.write(line) continue if re.search('',line): beginskip=0 if re.search('',line): continue if re.search('} and provide base methods for handling window with MathGL graphics. Inherited classes are exist for QT and FLTK widget libraries: @code{mglQT} in @code{#include }, @code{mglFLTK} in @code{#include }. @deftypefn {Method on @code{mglWnd}} @code{int} Run () @deftypefnx {C function} @code{int} mgl_qt_run () @deftypefnx {C function} @code{int} mgl_fltk_run () Run main loop for event handling. Usually it should be called in a separate thread or as last function call in @code{main()}. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} SetDrawFunc (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{void *}par=@code{NULL}, @code{void} (*reload)(@code{void *}p)=@code{NULL}) @deftypefnx {Method on @code{mglWnd}} @code{void} SetDrawFunc (@code{int} (*draw)(@code{mglGraph *}gr)) @deftypefnx {Method on @code{mglWnd}} @code{void} SetDrawFunc (@code{mglDraw *}obj) @deftypefnx {C function} @code{void} mgl_wnd_set_func (@code{HMGL} gr, @code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{void *}par, @code{void} (*reload)(@code{void *}p)) Set callback functions for drawing (@var{draw}) and data reloading (@var{reload}), or instance @var{obj} of a class derived from @code{mglDraw}. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} SetClickFunc (@code{void} (*func)(@code{HMGL} gr, @code{void *}p)) @deftypefnx {C function} @code{void} mgl_set_click_func (@code{void} (*func)(@code{HMGL} gr, @code{void *}p)) Set callback function @var{func} which will be called on mouse click. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} SetMutex(@code{pthread_mutex_t *}mutex) @deftypefnx {C function} @code{void} mgl_wnd_set_mutex(@code{HMGL} gr, @code{pthread_mutex_t *}mutex) Set external mutex for lock/unlock external calculations by widget. This functions is called automatically at using @ref{mglDraw class}. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} ToggleAlpha () @deftypefnx {C function} @code{void} mgl_wnd_toggle_alpha (@code{HMGL} gr) Switch on/off transparency but do not overwrite switches in user drawing function. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} ToggleLight () @deftypefnx {C function} @code{void} mgl_wnd_toggle_light (@code{HMGL} gr) Switch on/off lighting but do not overwrite switches in user drawing function. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} ToggleRotate () @deftypefnx {C function} @code{void} mgl_wnd_toggle_rotate (@code{HMGL} gr) Switch on/off rotation by mouse. Usually, left button is used for rotation, middle button for shift, right button for zoom/perspective. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} ToggleZoom () @deftypefnx {C function} @code{void} mgl_wnd_toggle_zoom (@code{HMGL} gr) Switch on/off zooming by mouse. Just select rectangular region by mouse and it will be zoomed in. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} ToggleNo () @deftypefnx {C function} @code{void} mgl_wnd_toggle_no (@code{HMGL} gr) Switch off all zooming and rotation and restore initial state. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} Update () @deftypefnx {C function} @code{void} mgl_wnd_update (@code{HMGL} gr) Update window contents. This is very useful function for manual updating the plot while long calculation was running in parallel thread. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} ReLoad () @deftypefnx {C function} @code{void} mgl_wnd_reload (@code{HMGL} gr) Reload user data and update picture. This function also update number of frames which drawing function can create. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} Adjust () @deftypefnx {C function} @code{void} mgl_wnd_adjust (@code{HMGL} gr) Adjust size of bitmap to window size. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} NextFrame () @deftypefnx {C function} @code{void} mgl_wnd_next_frame (@code{HMGL} gr) Show next frame if one. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} PrevFrame () @deftypefnx {C function} @code{void} mgl_wnd_prev_frame (@code{HMGL} gr) Show previous frame if one. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} Animation () @deftypefnx {C function} @code{void} mgl_wnd_animation (@code{HMGL} gr) Run/stop slideshow (animation) of frames. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} SetDelay (@code{double} dt) @deftypefnx {C function} @code{void} mgl_wnd_set_delay (@code{HMGL} gr, @code{double} dt) Sets delay for animation in seconds. Default value is 1 sec. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{double} GetDelay () @deftypefnx {C function} @code{double} mgl_wnd_get_delay (@code{HMGL} gr) Gets delay for animation in seconds. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void} Setup (@code{bool} clfupd=@code{true}, @code{bool} showpos=@code{false}) @deftypefnx {C function} @code{void} mgl_setup_window (@code{HMGL} gr, @code{bool} clfupd, @code{bool} showpos) Enable/disable flags for: @itemize @bullet @item clearing plot before Update(); @item showing the last mouse click position in the widget. @end itemize @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{mglPoint} LastMousePos () @deftypefnx {C function} @code{void} mgl_get_last_mouse_pos (@code{HMGL} gr, @code{mreal *}x, @code{mreal *}y, @code{mreal *}z) Gets last position of mouse click. @end deftypefn @deftypefn {Method on @code{mglWnd}} @code{void *} Widget () @deftypefnx {C function} @code{void *} mgl_fltk_widget (@code{HMGL} gr) @deftypefnx {C function} @code{void *} mgl_qt_widget (@code{HMGL} gr) Return pointer to widget (@ref{Fl_MathGL class} or @ref{QMathGL class}) used for plotting. @end deftypefn @c ------------------------------------------------------------------ @external{} @node mglDraw class, Fl_MathGL class, mglWnd class, Widget classes @section mglDraw class @nav{} @cindex mglDraw This class provide base functionality for callback drawing and running calculation in separate thread. It is defined in @code{#include }. You should make inherited class and implement virtual functions if you need it. @deftypefn {Virtual method on @code{mglDraw}} @code{int} Draw (@code{mglGraph *}gr) This is callback drawing function, which will be called when any redrawing is required for the window. There is support of a list of plots (frames). So as one can prepare a set of frames at first and redraw it fast later (but it requires more memory). Function should return positive number of frames for the list or zero if it will plot directly. @end deftypefn @deftypefn {Virtual method on @code{mglDraw}} @code{void} Reload () This is callback function, which will be called if user press menu or toolbutton to reload data. @end deftypefn @deftypefn {Virtual method on @code{mglDraw}} @code{void} Click () This is callback function, which will be called if user click mouse. @end deftypefn @deftypefn {Virtual method on @code{mglDraw}} @code{void} Calc () This is callback function, which will be called if user start calculations in separate thread by calling @code{mglDraw::Run()} function. It should periodically call @code{mglDraw::Check()} function to check if calculations should be paused. @end deftypefn @deftypefn {Method on @code{mglDraw}} @code{void} Run () Runs @code{mglDraw::Calc()} function in separate thread. It also initialize @code{mglDraw::thr} variable and unlock @code{mglDraw::mutex}. Function is present only if FLTK support for widgets was enabled. @end deftypefn @deftypefn {Method on @code{mglDraw}} @code{void} Cancel () Cancels thread with calculations. Function is present only if FLTK support for widgets was enabled. @end deftypefn @deftypefn {Method on @code{mglDraw}} @code{void} Pause () Pauses thread with calculations by locking @code{mglDraw::mutex}. You should call @code{mglDraw::Continue()} to continue calculations. Function is present only if FLTK support for widgets was enabled. @end deftypefn @deftypefn {Method on @code{mglDraw}} @code{void} Continue () Continues calculations by unlocking @code{mglDraw::mutex}. Function is present only if FLTK support for widgets was enabled. @end deftypefn @deftypefn {Method on @code{mglDraw}} @code{void} Continue () Checks if calculations should be paused and pause it. Function is present only if FLTK support for widgets was enabled. @end deftypefn @c ------------------------------------------------------------------ @external{} @node Fl_MathGL class, QMathGL class, mglDraw class, Widget classes @section Fl_MathGL class @nav{} @cindex Fl_MathGL @cindex widgets Class is FLTK widget which display MathGL graphics. It is defined in @code{#include }. @fig{fltk, Example of FLTK window with MathGL plot.} @deftypemethod Fl_MathGL @code{void} set_draw (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p)) @deftypemethodx Fl_MathGL @code{void} set_draw (@code{int} (*draw)(@code{mglGraph *}gr)) @deftypemethodx Fl_MathGL @code{void} set_draw (@code{mglDraw *}draw) Sets drawing function as global function or as one from a class @code{mglDraw}. There is support of a list of plots (frames). So as one can prepare a set of frames at first and redraw it fast later (but it requires more memory). Function should return positive number of frames for the list or zero if it will plot directly. Parameter @var{par} contains pointer to data for the plotting function @var{draw}. @end deftypemethod @deftypemethod Fl_MathGL @code{mglDraw *}get_class () Get pointer to @code{mglDraw} class or @code{NULL} if absent. @end deftypemethod @deftypemethod Fl_MathGL @code{void} update () Update (redraw) plot. @end deftypemethod @deftypemethod Fl_MathGL @code{void} set_angle (@code{mreal} t, @code{mreal} p) Set angles for additional plot rotation @end deftypemethod @deftypemethod Fl_MathGL @code{void} set_flag (@code{int} f) Set bitwise flags for general state (1-Alpha, 2-Light) @end deftypemethod @deftypemethod Fl_MathGL @code{void} set_state (@code{bool} r, @code{bool} z) Set flags for handling mouse: @var{z}=@code{true} allow zooming, @var{r}=@code{true} allow rotation/shifting/perspective and so on. @end deftypemethod @deftypemethod Fl_MathGL @code{void} set_zoom (@code{mreal} X1, @code{mreal} Y1, @code{mreal} X2, @code{mreal} Y2) Set zoom in/out region @end deftypemethod @deftypemethod Fl_MathGL @code{void} get_zoom (@code{mreal *}X1, @code{mreal *}Y1, @code{mreal *}X2, @code{mreal *}Y2) Get zoom in/out region @end deftypemethod @deftypemethod Fl_MathGL @code{void} set_popup (@code{const Fl_Menu_Item *}pmenu, @code{Fl_Widget *}w, @code{void *}v) Set popup menu pointer @end deftypemethod @deftypemethod Fl_MathGL @code{void} set_graph (@code{HMGL} gr) @deftypemethodx Fl_MathGL @code{void} set_graph (@code{mglGraph *}gr) Set new grapher instead of built-in one. Note that Fl_MathGL will automatically delete this object at destruction or at new @code{set_graph()} call. @end deftypemethod @deftypemethod Fl_MathGL @code{HMGL} get_graph () Get pointer to grapher. @end deftypemethod @deftypemethod Fl_MathGL @code{void} set_show_warn (@code{bool} val) Show window with warnings after script parsing. @end deftypemethod @deftypemethod Fl_MathGL @code{void} stop (@code{bool} stop=@code{true}) Ask to stop of script parsing. @end deftypemethod @deftypemethod Fl_MathGL @code{void} set_handle_key (@code{bool} val) Enable/disable key handling as in mglview (default is false). @end deftypemethod @deftypemethod Fl_MathGL @code{int} get_last_id () Get id of last clicked object. @end deftypemethod @deftypemethod Fl_MathGL @code{bool} running () Check if script is parsing now or not. @end deftypemethod @deftypecv {Fl_MathGL option} Fl_MathGL @code{Fl_Valuator *} tet_val Pointer to external tet-angle validator. @end deftypecv @deftypecv {Fl_MathGL option} Fl_MathGL @code{Fl_Valuator *} phi_val Pointer to external phi-angle validator. @end deftypecv @c ------------------------------------------------------------------ @external{} @node QMathGL class, wxMathGL class, Fl_MathGL class, Widget classes @section QMathGL class @nav{} @cindex QMathGL @cindex widgets Class is Qt widget which display MathGL graphics. It is defined in @code{#include }. @fig{qt, Example of Qt window with MathGL plot.} @deftypemethod QMathGL @code{void} setDraw (@code{mglDraw *}dr) Sets drawing functions from a class inherited from @code{mglDraw}. @end deftypemethod @deftypemethod QMathGL @code{void} setDraw (@code{int (*}draw@code{)(mglBase *}gr, @code{void *}p@code{)}, @code{void *}par=@code{NULL}) @deftypemethodx QMathGL @code{void} setDraw (@code{int (*}draw@code{)(mglGraph *}gr@code{)}) Sets the drawing function @var{draw}. There is support of a list of plots (frames). So as one can prepare a set of frames at first and redraw it fast later (but it requires more memory). Function should return positive number of frames for the list or zero if it will plot directly. Parameter @var{par} contains pointer to data for the plotting function @var{draw}. @end deftypemethod @deftypemethod QMathGL @code{void} setGraph (@code{HMGL} gr) @deftypemethodx QMathGL @code{void} setGraph (@code{mglGraph *}gr) Set pointer to external grapher (instead of built-in one). Note that QMathGL will automatically delete this object at destruction or at new @code{setGraph()} call. @end deftypemethod @deftypemethod QMathGL @code{HMGL} getGraph () Get pointer to grapher. @end deftypemethod @deftypemethod QMathGL @code{void} setPopup (@code{QMenu *}p) Set popup menu pointer. @end deftypemethod @deftypemethod QMathGL @code{void} setSize (@code{int} w, @code{int} h) Set widget/picture sizes @end deftypemethod @deftypemethod QMathGL @code{double} getRatio () Return aspect ratio of the picture. @end deftypemethod @deftypemethod QMathGL @code{int} getPer () Get perspective value in percents. @end deftypemethod @deftypemethod QMathGL @code{int} getPhi () Get Phi-angle value in degrees. @end deftypemethod @deftypemethod QMathGL @code{int} getTet () Get Theta-angle value in degrees. @end deftypemethod @deftypemethod QMathGL @code{bool} getAlpha () Get transparency state. @end deftypemethod @deftypemethod QMathGL @code{bool} getLight () Get lightning state. @end deftypemethod @deftypemethod QMathGL @code{bool} getZoom () Get mouse zooming state. @end deftypemethod @deftypemethod QMathGL @code{bool} getRotate () Get mouse rotation state. @end deftypemethod @deftypefn {Slot on @code{QMathGL}} @code{void} refresh () Redraw saved bitmap without executing drawing function. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} update () Update picture by executing drawing function. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} copy () Copy graphics to clipboard. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} copyClickCoor () Copy coordinates of click (as text). @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} print () Print current picture. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} stop () Send signal to stop drawing. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} adjust () Adjust image size to fit whole widget. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} nextSlide () Show next slide. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} prevSlide () Show previous slide. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} animation (@code{bool} st=@code{true}) Start/stop animation. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} setPer (@code{int} val) Set perspective value. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} setPhi (@code{int} val) Set Phi-angle value. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} setTet (@code{int} val) Set Theta-angle value. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} setAlpha (@code{bool} val) Switch on/off transparency. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} setLight (@code{bool} val) Switch on/off lightning. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} setGrid (@code{bool} val) Switch on/off drawing of grid for absolute coordinates. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} setZoom (@code{bool} val) Switch on/off mouse zooming. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} setRotate (@code{bool} val) Switch on/off mouse rotation. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} zoomIn () Zoom in graphics. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} zoomOut () Zoom out graphics. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} shiftLeft () Shift graphics to left direction. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} shiftRight () Shift graphics to right direction. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} shiftUp () Shift graphics to up direction. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} shiftDown () Shift graphics to down direction. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} restore () Restore zoom and rotation to default values. @end deftypefn @c @deftypefn {Slot on @code{QMathGL}} @code{void} reload () @c Reload data and redraw graphics. @c @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportPNG (@code{QString} fname=@code{""}) Export current picture to PNG file. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportPNGs (@code{QString} fname=@code{""}) Export current picture to PNG file (no transparency). @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportJPG (@code{QString} fname=@code{""}) Export current picture to JPEG file. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportBPS (@code{QString} fname=@code{""}) Export current picture to bitmap EPS file. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportEPS (@code{QString} fname=@code{""}) Export current picture to vector EPS file. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportSVG (@code{QString} fname=@code{""}) Export current picture to SVG file. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportGIF (@code{QString} fname=@code{""}) Export current picture to GIF file. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportTEX (@code{QString} fname=@code{""}) Export current picture to LaTeX/Tikz file. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportTGA (@code{QString} fname=@code{""}) Export current picture to TGA file. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportXYZ (@code{QString} fname=@code{""}) Export current picture to XYZ/XYZL/XYZF file. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportOBJ (@code{QString} fname=@code{""}) Export current picture to OBJ/MTL file. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportSTL (@code{QString} fname=@code{""}) Export current picture to STL file. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} exportOFF (@code{QString} fname=@code{""}) Export current picture to OFF file. @end deftypefn @c @deftypefn {Slot on @code{QMathGL}} @code{void} exportX3D (@code{QString} fname=@code{""}) @c Export current picture to X3D file. @c @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void}setUsePrimitives (@code{bool} use) Enable using list of primitives for frames. This allows frames transformation/zoom but requires much more memory. Default value is @code{true}. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} setMGLFont (@code{QString} path) Restore (@var{path}=@code{""}) or load font for graphics. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} about () Show about information. @end deftypefn @deftypefn {Slot on @code{QMathGL}} @code{void} aboutQt () Show information about Qt version. @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} phiChanged (@code{int} val) Phi angle changed (by mouse or by toolbar). @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} tetChanged (@code{int} val) Tet angle changed (by mouse or by toolbar). @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} perChanged (@code{int} val) Perspective changed (by mouse or by toolbar). @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} alphaChanged (@code{bool} val) Transparency changed (by toolbar). @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} lightChanged (@code{bool} val) Lighting changed (by toolbar). @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} gridChanged (@code{bool} val) Grid drawing changed (by toolbar). @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} zoomChanged (@code{bool} val) Zooming changed (by toolbar). @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} rotateChanged (@code{bool} val) Rotation changed (by toolbar). @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} mouseClick (@code{mreal} x, @code{mreal} y, @code{mreal} z) Mouse click take place at position @{x,y,z@}. @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} frameChanged (@code{int} val) Need another frame to show. @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} showWarn (@code{QString} warn) Need to show warning. @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} posChanged (@code{QString} pos) Position of mouse click is changed. @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} objChanged (@code{int} id) Object id is changed (due to mouse click). @end deftypefn @deftypefn {Signal on @code{QMathGL}} @code{void} refreshData () Data can be changed (drawing is finished). @end deftypefn @deftypecv {QMathGL option} QMathGL @code{QString} appName Application name for message boxes. @end deftypecv @deftypecv {QMathGL option} QMathGL @code{bool} autoResize Allow auto resizing (default is false). @end deftypecv @c ------------------------------------------------------------------ @external{} @node wxMathGL class, , QMathGL class, Widget classes @section wxMathGL class @nav{} @cindex wxMathGL @cindex widgets Class is WX widget which display MathGL graphics. It is defined in @code{#include }. @deftypemethod wxMathGL @code{void} SetDraw (@code{mglDraw *}dr) Sets drawing functions from a class inherited from @code{mglDraw}. @end deftypemethod @deftypemethod wxMathGL @code{void} SetDraw (@code{int (*}draw@code{)(mglBase *}gr, @code{void *}p@code{)}, @code{void *}par=@code{NULL}) @deftypemethodx wxMathGL @code{void} SetDraw (@code{int (*}draw@code{)(mglGraph *}gr@code{)}) Sets the drawing function @var{draw}. There is support of a list of plots (frames). So as one can prepare a set of frames at first and redraw it fast later (but it requires more memory). Function should return positive number of frames for the list or zero if it will plot directly. Parameter @var{par} contains pointer to data for the plotting function @var{draw}. @end deftypemethod @deftypemethod wxMathGL @code{void} SetGraph (@code{HMGL} gr) @deftypemethodx wxMathGL @code{void} SetGraph (@code{mglGraph *}gr) Set pointer to external grapher (instead of built-in one). Note that wxMathGL will automatically delete this object at destruction or at new @code{setGraph()} call. @end deftypemethod @deftypemethod wxMathGL @code{HMGL} GetGraph () Get pointer to grapher. @end deftypemethod @deftypemethod wxMathGL @code{void} SetPopup (@code{wxMenu *}p) Set popup menu pointer. @end deftypemethod @deftypemethod wxMathGL @code{void} SetSize (@code{int} w, @code{int} h) Set widget/picture sizes @end deftypemethod @deftypemethod wxMathGL @code{double} GetRatio () Return aspect ratio of the picture. @end deftypemethod @deftypemethod wxMathGL @code{int} GetPer () Get perspective value in percents. @end deftypemethod @deftypemethod wxMathGL @code{int} GetPhi () Get Phi-angle value in degrees. @end deftypemethod @deftypemethod wxMathGL @code{int} GetTet () Get Theta-angle value in degrees. @end deftypemethod @deftypemethod wxMathGL @code{bool} GetAlpha () Get transparency state. @end deftypemethod @deftypemethod wxMathGL @code{bool} GetLight () Get lightning state. @end deftypemethod @deftypemethod wxMathGL @code{bool} GetZoom () Get mouse zooming state. @end deftypemethod @deftypemethod wxMathGL @code{bool} GetRotate () Get mouse rotation state. @end deftypemethod @deftypemethod wxMathGL @code{void} Repaint () Redraw saved bitmap without executing drawing function. @end deftypemethod @deftypemethod wxMathGL @code{void} Update () Update picture by executing drawing function. @end deftypemethod @deftypemethod wxMathGL @code{void} Copy () Copy graphics to clipboard. @end deftypemethod @deftypemethod wxMathGL @code{void} Print () Print current picture. @end deftypemethod @comment @deftypemethod wxMathGL @code{void} Stop () @comment Send signal to stop drawing. @comment @end deftypemethod @deftypemethod wxMathGL @code{void} Adjust () Adjust image size to fit whole widget. @end deftypemethod @deftypemethod wxMathGL @code{void} NextSlide () Show next slide. @end deftypemethod @deftypemethod wxMathGL @code{void} PrevSlide () Show previous slide. @end deftypemethod @deftypemethod wxMathGL @code{void} Animation (@code{bool} st=@code{true}) Start/stop animation. @end deftypemethod @deftypemethod wxMathGL @code{void} SetPer (@code{int} val) Set perspective value. @end deftypemethod @deftypemethod wxMathGL @code{void} SetPhi (@code{int} val) Set Phi-angle value. @end deftypemethod @deftypemethod wxMathGL @code{void} SetTet (@code{int} val) Set Theta-angle value. @end deftypemethod @deftypemethod wxMathGL @code{void} SetAlpha (@code{bool} val) Switch on/off transparency. @end deftypemethod @deftypemethod wxMathGL @code{void} SetLight (@code{bool} val) Switch on/off lightning. @end deftypemethod @comment @deftypemethod wxMathGL @code{void} SetGrid (@code{bool} val) @comment Switch on/off drawing of grid for absolute coordinates. @comment @end deftypemethod @deftypemethod wxMathGL @code{void} SetZoom (@code{bool} val) Switch on/off mouse zooming. @end deftypemethod @deftypemethod wxMathGL @code{void} SetRotate (@code{bool} val) Switch on/off mouse rotation. @end deftypemethod @deftypemethod wxMathGL @code{void} ZoomIn () Zoom in graphics. @end deftypemethod @deftypemethod wxMathGL @code{void} ZoomOut () Zoom out graphics. @end deftypemethod @deftypemethod wxMathGL @code{void} ShiftLeft () Shift graphics to left direction. @end deftypemethod @deftypemethod wxMathGL @code{void} ShiftRight () Shift graphics to right direction. @end deftypemethod @deftypemethod wxMathGL @code{void} ShiftUp () Shift graphics to up direction. @end deftypemethod @deftypemethod wxMathGL @code{void} ShiftDown () Shift graphics to down direction. @end deftypemethod @deftypemethod wxMathGL @code{void} Restore () Restore zoom and rotation to default values. @end deftypemethod @c @deftypemethod wxMathGL @code{void} reload () @c Reload data and redraw graphics. @c @end deftypemethod @deftypemethod wxMathGL @code{void} About () Show about information. @end deftypemethod @deftypemethod wxMathGL @code{void} ExportPNG (@code{QString} fname=@code{""}) Export current picture to PNG file. @end deftypemethod @deftypemethod wxMathGL @code{void} ExportPNGs (@code{QString} fname=@code{""}) Export current picture to PNG file (no transparency). @end deftypemethod @deftypemethod wxMathGL @code{void} ExportJPG (@code{QString} fname=@code{""}) Export current picture to JPEG file. @end deftypemethod @deftypemethod wxMathGL @code{void} ExportBPS (@code{QString} fname=@code{""}) Export current picture to bitmap EPS file. @end deftypemethod @deftypemethod wxMathGL @code{void} ExportEPS (@code{QString} fname=@code{""}) Export current picture to vector EPS file. @end deftypemethod @deftypemethod wxMathGL @code{void} ExportSVG (@code{QString} fname=@code{""}) Export current picture to SVG file. @end deftypemethod @external{} mathgl-8.0.1/texinfo/parse_ru.texi0000664000175000017500000013176414167366465017007 0ustar balakinbalakin @c ------------------------------------------------------------------ @chapter Скрипты MGL @nav{} MathGL имеет встроенный скриптовый язык MGL для обработки и отображения данных. Скрипты MGL могут быть выполнены независимо (с помощью программ UDAV, mglconv, mglview и др. @ifclear UDAV , см. @ref{Utilities}) или с использованием вызовов библиотеки. @end ifclear @menu * MGL definition:: * Program flow commands:: * Special comments:: * LaTeX package:: @ifclear UDAV * mglParse class:: @end ifclear @end menu @c ------------------------------------------------------------------ @external{} @node MGL definition, Program flow commands, , MGL scripts @section Основы MGL @nav{} Язык MGL достаточно простой. Каждая строка -- отдельная команда. Первое слово -- имя команды, а все остальные ее аргументы. Команда может иметь до 1000 аргументов (по крайней мере сейчас). Слова разделяются одно от другого пробелом или символом табуляции. Различий между верхним и нижним индексом нет, т.е. переменные @var{a} и @var{A} идентичны. Символ @samp{#} начинает комментарий -- все символы после него игнорируются до конца строки. Исключением является случай, когда @samp{#} входит в строку. Опции команды указываются после символа @samp{;} (@pxref{Command options}). Символ @samp{:} начинает новую команду (подобно переводу строки) если он расположен не внутри скобок или строки. Если строка содержит ссылки на внешние параметры (@samp{$0}, @samp{$1} ... @samp{$9}) или макроопределения (@samp{$a}, @samp{$b} ... @samp{$z}), то текущие значения параметров/макроопределений подставляются в строку вместо ссылки до выполнением команды. Это позволяет использовать один и тот же скрипт при различных входных параметрах командной строки или вводить макроопределения по ходу исполнения команд скрипта. Аргументы команды могут быть строками, переменными или числами. @itemize @bullet @item Строка -- произвольный набор символов между метками @samp{'}. Длинные строки могут быть соединены из нескольких линий файла символом @samp{\}. Т.е. строки файла @samp{'a +'\
' b'} дадут строку @samp{'a + b'} (здесь @samp{
} -- перевод строки). MGL поддерживает несколько операций над строками: @itemize @bullet @item Соединение строк и чисел, используя @samp{,} без пробелов (например, @samp{'max(u)=',u.max,' a.u.'} или @samp{'u=',!(1+i2)} для комплексных чисел); @item Получение n-го символа строки, используя @samp{[]} (например, @samp{'abc'[1]} даст @code{'b'}); @item Инкремент последнего символа строки, используя @samp{+} (например, @samp{'abc'+3} даст @code{'abf'}). @end itemize @item Обычно переменная имеет имя, состоящее из букв и чисел (должно начинаться с буквы и не быть длиннее 64 символов). Если выражение или переменная начинается с символа @samp{!}, то будут использованы комплексные значения. Например, код @code{new x 100 'x':copy !b !exp(1i*x)} создаст массив действительных чисел @var{x} и массив комплексных чисел @var{b}, который будет равен @math{exp(I*x)}, где @math{I^2=-1}. В качестве переменной можно использовать также и временные массивы, включающие в себя: @itemize @bullet @item срезы (``подмассивы'') массивов данных (подобно команде @ref{subdata}). Например, @code{a(1)} или @code{a(1,:)} или @code{a(1,:,:)} -- вторая строка массива @var{a}, @code{a(:,2)} или @code{a(:,2,:)} -- третий столбец, @code{a(:,:,0)} -- первый срез и т.д. Также можно выделить часть массива с m-го по n-ый элемент @code{a(m:n,:,:)} или просто @code{a(m:n)}. @item произвольные комбинации столбцов данных (например, @code{a('n*w^2/exp(t)')}), если столбцы данных были именованы командой @ref{idset} или в файле данных (в строке начинающейся с @code{##}). @item произвольное выражение из существующих переменных и констант. Например, @samp{sqrt(dat(:,5)+1)} даст временный массив данных с элементами равными @code{tmp[i,j] = sqrt(dat[i,5,j]+1)}. При этом символ @samp{`} возвращает транспонированный массив: @samp{`sqrt(dat(:,5)+1)} и @samp{sqrt(`dat(:,5)+1)} оба дадут временный массив данных с элементами равными @code{tmp[i,j] = sqrt(dat[j,5,i]+1)}. @item массивы с элементами заданными в квадратных скобках [], разделенные @samp{,}. При этом внутри выражения не должно быть пробелов! Например, @samp{[1,2,3]} даст временный массив из 3 элементов @{1, 2, 3@}; @samp{[[11,12],[21,22]]} даст матрицу 2*2 и т.д. Элементами такой конструкции могут быть и массивы если их размерности одинаковые, например @samp{[v1,v2,...,vn]}. @item результат команд построения новых данных (@pxref{Make another data}), если они заключены в фигурные скобки @{@}. Например, @samp{@{sum dat 'x'@}} даст временный массив, который есть результат суммирования @var{dat} вдоль 'x'. Это такой же массив как и @var{tmp}, полученный командой @samp{sum tmp dat 'x'}. При этом можно использовать вложенные конструкции, например @samp{@{sum @{max dat 'z'@} 'x'@}}. @end itemize Временные массивы не могут стоять в качестве первого аргумента команд, создающих массивы (например, @samp{new}, @samp{read}, @samp{hist} и т.д.). @item К скалярным переменным, кроме собственно чисел, относятся: специальные переменные @code{nan=#QNAN, inf=бесконечность, rnd=случайное число, pi=3.1415926..., on=1, off=0, all=-1, :=-1}, переменные с суффиксами (@pxref{Data information}), переменные определенные командой @ref{define}, значения времени (в формате "hh-mm-ss_DD.MM.YYYY", "hh-mm-ss" или "DD.MM.YYYY") . Также массивы размером 1x1x1 считаются скалярами (например, @samp{pi/dat.nx}). @end itemize Перед первым использованием все переменные должны быть определены с помощью команд, создающих массивы (@ref{new}, @ref{var}, @ref{list}, @ref{copy}, @ref{read}, @ref{hist}, @ref{sum} и др., см. @ref{Data constructor}, @ref{Data filling} и @ref{Make another data}). Команды могут иметь несколько наборов аргументов (например, @code{plot ydat} и @code{plot xdat ydat}). Все аргументы команды для выбранного набора должны быть указаны, однако часть из них могут иметь значения по умолчанию. Такие аргументы в описании команд будут помещены в квадратные скобки [], например @code{plot ydat ['stl'='' zval=nan]}. При этом запись @code{[arg1 arg2 arg3 ...]} подразумевает @code{[arg1 [arg2 [arg3 ...]]]}, т.е. опускать можно только аргументы с конца, если вы согласны с их значениями по умолчанию. Например, @code{plot ydat '' 1} или @code{plot ydat ''} правильно, а @code{plot ydat 1} не правильно (аргумент @code{'stl'} пропущен). Можно предоставить несколько вариантов аргументов комманд при использовании символа @samp{?} для их разделения. Конкретный вариант аргумента, используемый при выполнении команды, задается значением команды @ref{variant}. При этом будет использован последний вариант, если задано слишком большое значение. По умолчанию используется первый вариант (т.е. как при @code{variant 0}). Например в следующем коде будет сначала нарисован график синим цветом (первый аргумент @samp{b}), а затем красным пунктиром -- после @code{variant 1} будет использован второй аргумент @samp{r|}: @verbatim fplot 'x' 'b'?'r' variant 1 fplot 'x^3' 'b'?'r|' @end verbatim @c ------------------------------------------------------------------ @external{} @node Program flow commands, Special comments, MGL definition, MGL scripts @section Управление ходом выполнения @nav{} Ниже собраны команды, управляющие порядком выполнения других команд (условия, циклы, подпрограммы), (пере-)определяют аргументы скрипта и пр. Прочие команды могут быть найдены в главах @ref{MathGL core} и @ref{Data processing}. Отмечу, что некоторые из команд (например, @ref{define}, @ref{ask}, @ref{call}, @ref{for}, @ref{func}) должны быть расположены на отдельной строке. @cindex chdir @anchor{chdir} @deftypefn {Команда MGL} {} chdir 'path' Переходит в папку @var{path}. @end deftypefn @cindex ask @anchor{ask} @deftypefn {Команда MGL} {} ask $N 'question' Задает @var{N}-ый аргумент скрипта равным ответу пользователя на вопрос @var{question}. Обычно команда показывает диалог с вопросом и полем ввода текста ответа. Здесь @var{N} это цифра (0...9) или буква (a...z). @end deftypefn @cindex define @anchor{define} @deftypefn {Команда MGL} {} define $N smth Задает @var{N}-ый аргумент скрипта равным @var{smth}. Отмечу, что @var{smth} используется как есть (с символами @samp{'} если присутствуют). Выполняется только подстановка других макроопределений $0...$9, $a...$z. Здесь @var{N} это цифра (0...9) или буква (a...z). @end deftypefn @deftypefn {Команда MGL} {} define name smth Определяет константу (скаляр) с именем @code{name} и числовым значением @code{smth}. Позднее она может быть использована как обычное число. @end deftypefn @cindex defchr @anchor{defchr} @deftypefn {Команда MGL} {} defchr $N smth Задает @var{N}-ый аргумент скрипта равным символу с UTF кодом @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z). @end deftypefn @cindex defnum @anchor{defnum} @deftypefn {Команда MGL} {} defnum $N smth Задает @var{N}-ый аргумент скрипта равным числовому значению @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z). @end deftypefn @comment @cindex defpal @comment @anchor{defpal} @comment @deftypefn {Команда MGL} {} defpal $N smth @comment Задает @var{N}-ый аргумент скрипта равным символу палитры с индексом, найденным из @var{smth}. Здесь @var{N} это цифра (0...9) или буква (a...z). @comment @end deftypefn @cindex call @anchor{call} @deftypefn {Команда MGL} {} call 'fname' [ARG1 ARG2 ... ARG9] Переходит к выполнению (вызывает) подпрограммы @var{fname} (или внешнего скрипта, если функция не была найдена). Опциональные аргументы передаются в подпрограмму. См. также @ref{func}. @end deftypefn @cindex func @anchor{func} @deftypefn {Команда MGL} {} func 'fname' [narg=0] Определяет подпрограмму с именем @var{fname} и задает число требуемых аргументов. Аргументы будут помещены в параметры скрипта $1, $2, ... $9. Отмечу, что выполнение основной программы будет остановлено при встрече @code{func} -- действует аналогично комманде @ref{stop}. См. также @ref{return}. @end deftypefn @cindex return @anchor{return} @deftypefn {Команда MGL} {} return Возвращается из подпрограммы. См. также @ref{func}. @end deftypefn @cindex load @anchor{load} @deftypefn {Команда MGL} {} load 'filename' Загружает дополнительные команды MGL из внешней динамической библиотеки @var{filename}. Данная библиотека должна содержать массив с именем @code{mgl_cmd_extra} типа @code{mglCommand}, который содержит описание новых комманд. @end deftypefn @cindex if @anchor{if} @anchor{then} @deftypefn {Команда MGL} {} if @code{val} @strong{then} @code{CMD} Выполняет команду @code{CMD} только если @code{val} не ноль. @end deftypefn @deftypefn {Команда MGL} {} if @code{val} Начинает блок команд, выполняемый если @code{val} не ноль. @end deftypefn @deftypefn {Команда MGL} {} if dat 'cond' Начинает блок команд, выполняемый если каждый элемент @var{dat} удовлетворяет условию @var{cond}. @end deftypefn @cindex elseif @anchor{elseif} @deftypefn {Команда MGL} {} elseif dat 'cond' Начинает блок команд, выполняемый если предыдущий @code{if} или @code{elseif} не был выполнен и каждый элемент @var{dat} удовлетворяет условию @var{cond}. @end deftypefn @deftypefn {Команда MGL} {} elseif @code{val} Начинает блок команд, выполняемый если предыдущий @code{if} или @code{elseif} не был выполнен и @code{val} не ноль. @end deftypefn @cindex else @anchor{else} @deftypefn {Команда MGL} {} else Начинает блок команд, выполняемый если предыдущий @code{if} или @code{elseif} не был выполнен. @end deftypefn @cindex endif @anchor{endif} @deftypefn {Команда MGL} {} endif Заканчивает определение блока @code{if/elseif/else}. @end deftypefn @cindex for @anchor{for} @deftypefn {Команда MGL} {} for $N @code{v1 v2 [dv=1]} Начинает блок команд, выполняемый в цикле с $@var{N}-ым аргументом изменяющимся от @var{v1} до @var{v2} с шагом @var{dv}. Здесь @var{N} это цифра (0...9) или буква (a...z). @end deftypefn @deftypefn {Команда MGL} {} for $N dat Начинает блок команд, выполняемый в цикле с $@var{N}-ым аргументом пробегающим значения массива @var{dat}. Здесь @var{N} это цифра (0...9) или буква (a...z). @end deftypefn @cindex next @anchor{next} @deftypefn {Команда MGL} {} next Заканчивает блок цикла @code{for}. @end deftypefn @cindex do @anchor{do} @deftypefn {Команда MGL} {} do Начинает бесконечный цикл. @end deftypefn @cindex while @anchor{while} @deftypefn {Команда MGL} {} while @code{val} Переходит к следующей итерации цикла если @var{val} не ноль, в противном случае заканчивает цикл. @end deftypefn @deftypefn {Команда MGL} {} while dat 'cond' Переходит к следующей итерации цикла если @var{dat} удовлетворяет условию @var{cond}, в противном случае заканчивает цикл. @end deftypefn @cindex once @anchor{once} @deftypefn {Команда MGL} {} once @code{val} Определяет код (между @code{once on} и @code{once off}) который будет выполнен только один раз. Полезно для работы с большими данными в программах типа UDAV. @end deftypefn @cindex stop @anchor{stop} @deftypefn {Команда MGL} {} stop Останавливает выполнение скрипта. @end deftypefn @cindex variant @anchor{variant} @deftypefn {Команда MGL} {} variant @code{val} Задает вариант аргумента(ов), разделенных символом @samp{?}, для всех последующих комманд. @end deftypefn @cindex rkstep @anchor{rkstep} @deftypefn {Команда MGL} {} rkstep eq1;... var1;... [@code{dt=1}] Выполняет один шаг решения системы обыкновенных дифференциальных уравнений @{var1' = eq1, ... @} с временным шагом @var{dt}. Здесь переменные @samp{var1}, ... -- переменные, определенные в MGL скрипте ранее. При решении используется метод Рунге-Кутта 4-го порядка. @end deftypefn @c TODO Translate it! @c ------------------------------------------------------------------ @external{} @node Special comments, LaTeX package, Program flow commands, MGL scripts @section Специальные комментарии @nav{} There are number of special comments for MGL script, which set some global behavior (like, animation, dialog for parameters and so on). All these special comments starts with double sign @code{##}. Let consider them. @table @samp @item @strong{##c} @code{v1 v2 [dv=1]} Sets the parameter for animation loop relative to variable @code{$0}. Here @var{v1} and @var{v2} are initial and final values, @var{dv} is the increment. @item @strong{##a} val Adds the parameter @var{val} to the list of animation relative to variable @code{$0}. You can use it several times (one parameter per line) or combine it with animation loop @strong{##c}. @item @strong{##d} $I kind|label|par1|par2|... Creates custom dialog for changing plot properties. Each line adds one widget to the dialog. Here @var{$I} is id ($0,$1...$9,$a,$b...$z), @var{label} is the label of widget, @var{kind} is the kind of the widget: @itemize @bullet @item 'e' for editor or input line (parameter is initial value) , @item 'v' for spinner or counter (parameters are "ini|min|max|step|big_step"), @item 's' for slider (parameters are "ini|min|max|step"), @item 'b' for check box (parameter is "ini"; also understand "on"=1), @item 'c' for choice (parameters are possible choices). @end itemize Now, it work in FLTK-based @code{mgllab} and @code{mglview} only. @ifclear UDAV You can make custom dialog in C/C++ code too by using one of following functions. @deftypefn {Method on @code{mglWnd}} @code{void} MakeDialog (@code{const char *}ids, @code{char const * const *}args, @code{const char *}title) @deftypefnx{Method on @code{mglWnd}} @code{void} MakeDialog (@code{const std::string &}ids, @code{const std::vector &}args, @code{const char *}title) @deftypefnx {C function} @code{void} mgl_wnd_make_dialog (@code{HMGL} gr, @code{const char *}ids, @code{char const * const *}args, @code{const char *}title) Makes custom dialog for parameters ids of element properties defined by args. @end deftypefn At this you need to provide callback function for setting up properties. You can do it by overloading @code{Param()} function of @code{mglDraw} class or set it manually. @deftypefn {Method on @code{mglDraw}} @code{void} Param (@code{char} id, @code{const char *} val) @deftypefnx{Method on @code{mglWnd}} @code{void} SetPropFunc (@code{void (*}prop@code{)(char id, const char *val, void *p)}, @code{void *}par=@code{NULL}) @deftypefnx {C function} @code{void} mgl_wnd_set_prop (@code{void (*}prop@code{)(char id, const char *val, void *p)}, @code{void *}par) Set callback function for properties setup. @end deftypefn @end ifclear @end table @c ------------------------------------------------------------------ @external{} @ifclear UDAV @node LaTeX package, mglParse class, Special comments, MGL scripts @end ifclear @ifset UDAV @node LaTeX package, , Special comments, MGL scripts @end ifset @section LaTeX package @nav{} There is LaTeX package @code{mgltex} (was made by Diego Sejas Viscarra) which allow one to make figures directly from MGL script located in LaTeX file. For using this package you need to specify @code{--shell-escape} option for @emph{latex/pdflatex} or manually run @emph{mglconv} tool with produced MGL scripts for generation of images. Don't forgot to run @emph{latex/pdflatex} second time to insert generated images into the output document. Also you need to run @emph{pdflatex} third time to update converted from EPS images if you are using vector EPS output (default). The package may have following options: @code{draft}, @code{final} --- the same as in the @emph{graphicx} package; @code{on}, @code{off} --- to activate/deactivate the creation of scripts and graphics; @code{comments}, @code{nocomments} --- to make visible/invisible comments contained inside @code{mglcomment} environments; @code{jpg}, @code{jpeg}, @code{png} --- to export graphics as JPEG/PNG images; @code{eps}, @code{epsz} --- to export to uncompressed/compressed EPS format as primitives; @code{bps}, @code{bpsz} --- to export to uncompressed/compressed EPS format as bitmap (doesn't work with @emph{pdflatex}); @code{pdf} --- to export to 3D PDF; @code{tex} --- to export to @emph{LaTeX/tikz} document. The package defines the following environments: @table @samp @item mgl It writes its contents to a general script which has the same name as the LaTeX document, but its extension is @emph{.mgl}. The code in this environment is compiled and the image produced is included. It takes exactly the same optional arguments as the @code{\includegraphics} command, plus an additional argument @var{imgext}, which specifies the extension to save the image. An example of usage of @samp{mgl} environment would be: @verbatim \begin{mglfunc}{prepare2d} new a 50 40 '0.6*sin(pi*(x+1))*sin(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))' new b 50 40 '0.6*cos(pi*(x+1))*cos(1.5*pi*(y+1))+0.4*cos(0.75*pi*(x+1)*(y+1))' \end{mglfunc} \begin{figure}[!ht] \centering \begin{mgl}[width=0.85\textwidth,height=7.5cm] fog 0.5 call 'prepare2d' subplot 2 2 0 : title 'Surf plot (default)' : rotate 50 60 : light on : box : surf a subplot 2 2 1 : title '"\#" style; meshnum 10' : rotate 50 60 : box surf a '#'; meshnum 10 subplot 2 2 2 : title 'Mesh plot' : rotate 50 60 : box mesh a new x 50 40 '0.8*sin(pi*x)*sin(pi*(y+1)/2)' new y 50 40 '0.8*cos(pi*x)*sin(pi*(y+1)/2)' new z 50 40 '0.8*cos(pi*(y+1)/2)' subplot 2 2 3 : title 'parametric form' : rotate 50 60 : box surf x y z 'BbwrR' \end{mgl} \end{figure} @end verbatim @item mgladdon It adds its contents to the general script, without producing any image. @item mglcode Is exactly the same as @samp{mgl}, but it writes its contents verbatim to its own file, whose name is specified as a mandatory argument. @item mglscript Is exactly the same as @samp{mglcode}, but it doesn't produce any image, nor accepts optional arguments. It is useful, for example, to create a MGL script, which can later be post processed by another package like "listings". @item mglblock It writes its contents verbatim to a file, specified as a mandatory argument, and to the LaTeX document, and numerates each line of code. @c This last three environments will test if the user is overwriting some file, and will issue a warning in that case. @item mglverbatim Exactly the same as @samp{mglblock}, but it doesn't write to a file. This environment doesn't have arguments. @item mglfunc Is used to define MGL functions. It takes one mandatory argument, which is the name of the function, plus one additional argument, which specifies the number of arguments of the function. The environment needs to contain only the body of the function, since the first and last lines are appended automatically, and the resulting code is written at the end of the general script, after the @ref{stop} command, which is also written automatically. The warning is produced if 2 or more function with the same name is defined. @item mglcomment Is used to contain multiline comments. This comments will be visible/invisible in the output document, depending on the use of the package options @code{comments} and @code{nocomments} (see above), or the @code{\mglcomments} and @code{\mglnocomments} commands (see bellow). @item mglsetup If many scripts with the same code are to be written, the repetitive code can be written inside this environment only once, then this code will be used automatically every time the @samp{\mglplot} command is used (see below). It takes one optional argument, which is a name to be associated to the corresponding contents of the environment; this name can be passed to the @samp{\mglplot} command to use the corresponding block of code automatically (see below). @end table The package also defines the following commands: @table @samp @item \mglplot It takes one mandatory argument, which is MGL instructions separated by the symbol @samp{:} this argument can be more than one line long. It takes the same optional arguments as the @samp{mgl} environment, plus an additional argument @var{setup}, which indicates the name associated to a block of code inside a @samp{mglsetup} environment. The code inside the mandatory argument will be appended to the block of code specified, and the resulting code will be written to the general script. An example of usage of @samp{\mglplot} command would be: @verbatim \begin{mglsetup} box '@{W9}' : axis \end{mglsetup} \begin{mglsetup}[2d] box : axis grid 'xy' ';k' \end{mglsetup} \begin{mglsetup}[3d] rotate 50 60 box : axis : grid 'xyz' ';k' \end{mglsetup} \begin{figure}[!ht] \centering \mglplot[scale=0.5]{new a 200 'sin(pi*x)' : plot a '2B'} \end{figure} \begin{figure}[!ht] \centering \mglplot[scale=0.5,setup=2d]{ fplot 'sin(pi*x)' '2B' : fplot 'cos(pi*x^2)' '2R' } \end{figure} \begin{figure}[!ht] \centering \mglplot[setup=3d]{fsurf 'sin(pi*x)+cos(pi*y)'} \end{figure} @end verbatim @item \mglgraphics This command takes the same optional arguments as the @samp{mgl} environment, and one mandatory argument, which is the name of a MGL script. This command will compile the corresponding script and include the resulting image. It is useful when you have a script outside the LaTeX document, and you want to include the image, but you don't want to type the script again. @item \mglinclude This is like @samp{\mglgraphics} but, instead of creating/including the corresponding image, it writes the contents of the MGL script to the LaTeX document, and numerates the lines. @item \mgldir This command can be used in the preamble of the document to specify a directory where LaTeX will save the MGL scripts and generate the corresponding images. This directory is also where @samp{\mglgraphics} and @samp{\mglinclude} will look for scripts. @item \mglquality Adjust the quality of the MGL graphics produced similarly to @ref{quality}. @item \mgltexon, \mgltexoff Activate/deactivate the creation of MGL scripts and images. Notice these commands have local behavior in the sense that their effect is from the point they are called on. @item \mglcomment, \mglnocomment Make visible/invisible the contents of the @code{mglcomment} environments. These commands have local effect too. @item \mglTeX It just pretty prints the name of the package. @end table As an additional feature, when an image is not found or cannot be included, instead of issuing an error, @code{mgltex} prints a box with the word @samp{MGL image not found} in the LaTeX document. @ifclear UDAV @c ------------------------------------------------------------------ @external{} @node mglParse class, , LaTeX package, MGL scripts @section mglParse class @nav{} @cindex mglParse Класс разбирает и выполняет скрипты MGL. Он определен в @code{#include }. Основная функция класса mglParse -- @code{Execute()}, выполняющая построчный разбор скрипта. Также есть вспомогательные функции для поиска и создания переменных MGL (объектов, производных от @code{mglDataA}). Эти функции полезны для отображения значений массивов во внешних объектах (например, в отдельном окне) или для предоставления доступа к внутренним массивам. Функция @code{AllowSetSize()} позволяет запретить изменение размера картинки (запрещает команду @code{setsize}). Функция @code{AllowFileIO()} позволяет запретить доступ к файлам на диске. @c Note an important feature -- if user defines function @var{func} in variable then it will be called before the destroying of this variable (@pxref{mglVar class}). @deftypefn {Конструктор класса @code{mglParse}} @code{} mglParse (@code{bool} setsize=@code{false}) @deftypefnx {Конструктор класса @code{mglParse}} @code{} mglParse (@code{HMPR} pr) @deftypefnx {Конструктор класса @code{mglParse}} @code{} mglParse (@code{mglParse &}pr) @deftypefnx {Функция С} @code{HMPR} mgl_create_parser () Создает экземпляр класса @code{mglParse} и устанавливает значение @var{AllowSetSize}. @end deftypefn @deftypefn {Деструктор класса @code{mglParse}} @code{} ~mglParse () @deftypefnx {Функция С} @code{void} mgl_delete_parser (@code{HMPR} p) Удаляет экземпляр класса. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{HMPR} Self () Возвращает указатель на используемый объект типа @code{HMPR}. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} Execute (@code{mglGraph *}gr, @code{const char *}text) @deftypefnx{Метод класса @code{mglParse}} @code{void} Execute (@code{mglGraph *}gr, @code{const wchar_t *}text) @deftypefnx {Функция С} @code{void} mgl_parse_text (@code{HMGL} gr, @code{HMPR} p, @code{const char *}text) @deftypefnx {Функция С} @code{void} mgl_parse_textw (@code{HMGL} gr, @code{HMPR} p, @code{const wchar_t *}text) Выполняет построчно скрипт MGL, содержащийся в @var{text}. Строки считаются разделенными символом @samp{\n}. Это основная функция класса. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} Execute (@code{mglGraph *}gr, @code{FILE *}fp, @code{bool} print=@code{false}) @deftypefnx {Функция С} @code{void} mgl_parse_file (@code{HMGL} gr, @code{HMPR} p, @code{FILE *}fp, @code{int} print) Аналогично предыдущему, но скрипт читается из файла @var{fp}. Если @var{print}=@code{true}, то предупреждения и информационные сообщения печатаются в stdout. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{int} Parse (@code{mglGraph *}gr, @code{const char *}str, @code{long} pos=@code{0}) @deftypefnx {Метод класса @code{mglParse}} @code{int} Parse (@code{mglGraph *}gr, @code{const wchar_t *}str, @code{long} pos=@code{0}) @deftypefnx {Функция С} @code{int} mgl_parse_line (@code{HMGL} gr, @code{HMPR} p, @code{const char *}str, @code{int} pos) @deftypefnx {Функция С} @code{int} mgl_parse_linew (@code{HMGL} gr, @code{HMPR} p, @code{const wchar_t *}str, @code{int} pos) Выполняет строку @var{str} с выводом графики на @var{gr}. Возвращает код ошибки: 0 -- нет ошибок, 1 -- неправильные аргументы, 2 -- неизвестная команда, 3 -- строка слишком длинная, 4 -- нет закрывающей скобки или @samp{'}. Аргумент @var{pos} задает позицию строки в документе/файле для использования в команде @ref{for}. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{mglData} Calc (@code{const char *}formula) @deftypefnx {Метод класса @code{mglParse}} @code{mglData} Calc (@code{const wchar_t *}formula) @deftypefnx {Функция С} @code{HMDT} mgl_parser_calc (@code{HMPR} p, @code{const char *}formula) @deftypefnx {Функция С} @code{HMDT} mgl_parser_calcw (@code{HMPR} p, @code{const wchar_t *}formula) Разбирает строку @var{formula} и возвращает полученный массив. В отличие от @code{AddVar()} или @code{FindVar()}, это обычный массив данных, который следует удалить после использования. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{mglDataC} CalcComplex (@code{const char *}formula) @deftypefnx {Метод класса @code{mglParse}} @code{mglDataC} CalcComplex (@code{const wchar_t *}formula) @deftypefnx {Функция С} @code{HADT} mgl_parser_calc_complex (@code{HMPR} p, @code{const char *}formula) @deftypefnx {Функция С} @code{HADT} mgl_parser_calc_complexw (@code{HMPR} p, @code{const wchar_t *}formula) Разбирает строку @var{formula} и возвращает полученный массив с комплексными значениями. В отличие от @code{AddVar()} или @code{FindVar()}, это обычный массив данных, который следует удалить после использования. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} AddParam (@code{int} n, @code{const char *}str) @deftypefnx {Метод класса @code{mglParse}} @code{void} AddParam (@code{int} n, @code{const wchar_t *}str) @deftypefnx {Функция С} @code{void} mgl_parser_add_param (@code{HMPR} p, @code{int} id, @code{const char *}val) @deftypefnx {Функция С} @code{void} mgl_parser_add_paramw (@code{HMPR} p, @code{int} id, @code{const wchar_t *}val) Устанавливает значение @var{n}-го параметра строкой @var{str} (@var{n}=0, 1 ... 'z'-'a'+10). Строка @var{str} не должна содержать символ @samp{$}. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{mglVar *} FindVar (@code{const char *}name) @deftypefnx {Метод класса @code{mglParse}} @code{mglVar *} FindVar (@code{const wchar_t *}name) @deftypefnx {Функция С} @code{HMDT} mgl_parser_find_var (@code{HMPR} p, @code{const char *}name) @deftypefnx {Функция С} @code{HMDT} mgl_parser_find_varw (@code{HMPR} p, @code{const wchar_t *}name) Возвращает указатель на переменную с именем @var{name} или @code{NULL} если переменная отсутствует. Используйте эту функцию для добавления внешних массивов в скрипт. @strong{Не удаляйте} полученный массив! @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{mglVar *} AddVar (@code{const char *}name) @deftypefnx {Метод класса @code{mglParse}} @code{mglVar *} AddVar (@code{const wchar_t *}name) @deftypefnx {Функция С} @code{HMDT} mgl_parser_add_var (@code{HMPR} p, @code{const char *}name) @deftypefnx {Функция С} @code{HMDT} mgl_parser_add_varw (@code{HMPR} p, @code{const wchar_t *}name) Возвращает указатель на переменную с именем @var{name}. Если переменная отсутствует, то она будет создана. Используйте эту функцию для добавления внешних массивов в скрипт. @strong{Не удаляйте} полученный массив! @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} OpenHDF (@code{const char *}fname) @deftypefnx {Функция С} @code{void} mgl_parser_openhdf (@code{HMPR} pr, @code{const char *}fname) Читает все массивы данных из HDF5 файла @var{fname} и создает переменные MGL с соответствующими именами. Если имя данных начинается с @samp{!}, то будут созданы комплексные массивы. @end deftypefn @deftypefn{Метод класса @code{mglParse} (C++)} @code{void} DeleteVar (@code{const char *}name) @deftypefnx{Метод класса @code{mglParse} (C++)} @code{void} DeleteVar (@code{const wchar_t *}name) @deftypefnx {Функция С} @code{void} mgl_parser_del_var (@code{HMPR} p, @code{const char *}name) @deftypefnx {Функция С} @code{void} mgl_parser_del_varw (@code{HMPR} p, @code{const wchar_t *}name) Удаляет переменную по имени @var{name}. @end deftypefn @deftypefn{Метод класса @code{mglParse} (C++)} @code{void} DeleteAll () @deftypefnx {Функция С} @code{void} mgl_parser_del_all (@code{HMPR} p) Удаляет все переменные и сбрасывает список команд к списку по умолчанию в данном классе. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} RestoreOnce () @deftypefnx {Функция С} @code{void} mgl_parser_restore_once (@code{HMPR} p) Восстанавливает состояние флага Once. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} AllowSetSize (@code{bool} a) @deftypefnx {Функция С} @code{void} mgl_parser_allow_setsize (@code{HMPR} p, @code{int} a) Разрешает/запрещает команду @ref{setsize}. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} AllowFileIO (@code{bool} a) @deftypefnx {Функция С} @code{void} mgl_parser_allow_file_io (@code{HMPR} p, @code{int} a) Разрешает/запрещает команды чтения файлов. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} AllowDllCall (@code{bool} a) @deftypefnx {Функция С} @code{void} mgl_parser_allow_dll_call (@code{HMPR} p, @code{int} a) Разрешает/запрещает команду @ref{load}. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} Stop () @deftypefnx {Функция С} @code{void} mgl_parser_stop (@code{HMPR} p) Посылает сигнал завершения выполнения для следующей команды. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} SetVariant (@code{int} var=@code{0}) @deftypefnx {Функция С} @code{void} mgl_parser_variant (@code{HMPR} p, @code{int} var=@code{0}) Задает вариант аргумента(ов), разделенных символом @samp{?}, для всех последующих комманд. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} StartID (@code{int} id=@code{0}) @deftypefnx {Функция С} @code{void} mgl_parser_start_id (@code{HMPR} p, @code{int} id) Задает начальный id (обычно это номер строки) первой строки при последующем выполнении скрипта. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{long} GetCmdNum () @deftypefnx {Функция С} @code{long} mgl_parser_cmd_num (@code{HMPR} p) Возвращает число зарегистрированных команд MGL. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{const char *} GetCmdName (@code{long} id) @deftypefnx {Функция С} @code{const char *} mgl_parser_cmd_name (@code{HMPR} p, @code{long} id) Возвращает имя команды MGL с заданным номером @var{id}. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{int} CmdType (@code{const char *}name) @deftypefnx {Функция С} @code{int} mgl_parser_cmd_type (@code{HMPR} p, @code{const char *}name) Возвращает тип команды MGL с именем @var{name}. Типы команд: 0 -- не команда, 1 - графики по данным, 2 - прочие графики, 3 - настройка, 4 - обработка данных, 5 - создание данных, 6 - трансформация, 7 - ход выполнения, 8 - 1d графики, 9 - 2d графики, 10 - 3d графики, 11 - двойные графики, 12 - векторные поля, 13 - оси координат, 14 - примитивы, 15 - настройка осей, 16 - текст/легенда, 17 - изменение данных. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{const char *} CmdFormat (@code{const char *}name) @deftypefnx {Функция С} @code{const char *} mgl_parser_cmd_frmt (@code{HMPR} p, @code{const char *}name) Возвращает формат аргументов команды MGL с именем @var{name}. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{const char *} CmdDesc (@code{const char *}name) @deftypefnx {Функция С} @code{const char *} mgl_parser_cmd_desc (@code{HMPR} p, @code{const char *}name) Возвращает описание команды MGL с именем @var{name}. @end deftypefn @deftypefn {Метод класса @code{mglParse}} @code{void} RK_Step (@code{const char *}eqs, @code{const char *}vars, @code{mreal} dt=@code{1}) @deftypefnx {Метод класса @code{mglParse}} @code{void} RK_Step (@code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt=@code{1}) @deftypefnx {Функция С} @code{void} mgl_rk_step (@code{HMPR} p, @code{const char *}eqs, @code{const char *}vars, @code{mreal} dt) @deftypefnx {Функция С} @code{void} mgl_rk_step_w (@code{HMPR} p, @code{const wchar_t *}eqs, @code{const wchar_t *}vars, @code{mreal} dt) Make one step for ordinary differential equation(s) @{var1' = eq1, ... @} with time-step @var{dt}. Here strings @var{eqs} and @var{vars} contain the equations and variable names separated by symbol @samp{;}. The variable(s) @samp{var1}, ... are the ones, defined in MGL script previously. The Runge-Kutta 4-th order method is used. @end deftypefn @end ifclear @external{} mathgl-8.0.1/texinfo/symbols_en.texi0000664000175000017500000004653614167366465017343 0ustar balakinbalakin@nav{} This appendix contain the full list of symbols (characters) used by MathGL for setting up plot. Also it contain sections for full list of hot-keys supported by mglview tool and by UDAV program. @menu * Symbols for styles:: * Hot-keys for mglview:: * Hot-keys for UDAV:: @end menu @c ------------------------------------------------------------------ @external{} @node Symbols for styles, Hot-keys for mglview, , Symbols and hot-keys @section Symbols for styles @nav{} Below is full list of all characters (symbols) which MathGL use for setting up the plot. @table @samp @item space ' ' empty line style (see @ref{Line styles}); empty color in @ref{chart}. @item ! set to use new color from palette for each point (not for each curve, as default) in @ref{1D plotting}; set to disable ticks tuning in @ref{axis} and @ref{colorbar}; set to draw @ref{grid} lines at subticks coordinates too; define complex variable/expression in MGL script if placed at beginning. @item # set to use solid marks (see @ref{Line styles}) or solid @ref{error} boxes; set to draw wired plot for @ref{axial}, @ref{surf3}, @ref{surf3a}, @ref{surf3c}, @ref{triplot}, @ref{quadplot}, @ref{area}, @ref{region}, @ref{bars}, @ref{barh}, @ref{tube}, @ref{tape}, @ref{cone}, @ref{boxs} and draw boundary only for @ref{circle}, @ref{ellipse}, @ref{rhomb}; set to draw also mesh lines for @ref{surf}, @ref{surfc}, @ref{surfa}, @ref{dens}, @ref{densx}, @ref{densy}, @ref{densz}, @ref{dens3}, or boundary for @ref{chart}, @ref{facex}, @ref{facey}, @ref{facez}, @ref{rect}; set to draw boundary and box for @ref{legend}, @ref{title}, or grid lines for @ref{table}; set to draw grid for @ref{radar}; set to start flow threads and pipes from edges only for @ref{flow}, @ref{pipe}; set to use whole are for axis range in @ref{subplot}, @ref{inplot}; change text color inside a string (see @ref{Font styles}); start comment in @ref{MGL scripts} or in @ref{Command options}. @item $ denote parameter of @ref{MGL scripts}. @item % set color scheme along 2 coordinates @ref{Color scheme}; operation in @ref{Textual formulas}. @item & set to pass long integer number in tick template @ref{xtick}, @ref{ytick}, @ref{ztick}, @ref{ctick}; specifier of drawing user-defined symbols as mark (see @ref{Line styles}); operation in @ref{Textual formulas}. @item @quoteright{} denote string in @ref{MGL scripts} or in @ref{Command options}. @item * one of marks (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}); set to start flow threads from 2d array inside data (see @ref{flow}); operation in @ref{Textual formulas}. @item + one of marks (see @ref{Line styles}) or kind of @ref{error} boxes; one of mask for face filling (see @ref{Color scheme}); set to print @samp{+} for positive numbers in @ref{axis}, @ref{label}, @ref{table}; operation of increasing last character value in MGL strings; operation in @ref{Textual formulas}. @item , separator for color positions (see @ref{Color styles}) or items in a list concatenation of MGL string with another string or numerical value. @item - solid line style (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}); place entries horizontally in @ref{legend}; set to use usual @samp{-} for negative numbers in @ref{axis}, @ref{label}, @ref{table}; operation in @ref{Textual formulas}. @item . one of marks (see @ref{Line styles}) or kind of @ref{error} boxes; set to draw hachures instead of arrows for @ref{vect}, @ref{vect3}; set to use dots instead of faces for @ref{cloud}, @ref{torus}, @ref{axial}, @ref{surf3}, @ref{surf3a}, @ref{surf3c}, @ref{surf}, @ref{surfa}, @ref{surfc}, @ref{dens}, @ref{map}; delimiter of fractional parts for numbers. @item / operation in @ref{Textual formulas}. @item : line dashing style (see @ref{Line styles}); stop color scheme parsing (see @ref{Color scheme}); range operation in @ref{MGL scripts}; style for @ref{axis}; separator of commands in @ref{MGL scripts}. @item ; line dashing style (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}); start of an option in @ref{MGL scripts} or in @ref{Command options}; separator of equations in @ref{ode}; separator of labels in @ref{iris}. @item < one of marks (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}); style of @ref{subplot} and @ref{inplot}; set position of @ref{colorbar}; style of @ref{vect}, @ref{vect3}; align left in @ref{bars}, @ref{barh}, @ref{boxplot}, @ref{cones}, @ref{candle}, @ref{ohlc}; operation in @ref{Textual formulas}. @item > one of marks (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}); style of @ref{subplot} and @ref{inplot}; set position of @ref{colorbar}; style of @ref{vect}, @ref{vect3}; align right in @ref{bars}, @ref{barh}, @ref{boxplot}, @ref{cones}, @ref{candle}, @ref{ohlc}; operation in @ref{Textual formulas}. @item = line dashing style (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}); set to use equidistant columns for @ref{table}; set to use color gradient for @ref{vect}, @ref{vect3}; operation in @ref{Textual formulas}. @item @@ set to draw box around text for @ref{text} and similar functions; set to draw boundary and fill it for @ref{circle}, @ref{ellipse}, @ref{rhomb}; set to fill faces for @ref{box}; set to draw large semitransparent mark instead of error box for @ref{error}; set to draw edges for @ref{cone}; set to draw filled boxes for @ref{boxs}; reduce text size inside a string (see @ref{Font styles}); operation in @ref{Textual formulas}. @item ^ one of marks (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}); style of @ref{subplot} and @ref{inplot}; set position of @ref{colorbar}; set outer position for @ref{legend}; inverse default position for @ref{axis}; switch to upper index inside a string (see @ref{Font styles}); align center in @ref{bars}, @ref{barh}, @ref{boxplot}, @ref{cones}, @ref{candle}, @ref{ohlc}; operation in @ref{Textual formulas}. @item _ empty arrow style (see @ref{Line styles}); disable drawing of tick labels for @ref{axis}; style of @ref{subplot} and @ref{inplot}; set position of @ref{colorbar}; set to draw contours at bottom for @ref{cont}, @ref{contf}, @ref{contd}, @ref{contv}, @ref{tricont}; switch to lower index inside a string (see @ref{Font styles}). @item [] contain symbols excluded from color scheme parsing (see @ref{Color scheme}); operation of getting n-th character from MGL string. @item @{@} contain extended specification of color (see @ref{Color styles}), dashing (see @ref{Line styles}) or mask (see @ref{Color scheme}); denote special operation in @ref{MGL scripts}; denote 'meta-symbol' for LaTeX like string parsing (see @ref{Font styles}). @item | line dashing style (see @ref{Line styles}); set to use sharp color scheme (see @ref{Color scheme}); set to limit width by subplot width for @ref{table}; delimiter in @ref{list} command; operation in @ref{Textual formulas}. @item \ string continuation symbol on next line for @ref{MGL scripts}. @item ~ disable drawing of tick labels for @ref{axis} and @ref{colorbar}; disable first segment in @ref{lamerey}; reduce number of segments in @ref{plot} and @ref{tens}; one of mask for face filling (see @ref{Color scheme}). @item 0,1,2,3,4,5,6,7,8,9 line width (see @ref{Line styles}); brightness of a color (see @ref{Color styles}); precision of numbers in @ref{axis}, @ref{label}, @ref{table}; kind of smoothing (for digits 1,3,5) in @ref{smooth}; digits for a value. @item 4,6,8 set to draw square, hex- or octo-pyramids instead of cones in @ref{cone}, @ref{cones}. @item A,B,C,D,E,F,a,b,c,d,e,f can be hex-digit for color specification if placed inside @{@} (see @ref{Color styles}). @item A arrow style (see @ref{Line styles}); set to use absolute position in whole picture for @ref{text}, @ref{colorbar}, @ref{legend}. @item a set to use absolute position in subplot for @ref{text}; style of @ref{plot}, @ref{radar}, @ref{tens}, @ref{area}, @ref{region} to draw segments between points outside of axis range; style of @ref{bars}, @ref{barh}, @ref{cones}. @item B dark blue color (see @ref{Color styles}). @item b blue color (see @ref{Color styles}); bold font face if placed after @samp{:} (see @ref{Font styles}). @item C dark cyan color (see @ref{Color styles}); align text to center if placed after @samp{:} (see @ref{Font styles}). @item c cyan color (see @ref{Color styles}); name of color axis; cosine transform for @ref{transform}. @item D arrow style (see @ref{Line styles}); one of mask for face filling (see @ref{Color scheme}). @item d one of marks (see @ref{Line styles}) or kind of @ref{error} boxes; one of mask for face filling (see @ref{Color scheme}); start hex-dash description if placed inside @{@} (see @ref{Line styles}). @item E dark green-yellow color (see @ref{Color styles}). @item e green-yellow color (see @ref{Color styles}). @item F set fixed bar widths in @ref{bars}, @ref{barh}; set LaTeX-like format for numbers in @ref{axis}, @ref{label}, @ref{table}. @item f style of @ref{bars}, @ref{barh}; style of @ref{vect}, @ref{vect3}; set fixed format for numbers in @ref{axis}, @ref{label}, @ref{table}; Fourier transform for @ref{transform}. @item G dark green color (see @ref{Color styles}). @item g green color (see @ref{Color styles}). @item H dark gray color (see @ref{Color styles}). @item h gray color (see @ref{Color styles}); Hankel transform for @ref{transform}. @item I arrow style (see @ref{Line styles}); set @ref{colorbar} position near boundary. @item i line dashing style (see @ref{Line styles}); italic font face if placed after @samp{:} (see @ref{Font styles}). set to use inverse values for @ref{cloud}, @ref{pipe}, @ref{dew}; set to fill only area with y1

6L/gS,!otm9WK?.+X810W`d#S6+S4#:aG)-,TN,#l0N6`+,U'gOsLJt 3_oDCpJZNK(`ja4GOOBIQS+Q*q]mT*DqUkq>KT-&<^gU;E1B50VuY$@P2\MPUQ;.@J6f\i1F_$ M:E.=PMNa4\ehM=!jo3nhS%_].oVDd:%P%La%`_=S1m_83rdVqMLdkBaF:`G:@fO.2jP&fn &,5M'*5h<@:&DOgOg^@M5\1UbT!;E6>-.Tor=,-+;!eY5".2)T?iX%AGJkGhIVS#6Eh,Y9o XI94D_/;ir>K?qJ`H?NS$O]ndI/X3S>I%A0#MuYfJK]C-p[,Ee)WCcX)bt\08I2% .C@/@NuA>,]*RoU9g`H?tCoiEYko+E8-!o3?5fUX+\rSQN&GCZ<7bE$0%iRkb,p?msG+3*0 afGbfW"(U\9^ZE5hQZb@&Cp5=&IfdAEP*7P3l@b1<%P?&`cHFb(j(b]W;)U>`h7ijDUIUBD ao],gO?`^+c0KLp>;XK!+id_'jJ>fM-AVIF9:1XT3GnSS!4MuXL7\rAk<_-l)nsCIY$bVn0XqpZc[dDFZl% _'!h;f3p*;VOroo>/oW.ZgoGcKmE5VbRorq@")^D"0TQc,lCP#qg'IQi!N#MMF6-NdD>\IZ &2)XLXPD/3sBn3*S9V>HrW)&qu>F(5U?H"uf1D!_*_NB5u'aM?Nd&MgY%CBp/PR]apZOSQR n'9#l3$&/,U1'B$b!P(IJGZmOp13Vi'e`e:;@=Is\T[u?G+PinAZ2u1U;VGbTFI/YG`KoHO +\'_K7oL;B5LQ(3\%*d2(AMU?O%a Pkq8Fs"4nF@<1NR2YXf--5kkN,=bRV`hW]_,`GSq9t=j'U)t5YVmX:G\Sl%ZMG@8.[Bli%" n7*cJcQ6\lXf`YlthKbb0<^pXMN,DGrfbNZlI%DP0Eed3?abruM,@GV2C1I$OuXlj'9O[/; )(0^?L9F%IcRW(7fXsCg5n`)jo&Yd_*n]!>+`PPJ(ll]Gm_$>Ej1PE.srk+?_P_F]#G)`)C c'3pJ1hbE,gW9&=S.eRj\2GE#`$7[`DrT_R*1Vk>j'&CBJ9OQ+(,"n2ZjsEm5sWNTlGt@0Qj!m"69QPZ0Yo;J&.j./"O$oO!MQ*ORXePV+NEY 'o4(^+BS?53Ue!X8[.TRS$dbQ7tL=d7;:!OI;B5Sdi$6,5$Z&C?+)\j=+_?kCZfp1?V+/79 %9K_0VC0N#-;)!XOU(+=[u&c,5:^Bp82$j)kOhF\>5$Q'"'0tbIJ?ktF%BY8]X6,5$Z&CC2 07R=g@?kC\01olS$f?p@&73N:H A#ToGl]HM$YNq.5@G53JBSSdgUGBX*7nX8O?'%_op>p,!\tj^miA`b=[;,%ntfh30FPsL:q gqn!bMJ$(!6cA=hlR2o0N2Z0aj?PA3MC`2.clqJBS8[F2fb=(6J?bI)qZYbQ9OAPYW.&J6> /"KC\PA(.OpMXbiDK1q"g)/S5$iJBS8[K>fBL(6J?bI&`P;bQ9OAP`HNbJ6>-LL%9q,(,-- ;Hr.OObeb<1_4U%D=[6mIjf>0sAc\Ug.,Uef^apVXK0d:(+S5`X2e[q"$cldS^-8lW=[3aY o%f_EELR-fA/St[]f+"L2_Idg/EDSjX7cCkVC_(,KbcfkeO!=gHl3/ra8]dY )KYZtl=7%GOGiV!rs!Ek8JU__4iFK.Nssr4$.\=?i-73GXhIpZ2fJW(_laBs:eHc-c$I)!D gI8t:lno5Vc6+H&ScHDB)7DPRT:1si+Sr@4`UK9amb.1ffVo<-[6njfu>a]u.`4]s+P[u1m joQ%ZHjH:g!D,Bgb;FRf@!\-%2>n+E1E%i2ja1t9Kn^p,'d"O#BVZsg@&d35M32VF2'f8J!CH#MpN(m=R1'rCRE p@o$HSJ*)u-6ZcA)aMR[=u7\!OC665GPjDoH;9;j641S"'9OqoCH?behi,:[d)Le(/[fDg& !"hj*@u'=.$(h!$RP6fi0W/n$AoZdqNbC=KmC"7K&!^F`T-.`K"U7>MKn,r->n*&=/B#%!: D7h4M=+5@82;seETB/>4dS6>2V)ACd`)A3ONl$c?(W: h3U;>RCtYQYGLA@*>saG,&3``M+YO(3XnGP(0IQ0WE3HW=2#jpg`d;RuMQ58b)=5-Q81Wj5 iW%EMAXPaB4C?*^_N`2[CGGSK_A)S0;BS)6j`>UW+Rs+nJ9f3#d5caWVgjcQMBR;\OD92Jt ER4;W=&;HZq)rn!a5LCYJ)fED!4ViL`Sr>cn+8Z=$?8mH%1Y&nGT4'QVM:#ob8@FF4Q=r<# 1c8U2(;$))b\NgG6(,?jbT1H\E(nW-be&\VDN`M`HefJpK(@;X8%-o%@W3ELVg`ZIiW;L&^ Go"IQL=GHgDf9\q6[ing3Q\MlXdHOt>e<4H3n]BqCjfGC.>JN!7[NZ3K=Q.2Tf3NR\BtE6l "!UWVN$@`22C],(Rg=6j1PGd=8%UF`k#@&;1[F?`/A1Lf,=.Ba9s5(#aGUMfM"3@g7;ZsEN nHV^F+!/,(qKd?R)!mMh)Fc*AfMniQ.&#TX^"?A6`YS?ETr_"##hl/ GtTrG#"mIH=9V^=n`jqrHKq#U";Vc6fpa*7&E?V7:o!.V,GC `OqYsmaQU_;"pP9*s']p<@T##u/rk :RLcl3oDq"5f:,3'j\,=?g,89ha@pg::LqLA~> Q 0 g BT 22 0 0 22 442.893213 123.332434 Tm /f-0-0 1 Tf [(Unde)]TJ /f-0-1 1 Tf [<01>]TJ /f-0-0 1 Tf [(n)-3(e)]TJ -2.75 -1 Td [(\\MGL@@@)]TJ ET Q q 0 154.4 278.457 -71.371 re W n q 0 154.4 279 -72 re W n [ 0.797873 0 0 0.793023 0 83.027923 ] concat /DeviceRGB setcolorspace 8 dict dup begin /ImageType 1 def /Width 349 def /Height 90 def /Interpolate true def /BitsPerComponent 8 def /Decode [ 0 1 0 1 0 1 ] def /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def /ImageMatrix [ 1 0 0 -1 0 90 ] def end image Gb"0VHVfoM^;ob.c^l11+iFAk&OHbb&?[/Z&-NV:84!B6J06BE,(fR#U/gNf=qlm8&J,YA'j S]ce4R-+Gf*1NX]g&ka.phO/E=!XeRQ34O39N?rIqVLmV\qs7A#A)IHL4;NtX`rJ%snI0F# k0B@!/5IJVcDhgP+@2n*\\\pX<9?XLEdB6388rMND]\pF$aIt.L3HhYVRL51Q+%*)i%A+TWNKKFDG >e>0]ld2>[R[WtO/R(&M::f&H?QQY^nnBfY_Ode2_FX==fK^Z`_CPcqK2LQ% $_BjO*6G"S-,/.2'6,oa7-<\A=J]t:JOcWUP=*iZ;o,n&dF8/'(HTq\9/<^H0OU;FC*/?W* g@WTMWm8`Iqel9$,DJ6/%^U:dbGC@H%-A9_RBWZcF%&_Y8I57W>ea(>Y2Qp>[O,N/)S3uDD U;E?b<_WHrbuIRQ;uO7[9YWS $!3mR1_S7gTW(RBmuA1.eBMVk[SM-*rW1gN'phu8_6gQp/L]Yo9^YJ0ku%m+rF:RdYbe<;6/D-3EoP\? X$[VF+3c>?QO>&&D-D`RX6`npEdEsK,d(D&p.AmGk6%iGtId[lnOQ5+#s'mtM"f9+/&k2m1?RC%>/EqjTJbDeo:3K9i"_ m=.<@nBf1\/W6q#k,3-#0YM@AHK2N`:m*`Qe^'Y@lAAMI^Zsh.NO-jpoCZm>[.!'h=(^\4V Ss7=@PZu.g(81VL_IRJ'=oq^fT'-XFDGsXoe4'*#6kOA@/U,ESND%AHB'R`4Pu@K?2hGrfk ,ASR/Gn9Wj;r!DkHB@ErFLq^"!@Rj_ZN(YKKnqV(8"3LG`XuD*pP?R\dB::")JWbLnX6Zlr @FRhf7Cnp`#ap:FGa_?eQ=!&q=;U^.Q2.:rg1](lWaDN8XgqTDpA>2%_Xk5P>V'`LXTr4:t !1,Lh0i5"4IhbG!ZS7cH$@tT0PAktXrGO+p3Hg[Cf!71W`huUVl9&:+$Hu/!aJtk1>=(KgX .d!c7RJn1cKGEe?j=b&dq31T;lt)cYr4K,VcM_tUhPK`-"`"nQoVYn6*UW*j8KM,L_j$5cV =a`JV6eEDZX`*FF`.r[Hc>ok5PA7NugHY.LY>:6F(Rj`g=rpp%nG 3El$-OI15**PXo/%pN\R;]d#`Ci%i*Wn@'Xh>6`.1^o:5q/VWemE:K4(:gtZpc`n)FMUAVJ [MVaR_iZ/,."ok--OW7f1VC0]78"s8dKVP`(c(mW>$`=V1$)BG1nk@Xs>hMr0hcW@rT&&SA5JYT'G2\ch"^dh>^fMq(+#!EXGM) 9m7?MDrVE\mq0Vnda;lnUkl)Vtn5RH&]<=n6I#0NZ)IPH^9F?#!"V<_-=)TSX^8tD'e[[$+-.p/HInSE't5Wol.bR-c_8h"%#sJQ3\QY_Efc \`^<`?X9c@$9D3@o:SgOFYN.!#fO5iH!Ue5G/q_BP]"3JW=jTYfr.Q\EOCrTeO3sRuUuZAb &G>2,To&sr*HigH!?HQh\#eqt$-nss_K^#`#pJU,-<]=nb-54\>Gf4$OPs*j\P/W!SZ#X:c q2pL*g79^Q8b.m8BWPtK#QkCDhHiI8B%X[M_E<`+BK`=RqXn_Hn]S3+@5cJ)>]NT1OArJN" B9"1gA,LD1Ko"fG4j16=?Cd02(#t':5X#H7:q=p/sqCoM1R]'h8PpN8i.k!hauf$O=r'AVA MW:&$7S/uQQd]"4&V&A=I=L54b'0=B WAEbd]?;@oS%cVrbb),;-E9+O*oiOr&i,elB-\eVQ%5sQ)!\^c.::^ark) d):)bf`JL15sXXl++f#G^`Xcl`BOP-Z[b>,'A:.O!4.2A5SM^%"9GiZ5sQ+.F+]!G^`&l&A !B9p/79%97.DU5KYOa`*a>lHK?P^4_=`$JEVXV]jhg3$]$tp?TMd"Z[h7l nr7,p0FN\#-snoF!OI=?KCW;X(,-,P4t'bpAc]5gk_&FX@hpa+Ld!4o0kLHmJEVXVrF-Ok/ dpqe:Wrm7!9MDC/795)I8IX\bQ;AWd0JcK`@PC4&5>tb;To2S!RV/6o>E1f((bmj5"s0%Ac ^9ajccJBbQ:+3P`Lqj0FJ.`5!uot/>.iYnc@/PAcYV"PY[@c0FMQgTmUtSLKQkU#N^"G0/* cI,+sl!W.uBJYf;i[b;5rRj"1X-.UK5`Htd0mC`^^8 4qeo.KPgnaNg/L#MBrbRp@KZ+Yt(7%ed0=hd%Q)(P(aHL+R@462X84,Wc=,Sp^jX)0JC,3C QXdh.7&&>7h/O2BM4+=,OF%!d7!19\OuL_iOmjl#@oX3+'nLgS/Z1Z#sB9U_7g%cLkaG'cU qd314AG0U>h:dK[VddnPKXmJ/RN'1+L8"1:K@LDaT-?Ge+TT7mTin2!^el*]g^u;'Hu9=H3 id&#YL`32oEO&.&Cu-ZnUG,6;t%?rI1Z$iJm+l1&kf8r]cGa\.`"_`XHAKe*OsTr(s.$ulk g=%9!hHbA,s_1t/uR.L27iVjP[r^)*:*X:pS/X7QqWHKj59SC\ZbFJ]oG9?%qld.A,:=pEl eIh-c]`IH9%Ia1\I)*%KGEe?'YnqdFE*sR(3]+^2!JL=Xph-;-d%btlg9l#n%*&8T M[AROa%#<&>Y4OB$5+cDCpEb_Ij+PBDSl*X2#oNbK7kZfJ+kPS LcA;f0Q'DN(eC6.BKZFe jo,dNll^I86S2&ON6\-:XtWPWKFD_rESq/]_N.%EY!IX::O= L/D#\9BZ(1M;'M3,WtCKiO:a(7bTh`aZQeF-$(65^#9PkA_qCX-YZL\Eb/tKk5(/%\9hg@6 <>MZIGkC4Ibo8TFS"!@$As!IR_fYD,0R[5s8/W+(B!dA^+CU\6CiZGp$?hu6i8e&1&43/3+ i>Jp8Ioo#q6A$b+\'[$k6039mn&N`[KGF':?:Q5$p>NpC4/@53-h%%3T5+GZX)0I@/Fd:1;f,u2<$QOAJn$R*D2o8+'c-Ar`K!JATgb-m MD3d<^=o,,7$1@7I-AW%=hO;l-R!0pnBr0RY.M]m5SFn93l>>+Lf4E?VDZ0XH1Frns/mcEF VF*%!60nP,'&AF>p`);Fo@33]"TbeG1n=@XbaIo=K#L?!86KW4A(_0g5)aRBjr1'k>k!nZ6 J_D']:Wl#+1ZXhBMifb_"p`6Q*!+OFSS9aIAEUdT6fL_\Agc\#pfTi^VNH6HfYA3ONlA4gB/A6*5G)O3'6/VVE.N/gSMBP>K`cP>Z*"o(Y,mbbd/oB+ T.Z:l\pMp.';MbIq_9+..,)',+d)'Bs &%mPKDA[$X05`Q9U!s;W->j4CmVRu`ha%&>[54W,`B.$%0=!CSK%''1Q)&G:VOJ.fIOjR># %^]u&os)4GknU2Kj2[5&X-/'sbKeJUF(]0"E*rYho[<.9IK,C3O`?M?OeM_u8/U).r#MrbO M(~> Q 0 g BT 22 0 0 22 104.449866 123.332434 Tm /f-0-0 1 Tf (De)Tj /f-0-1 1 Tf <01>Tj /f-0-0 1 Tf [(ne)]TJ -3.366211 -1 Td [(\\MGL@@@)]TJ ET Q q 268.801 38.4 96 -38.398 re W n q 268 38.4 97 -39 re W n [ 0.793388 0 0 0.799999 268.8 0.0000473848 ] concat /DeviceRGB setcolorspace 8 dict dup begin /ImageType 1 def /Width 121 def /Height 48 def /Interpolate true def /BitsPerComponent 8 def /Decode [ 0 1 0 1 0 1 ] def /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def /ImageMatrix [ 1 0 0 -1 0 48 ] def end image Gb"/kM-!XM[`AE!(7?q5&2KH&O?b/45_(O<&-7nbN5-)pMMN$9d8E5\MJ*a0%`fb]'GOE&W! M,BeQU#I3k[^aT@`7F45F4)gpVFAI<%$sYFIeK:71J3PqX-P;=?*eWID0]SmJ3bL2\[-BEL/u7bEH__ PEXad*UOjHQbn!bC,LiGi5?XMkI"L!]+*Wp8!$*]kj3Wgpln2dA(OtS'&m2EmrJR( ?O)4Q`R9'XY-(4[0,=@ E9V3j^A;@$n^,h1=Cm+o)0_O33hDVZLNs$kolkHDVrlIrX]!sA"nXK7qUSPbW<[:8[C`nH< YF`kl#k9^CKV?Uh9?C?)3A_iKWF[nN_:3LP<[sQT ]4uJIoFP:sLXBs\*^d_.3bfJW9oMaPe].A6N(UosK6Nh_mk&\tZ^`7mrT;AHC>HDie>^4<^ 3pr7s7!o:^R@(&q=Doss6.=Rmd@6XW[2^;)6YWZ]6a;$Q;ofsf!!;T$_9LlCB'SW_qWb7lI g9i^Z2N842*]%HYgUc?0,4KZ_tHu&R(MB>a&nfX%^lAR'kHN^/\*[ITNR,lc3]SESBt4?>* !l2-&-'nE6M_YL7)aEJ.e=LrV%)Wd0eNAZ=W?[/D/EWaE$j6nZpT +2f2_W1c0ICk0;dM)iqj`7aAV-gIk-GZI>^QPq?*Fp\M=@Fh,tq(Kut,>1XhM^>Yj#m<=W[ \UUpZCeN)= d1UB'\-Q()D6pi/rf=j'=*$e5ZrH5]2LS-h<^3mJtZ[M8sCeICKMXlo^p!p0[=6(Ytm;H9_f,$ dQi^D[h*H.P,\E(!a3k0G@i4E?9:++oaDp\CX[F_>D9%Po>8ZKZ&o)i61Bj?f8bW#dHXHu? @KLR7@fNYH]Z6;.O1*ZQ0(l1Xne$/^\s?leV%hHj$?SN&X8\pWJfL)&eRRDg'+6g\[H hmN90O6udS:XdRkHMH_3^d!=`YlDer'(!kg?(cGOBkUmC2,O9hI89FTVaCQRnPC%.M)\7aCU;`9/Me*,\u)IUChgBDPE;'j$ -1o6iVj8nPSl&Y\,#jZGbOQ92uMl9^s]2gP#W`m^h]IIY8m#]Mo5nNBt]:RsIB[JgOIbsXiH$KYhn%fY4jMW)k*Q?"n>.Jb*ntjuW=Q2YET.fVJCWoTG'gP86XpOs9IgWtt`5(E("0G;)/3/6+!V;2aj) ks#gn@D'&dk&A-"?XC)&N)gEo+<`'9RDI4.m#Nj(&QH!2o\g5jT!nGT=oa6`3PO=V,38GOY eZeDL6G"YX`u;kj4JN#Of>1LN5lTRH0>+fEe,J':FjUM$LE0ghr.*H:CPr?]F6gtio0JD4,QX'qnD]#3KtkC`B$Z r+:er%1C:$c'\EP9qFdgFQtUp_6+JA_Q2BQoQa,n#d[lC']tm%6o(!bhA=4rDcIR^H+*ncO po$@!]=ObGbp3]g(*Kn0.^N%h)t\.G\WR2Vtcto:MV\NA_!!+_-f(ZR5C8"t9$&Ei]$W0I;!+oK+.6]&Lm!#=5VkK&BU,Rl),NgA$'5<#$c:D6Um"#R<`Wl8Kj 1)`#1\b,Xbc-*MN=AH-;\o;S-DJ[Bn'l0D5CMTFChTCHMg]2aY@='gc=?URO9q!Z=%pL26# =FI\$5M_Z#Rr6Tj\1fbrS/e>2iKTb02 uXJ,d2DGALb6rdo2#:,fjJG@i,?$XB3rr"\0/EK\'n-" f*fV)U7gNBI=Q9pgW`rWSh.?\>8ld^"7*\sg%u\*7S1Vc)*C1i$7'5KJA1gXF*%I]NBPr85odA@pDqhQD4u, gIE!Z#tKR*/6j@g3Z5dCMB,@7#a-Yb6Zq$F")pI!FngUAQN`pd[8INGYc$?!?Y"0W!C0(pT K@8S.(-b^.R0a)$Lnf\%Mf(o[SK"p>QqKdI":/Ag6W0afB4l&eP-L*^n4_js\$FR*U12Met cHmA=EMP./(nk7H--D"cU<]#JV8"j!=X9J"lq%]Rh.rE5K?nSfMjT&&DO?AoIR-Q23/%APC1!:tR:Q a,21WTLmr![cto785%F@>6aTF!COb:fsKJ`QIZ?U^3k^Jf)]VUf8EpMN[! JH2M&F2Bc-crciKo@oQid)g.;[NufEUKSV&p=;au='*Ng0QGI#^X:9ikOQUr#l*,<@WPnip )CSX6MF*jV>%SbRM&J;X3RaS4aZ/F''3Q2m?pkmYS2QAQFRXCKpgS4Wd``&1O[#N_B@8'pM C0tLJ`a3"H4^komgb!CI]uM&l=!mbNKZ.#H-U.uBtBk&6[d`6WpMDIC'uMM:!5E ?^/U0?(5=qc+0K'3[kG,[F*G_h44qb%h&'@VDDYo3^_%Yb^5.$A*/0lh%pb;Mqj>-=WuMZ] []eajbD= :Psu]sighjP.2QHSJVZ)]EH"IU3*P,S*s(Xal:c*N*<-qf8nU_$Le`!B--[OY&L!3jHW al9M:)`Eju3flAlp*Zl'gkeos,Ogn6C)3`Q4B7GK=8P6sN#%sZ)0`q7s,.CqLJ2.khl%jA= UD!\N@jBZZ]k#H>7?4X8$m@P7^mdNlg`&ilh>#LBfs["OHYHiY,PKRRoTufP)!=@DRpt9gI 2f!e>EJoF6=c>n+$RrqbpbtGbtp24"`^!*GhA*_c'2UM+N3=u'euFl9><1][K]'R't\=W9=?%sHZq ;*'/Cco&pMJXp0'*BIa1J':F0=,W7sIIlq&II2*nqr(3m\?,uH:]CS5!,#Rb5GAin_$B>i0 I7UI?J;N Z"cI,m/3$Eb9RPB2-ad1+AoVQ8n.>0n)4iiU[nDsic l,H+!p=G0%HeE6'8*DDE=7T)lu[o2.'OD3Y[/)Blob)["GOA2T0N3Pl$-/smbG?om+=!A:L ["n-_Di\]Hh.El.d[89iq\*lsc/WjNh+?ih6mpc(^nBadES%Fc5lmNqDeHV;KL_rg5A;=$G b/Sq78e<`d]-De@2-S5"ZeJRCH).2!$u"2ln8#;e,R$m-X+XSIgFAUGgK6;WIGToJZ+J^Lj 0J>22=2fu!qVSYrp9mj%#K=@>6NphK=4#W:7"W[go*(uV9\b-OsXI,Pjd@LIQ$JJmNk\,k7 h)*7D'ZomP$#`jGdG[GaKGs;S&7H[u%L.W\@=T1A#)a]q+L/,i*r?DrB+^-EB9G'rL:;*Y* rgjHO/%[VKbk$;&W/fupaT>m294CjeS,/rS=\k3cdB&gikg"=@H:IYG]-">lD&S5;7nb5hO :ALD^N>$F;Wh'k:m)J"N/'K0JnHA%2],6j64H/VJg[5*MUp'KSTfj+JQK_Q8:W7mJHYHhn" (H0+AVi>YBCI7cr!i8gsD#hOY"CM_1b=2XmCaB.O]pjR`R$4]tA3Pg%X_/QubPQCUC3IKH" h_^qk+kVbJ_+^cE0%L.W\@=VOA,?@&?CGNM#lk';n5TkjdiK0RZircjQ/eP`QYY&AMI9g$>^Kh\,G'4GZ;@T1]/!jD$#^>Z,sB9[0G"WtK>Pu7ed2L'j 4oWFA,$<1;=*T5_E(4O5keJBgLudCJff7%i^IZ%)ckPNVPbA\]MPKpHZ;G?8\p:@WhONR_R c`.@B8XcjUb2`\2id.*4/uJ$#Vf)X6;7r[]>&#`C\6q<1P~> Q 0 g BT 22 0 0 22 295.822559 11.771399 Tm /f-0-0 1 Tf [(End)]TJ ET Q q 243.199 325.599 147.57 -135.715 re W n q 243 326.4 148 -137 re W n [ 0.797682 0 0 0.798319 243.2 189.885823 ] concat /DeviceRGB setcolorspace 8 dict dup begin /ImageType 1 def /Width 185 def /Height 170 def /Interpolate true def /BitsPerComponent 8 def /Decode [ 0 1 0 1 0 1 ] def /DataSource currentfile /ASCII85Decode filter /FlateDecode filter def /ImageMatrix [ 1 0 0 -1 0 170 ] def end image Gb"0WLK>0kqZlWji0Qio?C/+D/laq`779Bi/ijB( $WW;.$q#<:p1Xbj6rdAnG+4G(FqaS/b=bk2jj8Ep(!jHg_@C<)H(!$B4A3d(2B*I,8Doa6;%^C;-- AGm`O-%gg0#ok\2+$I2]q=:MK-[spbC!Z4<4+GqRZXW0bo($X%2K'uoCi)2\e_+s0nmsfCo _.oR>/jr9-ia/>hjlj<45/$2f2f(WZ=m\%gf`U0:0(u@;d@t@`Zb?tQ3dL8nq5ru7:E2N\ZZ=`hLgY]cQ]._cM,>En*"O,];eHJ *>9dtmRNbE'4(F7iQA/T2Fr$dc?Bl6?c#n/1cC_#AN.ljYSj.RFj6G0l]"7!]OqM4JB$]tm >IIqqo#,hQ*^O\p55$=0edN?nD'rg&2FH"mB7bi'JiQPnD+5'*EiUT>3:urr$gm>GQI/uC- WdH-e5W?iO.SWe@VpEhaf;0@/!EjUVD!MP9]+OP*.4jsVO2&,16nCJb*2$]Nd?R@g'VF1h` @,DqFts)Nh'JIf:S:n;-^=c_44I='J,-&9pdfEjG+Jb'P*Ql/6X+>fsN`?An0];V(p(U2RB JBK2#>I9U14SPW]k@DY+7\qMKI-'?ml!FYM57GB`%^H1^"qV.GmV\.; _XdV`*Q>)MOs5BLR<>/Rp[koe%6p_+TC9BBg@=VkfBPAV^BH="qb=]![cgd8APl(cjZ^;^:9I5:NmO8PDkSWXF:j[hblB0ClfH+*D5:Wr D.D='K2'X`QcD`GD,3s!rp)UR1BU=7%tO9ocKY(K8;0Y%Xq!cItNT6jmg:-nQ[NLn%GI=b\ s$gf&Z5DooOa/">/14D6A7^K(a=HbmbWi(.a8O\c!LgP9dgQY/%6L,$iaosGQK [@T#=f6HZ*oE2dQ/l/A)tor("FPFurt#2/i6=Q,4!,H%"i#>8?RCDJp)qtu5L&3FH,a]`be JeoR$J".[AcX<*\8$FrUIC$W+jY8-sS.SMcOb$SXL-0EhGB"3]XbHLV6:Y%;Xtk[r)9I4[I ($kiD[cn@/HTL4Vc4;!eYa:'J8-J3jLFgA9ieM,39%Zq%D)[7k)0GabR+@OY5Z7UcZb_'[. Jac;P^9rlaK@RL/FaZd&CpuI__p*Br#Y$:[oWt'YD!'Yu.G!ZFr5I_lC)ff['^Hfk5ddD -jtjs5H<-V#UC7!'VN#hHU0W[t/n,_=;Kk&dXM<^^1K1aT9FBTOg/DkRI6Y>4RBSD"KHt[( o-IC2mf6>>\Qn8;TDW?^%l<),HR]-V"#6MMrq-l]_?B#nh1Y_!>doFsT+2#946VXb#CE#Ft TUJ']&53map%9M:3EVWI&)'6,Vn8H]u<-\=qdj/=fUOd-nmD-K $Z\75:Hq7M@Z$8>cB27[p`jmMU7.As6>+6CqrV4$J3BSc@D+]!(=msoYT-Vj!1YE=ATA<\a ZuA7[MOI5:&%k^[^KA[LMKOb4-;i;CgB4U14rak,+7LqW&Rk5-#m q&Z`<$M^9Z&,XG=7r,C?a_l3@V*7GnRq_GGAQ 9b>S!g;5:M>]Hf/u<)m2V>M?MGrFeL`UC6trhuA=f-d]uUHLS!AS6pe'-\>+3`tN0o^t+3= Ml2C]e7'X6cr!u$Zg^>/!@Jn;P]NDn2"+;r2Xp7uJ%$ZJC#K;=W "p*nr7?R)Pc6WdR#B`k9mQ0[h8LDHf)<9=kfET\W08%Qk>&dr'6q,RbDDl-fXgPs(T:mu:J :Q&Vf=&XE@t2/K;i=T5L,^X"E]loi@/"ZE3dB*EdAP-#e4N@?[ZheK4`sai26h<"+9MNK9P 9PfG?LZf)iu=peNu)C>%lEY/Q*gKPBBMFPRHL;Hge(iJ.')P8/%C>Z6r8H=mhq#aju9YVrZ !pBGgR&91SQSe[tpK"uAUY*8I0E^Hqj(Ts&7MacZ2ACCTY`L3E179=E,pj!V!ADY#\nol4&8ME5kpD9dE,?P@#FR8ppnmPd86*9(qVakDSDL%Y.YR@RkkPV%"EBuKP5%KAe$d4`cD bX(7kq<$U:9t?ReZ5Ut0InGXk`=HGtcq,spP:LuQgGc%>(=#:;oUP*!-ZHe@-Ps//$9JRlM G=;^F@jh'*p6Eo7:/q\:..EqkbP%_??a#3'CZP>m4Tc*-cOG(#LCND6UIS;lL:EL.N2QK3. ]<\\W_RuQ64h=3'db4T])OfXp%RYRde4E+t_;)&LiV[`f`@8='D4;-ERpa8J&Bg>ZCK+"9U [d/L#PP8[M5/+=V$.-sa<5]D%8RN_rIdqMn`5kg30@Cfs5H_n[> aWs,%QTnW0;"K@4\r&rhT=Pr)(!Ql'r%U,XSj@,>Y%=Z+\q&4T$Q4mISmS7rt6f-ZFZ3MP1 ^"0NOd9OD#5bF&=LoK93?l3[_ctUa#A_e=pA&FAe_K-G^"+(d$`I# \nqB3PiDa?D,4Kd3>gd58S8$s/=F6'&(8!%MkYo3I/\g66=jA>Uh"&[S@IbEff4LLgWLBn" WAt>mj5;cZaDXIp#-N=DLcMJ+!OI:;k'&Om>Cr/P)BNaf5h;,+!ud=t0jeRd(BBk]7pn:'S Sf/a8$H_i@#1I2B\sQT.`26MjWWKmui#[P!@OmS_HQ`TCIC>%$[5eY58!0&]["oLs$g?Bn1ME-ks!c5d(;u2#/[.6\JNDI\qc;*8M0#rkjQ\;&N 2#5H0O)&6@72g3hGiYfG>hn:<(.q,./3=\mW_.U?=oK[#Bt4M-uP,(];WD+cc":DrJpWPZc ?>(:(cuNW^^B_q<@/71(Ug(*b1B7H7XUQ3l,a3-SEKdNjCj 5,P*Tr8O'ZP5/+=M3c-NF0Wdiqr"[%[>9S20p/Du9 Jg9!=PTn!R*eeg%ur#j:8AD1a+=sj/c:,/3@BEm`Ei%-U7`8:3%]`'+tRbsq<+Gk(3c&MLT sjlclRW'LcU+3ad5(,,?jm*7&mM9rX6CblhqAE@7&#Zq#=:MhJ@"PL%i)GYU Y/$\.>hmUY$7Jm.q r\V7HLK`>Yant6/-EpMGe,B\..M=Zjk/MBK&`>r:+2Rp_sZ0?p4b@*W<(:!@97#R%`_LK:` b4;iL8Vmi<7[N7KC_q9CKeDd)K_BZNal&8>*@H4di\--$eq/VU6<]cO>%$[eh*0#[G?'Q:e=lG$/"s(]]<(++_pMpp\iLU];jTfl7E!D<&A]V]D3.Xe?=a iDROrYXUISn&"nsmmMMVr`2j5eBNH\r0@(>-4fG5gN8iPrFNgc5$YCVcOJ2E(Oci+,@B%kH f;k:Hs&:n#qBHi;WTA]H'Np4HHMUo<3dl&q\C[P$WE@&&Wo)6/4I)qmN+Ieq^%*EtET:JT& (9e=J?:0+4;$d=S>3qli5FE4C'$)*P9%q@%9jB>;Nd'Ac5H"a(4[Jg:Z\h_cuZ64&FctS&+ hS":1o&\&9B28H2F8Otl\_3qg-*,KQrfE;,n9s0kd'hh(3d7bl;6m"*:tQ(OBKoJVaV^pBU .$3M7C5I([3ReR5<\J\<3ajjDl'Y]2E+<(9\<6DHLo:Es#khdf@rB#/^VW:p[91eGgOieDV s=.(X8S9St&W=[Bqc7ECO2(IUZDleV;7I`AK/4Ntt9q\FV#1@`euh(r7jnE4,2\M4e$5UBf d`NiB$+94a9[njMkb'5>TaVMo)EOt&D-3dp#_Ms&FFj.jB(Ih5@=I/!]644gZ@BrjD'I-JN 0a`6Xp(RJYc?8ala:Jp9M5:c1]ltjn+7_Y_I^'">"b"sbZ:fIXm"UjOU=,M"DM>T$PUcjV. -4'frs?dVne]ToYB,V)o5<]V3-i.1=ZokQNHI."cOJ,e94DnEWnCC]_2B m!0Snq%siQ^;9[B$QJ4or$$?eW+/e%2W4e@<*4+7CK<]:)I\rT0W.iAnVP5)'Kr$ei4cpTs(AuXm[5W#/ LX-QWlT^:7*/OUmpYU%)cYVLMBk_VclBP#"ZI>,XK]FbA]O&)59ikWXc'FFhcN$4;=8q_5p ob/i/jqol4*7/Zj^\p+3dFn4VLs2%YhL17F97krs"--U(h`bnJAHP-g1%MQ1o?GB_#t^GJt ^mWFA7H\G38,Br_Qs/rSkd(Cg`Bg$N-GX4ZuR^5Q9^;?!/&g(+%0T?^k?t_t%A[6P")c^=i "&cc&B#rrdjrk\onlrDu6g,%q;eN<.r?#FpK4m2%DW;H*k&"UjOS:C#.KbOkn$Y2C[SOCe6 4*pZKZj(E;D71NL0k%]pf$59heZ.-NCe/3+:7ZRfaBPM@nF8P[3=0JEt!_3trldh%7LMIG" [!(!B`JK;LdSjYi:R`B1V^2#iR=h]TC3q"m8&#?9OB2(I:#K,)3#%2HD"&fg%n-#QTgh@GO \uSbNtbJPblNef8;mBB'X5RaX>&s51d:b!I@H;SW_(oq`[Yj1MDhj37dC"dT^mT8[MJJtc. ]^F9D>2OYXaDn+R,ltp%:Isr-2H-`WbleT`I=\\LU_!8&kj/D:hn=ZL,]G3H8[jY'>-'"8s cY#C*Nh*!u_s^7`:Y)>]Gm:Z0T\-^58nWPJO/gB*K:Arl_=6f(@T>@7goc(Ds14(g=Wqbj`^1F7([kTcH%J2_e?[M\$:"ZUreu/XU4h-"1Gfu5TP+R+b>bcoLZ5:L* p7%Qe(UcL[E7n4^2;Z>iX.ruX(4a\.E&%mP7>'kJKZ_^,i/BlUY]Nc=*uR(i&"k]uU_@G4" ]au`Ops/uqGU'p`3ZHG%ElHWQ9/gXZ'8Pe-eRW20NGl!W/YkeaNR4_IUIZUe#,ugH[DSb=0 MqVRl>7h>E;aJ(WAdr#C&t#nt-i_jd[7RQQGNQQ`\$>X"LU$NI5# ?'NjR]A^Q'(th[=_D"J$ZTS1ck["a7]WZ6`Uer]\H64i1l^JDkfu>*Pk`+%s^^8&8)ES;Gs D('`KA*g>%$;U9Q0_FM^\[C))'FS5M'laqB0mb+pnBhG+dMk0lYLB(CkNh]0DYkoDae(OFU CHQ]^qWkUY(qj5B"u]3]23FOq$oEcS3DVXQ/gkMQ:3O4!+0@eg`M]Q02s.?5B/&o3Bh8dQi >*n\L(bR"'J))U1XT6D18DmC"]ZYsJ*GqrfQb29s&gcjQI\6Fo&S5q$ahjA7t_*#S'iZ&Wq s'HK@jcl>tcI/BX.9"KjM."6&);4=Zq%J?o&$eblm^uLmA8F+k@k/HQg]OY*0<LmH.jZTjHcjL]tMX@;9\6Z+PC-`qjW :B$)[SW5OY[jf3hH\R6SYHbAp6ciMIr'\g"QMP@T!PUQEdf/+4kMa;`n2^&Bq&@)Q+:`QGO !"DVdaD+*V;-Rc,[2K6.m5aS4'&!prHgVY=a!t?:>4ChZp-npB;:IT-!QRI\NoQ(rsDM_'S XcQT-8q(5'g@q[DQF2@\P]5Tk$qtY_JL98iXk4AP1tP,=h1W]_V-[bKkV/#ZAJsX2'5+K*V ,h)JV0s(T,-k33[M,Fk&Uu%72$O@;Ngu#9BBO,9\YH;5.7*W9r/Cfa2Ii:a_m$RgM3uG1Vb ];Y;tKnmj/SBaV:*"ZK)#W41O(Pkcn*%6(FrH1pkZ*#>@=Ar3mf9?b`Mh7ME\khqct_Bn_, Ca5C$Y1b]grD9q"388DLK.`RX_u?hHo33G@QXIm(jF55F:b@t3pf\q$\h_#XnoJ)uhukqcW"VXtRneQf7Q@Z:md>j;eVTrbhVMQN/[0B6[ (t6]P*TKDb:us(H2'&a]-BNVDJ5)bZ%s("J)ZE,S\QQfErqi`iH0Yd[[>_!fD":DF)ik:FW &PhmuC)"C8/5sJ$X7U^Wc//4Bs/*4lXC"F&MF9J2r2*$+U^oqhDonOVZT\ODBEL$e"-GPNY 'lQAT4%O6#7DFb3AG&LS;W#$GiTo80$Rk%+7XODAhoU,hM=@TpWo!?J$@:5aEd[#cpUao"' =r/r828"JjV\`kYad-rtkL/+8cn,te'c&'Z8n?p(3>q*2N"$/b#,&sd0Dj/BuBgV])#3H$r :Soi\SI(foPN"7;@u!n(rVQWaj'33KfHcodV+*$659Ii"OXp#b-*L'OF7M4,c?G6+UfcCY> JLP'.@(2ddV'5RF8nS7g_8(UQno<#ER-M'iJT7ok;tsG!St+-XAf;G\=l&MN0QaX=Rh`8Lp \pUj'3QUV`;c.VtPYGX$q&BcQ!5XTbC?k-XS<]rPB2p+qWqCm<)FA9Qe=^E8t2>WMh-VBjI BtB"n?ukJuHK6KCNoN.k"B3,6Z*(Q1_PI-o:0W!ZU!Y_NlM[KP>@n\]ir/]X_5>2%!K_apf SSl+pN57k+<%-uouck`J^[P#F#S/q:PHmTbd3#IR-rsTl!9n&b#Vkml3BGkNXrD8c8(4Me> bgc;D2[H]&)-cb5%&%aM+E9$6V*5/ANYsE:::O`6A1',=m>%_:!M-/)d5Y2Xa[rhU=-$#_C gBN8(($\JW"Y#]rQ'#2("#pAYSN\#Q?1,RDSDDS3*Nn(I:m-M"?%VO:)mr)pA4%qEY-q8e@9bDWSC+<)dYSAV-haL&)0-DE%ol1;rYo6KZJDo7BS!;/kg1MBBTFb55UY OS:,`+2%\)+-XRGkL(2fWm;%";hO_PcEXiolYm`ZAg,.F9E:mH.]5GgkBGiq;H4,Lta2#<2 V/^g015f497im(Mp'0-TjLT7-Us%1OnLhdlb!?G+"s.(4T/=^%Nh0Ws,paEi;FDM$u]uUFE PlWff"4(Hs40Cu(;9C;HK0i`bE=FW#"/Di]WhZ9=?;do#/(6KC3c@>@cMW'?j_kr./M,5$^YOL\h7Z$GAN/.*o<cUrA%alXN6DBgHq*B"Mj=m/0()j(k2!+`bF1@gS[XdM-Qk e_R1Nr[S]Q3>(UW&^F_N!A2j#QF`bR-\<;W&j)M!U.dQbSrtT$\&UWZ_?&1!i(th^Q9h]+O ublU`MaI&SFFEu>UNJfqiscopi"IidDGcI`,oNC2lF;A<[c_NSbWkb lNL(iu8&M"/kUhO,U6@2Z%`?"qe0bq\hgSJ*`HiM[i9O/HP&#@C,N!9bCrB^ \2bYglgI9SK`l>XVcJkW+b*)ohW4%,k,R$iqpl6K.s$l%kG-*,o)]d%4Fr)0$tQpI(YiH^u Fj2YI25mYb=.$&&&$iXVM#H4kjEcHjAm712K?7KtP$?Im4e)CQiq17F9J--tQ:Cd0M'3'7/?en#1 /QcclZLOJnTfoq"=o\AlMQDWZM-t\@K5?N6*>i5Y>V4XsgA=8$B;/OQP,ppZ+4q>;IeEg^- \2U@Yhg.sZ32]&h^"WFM.Q&`U16sn@4W?,:E7cGn6r+OcX%jH8Mf70k;SF[_'"&P#efJLH!3N(#p\:7]HC3WuXW[HGu04eq&F4W#5TG;b#f !s27?$0&u>*5+c!N%>1`lcR2MYrQQ"r5jQ`ZigiAZ"p/c1&'doeG!cDQ4aiXu=I$IBfR04D Tp:f'9NKRf4W`du9Ms%@#LkMDdNBM2IcK,ErQ&7rK",r3t-TFZ$$j1"Dh0Y2d>rpFoM8A12 ^@.8D`uoUm^02H4cWSD^&)_3R!q8o)'c:!(q;*pW,^Ks@DbnAB`O(OHqBc;;cBTeVt3aYm+ Ad";FVJt:233uut;N47:TDkT&69M8fgY);O5UU9*l?T+3H:.BYgS.dnf=1p.62K7A\4&\:8 ?"Hro#nq$12Dc^QD1m\Tju?<4Db\cr1XT1+1fS\(A?AO.\:%;pOiBF3N#`9P)!>3bhpL4Y^ \-cLOhh')N]&F_,t$5OkUPJqeA!k;rl.4b)huKoVRgLP-Mh%DDScGJDb.P5dO8\pjqhfdkeH/m T,Vf1J*l0n)=S;`Ti#BW+Ihql%pX0_1u91s?BO88+nXNFYZ,^B18`;&"7aU.S!AlW^sqeP) \LAKVNp\oI;lkqX73Ka"7"0.*ZplPpeoBOl,41B.a\oI+(8)'Y9^GjYCDm.sgl]/(pO1-/p G4a1W8'delLVF'<_>]\#Is.iH]0;nl!PEdR%d@;k,PC]ndp"bLG'A-pIf/uWrVNd*^OH(R/ N)"N$7cMn_uN@o1JghB:JYnI0-#&i^OK%%YZ-Gnp2Jt,2Wb"ri$7Q[N[h'-U5CG#W1o/!Wi 2YLWaW%0#A*92"o~> Q 0 g BT 22 0 0 22 298.411426 279.754358 Tm /f-0-0 1 Tf [(Ar)21(e)]TJ -0.272461 -1 Td [(they)]TJ -0.536133 -1 Td [(equal?)]TJ ET Q q 0 g 2.15895 w 0 J 0 j [] 0.0 d 4 M q 1 0 0 -1 0 790.399963 cm 316.762 37.789 m 316.762 80.293 l S Q 321.988 721.4 m 316.781 707.248 l 311.578 721.4 l 314.652 719.138 318.855 719.15 321.988 721.4 c h 321.988 721.4 m f* 0.809606 w 1 j q 0 1 1 0 0 790.399963 cm -69 321.988 m -83.152 316.781 l -69 311.578 l -71.262 314.652 -71.25 318.855 -69 321.988 c h -69 321.988 m S Q 2.15579 w 0 j q 1 0 0 -1 0 790.399963 cm 316.762 152.66 m 316.762 194.406 l S Q 321.98 607.271 m 316.781 593.138 l 311.586 607.271 l 314.652 605.013 318.852 605.029 321.98 607.271 c h 321.98 607.271 m f* 0.808421 w 1 j q 0 1 1 0 0 790.399963 cm -183.129 321.98 m -197.262 316.781 l -183.129 311.586 l -185.387 314.652 -185.371 318.852 -183.129 321.98 c h -183.129 321.98 m S Q 2.295753 w 0 j q 1 0 0 -1 0 790.399963 cm 252.547 257.68 m 139.148 257.68 l 139.148 359.32 l S Q 144.703 443.091 m 139.172 428.041 l 133.637 443.091 l 136.902 440.685 141.375 440.701 144.703 443.091 c h 144.703 443.091 m f* 0.860907 w 1 j q 0 1 1 0 0 790.399963 cm -347.309 144.703 m -362.359 139.172 l -347.309 133.637 l -349.715 136.902 -349.699 141.375 -347.309 144.703 c h -347.309 144.703 m S Q 2.324777 w 0 j q 1 0 0 -1 0 790.399963 cm 381.137 257.691 m 495.648 257.691 l 495.648 360.906 l S Q 501.273 441.658 m 495.668 426.416 l 490.066 441.658 l 493.375 439.22 497.902 439.236 501.273 441.658 c h 501.273 441.658 m f* 0.871792 w 1 j q 0 1 1 0 0 790.399963 cm -348.742 501.273 m -363.984 495.668 l -348.742 490.066 l -351.18 493.375 -351.164 497.902 -348.742 501.273 c h -348.742 501.273 m S Q 2.290224 w 0 j q 1 0 0 -1 0 790.399963 cm 228.438 397.988 m 317.062 397.453 l 317.062 469.492 l S Q 322.605 332.888 m 317.086 317.873 l 311.562 332.888 l 314.824 330.49 319.281 330.502 322.605 332.888 c h 322.605 332.888 m f* 0.858834 w 1 j q 0 1 1 0 0 790.399963 cm -457.512 322.605 m -472.527 317.086 l -457.512 311.562 l -459.91 314.824 -459.898 319.281 -457.512 322.605 c h -457.512 322.605 m S Q 2.300242 w 0 j q 1 0 0 -1 0 790.399963 cm 379.918 533.141 m 495.336 533.141 l 495.336 633.395 l S Q 500.902 169.041 m 495.359 153.962 l 489.812 169.041 l 493.086 166.63 497.566 166.646 500.902 169.041 c h 500.902 169.041 m f* 0.862591 w 1 j q 0 1 1 0 0 790.399963 cm -621.359 500.902 m -636.438 495.359 l -621.359 489.812 l -623.77 493.086 -623.754 497.566 -621.359 500.902 c h -621.359 500.902 m S Q 2.29295 w 0 j q 1 0 0 -1 0 790.399963 cm 252.285 532.551 m 138.273 532.551 l 138.273 633.395 l S Q 143.824 168.998 m 138.297 153.966 l 132.77 168.998 l 136.031 166.595 140.496 166.611 143.824 168.998 c h 143.824 168.998 m f* 0.859856 w 1 j q 0 1 1 0 0 790.399963 cm -621.402 143.824 m -636.434 138.297 l -621.402 132.77 l -623.805 136.031 -623.789 140.496 -621.402 143.824 c h -621.402 143.824 m S Q 2.335361 w 0 j q 1 0 0 -1 0 790.399963 cm 258.828 674.629 m 370.828 674.629 l S Q 2.348876 w q 1 0 0 -1 0 790.399963 cm 316.828 674.629 m 316.828 749.066 l S Q 322.512 53.619 m 316.852 38.22 l 311.188 53.619 l 314.531 51.162 319.105 51.173 322.512 53.619 c h 322.512 53.619 m f* 0.880828 w 1 j q 0 1 1 0 0 790.399963 cm -736.781 322.512 m -752.18 316.852 l -736.781 311.187 l -739.238 314.531 -739.227 319.105 -736.781 322.512 c h -736.781 322.512 m S Q 2.4 w 0 j q 1 0 0 -1 0 790.399963 cm 495.113 422.059 m 495.113 451.77 l 332.828 451.199 l 332.828 451.199 317.516 429.449 301.457 451.18 c 138.828 451.484 l 138.543 532.629 l S Q 1 0.890196 0.815686 rg 187.742 549.427 m 212.887 549.427 l 221.75 549.427 228.887 542.291 228.887 533.427 c 228.887 524.564 221.75 517.427 212.887 517.427 c 187.742 517.427 l 178.879 517.427 171.742 524.564 171.742 533.427 c 171.742 542.291 178.879 549.427 187.742 549.427 c h 187.742 549.427 m f 0 g BT 22 0 0 22 182.028894 526.571399 Tm /f-0-0 1 Tf (Y)Tj ET 0.8 w q 1 0 0 -1 0 790.399963 cm 181.98 247.797 m 184.309 247.797 l 188.762 254.391 l 193.184 247.797 l 195.512 247.797 l 189.84 256.188 l 189.84 263.828 l 187.652 263.828 l 187.652 256.188 l h 181.98 247.797 m S Q BT 22 0 0 22 192.556238 526.571399 Tm /f-0-0 1 Tf (e)Tj ET q 1 0 0 -1 0 790.399963 cm 204.914 257.312 m 204.914 258.281 l 195.836 258.281 l 195.918 259.648 196.324 260.691 197.055 261.406 c 197.793 262.117 198.82 262.469 200.133 262.469 c 200.891 262.469 201.625 262.375 202.336 262.188 c 203.043 262.004 203.75 261.719 204.461 261.344 c 204.461 263.219 l 203.75 263.523 203.02 263.754 202.273 263.906 c 201.531 264.059 200.777 264.141 200.008 264.141 c 198.09 264.141 196.566 263.586 195.445 262.469 c 194.328 261.348 193.773 259.836 193.773 257.938 c 193.773 255.961 194.305 254.391 195.367 253.234 c 196.426 252.082 197.859 251.5 199.664 251.5 c 201.285 251.5 202.57 252.023 203.508 253.062 c 204.441 254.105 204.914 255.523 204.914 257.312 c h 202.945 256.734 m 202.922 255.652 202.613 254.793 202.023 254.156 c 201.438 253.512 200.66 253.188 199.695 253.188 c 198.59 253.188 197.703 253.504 197.039 254.125 c 196.371 254.742 195.988 255.617 195.898 256.75 c h 202.945 256.734 m S Q BT 22 0 0 22 206.091394 526.571399 Tm /f-0-0 1 Tf (s)Tj ET q 1 0 0 -1 0 790.399963 cm 215.84 252.156 m 215.84 254.016 l 215.277 253.738 214.691 253.523 214.09 253.375 c 213.484 253.23 212.863 253.156 212.23 253.156 c 211.238 253.156 210.5 253.309 210.012 253.609 c 209.52 253.914 209.277 254.367 209.277 254.969 c 209.277 255.43 209.453 255.789 209.809 256.047 c 210.16 256.309 210.863 256.559 211.918 256.797 c 212.605 256.938 l 214 257.242 214.996 257.668 215.59 258.219 c 216.18 258.762 216.48 259.527 216.48 260.516 c 216.48 261.633 216.035 262.52 215.152 263.172 c 214.266 263.82 213.051 264.141 211.512 264.141 c 210.863 264.141 210.191 264.074 209.496 263.953 c 208.797 263.828 208.055 263.641 207.277 263.391 c 207.277 261.344 l 208.004 261.73 208.723 262.02 209.434 262.203 c 210.148 262.391 210.855 262.484 211.543 262.484 c 212.477 262.484 213.199 262.328 213.699 262.016 c 214.195 261.695 214.449 261.242 214.449 260.656 c 214.449 260.129 214.266 259.719 213.902 259.438 c 213.535 259.148 212.742 258.867 211.527 258.594 c 210.84 258.438 l 209.609 258.18 208.723 257.781 208.184 257.25 c 207.641 256.723 207.371 255.984 207.371 255.047 c 207.371 253.926 207.77 253.055 208.574 252.438 c 209.375 251.816 210.512 251.5 211.98 251.5 c 212.719 251.5 213.406 251.559 214.043 251.672 c 214.688 251.777 215.285 251.941 215.84 252.156 c h 215.84 252.156 m S Q 1 0.890196 0.815686 rg 186.602 274.685 m 211.742 274.685 l 220.605 274.685 227.742 267.548 227.742 258.685 c 227.742 249.822 220.605 242.685 211.742 242.685 c 186.602 242.685 l 177.734 242.685 170.602 249.822 170.602 258.685 c 170.602 267.548 177.734 274.685 186.602 274.685 c h 186.602 274.685 m f 0 g BT 22 0 0 22 180.886035 251.828577 Tm /f-0-0 1 Tf (Y)Tj ET q 1 0 0 -1 0 790.399963 cm 180.84 522.539 m 183.168 522.539 l 187.621 529.133 l 192.043 522.539 l 194.371 522.539 l 188.699 530.93 l 188.699 538.57 l 186.512 538.57 l 186.512 530.93 l h 180.84 522.539 m S Q BT 22 0 0 22 191.413379 251.828577 Tm /f-0-0 1 Tf (e)Tj ET q 1 0 0 -1 0 790.399963 cm 203.773 532.055 m 203.773 533.023 l 194.695 533.023 l 194.777 534.391 195.184 535.434 195.914 536.148 c 196.652 536.859 197.68 537.211 198.992 537.211 c 199.75 537.211 200.484 537.117 201.195 536.93 c 201.902 536.746 202.609 536.461 203.32 536.086 c 203.32 537.961 l 202.609 538.266 201.879 538.496 201.133 538.648 c 200.391 538.801 199.637 538.883 198.867 538.883 c 196.949 538.883 195.426 538.328 194.305 537.211 c 193.188 536.09 192.633 534.578 192.633 532.68 c 192.633 530.703 193.164 529.133 194.227 527.977 c 195.285 526.824 196.719 526.242 198.523 526.242 c 200.145 526.242 201.43 526.766 202.367 527.805 c 203.301 528.848 203.773 530.266 203.773 532.055 c h 201.805 531.477 m 201.781 530.395 201.473 529.535 200.883 528.898 c 200.297 528.254 199.52 527.93 198.555 527.93 c 197.449 527.93 196.562 528.246 195.898 528.867 c 195.23 529.484 194.848 530.359 194.758 531.492 c h 201.805 531.477 m S Q BT 22 0 0 22 204.948535 251.828577 Tm /f-0-0 1 Tf (s)Tj ET q 1 0 0 -1 0 790.399963 cm 214.699 526.898 m 214.699 528.758 l 214.137 528.48 213.551 528.266 212.949 528.117 c 212.344 527.973 211.723 527.898 211.09 527.898 c 210.098 527.898 209.359 528.051 208.871 528.352 c 208.379 528.656 208.137 529.109 208.137 529.711 c 208.137 530.172 208.312 530.531 208.668 530.789 c 209.02 531.051 209.723 531.301 210.777 531.539 c 211.465 531.68 l 212.859 531.984 213.855 532.41 214.449 532.961 c 215.039 533.504 215.34 534.27 215.34 535.258 c 215.34 536.375 214.895 537.262 214.012 537.914 c 213.125 538.562 211.91 538.883 210.371 538.883 c 209.723 538.883 209.051 538.816 208.355 538.695 c 207.656 538.57 206.914 538.383 206.137 538.133 c 206.137 536.086 l 206.863 536.473 207.582 536.762 208.293 536.945 c 209.008 537.133 209.715 537.227 210.402 537.227 c 211.336 537.227 212.059 537.07 212.559 536.758 c 213.055 536.438 213.309 535.984 213.309 535.398 c 213.309 534.871 213.125 534.461 212.762 534.18 c 212.395 533.891 211.602 533.609 210.387 533.336 c 209.699 533.18 l 208.469 532.922 207.582 532.523 207.043 531.992 c 206.5 531.465 206.23 530.727 206.23 529.789 c 206.23 528.668 206.629 527.797 207.434 527.18 c 208.234 526.559 209.371 526.242 210.84 526.242 c 211.578 526.242 212.266 526.301 212.902 526.414 c 213.547 526.52 214.145 526.684 214.699 526.898 c h 214.699 526.898 m S Q 1 0.890196 0.815686 rg 422.027 275.142 m 447.172 275.142 l 456.035 275.142 463.172 268.005 463.172 259.142 c 463.172 250.279 456.035 243.142 447.172 243.142 c 422.027 243.142 l 413.164 243.142 406.027 250.279 406.027 259.142 c 406.027 268.005 413.164 275.142 422.027 275.142 c h 422.027 275.142 m f 0 g BT 22 0 0 22 419.743164 251.142834 Tm /f-0-0 1 Tf (N)Tj ET q 1 0 0 -1 0 790.399963 cm 421.898 523.227 m 424.82 523.227 l 431.93 536.633 l 431.93 523.227 l 434.039 523.227 l 434.039 539.258 l 431.117 539.258 l 424.008 525.836 l 424.008 539.258 l 421.898 539.258 l h 421.898 523.227 m S Q BT 22 0 0 22 436.200195 251.142834 Tm /f-0-0 1 Tf (o)Tj ET q 1 0 0 -1 0 790.399963 cm 442.934 528.617 m 441.871 528.617 441.031 529.031 440.418 529.852 c 439.801 530.676 439.496 531.812 439.496 533.258 c 439.496 534.695 439.801 535.832 440.418 536.664 c 441.031 537.488 441.871 537.898 442.934 537.898 c 443.984 537.898 444.816 537.484 445.434 536.648 c 446.047 535.816 446.355 534.688 446.355 533.258 c 446.355 531.832 446.047 530.703 445.434 529.867 c 444.816 529.035 443.984 528.617 442.934 528.617 c h 442.934 526.93 m 444.648 526.93 446 527.496 446.98 528.617 c 447.957 529.734 448.449 531.281 448.449 533.258 c 448.449 535.227 447.957 536.777 446.98 537.898 c 446 539.016 444.648 539.57 442.934 539.57 c 441.203 539.57 439.848 539.016 438.871 537.898 c 437.902 536.777 437.418 535.227 437.418 533.258 c 437.418 531.281 437.902 529.734 438.871 528.617 c 439.848 527.496 441.203 526.93 442.934 526.93 c h 442.934 526.93 m S Q 1 0.890196 0.815686 rg 420.887 549.427 m 446.027 549.427 l 454.895 549.427 462.027 542.294 462.027 533.427 c 462.027 524.564 454.895 517.427 446.027 517.427 c 420.887 517.427 l 412.023 517.427 404.887 524.564 404.887 533.427 c 404.887 542.294 412.023 549.427 420.887 549.427 c h 420.887 549.427 m f 0 g BT 22 0 0 22 418.600293 525.428577 Tm /f-0-0 1 Tf (N)Tj ET q 1 0 0 -1 0 790.399963 cm 420.758 248.941 m 423.68 248.941 l 430.789 262.348 l 430.789 248.941 l 432.898 248.941 l 432.898 264.973 l 429.977 264.973 l 422.867 251.551 l 422.867 264.973 l 420.758 264.973 l h 420.758 248.941 m S Q BT 22 0 0 22 435.057324 525.428577 Tm /f-0-0 1 Tf (o)Tj ET q 1 0 0 -1 0 790.399963 cm 441.793 254.332 m 440.73 254.332 439.891 254.746 439.277 255.566 c 438.66 256.391 438.355 257.527 438.355 258.973 c 438.355 260.41 438.66 261.547 439.277 262.379 c 439.891 263.203 440.73 263.613 441.793 263.613 c 442.844 263.613 443.676 263.199 444.293 262.363 c 444.906 261.531 445.215 260.402 445.215 258.973 c 445.215 257.547 444.906 256.418 444.293 255.582 c 443.676 254.75 442.844 254.332 441.793 254.332 c h 441.793 252.645 m 443.508 252.645 444.859 253.211 445.84 254.332 c 446.816 255.449 447.309 256.996 447.309 258.973 c 447.309 260.941 446.816 262.492 445.84 263.613 c 444.859 264.73 443.508 265.285 441.793 265.285 c 440.062 265.285 438.707 264.73 437.73 263.613 c 436.762 262.492 436.277 260.941 436.277 258.973 c 436.277 256.996 436.762 255.449 437.73 254.332 c 438.707 253.211 440.062 252.645 441.793 252.645 c h 441.793 252.645 m S Q Q Q showpage %%Trailer end restore %%EOF mathgl-8.0.1/mgltex/CMakeLists.txt0000664000175000017500000000542014167366474016645 0ustar balakinbalakinfind_program(findpdflatex pdflatex) if(NOT findpdflatex) message(SEND_ERROR "Couldn't find pdflatex needed for LATEX example building.") endif(NOT findpdflatex) find_program(findkpsewhich kpsewhich) if(NOT findkpsewhich) message(SEND_ERROR "Couldn't find kpsewhich needed for LATEX example install.") endif(NOT findkpsewhich) find_program(findmktexlsr mktexlsr) if(NOT findmktexlsr) message(SEND_ERROR "Couldn't find mktexlsr needed for LATEX example install.") endif(NOT findmktexlsr) execute_process( COMMAND ${findkpsewhich} -var-value=TEXMFLOCAL OUTPUT_VARIABLE TEXMFLOCALDIR RESULT_VARIABLE TEXMFLOCAL_ERR OUTPUT_STRIP_TRAILING_WHITESPACE ) if(NOT TEXMFLOCALDIR) message(SEND_ERROR "Couldn't find TEXMFLOCAL directory.") endif(NOT TEXMFLOCALDIR) # set(extramgl Axis_projection Vectorial) add_custom_command(OUTPUT mgltex.sty COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/mgltex/mgltex.ins ${MathGL2_BINARY_DIR}/mgltex/ COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/mgltex/mgltex.dtx ${MathGL2_BINARY_DIR}/mgltex/ COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/mgltex/Recompilation_decision.pdf ${MathGL2_BINARY_DIR}/mgltex/ COMMAND ${findpdflatex} mgltex.ins COMMAND ${findpdflatex} mgltex.dtx COMMAND ${findpdflatex} mgltex.dtx COMMAND ${findpdflatex} mgltex.dtx DEPENDS mgltex.dtx Recompilation_decision.pdf ) add_custom_command(OUTPUT sample.pdf COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL2_BINARY_DIR}/mgltex/MGL COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL2_BINARY_DIR}/mgltex/MGL/scripts COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL2_BINARY_DIR}/mgltex/MGL/backups COMMAND ${CMAKE_COMMAND} -E make_directory ${MathGL2_BINARY_DIR}/mgltex/MGL/graphics COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/mgltex/sample.tex ${MathGL2_BINARY_DIR}/mgltex/ # COMMAND ${CMAKE_COMMAND} -E copy ${MathGL2_SOURCE_DIR}/mgltex/mgltex.sty ${MathGL2_BINARY_DIR}/mgltex/ COMMAND PATH=$ ${findpdflatex} --shell-escape -draftmode sample.tex COMMAND PATH=$ ${findpdflatex} --shell-escape -draftmode sample.tex COMMAND PATH=$ ${findpdflatex} --shell-escape sample.tex DEPENDS mgltex.sty sample.tex ) add_custom_target(pdf ALL DEPENDS sample.pdf) get_directory_property(mglconv_clean ADDITIONAL_MAKE_CLEAN_FILES) set(mglconv_clean ${mglconv_clean} scripts mgltex.sty sample.tex sample.aux sample.log) set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${mglconv_clean}") install(FILES ${MathGL2_BINARY_DIR}/mgltex/mgltex.sty DESTINATION ${TEXMFLOCALDIR}/tex/latex/mgltex/) install(FILES sample.tex mgltex.pdf ${MathGL2_BINARY_DIR}/mgltex/sample.pdf DESTINATION ${TEXMFLOCALDIR}/doc/latex/mgltex/) install(CODE "execute_process(COMMAND ${findmktexlsr} ${TEXMFLOCALDIR})") mathgl-8.0.1/mgltex/mgltex.ins0000664000175000017500000000507214167366474016123 0ustar balakinbalakin%% %% Copyright (C) 2014--2016 by Diego Sejas Viscarra %% Copyright (C) 2014--2016 by Alexey Balakin %% %% This program is free software: you can redistribute it and/or modify it %% under the terms of the GNU General Public License as published by the %% Free Software Foundation, either version 3 of the License, or (at your %% option) any later version. %% %% This program is distributed in the hope that it will be useful, but %% WITHOUT ANY WARRANTY; without even the implied warranty of %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General %% Public License for more details. %% %% You should have received a copy of the GNU General Public License along %% with this program. If not, see . %% \input docstrip.tex \keepsilent \usedir{tex/latex/mgltex} \preamble This is a generated file. Copyright (C) 2014--2016 by Diego Sejas Viscarra Copyright (C) 2014--2016 by Alexey Balakin This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . \endpreamble \generate{\file{mgltex.sty}{\from{mgltex.dtx}{package}}} \obeyspaces \Msg{**********************************************************} \Msg{* *} \Msg{* To finish the installation you have to move the *} \Msg{* following file into a directory searched by TeX: *} \Msg{* *} \Msg{* mgltex.sty *} \Msg{* *} \Msg{* To produce the documentation run the file mgltex.dtx *} \Msg{* through LaTeX. *} \Msg{* *} \Msg{* Happy TeXing! *} \Msg{* *} \Msg{**********************************************************} \endbatchfile mathgl-8.0.1/mgltex/Recompilation_decision.pdf0000664000175000017500000022764714167366474021303 0ustar balakinbalakin%PDF-1.5 % 3 0 obj << /Length 4 0 R /Filter /FlateDecode >> stream xZku޿?.lǎ# A Wd>%>[=C.!Qu}ϭ7%5ݖ^ضaOY+V5ӛW|8y>,~  oZKj.߻{˷wݻ/o_e_V\Xk8Զ\XP[ӑ\vXK,[ xzsKke˥Ү9+1^cqW?w_}{?\ΐ{_s[E|1oCN}Ͼ''k*ys-'O[(w~Ë[Rq= !^=&9~|xscYSh;R/=@.n9E2)ruBdnPkcWkOoݻ=}]%v?Ѥ+mӫK 8 mNt_O7>bϥJoڢ1KA "sM芋גEJw?W= & |4R/$a9QυjOBk[upNcZqS5WɇҤav*cO)!ޠph .i%P -i7'QkPC6JGT f %Sv !zo*}{ۑ;{ԺvMuC_#Oq:|"n ͇;?eddz:{ե7 G{ۿ%X߮&="ي$l3"9#OY'O 㸷8B#dެS8BDӆdm!+e=~Rv邌}Vt~&G-y= EQM]$j#-:հ 2i"O2 Ah?M1t&q'Qx@PD\FM[EqbavV!Ǭ"$vGRztt}P. n<*PR !sNNJ,=Iգfܢ'u W:$$e # BJŭW[5==o%BKa+ 2)ϺSn-ϫ y1 -Tԡa^,F\ F[ b ozt}&4>)MóÛ"<&X y @!@Mlh/OcVbmHM2ټ)㮶,}uMa&&4 l2S_NNAK|K ܢiSZJvXSKNjJjR~j1頉ezyә"-jBq FP5bJJ|>>mP*2O?b4*T ,'yj$D% 5KŢ(Q5oh Hhr*Jfz w)k P:1~XF<}k <R~Sy#@Aa}Y Pۤ<zvETm~ N8S1w4a1Ƨ ,S0<=~N p˶Ca{?uw{V;- sL t; Tv3 2xT;x|21" 3BGiz}E _j3F3ZzxRTbKuDͻR [ @ac/~F]:CKC@;8 1STzP mWc,rQ}h8%g82Pmi&Di]t(+ ]-=PR&x嘘cIjZg"sP)]𓺠`AyC2/*uxxz9Ǥ9dFPA;ltM`c%W[:Ԗ][=aP5X?Cӗ];5p1;AaU-ѠkW <0e(/ 5HGb Uֻ݉sngHGY*6q8[y1r4h`eɾe#Q04y/$2W>AhnCB@ \Rmš%wC>-%*ȣ̉sPKbhiR|)p=+*B&KY܆H@*i9(H̗ru(9O | #9`eOO컨==23>\58+hIqlSf|NgKŏƥF2vjL] /"hSGl܈r@4c%jjHP[o3 L}^Ji~Xia#dRx[ DNyIɴbw_,kݦ@QckC@!e;QFߛDaG>&K C%z&MPΙ jB8HC#D$zshEWG:fp1rLODKhL$T Ա xɢ} TǹDRŖjp~Cc6  jc[cDOkNɄ~L=%?V]YE+rF`k$8NmP!s0|Z2,WzZ:(M>l/p ofbX_1hEHzֺ`>4_ b>ڡeDf@RI% /"TM9h򲳮R\9K<0$`m+k[#2 }D=yһ+ qs`KDyqL P< bO}b|f92Rۓ!A1Ûc ̢ǶJfj2lєNg2sHA0R`%ɍ h1o3F,.Qh17vx#R 㖤k0l0RQab?S<P#<Cc3a€!Q;A{q S =̵{7u,OEICM#Az':*N5gJʠ<)VzPl?(>%7$؂?1>H>y"Iqk| 'gIя>Ln Կ}AJF`+:" ? g3srMªjX(8I%-NY.& w0*69%*C_vMWXSR8vzkmֳZD _qtFal"u?* ޝ$ * Rү%)I5ɶH[3C-+:[rFE)maz?l,Cy2zK(v7څLUvVɂ;טwY;MBJa.m9mȇZc 1'z3U Cr,qmŊ Bd?tYpȱSE.L!U fԙ'RФ$,]t⌷F^6aPIVJqYue9>dF-ѣu*L.5LN?d㓬 G;'Vݟ`xI"pj2[LE3U˙2噲/q1Y){8 endstream endobj 4 0 obj 4589 endobj 2 0 obj << /ExtGState << /a0 << /CA 1 /ca 1 >> >> /XObject << /x5 5 0 R /x7 7 0 R /x8 8 0 R /x10 10 0 R /x11 11 0 R /x12 12 0 R /x13 13 0 R /x14 14 0 R /x15 15 0 R >> /Font << /f-0-0 6 0 R /f-0-1 9 0 R >> >> endobj 16 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 630.457764 790.399963 ] /Contents 3 0 R /Group << /Type /Group /S /Transparency /I true /CS /DeviceRGB >> /Resources 2 0 R >> endobj 17 0 obj << /Length 18 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 121 /Height 48 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 >> stream xŘkA0,Ca K eC\H 9.$HAdbN"i 'Pb^C%- IMu6ɮie70I)Lk2l-ݺ*pP(:i>zA&' NTJ'la$N.r]bX|z C$k''|,ײNvƼ ŵiuFYf 7Ws-&h*Qc:Ф%>'wFխ")J'hWM=q"7V{FKv&<{%e}ץpʐO> stream xyTTwRTW=j(b*(( (DD0n }hܢѐؘ9,&md{:3'';ICb5IsxD_K,ɩxK*K}U]Ơݽf6R?57"'e;2i l" ?ypsiE]5ގ=3^ƥ/m_yjz!Y7ptzFooJ͔IJt{I<'~VmikEqBI# d|`Ccsdvd2WT4֔w4 dLc;̮-󾸽hvxۛGwul;w|0x>:8:!<º G#<74')&T8DcLߏƹE[^^P[Y=c{׮?2Aln;#,)gg=YߚktꛒBgww,j[R^s%EeDyZSc Lskͭ(.X{k( uom |yGzjkL?Ԕq5dtw`G`g9gf u= OgC'SG-G/0--IWw:qXyym-JIȷ[cR䳥A,`*Q++=.Wϝb\eTΆ6+:^ZPʦ M?M+˳ᝥ\[?Ld1+#PQIa D(Pcy,)ɾ./lƴdڿ9?|y&p1*t)37IgtT1ZkB# 3`ogAaK=7Y^MN5iaXT%dl.19J$ET*A)to,^މ ms_6N7VgKI?/x=m^F&~>S!\Q̇:8 |Xa"m,(H$"b- GѾ(99D$Kj_ahzgah0i\n"!ӄ۷p˾w'-[|9 gTx*N-.RIAYhVJ8J>+źs?Bth 2_jn;^Z`q^(C>q|M*mQ1iioQ9WpSnULD)&UP X>;'6h XR4+\S.ܙiYar>&_o S>_E  8y} ЛQ7ٓ`&ʼnFyh0Ge9QiiirGϛ^m-ypfuQ'*.g33F/Ƙ{6/xa :#G|SN,N U#b ??*mZ' ~5uwM:Z[Qog'nEͯx+2uR^:AVdäTl1eZ17CI7"nx]ڨ\XW* tbDF 6A8?JX f{]CIeAy-y%3mt{Yɔ>G5oSrzRaMYoW'7UV(Ƒk5\.6 )]sy"y)23 :ovryR6:1|0ꌇ m'j6$!D;d2Ij^)*Hq'GfTX*Oa䛂Pͨ1|p7ZUA$vL(~296r@j'wCdPM+Vs385NRBsՇ5jB5ؖ #hĖAQOVF#lxGA QcS- b%,)kIVLGr7d .p)_! HҹFWub?'Ñzr?^,sac̳ZB=^Y%d0p*Iy̔pMftGNVX͖GɁ5q0;|DP͞J` mnjK5Ya|;s߭1B_**WF`,v7#YڕGz$N^YnTD8oV_؞G d`["Xb|M69g Rf0??)_! a5VTG0K=9p,nzn:  G$u&ƪaq&R@ʈL0orHjB$n $5J:#am <_Pobt ,zmD5?F3z\xL NԊ]za]tUGYi*|[F~o٬@ :{ J3 B!`|놆hYR"I']Tb,3e;͖br~XuqJiVRzw5!r6C̙S+ kt1:"avQcܳE$Xҁ(8 jE 1ԃ^X4I>S%`EqBɱ i&ªQ{9\NxNĹuFD.SfGJGP4B6![7őRX6ibmF( `N –D8' ̓e7_An_*AO8rFFWn,bcSpH1+7ߛ7'6 R6szqNib?3Ѯ)ZE0艂uN؝J>q~d7=ET&#Cd 2慣n|BqHtk%^.KH)699 JFBUllm.56$k h5AWExҟ}d"}r=rn$}!$'6:HK"˂uzucz$Yɏ%aHݒ&R&_+`Ũx$A#@(A>ƞĀoH|b?3 &&Co4]h3b,ƥ_QDVLl2BYVǦū@nc⋭6oUzE-0;yV<6a.cX-8wch8`l_.FX Hl%En~Z'ӢR:>+LhW 5<,Xvt*WdчBJ:m6~l6y|(W/n&C@0 >b8A3[cc 5Gi,mscB;6n%K*dbv_Qy * >p7UtTp0( 01XА3J+b9gG _#PI`J:7ŕX)\X/zSOfWg׸\ o0cAah0 .h PqgR7"R8QJB$4?<@LH0F%!p5?]2o{"eVXi],+m>rF1 04 0!+x*CQ *)%ySpX8{&[h5yPq\|(ea2j o7\=0j?(FʼnTre#DAwbQ pŒp(S{u@*Q C#i6(tCWat;Vɵ)DT3tQ8OB`3P0Bc'\?2D@h$"ޤH9,)D1-Q/`t۩crr0щ6ar1p _ݤd endstream endobj 19 0 obj 4766 endobj 20 0 obj << /Length 21 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 349 /Height 90 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 >> stream xgqz#*QQ9xv(;&PKzؔɘ.NC=mf,:rYؔSYEL[3Fɡ!ݞ-ݒ6|/x{|;440"v&[(_Yypt g'Ǔ#a!7aDSRчi0(y]{4;k\򏶖o+"su=xvj Wvy[nMlcVHKuգuqq ϪGkS/-"4:V'l]a&n?ij!.}kՋ5r&]I}zFz1k gޫ^QJM^@q皪k\d\b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\  wGb{kYU/Hrfrz>:nolTOGw"zk٘ 'C"2Vv}6[z|QAVʭx_Tց\-:Яsf~ufxMW\a\kNKr:=n,=OaFSYwquZmZu}uͦfCwݐK8|@ 'BA5̰۶zaQ+l'T۝ endstream endobj 21 0 obj 765 endobj 7 0 obj << /Length 22 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 349 /Height 90 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 /SMask 20 0 R >> stream x{xU6/_. %IiHԒii͔ZJ\*7ЩEpggPDe 2,"̸<;e/=I]GX[)9'<ǿ[y*M;wn<ommD"p8`ᆆ_uuכ2*+=)+ՕUSiӦ+NksjUVdwNLb1{b59 ̅o55jU,ENL&#/9Mh4mawDzeK6}dxên߸fۼf: '-R7l͠T ,'/[$%]/=n~*tv;0jۦǞݶ{3^ڳоm{y߶WP<ފg{˦UzUrDBwTpnVKKKܴvO {x'P- _:/jOu}QR>6鍐V"{©eIqq{CjެPMyRW-vp67WKiz4Bsss;+Mػ}&V/y8wxW\:z )얍KfUtZ=v٬뷷W+T4. O&ԧ cˉX}bi@X13S%fmɔ<#+F-UVTTpd2 CoyY}oҫ'·|G]̨v8^ezT"f09N;l~2c ӹ %IOݦ#!H0:Xt%`0HJYp::(//Jy+~9RnF8|:ѕuts֧[5iGÍ 2.BA>Y9b{&`)ZiiTurr\. #π Ҳc7UT66_\:D}tmݍNvqt-^nJdzgq:C{ѠGC>!|v#hJZ3+3r(#f UB-z='Oћ :BB]ԻO.A;BgCX@{}qo9OF w-ޮn֖ -_ab$,MO IEA~s_>w[./Foc!t>(Egm"`RIGA|rqRpOekjtl-WP WǜCdWS%?'ÉGCnF$?q3? rNFɡI})Wba/GGY8сFЕdnu۝cp10Q\>F?YGw97ٖH,,az.`93S\G_p_$7J CsЈ,88@|!~-Y_˓/ H`fiC*zL, m_B@I y, m=@-mCfr>Hw3[hyY8=Y~چo,@ , Y 1<I4+WB `L LE}U }A,d Pn,A,d PnA,dWlA,;WP57@oB:"~1L(7!A, PnY(7A,Ќ}OM,PeA,ІeA,ЃeKM ~Rq\Y j dD  @ SY z@eIi_6@?,@=,l~'YHY_6,l~ė>ɲ/% Џ! Y8ge#nBʲ@5d!eY ~/Y83Y ~o,l -2d!5Y ~@Z >aBj@@|dMil! BR7 S,& oH G YHM4./,i -&d!5Y ~@Z J&Ini -#%2% 3L{Y836t=nЭX |ӟKat2AÉ,\rO,{=Mk}dх0IF,ݮEЕ0:Bǂ8 njcm7 2(Z[(=z{*A/7GAt.(ޕEע>9p5ل !t6 АӥK½dh͂&#Rjrq=n~{l̅3E:DgC|8l} @һ.> XiB{jw[<|]7ݬ0|,if4W4:]ܐOx}_ D^mFo.)Nw_t,Nx{mv]c#l q73ASbԚYUY\>Oj4Ju%V_>\6h^r2"wUhwzf&zv&<4TV~Wx9fn-4iTur1ҐRV-3IXm 3F|+ fA>8 -wEhm ~%<<yU)s ^'S  $AWKr;sn3b i_8o-u?]~>^“) vU^S1iTYy&^RB"F)=آ/0n_tr{͵s7¶ch٨0Fx2x8x>? ZkG8* I̗UF i1zbVs9&w-WdPz΄]^7 ˆ߲o̰߂Gǃ³ (ԩ, ju F\$2H$j,_m*<2yMESogNYrs= <`8<GBM SY5O+dy,<@]Nt x .~02A-ʪ|.TZP/q16ۤ³rzMUb\& |=Og2 #U.NUdTWnz- p'dW8*rA#W1?%" G*(# 'UR >0p%\!##3#3(su UA*iEjY+ 6hr^aɭy x>xDxJxPxVKs<7<: welHҨX8_-3&H@gDž'M-8HF.2E pĢ4x!|YS6_ݦ endstream endobj 22 0 obj 3832 endobj 23 0 obj << /Length 24 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 185 /Height 170 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 >> stream xouFѹ y$dP HЌ PxRLe&.o!@$2CLGp4.(O ..! &c kb?+'kԤ6mp D,=/Y̜,Wn116G%͛=~)r# ^7m2̌!Wт{R OqG\rϬtp__rNțlݡPX`υo-.b^.g w\r:x>NgZ-\y%헒pYIϮ<Jvl#;*pU{] ʵe[-eM.D=$gp,w[c(Er. Gݚ#?8zrtݠ3 f,DTrӗú#)'Sݠy-9rV17;hqjcגWN#,GV5ed7.Q7;>=g|D/.\Zw?:7Y9<Ԓ(j7)%@oa1:r|ǢS+n1C#<9̃\v%Hco2zrt J43OF#@9½kɑDcr)EX3!-o5{'\+NW(y%lD7J&w ȡ+GGa/6\sr%i>W[5!da[E^\Sfm!̏_NQ]} wTn,ER.=nr9ʎ˿'ѸG{R.gmo@8ILבK5;t+iIo+w1֖2V}x6S73t9\L>oiBw19蝻\/ni6x"SL~c7h&۹oaOsbVN6 ^9X7#$dqҖ7&ᜳds<WDkb)Vw}[ZIzeoҖ̽?'#{I!?mnt4IrruާӚk_WMs&$:p9<|[z'zhst y°['sm>u31|3Y*xgܒm-hU'sSrD~[ cQ.ʋ_s=nٓKˋЏc_hCf |P`OsZE^\qrV>聁&#n¸;XO݁{uϦRr>rDn<9x? vu6l2y,O_v?}W]0ecޭfUo,/}$[1Kx8iƋ_[=wq#-?9$y8p3oep4ֿIMjR_Zv endstream endobj 24 0 obj 1880 endobj 8 0 obj << /Length 25 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 185 /Height 170 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 /SMask 23 0 R >> stream xyX[epG[-[ @BB/BK R-Qij-Ъ]ֶZ{h;38*{ߓNNNg|}**** bcPekedd憇s\6ƙ2G]Ly jnndg̘swf;M,XTZaNJ ғ"Roܛ?#:$X <}n"Mrbx]<.B&SJ)-P' ZmiVVArb4;&oº%99~Q`1[!pW$lEbWWS)-N*+ii鑑~a1Vߺj\M69"'V!O xaެ`O*eH841kJ.̉&55-&&JLn^Vٲ|ǚOU?Y4&=*'LH$8ex</EsLԂN`s:I ԤٰtlK[йtAFhmgQ O) 2V#atN`4JD*'3t=ںr׷y[+L4%EK՞c듽yst9/N aQ->t7J(tS dDGlYZݵb;{[vyO i_5MV-ʞY$jg(x2v=,UC.sN܄:?EZJ~kځWGi cb|o%Y0ֳ@TRR'918y ur_߳m;v | RY ևdu}gr|7/T{jT,T4h9SZW 8' {;>۾Oξt`۹M/5Y৿"H6Rd)y*t%2C'wu V<KГj7h2(-\x'Xcݑ]ۛ6/8gգ;Ooʂ6o.lpy(h-sӒײ+\&s̄jCǪ-*Nn~xKXW|" Dr>E3݃jޢغZ2|J}IQ۾yI ڽޭ^M}1J˚A'j!=Zk kA"RZ0'QQfBG]ضŹ_{>-u}irJaY aaa9'Gs5\=M1_k ~ur!8kԠ#S-ț6qPZƼ91ton" <~7l1Ҝ'hE-*$ tQ,,dC;z'}/;is|` 7Z`j:Kw*‡Nٻ 2l~}Q ew;/wN@NZ`E.P[-kCmT\/M҃H@Gi2nv0'n;RC:2<|T9,'Z괠y-r 脔P :ɚ-Kk'p~滛Ꝝ?":=$'i}1E-(x rNkqshYvҵC'VנC@$d~{wIɧp-Hb^K˹b^ ]N*"ugZa{rA'hȆ _WG Bk^K?7RVԨhD45ur핮/9\ͭSZdZtTV6t%O G8ACCo_|j'o v_ ̅#lO:*Q)Ýurɂݝ^EN@'ڛ:f-X@R`1^VC{ڡn@y__yjԊ8 l Q'=wEBϗ؇XbsOV'~% .?! G > iRVC{l=9V'#)|@w\ ,-T/BVɉ' z6U wLh\֍HNB\'$3N4E#9yZbΠ,+2:M(]+Lt'#Ǝ1Fjbs8.Ҳ%ׅHf6'p8Zj-Ϛh:J މ^;>YDsgIbm'غ\6ldDqC0^԰}͡VA';zBkLl$i :&2>~ONZܴpIʝ+f#Û߱6'V"[O(-Qѷ &q^ +H̴sJM:]" |KXO&R-hn.x3ҨHE.'ӂF.vR![lp]# ⦞m z!Оɤ1Ғׂth"-$} ؟X Ofw?YVaɉ>-o',ZГֿ$ jAD=CcckϠa&ތIK'NwcЍIqF$48E/>B =IJ=c-3ċ >$2Vfg>vFTDqV:|bKNLXS',??Z0'3gjSRRQH־,%QN=%r,$//#&&)"(+}wCdN>9$Dῑغ<<-X:I MkucUZО|RK9yP-fb-NϮغn K/>wC߁6r'?U-ր|- lNHظPNlH .E,Tz>E 0 )äKNU:9 G%##Z)++,K/MYP57.[XyQyѮZ׳NO.5r2B2-5qn~ ?CKBJK0, mNBCC j"M6gI}5Kw,[U}cO=i*A~Kdߠa,Ee8g+j =4>VʚcljI*<Sm(5r[sӞ- no/;Va˜;]MОr2L'QTi1Ĺ. RY(kJQK2c$݇v3cC[R3fT./[Se{lxn[KW/lK/jߛ wSkarZ/$MM!/)̓O. e*f7_&b9 .\e(T EqqqiqamU'V/jizmQgx㝟??? N.WKSNF ALp4,NcmeqY N/+҇'.^L'>ۙ Vh5EsjKҲmƊû|՟ow/ԯޟ%b9Ղp6Z6 )*#脰m|;`{ h\e_lX`ڇ4B|!T4Gp*5fՕjKW/]ٺinچ}wgmk푺W|p,'r2L*tWzst%eaY9^/;R _@>l3}>T2= ;u禵͋>ґΓn?8WRp&٬ito'a:/,spU8r;7+s%+<+Cq>p]vd8N,Gh mmYYYvjrD<5.㩅 m k-Z;3b̠[~#S-A|P" 'gԩ`1Koa2 /UDw2ip]DlL.ƇkE fKkt&8TBvhOa<|gFGUcZ,* pS#Xwi^tWOiӆ#YX"#%~~LOO$ #$M\PZYώ^ݒ">V|{~Gy'L8!,dZִ Z.ԁ_Yph8 1 lbQ'2d3NЂe-u1EȞ {"noX|Vd6GNNU\rB[Zcq.Z.N3f6ň}9>Ow1tbN l]P- r~S-(ź0VDڜ CA'hx~خ 茴t F-Nn 4<9%sb?F.XkA ^tD-RZL%p7ŖbrغZNx-MԣARZh0s&*u4X{vX0'TVkǹ?67Rϧ8'Aih Q'N9P?;T & jۓoy18N=*Ȝr;"Rj1 IM4rC;^F2qr*lD7Gj9/NkQ /BQDЂtZ.#.e2ĹYqbH>W63Qb^ l]ZJ@bΉ>ᗵQ}--X@7!NnYvvڏTYI"L j"2\ۜ$ڋ"dSh?Re!%hǴ2QR'&(#U%EdtW܉ ٮ3Nuw'E-rC@W N2~[;8'ڏTY 1-h{b68o{-N^69i ONx GlY20I lN*NO'h\#-x_¨i]iGT8 $?1C*RX=]r Z-X;^'C'~T. 07*´GE7v'h Z87F**ejQl]qeÝZYꀲ{"óCX Q'5" Ce*L=u_he}.dX(87`e0΅}j\hȘ a$P-$DZ`r>r㝘 NF}Io.;hx-ݳZ伥m^=Ȱ"sɴA6uD-wlN&g;"h{ ;{-"Bw;x'覘r2"ĹC@geGEB{(Dz9B>D&qnҺE-}QBQ-WOg Z.={"{C ]xO9y8E8ӂ qZgр-#{jhߠ$ w9I,"dYD wАӹ-)[3bغ< -Vodqŀ] cfjsrk2RDNT\(_mrODe!:'9XR'T< (S tp@ NԀ:-}OFrĉ GLJEʲx=iD-C'bۍ B 7;^`1c}ű^iE->pSaqT$Ip[dQK 87G|#g_J򯎗.iAK8^ X謅pn䞈 *t' ZtbKho O'RBݛ{V.[ndB{ L4rBۊ4{NJ9" D*dZkElCX13HP-BFvԂ2U$'jܫm-= _Z+^/B 1-RsI`a,5eiT-^uZ׀\18 Dwst/Ǝ2;*WVEx-?oM/jjp*f73+i`g4Zȝ=dzs\+G\ x& la`MUՠ|S+C`al.< 5qBx,B hd(S.W6'Z(k [Z*şkOמxU8XvuK~Nowd] 'p 'yYejeZ^-Yf|s%n~ ^9U/vfIB6Ʉ,+TU JoCxώWNi{fˎ>%>JXŸ;:u#cbĠ8H9Q+D[S|vw7[WyU 4n/ T;qTKV F&,( Ԇ =FxE< T,n/'NŽNܔr2 p;ZOVI2B|C*t ]ggd~?V%f{14 &M\X0Q)JUe|. ho3¼!^?&r2 ?zYv sa>(n73T Y*f:K>\*غYS\GIaHnI8REra:t'ԩ,'ɤ+́͞*:{2\=]nBw'/sEr=N|4)1WG7Gy,G.qc> stream xk`J0:$H)eC)RR2""/BP" j(Ke؋Dw'A٥E% `t2WP] (ҷ_v3"*팵OgFaލܬ$=T;oڝvoϦQ]qUB@ȲU;ɺodT"|yPHp!L2" ׬LkS zz{$ӾUM]& F9d?:,3;yNPb9DQ@!s-@ #&] @ @ @ @ @ @ @{'2n=qE(6>ȸ>D^xp{"(҅lD* "wI;ճ Ivm􆼗k)P<]}z(w_4tE#=e+Uᴼ4ڊ|cAT#c ET͌òNA (jTӗբEUY~F= endstream endobj 27 0 obj 648 endobj 10 0 obj << /Length 28 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 258 /Height 85 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 /SMask 26 0 R >> stream x}TSgO]!$|oM1P|"ZAEڵiU:ZZul;SV;3jjcv:;Lٝsv̜9=svo=1gMy~'"ѴghticEwdkQG9*k~ _$k >Gx^iiinzVT*=u!wt tEu? UbGeAa.,dG *\TT8>w7COo>-o7^\VGB̑ z]X7'Vjŋj;*Uy:6*)%9Ȑ Y"QXhwȿ{CߍS)%uتw5]_'&7Buw]o,:pg8M uas.ZUYAe2D$T`X4JЊjmYGSWwā|G~88I߽F'}զ"UUWsZVje(LHWaBAӴΨ)pĂeMU/m[3-Y6.|AFP)Z֓CeSf4G&!VҴNSe m kσ_G_g੖O_wLKJƑ,W%#$|y@B洴<27G*E*a_h;\/ioO7OOXpeNܓ1mfRdcY K:ĩ6u&USvNbt8wAcE}C%!˥D-&B.4pMOтL_2 WJ*ha-יNv$`.dZګ)W+ȟ.- Y8`4+>WԿVnG!vpkʨS!D|Us]ZK̫wj 'si]q/}V;\qA>Ba;2 >Lt`nn4h靪ΑKm7{9Vo,wR\ķ]?E,S,o ~?<^AnnGT .wTXF _`+HMx7JX|X(aW,aL>%, (aqc F o?VjnHXAQ"cF "Ij]~[^F ) )ˌ6/E+/ x7JX̰XR?V<ûXc(??VXc??VXc??VX xIpl`6R OWpe7wfb wNb w6bwbwߎ xwI^ xwIn]! xwI[j" >['i*x; 6 + +@gc+ +@xQx ~S.Frhۿ avAI0w"pD3/s94&c WÙ^Xfw"H/p^Ax77:pzEc)*TW\`C sxs>CB7k THЅ0<|X+ݯw[k-1/S Yhl.!.3>}K]kWLJ'#ciedT`8XGӬ:>?gS3 Dwz/`0R#"؊ D. w3o=0zʥ&CId&333xD"E1 c)*Ү!ͬ,$~J׿r nB6.W?_d w=l''E)6[+5+)LV˥Ri+ C҉F؜MV+Xewa<yt~]q7{[ ND+x'{"j;rm235(3L ^&H$d4 )D Lf팴Ԣͮ2$BfT?Tm5 YB} FI qam߫RSVdiA͍d1MOiHQdﰌȢ,*r<h!j{~ϰ܏ g R`F&gՔIWEIwIDT ]Cց$/;ӓ#/ʭt&naiv1nI$D0&pЦ$ʕ9| e$'^̺ϐ!'-#HkjL]AqZ(Yvy*BUײ $"Q+Y^S[`2l*I:$H)XL%9A#(Xrk2 s2> stream xgaz*^PZLm&ꔙ7vrBH=N=dme)S:Ce^&J[jaO~!_yLr"0/|VZMRt4 Nl@bmHLHW1<(UGϏK:an*)gnUՉmI\W1ZD93tZićNκziS:aޫު&uSU//#Y.z^*9rza9ˡ)\/CP,b9ˡXr(CP,b9ˡXr(CP,b9ˡXr(CP,b9ˡXr(CP,b9ˡXr(CP,b9KG9WVQnW=V+_ݸTXS2󯾫vҖ)gXwZ GE+úK~+jM^K^nFMk%gR]\!S*(ï%sY/K|ۭYsWlSȕיd=7k6NLܖ{N"ERn;mT91{DM7bGN2fs)MɰJ@ endstream endobj 30 0 obj 690 endobj 11 0 obj << /Length 31 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 314 /Height 78 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 /SMask 29 0 R >> stream xipSq}lvVkGlٖx7Y^=6qH05fsI[$ew$А)@0!@I t;io%L_is_+{;&܂_Z$NMMMoookkkoK"\PZ[_Y*+r99YD=|ek4g{j͙Nr"̒K$/s`OOπX653:481:fthӊeώ/ٰr W#6~jl?ղcQgCC"ϝHh-ey$Bьc?kK幪mi&U+%bbvb"oVgerAikܻeê%mW>1uWWډOO쾱wUӻ.\HGwV +%ه{}^:>3knܞu#PW6q3 {z}Muˬyv]1ДAOk\\S%a4N7qWXk{ocw/ p~ \6MvvC;l>N=&ck?{&pvyKS5MNBڒsMdTi\wqTz}N)%+i-4Jˊm:2ԳbAUonmbopo>\5"H.Oɍ'p ^[?tX77ZTUyST˰\.r;5Y^s :| ¹:JL9cLn >Ϗ]vGtM.ܦ*0Z0sxզL**UKwdkpfG4818 }p7҈bݴ/ [Spdl̆owb+2]|;oQy +|jWQ.9w^W{a|ϓ;.sCpNPf3i?lN}irqgΣ-yVbʭG@x^oyH7 a20Svx.7F>nE1꣖hv+, ^m^X!}M+  k-hd M~wڪ[.=wZ &x |F%_ ~OjZOB̋#K>iwBz\*ᥙZGj+3vc(֊{8X+֊ ޫZVxkZ⽔H Z_nZDE,4X+@wVQx/"a(rCZ/,ZZɜ_hZxO@@>nVއ_@6ZQ>UX+ ?އ_@S/,*֊ƒ)֊€)֊)އ_@Sab;JX+N*֊SAt"T(bSJX+N)֊St"T@b;DX+Ni4:Ձb)֊St"LU(b;PB5? kNcSaUZӘkYO)x|a=O56>{Xkl}$֘ =bKZ'X+vbчZX+/,wPj}A4Yt>? ¹+ pn3qPJ&jnzyau\'2cWW9UԞ\Hng;0tNT\ כ {;jBA&.7;uz9l¸A[2cEJN9?-7+Ǹ$GA6Uz_gC?UFTCZz%4,0iHu`+mt~jfNYhMm2s4۫r4χUZ!KQ=ċCNR}vDQ'Z4ע-q*\֐zg~٠NqkZ Óy3V;<2]+sqVĤf%&*9벬r$UFkRJܑ[1ٳ"xɌUEF #`/kql<2KV1N"&M,VHdLYIXҴ'E BK֡9Y\W2.g583䭚mUY*EJiR&SST?HĊJT' YlB6> stream xka """HƐav" b,`c0֥bv.!QbD!@eRrzWWWs_Kx'NOL_+ܾ{s)wcKaչɠ%7<6\|ji~m!gsىaպ*n~??^:? ?2{ . z W8Sb[9[喯+óu6Ew(<ۺG;2qcL>F)>twhiQCWb^^lFv'Ͼҽ L\:*d2{AEa\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ RFb0.1.)}{A> stream xWwq~4~7! !BHBB!B ""ǪʱQ:TTjmNTEcjvzΞΞ=;3ٞnwy'auT~Cޟ~ #궶 bx|ζYEEENgUϢ Rd2ٲVSXZt8yylH$E1 V҈kIAkkxm% "`uﯩ*5s)VskUlo4)8mbaIԋf|̙Blڴ4a޼ydv-^0Eot˓m}j`uu[7f!vȈ6 XVLLIx.]OCCi*EW>9ض]ϼ{ѫ{x#o;o^^phϖp٧'+#'˻0^48^ܹ!{׍n}̇LdVO*hd'|+\cX8\G>3ٺe–*OyUڒHŲ`ñl^GNK[jѝzk&'Z.0#o*/yjmheY,'ҥ\jkksa, Mس}kG(XY ye⏟c_;Ր)۴zUgS0.#c5*QR%elgم cMzLk+x~+?+'ԓIU" :_"a9 $ Y:nԖJG4%)N/wťpy)\INLz'bbxc!;sj{ywi*,rQng&V A~zQ)(4i>[v:9f×g28Qxi18g]›Q8*XSق5n/]sB2Cj&@s""/5`WÛp D΄l΅B*;߀i=`-('lm(`1AԤ(VhTNr)ˬ-i.E]L4_vH PPbSE\KMWjWq e8V{g(K,,/3X>83rOk§\\Y\n p xaM] J[v^,`Jfz.1 n&,` A,`uG0  fֽY 4Y 2 `0(M? &McMK钅<[]=x0 4m< `0hzxA,`P{A,`Pꚤ `0(Mj0 Z  JSqA@J, /UN,kWXY`MG^ Bzf7{aita>N^zz0 a8gN7`zfq{,`wtfq,`>pfq,`w>jfqs,`w>dfq,`w>^\ fM.gY, `}֧Y, `}Y, `}BIY@dfX#G`A, -o0 (m>,48.e`Qbı0]_f‘v8b#|CP:$(\0+as" 7죩>?3qdFzx$𳹉8aM i{a8AOG ntGCBmi*m,A aw p~R瓏WjS(hO6\hT._ Y,lEY |{Z8Y kEN. A p"/]\60UUjRg+rbDz`T r20>_7_o|io6}LĮE:IVĨxjPI~Ϡ 52V0R&'[QiNja{ QKqt[>W},Gu_/wɐ]Lh20>7t8j fvFjZy" @*e; #eP^7kvU-W}ATrz.n#ƉL PԼ/d&p境6g5%q bx JE+ZS$><`bMYUƐ 5-`=`Ȧ̖huCEfE78O)1)D:@%ʒ21vD:>_&j3h8O+WH,Z]E):ݚ./(AMCwi$T[0J L2@̙k#gR RD hE.Z3H+JKX)p22j Uaz R2+JDɫw 0hT'R2iФUK #ukJM }zYq Ns"1E>*AQ"Qc|ZKFD!agĎ#&BJcO ʨq$Ydn,ф, pC d(fdȄ3,1ӊ:yVFlшsT!41*U~AL0̍?;d32L4S)ieB}!dJdPdVd\dbR_ER (C'"/#nIB@1! endstream endobj 34 0 obj 3738 endobj 35 0 obj << /Length 36 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 349 /Height 90 /ColorSpace /DeviceGray /Interpolate true /BitsPerComponent 8 >> stream xgaz""5Pv&Ly/Y2zZDU(!M1Te6b:9ltIڴ͖lo[<ߞ=?_}OדFnL=:?_8O>z?s}d07 ⶍ&6{{?e;/OL*5L{vs[{3712u:V3C^[nޭڊ3dy̺Ѻ~'%]3tuz6Z%-՛Q͍ ֋C‡NVX#kND5MՋ5H_ 5-Ջ5.ߏŏKʪkgyZ*TEbt*3rqߩ^b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ b\ Vbƽju#q7_=]Փ!wOyZAj> UEsc:.~7FOPZ{|ZQP=T[v1d.Jt_itRot;F":NTީ7VNq4;Y'KAy\׎&RTZJRnIDmݴG8J%G㑠{nO^epzpÄl>g U# endstream endobj 36 0 obj 781 endobj 13 0 obj << /Length 37 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 349 /Height 90 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 /SMask 35 0 R >> stream xsqز+YeY,_%l] Y6acs!$@ 0LdiH4 )wc:vLm'Gri4`~%?lӟ|J$`O7⫪w:++b\6NbOܹJVhhJ^iZR҈gL7g0K7芵[ M 憖z׹3^Smqg׽歾-rQqyjKI@2<+MI ,퟿ho֭Y|kDoo/PsފW1eE_='{C22Eơh@2. y쁚`[frO,ti WϧW*0i-Xߗ-:S/LiWB3622"2w?p"W %zRIsD"sinn QA-_`͉aWgx~|;`U}ʾ,wY7vvX۲8a0`[{|Q_pLrƨi9RÒ| EL&)klA8w? Sώ:gL&q>gЗ3jޗpMTm=s^p\\5feejPj[)FHYi LfALGQHh͟Z\ ps)N/pi{wձ qeY<ȻpnN0qUޢCazCB]o9 v@)*dlxGA5*|USPrg{'W/p Nt[p·\B7w ot±ǃ;,O6\& 6PeIH PpBġ[袷M*|o H+LT΄\\H#1t ns1/ǺoZ[-JO<_nֈ dŽZk[vM?j4耝$qxލ(\MWbޥdH`#sy~9aFMYSp"YWcufKOM$?. $w>!Œe8!xflp ~ہyk۔uBg]qC3Zkl3p"o;&|7!v3YF#YUatXa_,18z>{t>cO;b:Z i7C,l c360 ({0>tY@ـlO,aPFb|Yi 2 1_SȔ,&MghG\lbA_ˀ2Ս4w(\h;>ؐہtˆ-*=,Cp6Re֙<;#Mx ΄a*ϒ,8az@\DBE$fZE?<] Tnv&n7 VS 2Rf,|ZRWo*뛌::\k=.Y9M!8J)P{-=yW OZ,!BUKeY*I-q[sKU]ea~epjၝ5i‹2./lw&<^vz5a~p!^n0*6ZTj|; Y94SH_e֔ 3nj2~7j`AѯCXSk+C ro_0mo26kE!䪤G&!_N'PKj)HU|ye|6dboFl~c[X) ,dJG~^CL3SUĮ)F̂Z͗HBJya3P| [ J7ϸt$j2c9B3D&CCbԴ/h"p wBjM-(Vr-Q.^Ӈ90O-3ke6rnoJՋ]Zo2n7Mf l|ȈɠȬȸFYVdUJ BIs>BGI(G+YELV )ɛJ=.LB3%!WJrIe@P"H!TCJE. W'Z(U+kZ 7JBB趐TY2HȬlJE-* i W)*RW 0*)sbA> stream xŘKpˏB($HPʊ"&cTFI2ccFJzI<.0Q("nR. ZAoZo>{E"m&ۇj|}JN .~X_{K³+w !&.yxHg/E:eLϗqr!_lui5#>\'5pP\'VOI)BgH[SĤ]\2AtHu >nE4es+ t:>N(!W\"'e2 =tz7/"Q^r S/ ʲfWLE;)ͪb"nRѫclՋyA3*cx^62<}rޮctE\Y`>>(VU^13Ui` kT,=#0=$ܪ~ږ95‡r0|Z1riԮS+[#E91-vzv](r4 endstream endobj 39 0 obj 761 endobj 14 0 obj << /Length 40 0 R /Filter /FlateDecode /Type /XObject /Subtype /Image /Width 121 /Height 48 /ColorSpace /DeviceRGB /Interpolate true /BitsPerComponent 8 /SMask 38 0 R >> stream xyTTw'(}yUEQE{kY%KJM(BH\0ɨ[\15Ǝӧc2[O:Nt{=ܹ=$F%Kw{QQ7+++TU5DՆO3}ʒͫ[~ʂ,ޛ %4%Am&,\Q8E.4K :N<%rF$NgV溬YIYiN !)x,!/ZG۽h̙5/hn_{P_wϲ|τtĔ<@ºH -;.ױȶ'?+0_>>mm&BYRoBX4 azmq^n dB17gl`0X_?Ʃ fyt;6n[qzx˃Oڮyo~i/ձU\3T1aLGV{Rmv]y3sUaϔ111P$nl4M{|['gN8s/Wdžsf8xv36͚D}~O],ΐoEJ]UFgw"i|{4,Zdpc~wYmઅ-S}ג|ÔJcxߍsGG3r MR1zղE{V>g ULJ6}~/_ٹC>Ut5oj}~*GϺw}oE ?- ZPrl̲Ig&prwi_ך#">]Ȯql&#QkQT<TGqgH$6Ԅ״/5aMSUѡ~8 WN~ν)`ZU]VmҀMJ\&ib7V!i1Y\\s0*vWw/޷ejk}| zhݽca?yZw=tbK:)QTfWS~.F$*2n MvFP$#Ö~FLjܱ#;.swb3cd go? '//\xoSp(l'~h'Sa")irY2lRҁ0\^1ӼΥ-檲;6x`O\࿟lxNOjppNτpx gÍp f}ܚ{ d-`{G ..(WbS`nG:&tJ^1kj ~g|Y&cv0KB8Hb8XLA'I-%?Cp53ayca@fIE1J2Mr^F(`q9(Y4"imU*+nr |ٱ9o$\";Py)D1>-=0Xwtu¦RIvqQme&1@3eLrƭPd,N- - v?\|i7w~i*7y:&ěwH&LO?CT"(Og;I)JutܡL kUb0h8 .e-=OnZrpgj[A:p!y} "hbR 5X IzQ^b .S̉FffIcb11\\UԜ|ûU^!84ggwQ22mú|bi=1! /[4x\cORZ/̳WOjȼT8M-paj %ƛf+mVpHp'WCMrEKm+vnl,! XQyW\6q]mD}TKL'V p!k%^ / {fžJ@ZJX>Bths|2| CPUvi! K%Qpȵ4(X9rs]2i[qIWkj`x졄$귩],%׈?9~hFˇhhx(|{ Ca0dVɴ2;˯9YkuWî9NGMlD!&>ˊK:B\ګX<yZ`\[NI8ɦ*Q2Ag}Էڣ0>-Qo# %xG}qK3a[},_% ho, lʁX$q><'IJQQQ4akʿ?Gp.`U b "z%`hAi# ,]̿7ڠ3[= eC&2{*Y7ѐ(} a#iFYI>*Fg) ,0\tYafCg2X^aTUc0[$QE^oipjȆ9Y|/\̋q7X̣(k-b A\Fa8QC̴ؐ ;M'MY _P #3ѭXl%Xh2.a2e$ ^IN'VpO?D4谣z>D XK5nJV!ۥk%aK' bc9ɇ)#w1Vcr` X{&&)8zA#[yYC]#N5IUJ5X`Ƌw |#zܰ,&N&DD!玪X/F5DɊs .$e{4T vS0+\䢄׸I7<ҁ(_~7}nck7}K_84%|ZLT<:!6v&mNU IX} w^q8a< fD4PN$fk,VOkTFQS-Hp(#Ħͩ*oDH>l˂#7hM'\4gh0r&&18Jԑ wi:,D?;ѳe:Cdo?%1N:.%: x*V;ԍ_SGNpK'2~;KH)69 XZJFR45$wIf+J4hH.N5h q&g0}rƏoA$& `!;cTayIMr FBf3b}*@H!e$(u[~|Hm8|꠱|+B%,#I  L{SppO2N?Be#D0QYI)6ASWt4-L VyW-@iAcM΂tb_9^2SoI̗fl6Ռ=*UL,,b4p,!~<o 5GӴ_kQpjWAǎf2h㢄kiG.[+h82 ^14b:Wc:A &@Ȁ`9XbX,6 gl?Bs_;6*APPqwx.%?EnGō9\8/V]~EM_߯/'Sń1mLKB, KChHJnܾ$qjRI@8FXR"%Ġ4㱽8>11*UvT#7Ae8J,4,УLďGN.Szݓ.Ch) [T=JY>hWF> stream xoSeuH& L@T؄0$EQ,EcbBi@D ~ Id!9 26*9F^>}nIOzox BD1$x丝pe*)/Y>r-rŬ{U^~L58H݇=VHpڰ ob |IVbވ9vC{gx?HF<Q._*p_&0x(f݂fE%W:nEʯ&Ӿӈ[Y¹}pq72c;o`O Q%%V>{Dw)7 ynYuk/Ѡ~qEnx%w̼GD g7DSb.r5yqݶ}e$y9Z<^*}nB 矶Fut.2Xi m!,i-R[N'$27* y]9Vo!,ˉlٸ#zº{h* A9Sw_Dmn!NfqCboM"d6otm-m!ɕZI-K9屽U7?gmoA~ a]n=4ނ¢ނK.F^|2{ [c/1vpy[Bw3 F{on a~@2LqӷHBwow_ܱ;xc;u~YrzNxzp(Vj0nU{Ë>?~_ڶ..8 )+6|5 f rz;ząW>?}uAV -i> stream x TSg?piIHH $@d K! ԊVں!nuZk&.Vm.`Nߙbv鴝V?$d7A@=s<==ss?>|Ã,",",","˪ƎDT*\srzW###E"LJ=jǣdC\rƌEE99Q*k2=f 6ua( 0YɬYœ AQ Sf=Æ~|y" EPǓdrQ~i~fj|BSI9)Ab?R!_ "SiE`|}RJC^ޤe\,%Z<ܪjmF^:92(6D)a~J>5E2)L_1& =2 s2`VǏ+ߺtef2iyhEZ꟨E0#`E dJ~"*E4jeى!++79!1R]8!y]kT1xMΟ?N>1?UIVpY1bF?5XHirMMjs21&f|LTIĭO,{vm.֝O]3%ZX% +-,cIbҟ32Iinƶ[ִ̭X3/n>a˴ICxapJ@(Ypx$P!ex}[ִW=xʛZ.p_V] /)6dJW,H 7Qb?LF% &IAr͏M=ڱW߲O۪oM٭\7MWg˃?%mL ,%7)-Çcw9ٳn)@g^tɩߝm xgs^OSͺO(5(:re$ⅺ0^;1Cj.e6'gڌN`srw6~W {WbE|;=RrG|ɼaQ/H  MZ|I-Ca,lNk޵veO¦vtl1|wf+} ;wk˹ `D4DWo1-! 7FFB._DN߼v%kKܲ:`u}{~?:8Fp ׂ#`6xq"FiaתTZrT0x2 6)Nmm۵aem]zq<ڂ} &p) Bp^ϦMco/nǴ`hL йsYNҶcMÊڲ7R -*Nzۈ߬Us]-x_ >Ђ\!8 Zڬ̓cZ` 8jRP(\'V>'Uю'g7,x} e8gZpI\Wts^ .T"-Zhev-ϝk3mΎw7->N>.@Wu\GvZcZ93^ |F7sݲpC{ɖݭ5پC;^Väݧ8Hn|^j %[#gmpR|}gۮh:Xv=ur}m"D腫hPK-Hb]Rىϯ︺қמ+N~ҹ>hP*c-drչ׶uY97ccv?H9fz8mIݝq'/tn`nC=|'ɝfpc.ҜX:O.dˀ ?prg~u/^'?n.uI rb X l]0-E@ŏsd.h׿ Q'?;=N''Z`b\&-cYf*Jn.A:R("'pcvrq?x`~ɖΚ~nA0'ZߎZKu%Eƴ:>Qh:iZ.Y\;d]ϯ6."NN[P'zF8QEq.iAMVznBHs"ZNSSmbɩ9-ЙB{lkߣN>49K-fr"Ӣ +I Z0jISEV6N'Xktcgo1"3(NpĹZC812V%K',،IvNnڽxS7޷ /MLN'b엊86GDI-Osk]^Q15/C'9t; O0]*KERNC1' ?\ϑɯ_!йw-RaOj{X؜9`7Dr_[Zk'щn'Z\rh E&Nm5 '&RoC'MN"-}ɥ؜8vƚC{'`TiH yN/e:rZfC_ HE 2#bہu,"'褸 ` dͽa"W:r]*M<'l`b~ǚ&'g"͉M&GN\B^ jsK{m.q}p;lNN.wrg<Nl\XUGJw\غZp Iod1c'p^l6'=zS>vZ*ZѲN9#X: Il'[Dq΢nk-uDh1O64fhCg[;q?'dbh-Хg0-!pͥ9-X6`rS25eyYN&еɩÉhb-ŽXĹZ<-طDkcu: y*tP'K4]{~>ɉغ`Zh9'>C( 34MuMۅt<1?mq2Ɠ>k m{NW6)]zzF8s:S,d'NÕJ^XsZ~襤L5CYrk}zp+Ӟ NWˇ&-/rA f-X&eٴ_ݴ`Eh?zg6_ޱܦ3M{dP 3*f0Z-A\:(@M;1&F3 -wN,/?y&O= N,:w/Z=QpNE.<4|0ڣ['9|ND.% CLTB'bj0trZ,ωXk1o oL G˃0'p3$++;%,?~chI?HRy/?r-f'tʼ4dkm)dtBFK+K'c [vҍ.xI'f-/ւVZZ`rwN41y[m\T{^YAa,IFy/799Cf@egnkkNV*۰pOl $Z`brjukǧkqunٛ+_py NC~,Tpt;[Z`i8)3rrVdMZ@'?Fda,ıho<-c%~PK .<-z~ƌS*&e!?mڥ;Xz9eW_>v~~ƓNŁ8Rc2/t%w\ ]-S 2]ʠFVyy F%++P\RSZxf+,Z^W6չ-GطŝLI'D`,ab:'jsj^;>)SZ!`2(p2vXN7EZ^Ze-~iUN+>yō|{ӫjo\ۇ~KewH*Ђt+ŌD.Z }4lpR?="cU\ c{1|G1K>uefuSo㠆{Ղ-C`kˆKUʃ bCȈӤ\J˛g#oHOP]Zi}mwn?[*7MR|'2H*ż;p.xu"S x"!3劽iel%+.16"^|C2(T*KKKKT/3}mͫZ2>W}]'7Оt-]&- |b:ؙVDwQͺW2%9Jv#a}%cyz}ue겹3tW3etx_ ._;E@J`{,rTLե şrƋ )c*tO_w*)))5&M//Tظp5KNjVz`k˭K}oH+.p/F~׊dT%T.j<}e"X746/I{׌r |i^\1\({򂌔肬-jfO|nSW]xg<#T>2!OOH'}^-Bξ"X"Vkbo~Dae$/Q'S,o!݋Kb<{ 9QꒂU kLXYgPW4;b]nյ? D 8G[.鐁| |]"|Й$=?R) \$.PqRe̘G(b'ϋ;@8\1P6d%/*h)(kL ؞'!ߛ2p +'KBx^eY`/G?CU* ڐ.ؚFʣ0(75RȈH|wR[M/I XNv2?kBp 4SvZnNN^HO#>trEk>޿"LdD dl@ɥϠ|EDDT6S5B%F'UIj5MY5_Zn- NV ZNY;_Nv!NZ" o*C6gKESCةrV|4o}4~BAK )E̤H)WQ+K4AU1ŽC-n仁ᶗNS] iy<IWE>5G|E41c")شD Wp|B~QR^A8.xR|J>I*]zrM7 iܓ )#'m \9A\[0D[#aDByAo8y{/ҷ)XLRy1|V hR~F4^aH `bXnr}vejK'Ux:5;SJ0eeCsY^"ѼC1qj>M#C*&Kiy[hqMq'N%WEd C#}J0"a{ Xi 'в=_i5ݨpZw8TbvR9!NOs>k6Np}_&pl1_]6NI1tirĜIӚD s9[L˕ouvZ3%}ָe9) M,$KJ1\R l]k˷ Q-{tZ6.5s} lNP'i+0 غ`Z`LK q>nhBq&sw\+__'Z`ҫ-6g GD`N:؜-uq.HMOm.NI1d{|et؜ >-^ŴT:L bRo˯>ʴ0t' lNIߵ:B-6qo˯% (XNܧ?8ׁlmr.7urW'98 b{'NI[9 W}-ok{:|9 NE4q8^Q17+b- 8GˇZӵyh 5whN"pR{-8[*:Z.Pق^-7FB:N&OFm<0ve4J^˅BD0Shȓlr, nYkƇڅ -g y#@ː 0-87B@ύlF-Hj9G"'0ֹwc^Zl\Q}p{~#-uZN3Y*"rmRwN`sb$ND)rhlԢى "'U9eU؉غ -}f^7`e9Ղt ^w&[;q~aiY'јC^K_Ndyq'dU}\*='be(tBpK'ؤ~qMk%`?!DʼnM ;iD{]k''+&:Z*:iž@̱pVZr#%!1B祢kEn='r蝇# V6qF*Zܖq!e;)xh ӲՁD0-1?zغ''2 ~ao}NdA/mIdMZhF:qPq. 'x2؁=F l].\j?q$;'2ܳ;9f%-C{Mhѻ8qYDZ, juNV˃`! c^6Z h˽ܫh9DTlq9c%@&UwC-;LC{k'kJqlNQD;_)?0-DN(a R%Q*KlDX'\Ӊv WĹPK.*T^ ^n׵*ŝL5 #R@WYvDhy&-Ub9"'0I'd{?vg/w#}N7%vR!Q"]?z\\'0\h(F:5VTh(@98VcDr?CCB r;-i`WxY ^ׂ2Ag&x)lO`=d9l/>6,^aJ* Tk8Q?e!M?ׇVuP91hx2 YCl\t/7r qyįޯR~57NK5IwwE _U_NW.O0.{-d`i,NnI5*S\ ag~7CiʫU!uM9Ҧ4"d# gj$ ^, >3)DiKZ@g "yX䉌Y;#eMP񸀩qӥ3$3%%R$Ejn^('Y2lJ2%+\V(Ej!?%J(A83z6V pR@VLtBU}P6qn fGd!L;+fMb1eX s Rd6bRK0GT N| @qFB#EP>5 e8"NFT["L?s#aGBZ@Uz#axRddl]xQ?[),@EƢ(ٔ 6E¤HR%"R=#P=~^"?cczhB90:JÃMK'0ɡ=ʦ>¥>ʢf=¡?~1c<|\kr}ԃOyzb>|YW?> stream xzy|Uԭ^ӝ},$ Y, aQ$ 0BDDD61 ,p2#*RB(,6kN3 {oڃ [ ~B"L:nXk:Vتel+YP_WgODXBH|ǬI Ʒ§F ETwl-$ܰI׉|*I$||ƴ =V걅i -_J %em_H;xI"6氲hEeDhKyφ ] OkDk֘ sty⺸.546,Nzch4zظĤh+gb*A3{&dK瞹Wݵ??+3--n|ڲşGC|绽{Ο25&,⑋IKpPZ}'qHoVDa8aiRYqQ\nGҿ6^_טgezŋSz7VL=>3Cbbc.(+[k[߼#}+Fwi~Rk$XCT"8tʘ5 PXc@ Jt49ߘnN'SpZUU=KrgEEŤbⲓ(#ڈ1|Fˋ͋K*JZU]S+].i{RSRt竝/uˏ-.)ŖFƔJcC';t wPS={e^Z27._:U[S#1XFa'Ѻto;.YݣޤsCQV:I34R 5OWTf)vuLIeJA2^m(Sp3&vӯHpQw~5%v&HՋW쯩yulg}l붭ol-CL-1q;"ք+kt#ΰuuP| jJUw5H~tih0 ]#vTW=/>z򥧟޽_#lύ &сTs$᭿r ʃCg@N&mwPH kvcqqA4e֟g;_lM'tyj*5M,  (V*(Hi[7E3U:9"BTeK->KzZ2l1+,J22m hntQ{0FNUfRTg3 *UqLڝ.%^ - ԜcZD? `n|5(eQx+O)k{JaVWΆ7AjFRƦK!]%#0;2{{Bw)/uΚ\\ĺE ײNOMo/fŅ;8w yn/7Ոҕ[J>v>P<.+ ['׼S sϧN5cy/j󖯾(8M1{ҴK!ǎСKJlUY|({xLJL4- Bd^PdNCd}Ѓdݭdmo$Q+~³v[#ևy Q#2*o2c4GvӗP$b*D_)D&rTh$CK:m)]=^#0.Lrjl >`gZ4jӸx>_˷q9@NN<9tpD"#xRYŽ{(Ckն5^x2"4 .䲮k-M3G}ųI6f͒&l6;;BE#Tbx$kpo,XC<9yʇk$MnZً68o@n&\暐@C dʒ$ʠUrnWES{d) iQAmo^|ӳpm^YmGE>GM&zD<[eg꤉ǧU_<~lj"BЧ6O]6f\ߍ{(ڬ>oo|̘0o7|+ cyBϓ.T0;IMEh1K;쌈`:&O*&dٕ™^,ѕto O''89smtNN:141d%!d$׸Iڽ&Tu;G;(4ZVLKRh%b[Q,qaMaMQ3M%햄ݰ_7Qw-ӧɯSQ|B\xh-Q882HjQ,a.P"3/2T ύ7҂0&u |3rB[3nY?Ao-{博UO쪩ɮZh/&y~IϾBO܂DG[sH]B7`2$8yrX\Ui7lI`Uy`E‹]j<9dŬd))@*m4¥DH!Y)$RKr"!c8')΀4>]WGh1K"yYAˡ\*+JRI7ͰI7ʻKrrYiS8C4wD:q_2 _ѧq}5TsFB.ި;'b'3A#SU,ɺiu49D y+TO}U2* vp-,Lҳ=ZM xdHH ;Gc٧촽;Ǥyg€>EP[i꯾՗Ӌ"jV%4P21; G@_bv@Ⱦ׌/FF{CW &.'UWW˞w/Ly0[ pQRA:t:d%!j:Aۂ3Dx;oWKqyM5%d]Zؐ*axI.4$Rϧf)P~P zk2!ۋzES?JCw!FQ*78#TH/k={u$b7'Z,S32?#y۸|zk͢sI6+U4l!`ThWekVU7oNĴk!-`4ɜf…%IYCT UЄR0 ccXgCFl1<,=RFWR& TJ!tƚ(Xg*/YGZ_u;Z@s -Kɍ\b3un?5vov=[T11}6n(LՉSӭ!N$NnⰣQhsVE 9.ݦh䴺:N`~@ʫC/_9XZMHicdY{bw!]pxu6S+I:e.C4c w;HF>Ǔ._K&ؒ]]>7L&>Z/k/[{#˙J j0 谮9 v"#6<>Fmܣރvmc3O/l61Ù+  quu^(w>VX+l;;mUeMh#)5[?|1*#Vk'"O-6~F/(_ZO 1Gz f*i޷̴t~90rum?E?GٮI۶_߾pJF] FrZ(&PLN,İ - \ʹ90DKJ6P߳$6F3)lo ,"mfǍD.ҭًMBfVZ̓o hnD]9s :/ zY:~hil%MV䥎$ءg #cn`RfA-#זSбT:C^(t d}l ebuufp=F9EzL``zpb#h@ёt]@O/їfIӻi>/h8%nAm;xoލ ́MYqG=#eXF; q% }]V1_O$q$p-$դd/Bw]!VYAa;X4sdCIr3r",ܳ;itX[HgIoitVʗ ]X]F!2Kא@A.YKQ$쿞%;I1Cg kƚ,ٌll?(=;J dHl0J/d9b% V?}7FK:=59لZVLF2RXKK-wᘇݸBRQمkGW@9l"g-CT|{,U22LVLC;TS`roE ׼>~ ga Vtem*0r,sU1*cXߩqݻH^}-oU*+U?YnZ uP@9wXAWL=z<㮩}5`h'_y~gIqh5i;Q^?~ 9-g n8@|\Rlg>|o5zF2G&y%>%c>k-)_&c>c|J4w`YH\E[ o1Uꏥn@\‚N~QЧ)fg,RƳ'!BݰAcִ{>>X>DV߇h7!^}/wc1CvIH_ _߆CqRsK!ѮQ3H^Wm4{g??V^5Jh÷ʿpf[3_sˆJhF/TL_\N+ᒀOK Kp~NGG @V™h~F@}4Xn0 xG xKpL@աf~ w_{^+ϏL0!Z P% e `^7燽n؃ $`ݰS ;t `;> o <Ʒ]0g4$`coPi |6w ]`nֽΟnuXW*}NfuF8.[|{`ʰVVa|Η XRJm-Yd ,.Q^^E XGm0_yip3i"<$Xx@L= 3L_PT,`R_o6 ^q0V{=0FhytH#CnGȳ]; ÖaqA0$·`n[ *aXw~[3C@oqC~vhsB?;%Oo {xoʴ^.ȴBhȰC<]﬐jivHB**tK~R]ݼ%ϻ I~H[yVH/ X7 q eH`fρ0 Z!(Rpxx pn:UpCl-4|L`\6J/`-B.κu@i'h={Dߴ endstream endobj 45 0 obj 7577 endobj 46 0 obj << /Length 47 0 R /Filter /FlateDecode >> stream x]Sn0+|LR^rCM^R zTvX,Rmwϻ8̲zO,!D<(VJϷrnUN؏idsS [ xe~Dqh[^;x |,c|^'<`ɏS)uHV6} ߙIh:S:8]psyXۂsȜ 8LQrQ߳6@;`]85p5|:im +|xX o)ps0g>jRyy ϖ=;ww)~| ǡ/})Qz܋4fyVy]Gh>rܗǕoc0Gg k{7I)ZYc]C0 cК endstream endobj 47 0 obj 415 endobj 48 0 obj << /Type /FontDescriptor /FontName /EPAJZG+DejaVuSans /FontFamily (DejaVu Sans) /Flags 32 /FontBBox [ -1020 -415 1680 1166 ] /ItalicAngle 0 /Ascent 928 /Descent -235 /CapHeight 1166 /StemV 80 /StemH 80 /FontFile2 44 0 R >> endobj 6 0 obj << /Type /Font /Subtype /TrueType /BaseFont /EPAJZG+DejaVuSans /FirstChar 32 /LastChar 121 /FontDescriptor 48 0 R /Encoding /WinAnsiEncoding /Widths [ 317 0 0 0 0 0 0 0 0 0 0 0 0 0 317 336 0 0 0 0 0 0 0 0 0 0 0 0 837 0 837 530 1000 684 0 698 770 631 575 774 0 294 0 0 557 862 748 0 0 0 694 634 0 731 0 0 0 610 0 0 336 0 0 0 0 612 0 549 634 615 0 0 633 277 0 0 277 974 633 611 634 634 411 520 392 633 591 817 0 591 ] /ToUnicode 46 0 R >> endobj 49 0 obj << /Length 50 0 R /Filter /FlateDecode /Length1 2600 >> stream xTktT~$0 !Gyv ڦ d"4` iJPIBZc-AV@`WZ߮sϽۏo?94"K҃)#GeqpѼ.OoނƊ}7dCesgD`Dl)\&βK6 ^'8fAyl(x/2-7N]T1wh맲5^%ReSCFPo$M-F pH cqИn44ܨ4ڍR.#k$.zPv*0." G]$ov&\NdwX[E }:6FP%7]QAC#`ٚNAWhD.ݖfۚ.Qۣ.Y6RķkF1ow%T/ۢ>BjΪ((Qb#ǣĨt(HGd-Rhk%Ө6ڭF Z&*G6͗] SWx0Jz#Qи,&7QjQta;1O+JլSMkj+R;;5+z Iy6cऩEulI dE"ؼ.]4hXyXN--K3GՙsGeq=:; 9WO EWۖ{;O=օBd?wtd+.'4kE1㡐Pm6ikHԓk45Λ7‡!\s*ś߽OC'uc'!-K50.ǹ !\ s83r! {xqZOWxQSq:xǃ2~x[m[o2^u{x12~x*W?ga2;ѲګZMtX58W*wxًB8xf<ϫ `_KхeSv3Pˁ & !xtTmSLd07 )c 3mj6 ʈULdb{Հs^s^w .Mݕ w2w$ MLs!5>zbG/`/'H@wTwF8%%#ftcpJ\H');#^`cęeĈY %CD,QSLCk ב%(ǭ endstream endobj 50 0 obj 1860 endobj 51 0 obj << /Length 52 0 R /Filter /FlateDecode >> stream x]j0 ~ Cqslrfhd8d7t0-$}?Yڿ2Ov >c\a)j.{Uo;öd{Q- ^\@C4:> endobj 54 0 obj << /Type /Font /Subtype /CIDFontType2 /BaseFont /MMAUPE+DejaVuSans /CIDSystemInfo << /Registry (Adobe) /Ordering (Identity) /Supplement 0 >> /FontDescriptor 53 0 R /W [0 [ 600 629 ]] >> endobj 9 0 obj << /Type /Font /Subtype /Type0 /BaseFont /MMAUPE+DejaVuSans /Encoding /Identity-H /DescendantFonts [ 54 0 R] /ToUnicode 51 0 R >> endobj 1 0 obj << /Type /Pages /Kids [ 16 0 R ] /Count 1 >> endobj 55 0 obj << /Creator (cairo 1.13.1 (http://cairographics.org)) /Producer (cairo 1.13.1 (http://cairographics.org)) >> endobj 56 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 57 0000000000 65535 f 0000076261 00000 n 0000004704 00000 n 0000000015 00000 n 0000004681 00000 n 0000006166 00000 n 0000072813 00000 n 0000012189 00000 n 0000018395 00000 n 0000076101 00000 n 0000028696 00000 n 0000033356 00000 n 0000038040 00000 n 0000043052 00000 n 0000047954 00000 n 0000055054 00000 n 0000004952 00000 n 0000005181 00000 n 0000006143 00000 n 0000011162 00000 n 0000011186 00000 n 0000012166 00000 n 0000016251 00000 n 0000016275 00000 n 0000018371 00000 n 0000027786 00000 n 0000027810 00000 n 0000028673 00000 n 0000032404 00000 n 0000032428 00000 n 0000033333 00000 n 0000037005 00000 n 0000037029 00000 n 0000038017 00000 n 0000042009 00000 n 0000042033 00000 n 0000043029 00000 n 0000046931 00000 n 0000046955 00000 n 0000047931 00000 n 0000052946 00000 n 0000052970 00000 n 0000055030 00000 n 0000064302 00000 n 0000064326 00000 n 0000072000 00000 n 0000072024 00000 n 0000072518 00000 n 0000072541 00000 n 0000073290 00000 n 0000075246 00000 n 0000075270 00000 n 0000075572 00000 n 0000075595 00000 n 0000075866 00000 n 0000076327 00000 n 0000076455 00000 n trailer << /Size 57 /Root 56 0 R /Info 55 0 R >> startxref 76508 %%EOF mathgl-8.0.1/translations/0000775000175000017500000000000014167366473015324 5ustar balakinbalakinmathgl-8.0.1/translations/mathgl_es.mo0000664000175000017500000002266414167366473017636 0ustar balakinbalakin\ p "q          % + 1 ? Q b {         &.7@O b lv      " / :EW ft    $,5=Zck {   7  !9+e x; 8<:E ; = ;)e8n$(  I;.   ?(V5  " "- P[{     Z&]2( -5=CJS Xf(& !"DZ c p ~         !-@ T ao     /DUe~     $ EQZjy   F& CGP I%6 \Gi G J a r L G !!G.!7v!!&!:!",("RU""/""&"& # 4#>#AC#?#9# # $$$$#8$\$-d$-$ $/$$% %-%=%M%]%b%d%i% q% ~% %% %=P Kxi;fE%z.g,hd7k )+*T|/eVm\<SN w^yWct!~8?#5RG-Q U3(ArnD`$41_'vb]O jps6[Lo:lHXIM0u"&@aF9>YC2} ZB{qJ Change temporary data in line %ld String too long in line %ld Wrong argument(s) in line %ld Wrong command in line %ld - UDAV preview - UDAV variable Delete Edit Info New Save Yes %d - %d of %d'#+' squared plus'#.' circled dot'#<' solid triangle left'#>' solid triangle right'#d' solid rhomb'#o' solid circle'#s' solid square'#v' solid triangle down'#x' squared cross'*' cross'*' star'+' plus'-' lines'-' solid'.' dot':' dots';' dash'=' small dash'>' triangle right'A' arrow'D' rhomb'D' solid rhomb'I' stop'K' size'O' circle'O' solid circle'S' solid square'S' square'T' triangle'V' back arrow'X' cross'^' hats'^' triangle up'_' none'd' rhomb'j' dash dot'o' circle's' square'v' triangle down'x' skew cross'|' long dash0 - special plot1 - other plot10 - dd plot11 - vector plot12 - axis13 - primitives14 - axis setup15 - text/legend16 - data transform1D plot1D plots1D view2 - setup2D plot2D plots2D view3D data with sizes from file3D plots3D view4 - data create5 - subplot6 - program flow7 - 1d plot8 - 2d plot9 - 3d plotAboutAbout QtAdd arcAdd arc which properties can be changed later by mouse.Add command option(s)Add curveAdd curve which properties can be changed later by mouse.Add data or numberAdd ellipseAdd ellipse which properties can be changed later by mouse.Add inplotAdd legend entryAdd legend entry for the plotAdd lineAdd line which properties can be changed later by mouse.Add markAdd marker which properties can be changed later by mouse.Add polygonAdd polygon which properties can be changed later by mouse.Add primitiveAdd rectAdd rectangle which properties can be changed later by mouse.Add rhombusAdd rhombus which properties can be changed later by mouse.Add textAdd text which properties can be changed later by mouse.Add title for current subplot/inplotAdd toAdd user-defined symbolAdjust picture size to fill drawing areaAdjust sizeAdjust ticks for best viewAll indexes (of data arrays, subplots and so on) are always start from 0.AlphaAlpha value (transparency) of surface or cloudAmbientAngle around x axis (in degrees)Angle around z axis (in degrees)AnimationAnotherApply operator (smoothing, integration, difference ...) to dataApproximate number of mesh lines in plotAre you sure that you want to delete ALL data arrays?ArgumentArgumentsArrow at endArrow at startAsk to stop plot drawing (F7).AspectAspect ratio of x-scale to z-scaleAspect ratio of y-scale to z-scaleAspect x/zAttach light settings to inplotAuto detect data sizesallalongalong xalong yalong zalphaandarcarrowsat centerat maximumat minimumat positionattach lightProject-Id-Version: MathGL2 2.4.0 Report-Msgid-Bugs-To: POT-Creation-Date: 2017-05-18 13:38+0300 PO-Revision-Date: 2017-05-11 23:14-0400 Last-Translator: Language-Team: Language: es MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Generator: Poedit 1.8.7.1 Plural-Forms: nplurals=2; plural=(n != 1); Cambiar datos temporales en linea %ld Cadena de caracteres demasiado larga en linea %ld Argumento(s) incorrecto(s) en linea %ld Comando incorrecto en linea %ld - Vista previa de UDAV - Variable de UDAV Borrar Editar Info Nuevo Guardar Si %d - %d de %d'#+' signo mas en cuadrado'#.' punto en circulo'#<' triangulo solido hacia la izquierda'#>' triangulo solido hacia la derecha'#d' rombo solido'#o' circulo solido'#s' cuadrado solido'#v' triangulo solido hacia abajo'#x' cruz en cuadrado'*' cruz'*' estrella'+' signo mas'-' lineas'-' solido'.' punto':' puntos';' guion'=' guion pequeno'>' triangulo hacia la derecha'A' flecha'D' rombo'D' rombo solido'I' detener'K' tamano'O' circulo'O' circulo solido'S' cuadrado solido'S' cuadrado'T' triangulo'V' flecha inversa'X' cruz'^' sombrero'^' triangulo hacia arriba'_' ninguno'd' rombo'j' guion y punto'o' circulo's' cuadrado'v' triangulo hacia abajo'x' cruz oblicua'|' guion largo0 - grafico especial1 - otro grafico10 - grafico dd11 - grafico de vectores12 - eje13 - primitivas14 - configurar eje15 - texto/leyenda16 - transformar datosGrafico 1DGraficos 1DVista 1D2 - configurarGrafico 2DGraficos 2DVista 2DDatos 3D con tamaños de archivograficos 3DVista 3D4 - crear datos5 - subgrafico6 - flujo de programa7 - grafico 1d8 - grafico 2d9 - grafico 3dAcerca deAcerca de QtAnadir arcoAnadir arco cuyas propiedades pueden ser cambiadas luego con el mouse.Anadir opcion(es) de comandoAnadir curvaAnadir curva cuyas propiedades pueden ser cambiadas luego con el mouse.Anadir datos o numeroAnadir elipseAnadir elipse cuyas propiedades pueden ser cambiadas luego con el mouse.Anadir grafico internoAnadir entrada a leyendaAnadir entrada a leyenda para graficoAnadir lineaAnadir linea cuyas propiedades pueden ser cambiadas luego con el mouse.Anadir marcaAnadir marca cuyas propiedades pueden ser cambiadas luego con el mouse.Anadir poligonoAnadir poligono cuyas propiedades pueden ser cambiadas luego con el mouse.Anadir primitivaAnadir rectaAnadir rectangulo cuyas propiedades pueden ser cambiadas luego con el mouse.Anadir romboAnadir rombo cuyas propiedades pueden ser cambiadas luego con el mouse.Anadir textoAnadir texto cuyas propiedades pueden ser cambiadas luego con el mouse.Anadir titulo para el subgrafico/grafico interno actualAnadir aAnadir simbolo definido por el usuarioAjustar tamano de la imagen para llenar el area de graficoAjustar tamanoAjustar marcas del eje a la mejor aparienciaTodos los indices (de vectores de datos, subgraficos, etc.) siempre empiezan en 0.AlfaValor alfa (transparencia) de superficie o nubeAmbienteAngulo alrededor del eje x (en grados)Angulo alrededor del eje z (en grados)AnimacionOtroAplicar operador (suavizado, integracion, diferencia ...) a datosNumero aproximado de numero de lineas de la malla en el graficoEsta seguro que desea borrar TODOS los vectores de datos?ArgumentoArgumentosFlecha al finalFlecha al principioSolicitar detener graficacion (F7).AspectoProporcion de aspecto de escala-x a escala-zProporcion de aspecto de escala-y a escala-zAspecto x/zVincular configuracion de luz a grafico internoAutodetectar tamanos de datostodoa lo largo dea lo largo de xa lo largo de ya lo largo de zalfayarcoflechasen el centroen el maximoen el minimoen la posicionvincular luzmathgl-8.0.1/translations/mathgl_ru.mo0000664000175000017500000041664214167366473017660 0ustar balakinbalakin,yYwwexh:{8|"||}6}U}p}}}}}}}}} }} }}}~~8~O~`~r~~~ ~~~ ~ ~~~~ ~+:I \ fp      / < GRd s   ɀӀ ) 1;CLTd  ˁ ׁ{ _iox7 ΂9؂ %;1 mx8: -;9 u= ʄ;ք8$Ty( ͅI.Ap x Ć?̆( 55k t ~"" 1%H*n(2ˆ %09B)T ~ $$ˉ$$: IT mx ̊ ӊފ-( AM(_ 3ȋ ΋؋    & 2?X~_ތ ,֍@D_t2 Ž * 32=1p ȏ(Џ' !,BZu.Ɛ '(8!N(p1ˑБ <'Ck t(,L GU s }"$ܓ1#O s Δ-C Y(e %Ǖޕ )2 ISlo 0  )BR'gӗ #:^ p{ ˜ ͘ ۘ**:*e+(ۙ+ CNa&s))Ě) #& J Tap!!!ܛ, +"L$o  ٜ(9@U14ȝ 4J` v ˞ ݞ4H W0d00Ɵ$&0W7j(+ˠ 9Xt'ҡ)8So&âӢ  "+FeiqP()(R.{-ؤ-:Uke ѥܥ!8WIwߦ(%EY ^ j x  ͧ ۧ  ;B GU t ~"è" $* O ]~$ ©!! ?I+^'(Ъ   3 >J^m q{  ī Ϋ ث  ?$ d rͬ(' F!R%t&ʭ٭"9\yخ5LczƯ 2EUj {ð38 O@\@ޱ#" ,ESJ β  $#. R] {ֳ"$3Xk p|ôմ3/"D g!q @..C@r, зݷ$ . 8C Tbi+o ɸ Ը ߸   6@gT˹ڹ2)B l w'ۺ ;aUʻ 8 L Vap'Ӽ8848m* ѽܽ*2'E8m88߾* CNUtп '(B&k( ( (*>i q}   /#/S. ", ANl B@O`h z%# "r" /* A1K }  ??/o w 5 +(?Ss" U s ~  , 6Pe$t+   $ 1!< ^ jw 2  %%!G5[& E+"0SZ y #+: B N*Z& 312C0v @"=7ED}E7@G`q + . : GQZfs'   %3 D PZ#q   '4CT[ kv)&:Z)^) 'Fbr& ,)J$t*#'/!@b~&$**@1k1&5#Jn-! !6Kdu!P6OQ   #. J T al%!r =6c?{x&  )4Q k('   !/(5 ^h o{1 00*Bm/.< H P];c4 ' ,9H d r  ( 6 D R `nv| ! *, ITf412&9[`,! 4&5[)    " 2= NYCxIL*:+V"%$#60g m y9 1  ,6EZ"t   ,A R^ q})?Ufx1EW kx &05R[m+)()1 &FLai N[ j x# ,  %*PW ] ht|   zioTV|6s}m_jvV28V q,1%5< B MYa hu  &   -B S]cgmu}       .AG!Oq  &  % . :D HR blq  P>"=aH  =OTdv&   % 0;K S]c i u    $,<MR Y d ny ~ M T =G*TrV2@Q<   . < FRfk {!+-+0\ {$)#  )8M\o ( ;H fs  # ( B MZx):"Z&} .JZ lv #5 %!/(Q'zc*Jug1-iK$,BJefiT kt # +!w0!!e!("gD"M"">#OM##E#$n$[$$@$@6%w% %%G-&Ju&&&&&<'#O'/s'/''I'G0(Vx(;(D )4P))))))) ***L;*** ***B*B"+Be+B+4+ , /,P,d, {,,,, ,:, --9-*J-Qu-#--* .84.m.N...*.*/J/Y//w////// 0#01n12222E2\8343!3'3h4!}4H4#4N 5>[5#5[5m6B666\7Xb77$7*7(%8&N8(u8$848`8Y9Zs9393:X6:;:]:);5:;p;5;;\R<<<S<1=M=6`=== =b=)>6I>>>:>)>8?8P?,???9?P0@N@@@7@14A0fA!A.A/A.BGBMXB BOBC2)C6\CC[C0D7DZODD4DUDA8E5zENEE#FD;F&F6FBF8!G,ZGKGGEGJ7H@HMH^INpI:I7I02JOcJ4J8J0!KRK8rK,K>K>L>VLNLjLgOMFMM!N7N4NTOFgOFOFO?X<XX#X> Y2HYV{Y/YZ< Z<]Z<Z?Z*[LB[+[l[L(\Zu\\@\'1]<Y]S]K]T6^A^B^F_ZW_8_0_R`;o`V`%a(a!Faha qaG~aa4a7b NbYb*nb"bb8@c"yc3c5c1d38d3ld&dNdDeC[e%eeGf5aff,f.f>g/EgPug5g;gH8h@hh h hh i(iBi_i+|iii,ij$jZDj jjj4jkk1k&Lksk&kOk?k:=lMxl(lUl Em9Pm*m7m.m7n5Tnn"n@n^ o1ko[oo p(p%Dpjpp3p%p pp-qu(;#=7S/$77,P}#1#5"Y$|~& =GC< !e. 0YЄQ*~|QYpʇ +#Ob ~"ˆшZڈ%5=[ɉۉ- 9<v/Ɗ"8ȋ6*8,c!M9(b1xԍ$K{\(؎(!*L!f  5$ !"Dc42.V+FFɑF4W Œے*,,;ThDDDG2Ӕ991X111 @4Bu@>8VN&(̗T VbϘA'9<v"}͙2+7+c+Κ%$"J9m),ћ!& Gf|#5Q?Y o#z#>K@M:EI<fR_g x  <ҡd$d,aJ:ȣD?H'!ҤE/87h0ѥ3!9!Ǧ=$Af{'ȧ\?w4!KMZ!!ʩ'2R#eA!ܪ*8<ua  U)^/ެdHs Iǭu/C1%Ek|$ܯJ0BNs°ӰR(U=~رOO>QQF2y]9W/jw xkh9q"ɶ"$49E·ܷM9Uq.˸8nϹ % Fd0;+;9u4+ʻ?6%U"{ ü5ۼ:L%h C%$7> vH?̾c p0.,&6DB{(+O7c<6==M?XR$XwPF!Kh:36##Z(~AQP;QWf6h$$+$P9u.A( *I[tT+%:Q'''8;=.yP,'&N'#%5<?r#3*>U(q*,*A3_&23mixA?.^7H%4,R6.8T4T 7BF*FZOxHWWiE<MDl^ru  7r,An@'8=,j "9Pg~  ,7H-Y88R)H|8-9Lg:;1+]TSA(@A7A)y    (A^t6W8[Qw<L-S%?+</PL;& [0 mBGWSr++J+v+#="a*$$&=#Os) "&,:&g/*+4"L9o1& C#&g5/(<Y$q ):9(X" C";=OyQPQl4x=5!)2\dk!% 0FL *.! ?<L    '3L_sB '^TeW +   -x ( d =41r:MD-GrL  (ATh?x!##E7}#2.!a    +0Iz  % 4-3b1 K.z!' 8#Cg z `eLv@!8$1V%] :C AK<S " (DWr {8" -9 Q^bj      ->Ud v 3|e-e =xcEM$<x9 6>h@w Ha%'LcPT %NgfVu:%2}.t0/b!&4}OS*8-SIB@o!Wm(#'"Kxuyz~:o.b-U|R]PD: M1F#V [9l)]|Z^. ECI!;'dRd9 gD{{ym>L:%vpQkJ; `w6iMQ SGW]Wo'kh.CC^Q#+F(P|xqA/3O'3X8j/u g\0 Mo0}{v\t4n| <k`6Bf>zX8]FNWT 80H=f 9jtB~J7&^~-+\?7-3(/KLdnd"N rLQ):kA``tyNa4 {Gy3sb\ 9i5uy1"__ $?7g$i$>_mR +aPcO*RSBz_I=@tfO*?R4#zbuerOmc\2r }Vd?H# 5#~Vf[qPYyi9 J=UgiJVWQ++!p* C_KFYw6wN;UkjnJPAK,a 8lA<)eEG``I^U^<&w 7.X/QLKcpT<VT@zD|IH3 7GB{lGq$[>j*6Dh${)IJ0<nZ)pNC5sTY}vU^24Hr?*h2,voM&t]'jac;vs "l&Y" bAv!B 4[CHK)?q:;~@ 2Dl~5 +5qXEgUrn%0d7SD,,Xs,"XZkGLSp6%Y&ro;18FxThbxOE25e[YZ(Wu wFsm(.f}_]Z[z1M !=Z/e1Eil(R sh@p,>jn \-1=Aqam -1 str set str as argument $1 for script ... ... -9 str set str as argument $9 for script -L loc set locale to loc -h print this message -1 str set str as argument $1 for script ... ... -9 str set str as argument $9 for script -L loc set locale to loc -s fname set MGL script for setting up the plot -S val set scaling factor for images -q val set quality for output (val=0...9) -g val set gray-scale mode (val=0|1) -v val set variant of arguments -o name set output file name -n no default output (script should save results by itself) -A val add animation value val -C n1:n2:dn add animation value in range [n1,n2] with step dn -C n1:n2 add animation value in range [n1,n2] with step 1 - get script from standard input -h print this message -1 str set str as argument $1 for script ... ... -9 str set str as argument $9 for script -g val set gray-scale mode (val=0|1) -v val set variant of arguments -s opt set MGL script for setting up the plot -L loc set locale to loc - get script from standard input -h print this message (c) Alexey Balakin, 2007 http://mathgl.sourceforge.net/ Change temporary data in line %ld String too long in line %ld Unbalanced ' in line %ld Wrong argument(s) in line %ld Wrong command in line %ld - UDAV preview - UDAV variable Del.all Delete Edit Info New Save Yes %d - %d of %d' ' none'#*' Y-sign'#+' squared plus'#.' circled dot'#<' solid triangle left'#>' solid triangle right'#^' solid triangle up'#d' solid rhomb'#o' solid circle'#s' solid square'#v' solid triangle down'#x' squared cross'*' cross'*' star'+' plus'-' lines'-' solid'.' dot':' dots';' dash'<' left sign'<' triangle left'=' double lines'=' small dash'>' right sign'>' triangle right'A' arrow'D' rhomb'D' solid rhomb'I' stop'K' size'O' circle'O' solid circle'S' solid square'S' square'T' triangle'V' back arrow'X' cross'^' hats'^' triangle up'_' none'd' rhomb'i' small dash dot'j' dash dot'o' circle's' square'v' triangle down'x' skew cross'|' long dash'~' waves0 - special plot1 - other plot10 - dd plot11 - vector plot12 - axis13 - primitives14 - axis setup15 - text/legend16 - data transform1D plot1D plots1D view2 - setup2D plot2D plots2D view3 - data handle3D data with sizes from file3D plots3D view4 - data create5 - subplot6 - program flow7 - 1d plot8 - 2d plot9 - 3d plot
(c) Alexey Balakin, 2007-present

License is GPL v.2 or later.@<- PrevAboutAbout QtAdd arcAdd arc which properties can be changed later by mouse.Add command option(s)Add curveAdd curve which properties can be changed later by mouse.Add data or numberAdd ellipseAdd ellipse which properties can be changed later by mouse.Add inplotAdd legend entryAdd legend entry for the plotAdd lineAdd line which properties can be changed later by mouse.Add markAdd marker which properties can be changed later by mouse.Add polygonAdd polygon which properties can be changed later by mouse.Add primitiveAdd rectAdd rectangle which properties can be changed later by mouse.Add rhombusAdd rhombus which properties can be changed later by mouse.Add textAdd text which properties can be changed later by mouse.Add title for current subplot/inplotAdd toAdd user-defined symbolAdjust picture size to fill drawing areaAdjust sizeAdjust ticks for best viewAiry and GammaAll indexes (of data arrays, subplots and so on) are always start from 0.Alpha value (transparency) of surface or cloudAmbientAngle around x axis (in degrees)Angle around z axis (in degrees)AnimationAnotherApply operator (smoothing, integration, difference ...) to dataApproximate number of mesh lines in plotAre you sure that you want to delete ALL data arrays?ArgumentArgumentsArrow at endArrow at startAsk to stop plot drawing (F7).AspectAspect ratio of x-scale to z-scaleAspect ratio of y-scale to z-scaleAspect x/zAttach light settings to inplotAuto detect data sizesAuto detect data sizes (%1 x %2 x %3)Automatically execute script after loadingAutomatically save before redrawing (F5)Averages are: = %g = %g = %g = %g Axial directionAxialDirAxisAxis and colorbarAxis setupB - navyBackwardBad '%ls' at %zu Bad arguments for %ls: %ld instead of %d BaseWidthBasicBeginBesselBold styleBoth fields in crange must be filledBoth fields in xrange must be filledBoth fields in yrange must be filledBoth fields in zrange must be filledBreak for-loopBrightnessBrightness of i-th colorBy formulaC - tealC axisC-rangeCalculationsCalculatorCancelCannot triangulate this set!CanvasCell indexChangeChange (resize) dataChange canvas size to fill whole region (F6).Change current directoryChange dataChange data sizesChange data values and close this windowChange fontChange view angles - use 'rotate' for plot rotationClearClear allClear legend entriesClear pictureCloseClose tabClose this data tab.ColorColor orderColor schemeColor(s) or color schemeColorsColors denote values: magenta - local max, cyan - local min, red - Re(v)>0, blue - Re(v)<0, purple - Im(v)>0, teal - Im(v)<0.CommandCommand arguments. Bold ones are required arguments. Other are optional arguments but its order is required. You can use '' for default format. See help at right for default values.Command optionsCommentsComputes the attractor of an IFSComputes the attractor of an IFS for 3d caseComputes the attractor of an IFS with parameters from *.ifs fileComputes the flame fractalConditional operatorCopy click coor.Copy coordinates of last mouse click to clipboard.Copy dataCopy data from another variableCopy graphicsCopy graphics to clipboard (Ctrl+Shift+G).Copy image to clipboardCopy plotCopy range of numbers to clipboard (Ctrl+Shift+C).Copy selected text or data to clipboard (Ctrl+C).Copy selection to clipboardCopy textCos FFTCos-Fourier transform along direction(s)Cos-Fourier transform at some directionCosine FFTCould not write to %1Could not write to fileCouldn't change to folder Couldn't open file Couldn't open file %sCreate data and I/OCreate data and IOCreate histogram (distribution) of data valuesCreate newCreate new 1D data and fill it in rangeCreate new dataCreate new data arrayCreate new data with zero fillingCreate new empty script window (Ctrl+N).Creates new variable from list of numbers or dataCropCrop (cut off edges) dataCrop dataCrop edge of dataCrop the data edges. Useful to cut off the zero-filled area.Cumulative summation along direction(s)CurrLineCurrent fontCut selected text to clipboard (Ctrl+X).Cut textCuttingDAT Files *.{dat,csv} HDF Files *.{h5,hdf}DashDashingDataData files (*.dat) HDF5 files (*.h5 *.hdf) PNG files (*.png) All files (*.*)Data handlingData information and preview.Data nameData previewData preview for current slice.Data transformDecrease \phi angle by 10 degrees.Decrease \theta angle by 10 degrees.Decrease font sizeDefine constant or parameterDefine parameter as characterDefine parameter as numerical valueDefine parameter from user inputDelay (in ms)Delay (in sec)Delete @b all@. data arrays.Delete ALL data arraysDelete data or slice of dataDelete selectedDelete selected data arrayDelete selected data.Delete selected plot.DescriptionDetect curves for maximums of data arrayDifferenceDifferentiate data along direction(s)DiffuseDilate data larger valDirect multiplication of arraysDirectionDirection along which data will be filledDistance between cellsDivide byDivide by data or numberDoDo STFA transformDo integral transform of dataDo nothing and close this windowDo you want to delete all data?Do you want to save the changes to the document?Don't SaveDouble diff.Draw Bifurcation diagramDraw Iris plotsDraw Lamerey diagramDraw Open-High-Low-Close (OHLC) diagramDraw Poincare mapDraw STFA diagramDraw TeX mark at point positionDraw angle arcDraw area plot for 1D dataDraw bars for 1D dataDraw beltsDraw binormales for 1D dataDraw bitmap (logo) along axis rangeDraw bounding boxDraw boxesDraw boxplot for 2D dataDraw candlestick chartDraw chartDraw circleDraw cloudDraw colorbarDraw coneDraw cones for 1D dataDraw contour linesDraw contour lines at x-slice (or x-plane)Draw contour lines at y-slice (or y-plane)Draw contour lines at z-slice (or z-plane)Draw contour lines for 3D dataDraw contour lines for surface of trianglesDraw contour lines on parametric surfaceDraw contour tubesDraw contour tubes for surface of trianglesDraw curveDraw curve by tubeDraw density plotDraw density plot at slices of 3D dataDraw density plot at x-slice (or x-plane)Draw density plot at y-slice (or y-plane)Draw density plot at z-slice (or z-plane)Draw dew plotDraw dots for arbitrary data pointsDraw dropDraw ellipseDraw error boxDraw error boxesDraw face (quadrangle)Draw face perpendicular to x-axisDraw face perpendicular to y-axisDraw face perpendicular to z-axisDraw filled region (ribbon) between 2 curvesDraw flow pipes for vector fieldDraw flow threads for vector fieldDraw gradient lines for scalar fieldDraw gridDraw grid at slices of 3D dataDraw grid for data array(s)Draw horizontal bars for 1D dataDraw horizontal tilesDraw horizontal tiles with variable sizeDraw isosurface for 3D dataDraw isosurface for 3D data colored and transpared by other dataDraw isosurface for 3D data colored by other dataDraw isosurface for 3D data transpared by other dataDraw label at arbitrary positionDraw label for t-axisDraw label for x-axisDraw label for y-axisDraw label for z-axisDraw legendDraw lineDraw mapping plotDraw mark plot for 1D dataDraw mesh surfaceDraw point (ball)Draw polygonDraw quasi-optical beamDraw radar chartDraw reconstructed surface for arbitrary data pointsDraw rectangleDraw rhombusDraw solid contour lines at x-slice (or x-plane)Draw solid contour lines at y-slice (or y-plane)Draw solid contour lines at z-slice (or z-plane)Draw solid contour lines for 3D dataDraw solid contoursDraw solid contours with manual colorsDraw solid surfaceDraw solid surface colored and transpared by other dataDraw solid surface colored by other dataDraw solid surface transpared by other dataDraw sphereDraw stem plot for 1D dataDraw step plot for 1D dataDraw surface of curve rotationDraw surface of quadranglesDraw surface of trianglesDraw surfaces of contour lines rotationDraw table with data valuesDraw tension plot for 1D dataDraw text at some position or along curveDraw user-defined symbol at given position and directionDraw usual plot for 1D dataDraw vector fieldDraw vector field at slices of 3D dataDraw vectors along a curveDraw waterfallsDrawing time %1 msDual plotsE - darklawnEdgesEditEdit selected data arrayEllipticEnable keywords completionEnable mouse wheel for zoomingEndEnglishEnter color schemeEnter data nameEnter formula for data modification Here x, y, z in range [0,1], u is data valueEnter name for new variableEnter name of dataEnter new data sizesEnter number for addition to data valuesEnter number for division of data valuesEnter number for multiplication of data valuesEnter number for subtraction from data valuesEnter number of vertexesEnter range for data and direction of fillingEnter range for final dataEnter range of saved date.Enter slice id:Enter step of saved points. For example, '1' save all, '2' save each 2nd point, '3' save each 3d and so on.Enter textEnter value for %s argumentEnvelopErode data larger valError reading from file '%s': %s.Error to call external viewer Error writing to file '%s': %s.Evaluate (interpolate) values of array Dat at points i=idat,j=jdat,k=kdatExecute if condition is falseExecute script after loadingExecute script and redraw graphics (F5).Execute script in external fileExisted data arraysExitExp and logExp-integralsExport Data?Export as ...Export as 2D ...Export as 3D ...Export data to PNG fileExport to GIFExport to PNGExtend data arrayExtract dataExtract sub-arrayExtract sub-array between valuesFactorFileFile %1 savedFile is exesist. Overwrite it?File nameFile pathFile to exportFile/Recent filesFillFill data by formulaFill data by global spline of VdatFill data by interpolation of VdatFill data by triangulated valuesFill data linearly in range [v1, v2]Fill in rangeFill x-,k-samples for transformsFindFind correlation between data arraysFind envelop for the dataFind envelope along direction(s)Find histogram of data.Find maximal value over directionFind minimal value over directionFind nextFind or replace textFind root Dat[i,j,k]=val (inverse evaluate)Find roots using data as initial valuesFind summation over directionFind triangles of randomly placed pointsFind what:Find/ReplaceFind|ReplaceFinish if/else blockFirst cellFirst sliceFit data to formulaFitted formulaFogFog dist.Folder for help filesFolder pathFontFont file nameFont files (*.vfm)Font kindFont sizeFont styleFontSizeFor loopForwardFrame %1 of %2FromFunctionG - greenGIF support was disabled. Please, enable it and rebuild MathGL.General setupGet JacobianGet formated data from fileGet momentum along directionGet pulse propertiesGet trace of arrayGlobal message - %s Go to first slice for 3D data (Ctrl-F1).Go to last slice for 3D data (Ctrl-F4).Go to sliceGo to the next slice for 3D data.Go to the previous slice for 3D data.Go to the specified slice for 3D data.GraphicsGraphics setupGraphics/Adjust sizeGraphics/AlphaGraphics/Animation/Next frameGraphics/Animation/Prev frameGraphics/Animation/Setup animationGraphics/Animation/SlideshowGraphics/Copy click coor.Graphics/Copy graphicsGraphics/Export/as BMPGraphics/Export/as GIFGraphics/Export/as JPEGGraphics/Export/as OBJGraphics/Export/as OFFGraphics/Export/as PNGGraphics/Export/as PRCGraphics/Export/as STLGraphics/Export/as SVGGraphics/Export/as TeXGraphics/Export/as XYZGraphics/Export/as bitmap EPSGraphics/Export/as solid PNGGraphics/Export/as vector EPSGraphics/GridGraphics/LightGraphics/Pause calcGraphics/PrimitiveGraphics/RedrawGraphics/Reload dataGraphics/RestoreGraphics/StopGraphics/Transform/Move downGraphics/Transform/Move leftGraphics/Transform/Move rightGraphics/Transform/Move upGraphics/Transform/Zoom inGraphics/Transform/Zoom outGridGroups of MGL commandsH - darkgrayHDF4 support was disabled. Please, enable it and rebuild MathGL.HDF5 support was disabled. Please, enable it and rebuild MathGL.HankelHankel transform along direction(s)Hankel transform at some directionHeight of selected cellsHelpHere you can specify command options. Options are used for additional plot tunning.Hidden plotsHide selectedHide selected plots.Highlight current object(s)HintsHistogram (Ctrl+Shift+H)Horizontal sizeHyperbolicIcon listId of slice on third (z-) dimensionImage sizeImmediately print the messageImport Data?Import data from PNG fileImport from PNGIn rangeIn-place Fourier transformIncompatible loop parameters!Incorrect type of base dataIncrease \phi angle by 10 degrees.Increase \theta angle by 10 degrees.Increase font sizeInfoInformationInplotInsertInsert MGL commandInsert as 'list'Insert file content?Insert file name?Insert filenameInsert inplot commandInsert last fitted formula with found coefficients.Insert slice of dataInsert to script as 'list' commandIntegrateIntegrate data along direction(s)Intensity of diffuse lightItalic styleJPEG support was disabled. Please, enable it and rebuild MathGL.JacobiJoin data arraysKeep empty to put at beginning of main script.Keep only each n-th element of the data array.Keep slides in memory (faster animation but require more memory)KeywordsKindKind of command argument order. The notation is: * Capital arguments are data (like, Ydat); * Argument in '' are strings (like, 'fmt'); * Other arguments are numbers (like, zval); * Arguments in [] are optional arguments.Kind of plots: lines for 1D, density for 2D.L - seagreenLabelLanguage for UDAVLanguage for mgllabLaplace transform along direction(s)LaplacianLast sliceLeft bottom edgeLeft top edgeLegendLightLight position should be filled. Ignore it.Light settingsLimit data to be inside [-v,v]Line styleLine widthLinear *3Linear *5List of available data.Load Data?Load commands from external DLLLoad dataLoad data from fileLoad data from file. Data will be deleted only at exit but UDAV will not ask to save it (Ctrl+Shift+O).Load fontfacesLoad from fileLoad image for backgroundLoad script to new windowLoaded document Loaded document %1Loading abortedLow border for determining color or alphaM - purpleMGL ParserMGL commands for selected groupMGL files *.mglMGL files *.mgl DAT files *.{dat,csv}MGL files (*.mgl)MGL helpMGL messagesMGL samples and hintsMGL scripts (*.mgl) HDF5 files (*.hdf *.h5) All files (*.*)MGL scripts (*.mgl) HDF5 files (*.hdf *.h5) Text files (*.txt) Data files (*.dat) All files (*.*)Make another data.Make new (Ctrl+Shift+M)Manual dashingManual maskManual primitivesMarkMarksMaskMask for bitmap coloringMask rotation angleMask sizeMatch caseMathGL - aboutMathGL message - %s Matrix with sizes from fileMax along direction(s)MaximalMaximal value (v2)Maximal value for resulting data valuesMaximal value of X for cutting or for coordinate fillingMaximal value of Y for cutting or for coordinate fillingMaximal value of Z for cutting or for coordinate fillingMaximum is %g at x = %ld y = %ld z = %ld Maximum ofMemoryMesh numMeshNumMessagesMessages and warningsMin along direction(s)MinimalMinimal value (v1)Minimal value for resulting data valuesMinimal value of X for cutting or for coordinate fillingMinimal value of Y for cutting or for coordinate fillingMinimal value of Z for cutting or for coordinate fillingMinimum is %g at x = %ld y = %ld z = %ld Minimum ofMirrorMirror data along direction(s)Mirror data at some directionModify data values by formulaMomentum along 'x' for functionMomentum along 'y' for functionMomentum along 'z' for functionMove downMove graphics left by 1/3 of its width.Move graphics right by 1/3 of its width.Move graphics up by 1/3 of its height.Move graphics up down 1/3 of its height.Move leftMove mouse-handled primitives to script.Move plot downMove plot upMove rightMove selected plot down to next subplot.Move selected plot up to previous subplot.Move upMultiply byMultiply by data or numberN - darkskyblueNOTE: All fields must be filled!NameName for outputNavigationNew commandNew inplotNew order of dimensionsNew scriptNew size of data on 1st dimension (x-direction)New size of data on 2nd dimension (y-direction)New size of data on 3d dimension (z-direction)NextNext @->Next sliceNext slideNoNo action is selected. Do nothing.No argument is selectedNo direction/formula is entered. Do nothing.No filename.No occurrences of '%s' found!No selection. So nothing to doNo string occurrence is foundNo text rotationNormal viewNormalizeNormalize dataNormalize data slice by sliceNormalize in symmetrical range: -max(|v1|,|v2|) ... max(|v1|,|v2|)Not recognizedNumber of pointsNumbersNumeric parameterNumeric valueNumerically differentiate dataNumerically double differentiate dataOnly current slice will be insertedOpen File?Open all data arrays from HDF fileOpen and execute/show script or data from file (Ctrl+O). You may switch off automatic exection in UDAV properties.Open dialog for new data creation.Open fileOpen file ...Open printer dialog and print graphics (Ctrl+P)Open script or data fileOpen table with selected data for editing.OperationOperation is not supported for this type of data.OperationsOptionsOriginOther plotsOthersOverlineOwn brightness of the surfaceP - darkpinkPDF support was disabled. Please, enable it and rebuild MathGL.PNG Files *.pngPNG support was disabled. Please, enable it and rebuild MathGL.PaletteParabolic *5Paste dataPaste range of numbers from clipboard (Ctrl+Shift+P).Paste textPaste text from clipboardPaste text or data from clipboard (Ctrl+V).Path for MathGL font (without extension)Path for help filesPath for user MathGL font filesPause calculationPause on/off external calculationsPerform Runge-Kutta stepPhi angle (rotate in x*y plane)Place editor at topPlot IDPlot curve by formulaPlot dataPlot data in new script window. You may select the kind of plot, its style and so on.Plot setupPlot stylePlot surface by formulaPopular color schemesPrevPrev slicePrev slidePreviewPrevious expressionsPrimitivesPrimitives ...Print MathGL version or check if it is validPrint content of the dataPrint fitted formulaPrint graphicsPrint list of data names in HDF filePrint message or information about the dataPrint plotPrint scriptPrint string from filePrinting abortedPrinting completedPrinting...Program flowPropertiesProperties of selected data arrayPulse prop.Put functionPut in variablePut into this data arrayPut to scriptPut value (numeric or array) to given data elementQ - brownQuitR - maroonRasterize plot and save to backgroundRead and join data from several filesRead data from fileRead data from file with sizes specified in first rowRead data with name 'id' from HDF fileReadyRearrange data dimensionsRecent filesRecreate the data with new sizes and fill it by zeros (Ctrl+Shift+N).RedoRedo editor change (Ctrl+Shift+Z).RedrawRedraw picture for $0 equal toRedraw plotRefreshRefresh the pictureRelative position of i-th colorReloadReload dataReload data and refresh the pictureRemove duplicate rowsRemove jump into the data, like phase jumpsReplaceReplace allReplace by:Replace expression by its numerical value.Replaced %ld occurrences.Required argument %s is not specified!Reserve atReserve at:Reserve space for labels at bottom side (style '_')Reserve space for labels at left side (style '<')Reserve space for labels at right side (style '>')Reserve space for labels at top side (style '^')Reset settings and clear pictureResizeResize (interpolate) the data to specified sizes (Ctrl+Shift+R).Resize data arrayResize data with smoothingRestoreRestore default graphics rotation, zoom and perspectiveRestore default graphics rotation, zoom and perspective (Alt+Space).Restore default graphics rotation, zoom and perspective (Ctrl+Space).Restore status for 'once' command and reload data (F9).ResultResult (will have sizes Resulting stringReturn from functionRight bottom edgeRight top edgeRollRoll data along direction(s)RotateRotate by mouseRotate downRotate leftRotate onRotate picture by holding left mouse buttonRotate plotRotate rightRotate upRotationRun slideshow (CTRl+F5).Run slideshow (Ctrl+F5). If no parameter specified then the dialog with slideshow options will appear.Run/Stop slideshow (graphics animation)RussianSaturationSaveSave Data?Save File As?Save JPEG framesSave as ...Save dataSave data to HDF5 fileSave data to a file (Ctrl+Shift+S).Save data to fileSave fileSave file before redrawingSave scriptSave script to a file (Ctrl+S)Save script to fileSave selected data to file.Save to fileSaving abortedScale and rotateScriptSearch backwardSelect allSelect and insert file name.Select and insert folder name.Select data argumentSelect directionSelect file nameSelect first the proper kind of argumentsSelect folder nameSelect kind of plotSelect variant of plot style(s)SetSet additional tick and axis labels shiftSet ambient light brightnessSet arbitrary position of plot in pictureSet argumentsSet aspect rationSet axis and tick styleSet axis originSet axis rangesSet bounding box for 2d exportSet brush for given mask idSet color rangeSet column id for dataSet cutting off/on for particular plotSet data sizes manuallySet default bars widthSet default filenameSet default transparencySet diffusive light brightnessSet draw region for quality&4Set drawing area as cell of matrix nx*ny.Set drawing area as cells of column.Set drawing area as cells of matrix nx*ny.Set drawing area as cells of stick.Set lighting off/on for particular plotSet number of lines in mesh/fall/vect and so onSet number of marks in the legendSet number of visible facesSet palette for 1D plotsSet perspectiveSet picture sizeSet plot qualitySet position of plot as cell of matrixSet position of plot block in matrixSet position of plot inside cell of columnSet position of plot inside cell of matrixSet position of plot inside cell of rotated stickSet position of plot inside cell of sheared stickSet range for x-axisSet range for y-axisSet range for z-axisSet scaling factor for further setsizeSet script argumentsSet size for text, marks and othersSet size of arrowsSet size of markersSet size of semi-transparent area around lineSet tick labels drawing at originSet tick lengthSet ticks for colorbarSet ticks for x-axisSet ticks for y-axisSet ticks for z-axisSet ticks in time formatSet ticks tuningSet to auto rotate text or notSet to use whole area (style '#')Set type transparencySet value of \phi angle.Set value of \phi angle. You can use keys (Shift+Meta+Left or Shift+Meta+Right).Set value of \theta angle.Set value of \theta angle. You can use keys (Shift+Meta+Up or Shift+Meta+Down).SettingsSetupSetup animationSetup colors for:Setup fontSetup lightSetup or draw axisSetup plot points cuttingSetup scriptSetup showSew data along direction(s)Sew phaseSharp colorsShear plotShift the picture downShift the picture leftShift the picture rightShift the picture upShort description of selected commandShort information about the data.Show at startupShow calculator which evaluate and help to type textual formulas. Textual formulas may contain data variables too.Show calculator windowShow dialog for UDAV properties.Show dialog for new command or edit arguments of existed one.Show dialog for new inplot and put it into the script.Show dialog for options and put it into the script. Options are used for additional setup the plot.Show dialog for plot setup and put code into the script. This dialog setup axis, labels, lighting and other general things.Show dialog for styles and put it into the script. Styles define the plot view (color scheme, marks, dashing and so on).Show dialog for text finding (Ctrl+F).Show help on MGL commands (F1).Show hidden plotsShow hint on startupShow hints of MGL usage.Show infoShow linesShow next frame in slideshowShow next slide (Ctrl+.).Show previous frame in slideshowShow previous slide (Ctrl+,).Sin FFTSin-Fourier transform along direction(s)Sin-Fourier transform at some directionSinus FFTSizeSize of columnSize of stickSizesSkip commands and iterate for-loop againSlideshowSmoothSmooth dataSmooth data along direction(s)Solve Hamiltonian ODE (find GO ray or trajectory)Solve ODESolve PDESolve PDE in accompanied coordinates for 2d caseSolve PDE in accompanied coordinates for 3d caseSolve PDE using advanced method (X-Y only)Solve tridiagonal matrixSort data by values in columnSpecialSpecify new data size Data will be interpolatedSpecify new data size Data will be zero filledSpecify the skipping step Each m-th point will be saved onlySqueezeSqueeze dataStartStart function definition and stop execution of main scriptStart next for-loop iterationStart/close commands which should executed only onceStarting cell indexStateStep for pulse diffractionStopStop drawingStop executionStop script execution (F7).String for $0String for $1String for $2String for $3String for $4String for $5String for $6String for $7String for $8String for $9String for %1String for %2String for %3String for %4String for %5String for %6String for %7String for %8String for %9StringsStyleSubTicksSubticksSubtract data or numberSubtract toSuffixesSum along direction(s)Summarize data along direction(s)Summation ofSwap data (useful after Fourier transform)Swap data along direction(s)Swap partsSwitch on/off fogSwitch on/off gray-scale modeSwitch on/off grid drawingSwitch on/off grid of absolute coordinates (Ctrl+G).Switch on/off lightning for the graphics (Alt+L).Switch on/off lightning for the graphics (Ctrl+L).Switch on/off lightning in the pictureSwitch on/off mouse handling of the graphics (rotation, shifting, zooming and perspective).Switch on/off mouse zoom of selected region.Switch on/off to use ternary axisSwitch on/off transparencySwitch on/off transparency for the graphics (Alt+T).Switch on/off transparency for the graphics (Ctrl+T).Switch on/off transparency in the pictureSymmetrical rangeSymmetrical?TEST: %s TemplateTemplate nameTemplate savedTernaryTextText alignText and legendText colorText on contoursText styleThe calculator can help you to put complex expression in the script. Just type the expression (which may depend on coordinates x,y,z and so on) and put it into the script.The current file has not been saved. Would you like to save it now?The special dialog (Edit|Insert|New Command) help you select the command, fill its arguments and put it into the script.There are duplicated or indistinguishably adjacent points for triangulation.There is changing temporary data in scriptThere is manual primitives.There is no 'fmt' argument for this commandThere is no fitted formula.There is no query. Exit. There is no selection to evaluate.There is powerful calculator with a lot of special functions. You can use buttons or keyboard to type the expression. Also you can use existed variables in the expression.There is too long string(s) in scriptThere is unbalanced ' in scriptThere is wrong argument(s) in scriptThere is wrong command(s) in scriptTheta angle (tilt z-axis)This operation is not supported for this kind of data.TicksTicks startTime ticksTitleTitle for plot. Can be used in SubPlot or MultiPlot only.ToTo scriptTransformTransform data along dimension(s) (Ctrl+Shift+T).TransparencyTransparency typeTransposeTranspose dataTranspose data arrayTranspose data dimensionsTranspose data with new dimensionsTrigonometricTune ticksType of operationType of smoothingU - indigoUDAV - Add optionsUDAV - Animation setupUDAV - Clear dataUDAV - Crop dataUDAV - Export to PNGUDAV - Fill dataUDAV - FindUDAV - Go to sliceUDAV - HintUDAV - Import PNGUDAV - Insert filenameUDAV - Insert pathUDAV - Insert style/schemeUDAV - Load dataUDAV - Make histogramUDAV - New variableUDAV - Normalize by sliceUDAV - Normalize dataUDAV - Open data fileUDAV - Open fileUDAV - PropertiesUDAV - Read from HDFUDAV - Rearrange dataUDAV - Resize dataUDAV - Save templateUDAV - Save to HDFUDAV - Save/export dataUDAV - Set script argumentsUDAV - Set template parametersUDAV - Setup inplotUDAV - Setup plotUDAV - Squeeze dataUDAV - aboutUDAV - animationUDAV - change dataUDAV - command optionsUDAV - delete all dataUDAV - find textUDAV - make new dataUDAV - open fileUDAV - save currentUDAV - save fileUnderlineUndoUndo editor change (Ctrl+Z).UntitledUntitled - mgllabUpdate list of data arraysUpper border for determining color or alphaUsage: mglconv [parameter(s)] scriptfile Usage: mgllab [parameter(s)] scriptfile Usage: mglview [parameter(s)] scriptfile Use 'a', 'd', 'w', 's', 'q', 'e' for changing view angles Use 'j', 'l', 'i', 'k' for changing light angles Use 'u', 'o' for changing distance to light Use 'r' for switching transparency Use 'f' for switching lightning Use 'E' for exporting to EPS file Use 'S' for exporting to SVG file Use 'J' for exporting to JPEG file Use 'P' for exporting to PNG file Use ',', '.' for show other frames Use 'm' for view movie Use 'h' for view this text Use 'x' for exit Use color schemeUse dots plot for previewUse multi-threading for drawingValueValue for i-th colorVariantVariant of command argument order. The notation is: * Capital arguments are data (like, Ydat); * Argument in '' are strings (like, 'fmt'); * Other arguments are numbers (like, zval); * Arguments in [] are optional arguments.Vector plotsVertical alignVertical sizeW - lightgrayWavelet transform at some directionWhole areaWidthWidth of selected cellsWidths are: Wa = %g Wx = %g Wy = %g Wz = %g Wire or meshWire or mesh plotWire styleWrite current image to graphical fileX axisX posX positionX-directionX-rangeX-sizeX-slice fromY - oliveY axisY posY positionY-directionY-rangeY-sizeY-slice fromYesYou can copy the current image to clipboard by pressing Ctrl-Shift-C. Later you can paste it directly into yours document or presentation.You can easily insert file or folder names, last fitted formula or numerical value of selection by using menu Edit|Insert.You can edit MGL file in any text editor. Also you can run it in console by help of commands: mglconv, mglview.You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing right mouse button inside image and selecting 'Export as ...'.You can put several plots in the same image by help of commands 'subplot' or 'inplot'.You can put several plotting commands in the same line or in separate function, for highlighting all of them simultaneously.You can rotate/shift/zoom whole plot by mouse. Just press 'Rotate' toolbutton, click image and hold a mouse button: left button for rotation, right button for zoom/perspective, middle button for shift.You can save the parameter of animation inside MGL script by using comment started from '##a ' or '##c ' for loops.You can setup colors for script highlighting in Property dialog. Just select menu item 'Settings/Properties'.You can shift axis range by pressing middle button and moving mouse. Also, you can zoom in/out axis range by using mouse wheel.You can type arbitrary expression as input argument for data or number. In last case (for numbers), the first value of data array is used.You can use command 'once on|off' for marking the block which should be executed only once. For example, this can be the block of large data reading/creating/handling. Press F9 (or menu item 'Graphics/Reload') to re-execute this block.You can use command 'stop' for terminating script parsing. It is useful if you don't want to execute a part of script.You need to enter text!You need to provide output nameYou need to restart UDAV for applying the changes.You need to select data arrayYou need to select marker!You need to specify direction(s)You should put text inside ' ' for argument You should select one of caseYou should specify all optional arguments before You should specify required argument Z axisZ posZ positionZ-directionZ-rangeZ-sizeZ-slice fromZoom axis rangeZoom by mouseZoom graphicsZoom inZoom in graphics.Zoom in selected region of the pictureZoom in textZoom in the pictureZoom outZoom out graphics.Zoom out textZoom out the pictureZoom plot regionZoom/moveaboveallalongalong xalong yalong zandarcarrowsat centerat maximumat minimumat positionattach lightaxis ranges are incompatibleb - bluebitmap EPSbothbottomc - cyancenterclick at %g, %g, %gcouldn't open filecurvecuttingdata dimension(s) is incompatibledata dimension(s) is too smalldata values are zerodefaultdimensionse - lawngreenellipsefactorformat is not supported for that buildframefromg - limeglass-likegrayscaleh - grayin line %ldincrementindk - blackl - springgreenlamp-likeleftlight: ID is out of rangelightinglinem - magentamanualmarkermarkersmaxmem. usagemgl_enmglconv convert mgl script to image file (default PNG). Current version is 2.%g mgllab draw mgl script interactively. Current version is 2.%g mgllab v. 2.%g (c) Alexey Balakin, 2017 http://mathgl.sf.net/mglview show plot from MGL script or MGLD file. Current version is 2.%g minminimal data value is negativen - skybluenameno file or wrong data dimensionsno legend entriesnonenone or defaultnot enough memorynot enough space for plotnot usednumber of contours is zero or negativeoffonor enter name for new variablep - deeppinkpen blurplainpointer is NULLpolygonprojectionq - orangequaternaryquaternary projr - redrectanglerhombrightrotate textsave slidessize(s) is zero or negativeslice value is out of rangesmoothedsolidsolid PNGstringssumternaryternary projtexttickstoto scripttopu - bluevioletunderunknownuntitled - UDAVuntitled* - UDAVuservaluesvector EPSw - whitewhole areawirewith stepy - yellowProject-Id-Version: MathGL2 2.4.0 Report-Msgid-Bugs-To: POT-Creation-Date: 2017-05-18 13:38+0300 PO-Revision-Date: 2017-04-19 01:17+0300 Last-Translator: Alexey Balakin Language-Team: Russian Language: ru MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2); -1 str установить аргумент $1 равным str ... ... -9 str установить аргумент $9 равным str -L loc изменить локаль на loc -h показать справку -1 str установить аргумент $1 равным str ... ... -9 str установить аргумент $9 равным str -L loc изменить локаль на loc -s fname дополнительный скрипт с настройками графика -S val масштабирование для рисунка -q val качество рисунка по умолчанию (val=0...9) -g val режим оттенков серого (val=0|1) -v val задать вариант аргументов -o name имя файла для сохранения рисунка -n нет вывода по умолчанию (скрипт должен сохранить рисунок сам) -A val добавить значение val в анимацию -C n1:n2:dn добавить диапазон [n1,n2] с шагом dn анимацию -C n1:n2 добавить диапазон [n1,n2] с шагом 1 анимацию - загрузить скрипт из стандартного ввода -h показать справку -1 str установить аргумент $1 равным str ... ... -9 str установить аргумент $9 равным str -g val режим оттенков серого (val=0|1) -v val задать вариант аргументов -s opt дополнительный скрипт с настройками графика -L loc изменить локаль на loc - загрузить скрипт из стандартного ввода -h показать справку (c) Алексей Балакин, 2007 http://mathgl.sourceforge.net/ Попытка изменить временные данные в строке %ld Строковый аргумент слишком длинный в строке %ld Лишняя кавычка ' в строке %ld Неправильные аргументы в строке %ld Неправильная команда в строке %ld - UDAV предпросмотр - UDAV переменная Удал.все Удалить Правка Инфо Новый СохранитьДа%d - %d из %d' ' нет'#*' знак Y'#+' плюс в квадрате'#.' точка в круге'#<' треуг.влево сплошной'#>' треуг.вправо сплошной'#^' треуг.вверх сплошной'#d' ромб сплошной'#o' круг'#s' квадрат сплошной'#v' треуг.вниз сплошной'#x' крест в квадрате'*' крест'*' звезда'+' плюс'-' линии'-' сплошная'.' точка':' точками';' пунктир'<' знак влево'<' треуг.влево'=' двойные линии'=' мелкий пунктир'>' знак вправо'>' треуг.вправо'A' стрелка'D' ромб'D' ромб сплошной'I' стоп'K' размер'O' круг'O' круг'S' квадрат сплошной'S' квадрат'T' треугольник'V' обр.стрелка'X' крест'^' шляпы'^' треуг.вверх'_' нет'd' ромб'i' точка-пунктир'j' точка-штрих'o' окружность's' квадрат'v' треуг.вниз'x' косой крест'|' штрихи'~' волны0 - специальные графики1 - прочие графики10 - двойный графики11 - векторные графики12 - оси координат13 - примитивы14 - настройка осей15 - текст/легенда16 - преобразования данных1D график1D графики1D вид2 - настройки2D график2D графики2D вид3 - изменение данных3D данные с размерами из файла3D графики3D вид4 - создание данных5 - картинка в картинке6 - команды управления7 - 1D графики8 - 2D графики9 - 3D графики
(c) Алексей Балакин, 2007-наст.вр.

Лицензия GPL v.2 или более поздняя.@<- Пред.О программеО версии QtДобавить дугуДобавить дугу. Ее свойства можно изменить позже мышью.Добавить опции командыДобавить кривуюДобавить кривую. Ее свойства можно изменить позже мышью.Прибавить массив или числоДобавить эллипсДобавить эллипс. Его свойства можно изменить позже мышью.Добавить под-графикДобавить запись легендыДобавить запись легенды для графикаДобавить линиюДобавить линию. Ее свойства можно изменить позже мышью.Добавить маркерДобавить маркер. Его свойства можно изменить позже мышью.Добавить полигонДобавить полигон. Его свойства можно изменить позже мышью.Добавить примитивыДобавить прямоугольникДобавить прямоугольник. Его свойства можно изменить позже мышью.Добавить ромбДобавить ромб. Его свойства можно изменить позже мышью.Добавить текстДобавить текст. Его свойства можно изменить позже мышью.Добавить заголовок к текущему под-графикуДобавить кДобавить пользовательский символПодогнать размер картинки под область окнаПодогнать размерПодобрать метки осей для лучшего видаЭйри и ГаммаВсе индексы (данных, под-графиков и пр.) всегда начинаются с 0.Значение прозрачности для поверхностей и облаковФон.светУгол относительно оси x (в градусах)Угол относительно оси z (в градусах)АнимацияДругойПрименить к данным оператор (сглаживание, интегрирование, дифференцирование и пр.)Примерное число линий сетки на графикеВы уверены, что хотите удалит ВСЕ данные?АргументАргументыСтрелка кон.Стрелка нач.Запрос на остановку рисования (F7)Соотношение сторонСоотношение сторон по x и zСоотношение сторон по y и zСтороны x/zПривязать настройки света к под-графикуАвтоматически определят размер данныхАвтоматически определят размер данных (%1 x %2 x %3)Выполнить скрипт после загрузкиСохранять скрипт перед рисованием (F5)Средние: = %g = %g = %g = %g Ось вращенияОсь вращ.ОсиОси и цв.шкалаНастройка осейB - темно-синийНазадНеправильный '%ls' при %zu Неправильные аргументы для %ls: %ld вместо %d Баз.ШиринаБазовыеНачалоБессельЖирный шрифтОба поля в crange должны быть заполненыОба поля в xrange должны быть заполненыОба поля в yrange должны быть заполненыОба поля в zrange должны быть заполненыПрервать выполнение цикла forЯркостьЯркость i-го цветаПо формулеC - бирюзовыйЦв. осьЦв.диапазонВычисленияКалькуляторОтменаНе могу построить триангуляцию!ГрафикИндекс ячейкиИзменитьИзменить размер данныхПодогнать размер рисунка под размер окна (F6).Сменить директориюИзменить данныеИзменить размер данныхИзменить данные и закрыть окноИзменить шрифтИзменяет углы обзора, а не поворот как 'rotate'ОчиститьУдалить всеУдалить записи легендыОчистить рисунокЗакрытьЗакрыть вкладкуЗакрыть вкладку с даннымиЦветПорядок цветовЦветовая схемаЦвет(а) или цветовая схемаЦветаЦветом выделены значения: фуксия - лок.максимум, голубой - лок.минимум, красный - Re(v)>0, синий - Re(v)<0, пурпурный - Im(v)>0, бирюзовый - Im(v)<0.КомандаАргументы команды. Жирным обозначены обязательные аргументы. Прочие - опциональные, но их порядок фиксирован. Можно использовать '' для стиля по умолчанию. См. справку справа для значений по умолчанию.Опции командыКомментарийВычисляет точки фрактала IFSВычисляет точки фрактала IFS в 3d случаеВычисляет точки фрактала IFS с параметрами из файлаВычисляет точки фрактала flameУсловный операторКопировать коор. мышиКопировать координаты последнего нажатия в буфер обменаКопировать данныеКопировать данные из другой переменнойКопировать рисунокКопировать рисунок в буфер обмена (Ctrl+Shift+G).Копировать рисунок в буфер обменаКопировать рисунокКопировать диапазон чисел в буфер обмена (Ctrl+Shift+C).Копировать выделенный текст или данные в буфер обмена (Ctrl+C).Копировать выделение в буфер обменаКопировать текстКосинус-ФурьеКосинус-Фурье преобразование вдоль направления(й)Косинус-Фурье преобразование вдоль направленияКосинус-ФурьеНе могу записать в %1Не могу записать в файлНе могу сменить папку Не могу открыть файл Не могу открыть файл %sСоздание данных и I/OСоздание данных и ввод-выводСоздать гистограмму (распределение) значений данныхСоздать новыйСоздать новые 1d данные и заполнить их в диапазонеСоздать новый массив данныхСоздать новый массив данныхСоздать новый массив данных, заполненный нулямиСоздать новое окно скрипта (Ctrl+N).Создать новый массив из списка значений или данныхОбрезатьОбрезать края массива данныхОбрезать данныеОбрезать края массива данныхОбрезать края массива данных. Полезно для удаления краев заполненных нулями.Накопительное суммирование данных по направлениюТек.строкаТекущий шрифтВырезать выбранный текст в буфер обмена (Ctrl+X).Вырезать текстОбрезаниеDAT файлы *.{dat,csv} HDF файлы *.{h5,hdf}ПунктирШтриховкаДанныеDAT файлы (*.dat) HDF5 файлы (*.h5 *.hdf) PNG файлы (*.png) Все файлы (*.*)Изменение данныхИнформация и просмотр данных.Имя данныхПросмотр данныхПросмотр текущего среза данных.Преобразование данныхУменьшить угол φ на 10 градусов.Уменьшить угол θ на 10 градусов.Уменьшить размер шрифтаОпределит постоянную или параметрОпределить параметр как символОпределить параметр как значение выраженияОпределить параметр по вводу пользователяЗадержка, мсЗадержка, сУдалить @b все@. массивы данных.Удалить ВСЕ массивы данныхУдалить данные или их срезУдалить выбранноеУдалить выбранные данныеУдалить выбранные данные.Удалить выбранный графикОписаниеНайти кривые по максимумам массива данныхДифференцироватьДифференцировать данные по направлению(ям)Расс.светРасширить данные большие valПрямое произведение массивовНаправлениеНаправление по которому данные будут заполнятьсяРасстояние между ячейкамиРазделить наРазделить данные поэлементно на массив или числоOKВыполнить преобразование STFAВыполнить интегральное преобразование данныхЗакрыть это окно ничего не выполняяВы хотите удалить все данные?Вы хотите сохранить изменения в документе?Не сохранятьВторая производнаяНарисовать бифуркационную диаграммуНарисовать график IrisНарисовать диаграмму ЛамереяНарисовать диаграмму OHLC (Open-High-Low-Close)Нарисовать диаграмму ПуанкареНарисовать диаграмму STFAНарисовать ТеХ символы в положении точекНарисовать дугуЗакрасить область между кривой и осьюНарисовать график из вертикальных полосНарисовать поверхность ленточкамиНарисовать нормаль и бинормаль для кривойНарисовать растр (логотип) в области осей координатНарисовать ограничивающий параллелепипедНарисовать поверхность ящикамиНарисовать box-and-whisker диаграммуНарисовать свечной графикНарисовать линейчатую (круговую) диаграммуНарисовать окружность (круг)Нарисовать облако для 3D данныхНарисовать цветовую шкалуНарисовать конусНарисовать конусы для 1D данныхНарисовать линии уровняНарисовать линии уровня на x-срезеНарисовать линии уровня на y-срезеНарисовать линии уровня на z-срезеНарисовать линии уровня на срезах 3D данныхНарисовать линии уровня для поверхности из треугольниковНарисовать линии уровня на параметрической поверхностиНарисовать цилиндры по линиям уровнейНарисовать цилиндры по линиям уровней для поверхности из треугольниковНарисовать кривуюНарисовать трубу около кривойНарисовать график плотностиНарисовать график плотности на срезе 3D данныхНарисовать график плотности на x-срезеНарисовать график плотности на y-срезеНарисовать график плотности на z-срезеНарисовать векторное поле каплямиНарисовать набор точекНарисовать каплюНарисовать эллипсНарисовать размер ошибкиНарисовать размеры ошибок для 1D данныхНарисовать грань (четырехугольник)Нарисовать грань поперек оси xНарисовать грань поперек оси yНарисовать грань поперек оси zЗакрасить область между двумя кривымиНарисовать трубки тока для векторного поляНарисовать линии тока для векторного поляНарисовать линии градиента для скалярного поляНарисовать сетку осей координатНарисовать сетку на срезе 3D данныхНарисовать сетку для массиваНарисовать график из горизонтальных полосНарисовать поверхность горизонтальными плиткамиНарисовать поверхность плитками переменного размераНарисовать поверхность постоянного уровняНарисовать поверхность уровня с заданными цветом и прозрачностьюНарисовать поверхность уровня с заданным цветомНарисовать поверхность уровня с заданной прозрачностьюВывести надписи для 1D данныхВывести подпись оси tВывести подпись оси xВывести подпись оси yВывести подпись оси zНарисовать легенду графикаНарисовать прямую линиюНарисовать отображение матрицыНарисовать маркеры переменного размераНарисовать сетчатую поверхностьНарисовать точкуНарисовать полигонНарисовать квазиоптический пучокНарисовать круговой графикНарисовать поверхность по произвольным точкамНарисовать прямоугольникНарисовать ромбЗакрасить линии уровня на x-срезеЗакрасить линии уровня на y-срезеЗакрасить линии уровня на z-срезеЗакрасить линии уровня на 3D данныхЗакрасить линии уровняЗакрасить линии уровня заданными цветамиНарисовать поверхностьНарисовать поверхность с заданными цветом и прозрачностьюНарисовать поверхность с заданным цветомНарисовать поверхность с заданной прозрачностьюНарисовать сферуНарисовать линии от 1D данных до осиНарисовать ступенькиНарисовать поверхность вращенияНарисовать поверхность из четырехугольниковНарисовать поверхность из треугольниковНарисовать поверхность вращения линий уровняНарисовать таблицу значений данныхНарисовать кривую с заданным цветомВывести текст в точке или вдоль кривойНарисовать символ в заданных точке и направленииНарисовать кривую для 1D данныхНарисовать векторное полеНарисовать векторное поле на срезах 3D данныхНарисовать вектора вдоль кривойНарисовать поверхность набором линий (водопад)Время рисования %1 мсДвойные графикиE - темно-салатовыйКраяПравкаРедактировать выбранный массив данныхЭллиптическиеРазрешить дополнение командКолесо мыши приближает графикКонецАнглийскийВведите цветовую схемуВведите имя данныхВведите формулу для изменения данных x, y, z в диапазоне [0,1], u - сами данныеВведите имя для нового массиваВведите имя данныхВведите новый размер данныхВведите число для добавленияВведите число для делителяВведите число для умноженияВведите число для вычитанияВведите число вершинВведите диапазон и направление заполненияВведите диапазон для выходных данныхВведите диапазон сохраненных данныхВведите номер среза:Введите шаг сохранения. Например, '1' - все точки, '2' - каждая вторая, и т.д.Введите текстВведите значение аргумента %sОгибающаяСузить данные большие valОшибка чтения файла '%s': %s.Ошибка вызова внешнего просмотра Ошибка записи в файл '%s': %s.Интерполирует значения в точках i=idat,j=jdat,k=kdatВыполнить если условие ложноВыполнить скрипт после загрузкиВыполнить скрипт и обновить рисунок (F5).Выполнить скрипт из внешнего файлаМассивы данныхВыходExp и logExp-интегралыЭкспорт данных?Экспорт как ...Экспорт как 2D ...Экспорт как 3D ...Экспорт данных в PNG файлЭкспорт в GIFЭкспорт в PNGРасширить массив данныхВыделить данныеВыделить под-массивВыделить под-массив в диапазоне между значениямиФакторФайлФайл %1 сохранен.Файл существует. Переписать?Имя файлаПуть к файлуЭкспорт в файлФайл/Последние файлыЗаполнитьЗаполнить по формулеЗаполнить данные по глобальному сплайну VdatЗаполнить данные интерполяцией VdatЗаполнить данные триангуляциейЗаполнить данные линейно в диапазоне [v1, v2]Заполнить в диапазонеЗаполнить как x-,k-координаты для трансформацииНайтиНайти корреляцию между даннымиНайти огибающую данныхНайти огибающую в направленииНайти гистограмму данныхНайти максимум по направлениюНайти минимум по направлениюНайти следующееНайти или заменитьНайти корень Dat[i,j,k]=val (обратно evaluate)Найти корни используя данные как начальные условияНайти сумму по направлениюТриангулировать произвольно расположенные точкиНайти что:Найти/ЗаменитьНайти|ЗаменитьОкончание блока if/elseПервая ячейкаПервый срезПодогнать данные по формулеПодобранная формулаТуманглубинаПапка для файлов справкиПуть к папкеШрифтИмя файла шрифтаФайлы шрифтов (*.vfm)ШрифтРазмерШрифтРазмерЦикл forВпередКадр %1 из %2отФункцияG - зеленыйGIF поддержка отключена. Включите ее и пересоберите MathGL.Общие настройкиВычислить якобианЗагрузить форматированные данные из файлаВычислить момент по направлениюНайти параметры импульсаНайти след матрицыОбщее сообщение - %s Перейти к первому срезу 3D данных (Ctrl-F1)Перейти к последнему срезу 3D данных (Ctrl-F1)Перейти к срезуПерейти к следующему срезу 3D данныхПерейти к предыдущему срезу 3D данныхПерейти к указанному срезу 3D данныхГрафикаНастройка графикаГрафика/Подогнать размерГрафика/ПрозрачностьГрафика/Анимация/СледующийГрафика/Анимация/ПредыдущийГрафика/Анимация/НастройкаГрафика/Анимация/ЗапуститьГрафика/Копировать коор.Графика/Копировать рисунокГрафика/Экспорт/как BMPГрафика/Экспорт/как GIFГрафика/Экспорт/как JPEGГрафика/Экспорт/как OBJГрафика/Экспорт/как OFFГрафика/Экспорт/как PNGГрафика/Экспорт/как PRCГрафика/Экспорт/как STLГрафика/Экспорт/как SVGГрафика/Экспорт/как TeXГрафика/Экспорт/как XYZГрафика/Экспорт/как растровый EPSГрафика/Экспорт/как PNG с заливкойГрафика/Экспорт/как EPSГрафика/СеткаГрафика/ОсвещениеГрафика/Пауза расчетаГрафика/ПримитивыГрафика/ПерерисоватьГрафика/ПерезагрузитьГрафика/ВосстановитьГрафика/СтопГрафика/Сдвиг/ВнизГрафика/Сдвиг/ВлевоГрафика/Сдвиг/ВправоГрафика/Сдвиг/ВверхГрафика/Сдвиг/ПриблизитьГрафика/Сдвиг/ОтдалитьСеткаГруппы команд MGLH - темно-серыйHDF4 поддержка отключена. Включите ее и пересоберите MathGL.HDF5 поддержка отключена. Включите ее и пересоберите MathGL.ХанкельПреобразование Ханкеля по направлению(ям)Преобразование Ханкеля по направлениюВысота выбранных ячеекСправкаЗдесь можно задать опции команды, которые используются для доп.настройки графика.Скрытые графикиСкрыть выделенноеСкрыть выделенные графикиВыделить текущие графикиПодсказкиГистограмма (Ctrl+Shift+H)Горизонтальный размерГиперболическиеСписок иконокНомер среза в z-направленииРазмер рисункаНапечатать это сообщение сразу жеИмпортировать данные?Импортировать данные из PNG файлаИмпортировать из PNGВ диапазонеФурье преобразование по местуНеверные параметры цикла!Неверный тип данныхУвеличить угол φ на 10 градусовУвеличить угол θ на 10 градусовУвеличить размер шрифтаИнфоИнформацияПод-графикВставитьВставить команду MGLВставить как 'list'Вставить содержимое файла?Вставить имя файла?Вставить имя файлаВставить под-графикВставить последнюю подогнанную формулу с найденными коэффициентамиВставить срез данныхВставить в скрипт как команду 'list'ИнтегрироватьИнтегрировать данные по направлениюИнтенсивность рассеянного светаКурсивJPEG поддержка отключена. Включите ее и пересоберите MathGL.ЯкобиОбъединить массивы данныхОставьте пустым для добавления в начало скрипта.Сохранить каждый n-ый элемент массива данныхХранить кадры в памяти (быстрее анимация, но требуется больше памяти)Ключевые словаТипВариант аргументов команды. Обозначения: * Заглавные -- данные (например, Ydat); * В кавычках '' -- строки (например, 'fmt'); * Прочие -- числа (например, zval); * В скобках [] -- опциональные аргументы.Тип графика: кривые для 1D, график плотности для 2D.L - морской волныНадписьЯзык для UDAVЯзык для mgllabПреобразование ЛапласаЛапласианПоследний срезЛевый нижний уголЛевый верхний уголЛегендаСветПоложение источника света должно быть заполнено.Настройки освещенияОграничить данные диапазоном [-v,v]Стиль линииТолщина линииЛинейно *3Линейно *5Список доступных данных.Загрузить данные?Загрузить команды из внешней DLLЗагрузить данныеЗагрузить данные из файлаЗагрузить данные. Данные будут удалены только при выходе из программы без запроса на сохранение (Ctrl+Shift+O).Загрузить шрифтЗагрузить из файлаЗагрузить фоновое изображениеЗагрузить скрипт в новое окноЗагруженные документы Загруженные документы %1Загрузка отмененаНижняя граница для цвета или прозрачностиM - пурпурныйMGL парсерКоманда MGL для выбранной группыMGL файлы *.mglMGL файлы *.mgl DAT файлы *.{dat,csv}MGL файлы (*.mgl)Справка MGLСообщение MGLПримеры и подсказкиMGL файлы (*.mgl) HDF5 файлы (*.hdf *.h5) Все файлы (*.*)MGL файлы (*.mgl) HDF5 файлы (*.hdf *.h5) Text файлы (*.txt) Data файлы (*.dat) Все файлы (*.*)Создание новых данныхСоздать новый (Ctrl+Shift+M)Штриховка вручнуюМаска вручнуюПримитивы вручнуюМаркерМаркерыМаскаМаска для растровой закраскиУгол поворота маскиРазмер маскиУчитывать регистрMathGL - о программеСообщение MathGL - %s Матрица с размерами из файлаМаксимум вдоль направленияМаксимумМаксимальное значение (v2)Максимальное значение для получившихся данныхМаксимум X для обрезания или координатМаксимум Y для обрезания или координатМаксимум Z для обрезания или координатМаксимум %g при x = %ld y = %ld z = %ld Максимум отПамятьЧисло линийЧисло линийСообщенияСообщенияМинимум по направленияМинимумМинимальное значение (v1)Минимальное значение для получившихся данныхМинимум X для обрезания или координатМинимум Y для обрезания или координатМинимум Z для обрезания или координатМинимум %g при x = %ld y = %ld z = %ld Минимум отОтразитьОтразить данные по направлениюОтразить данные по направлениюИзменить данные по формулеМомент вдоль 'x' для функцииМомент вдоль 'y' для функцииМомент вдоль 'z' для функцииСдвиг внизСдвинуть графику влево на 1/3 шириныСдвинуть графику вправо на 1/3 шириныСдвинуть графику вверх на 1/3 высотыСдвинуть графику вниз на 1/3 высотыСдвиг влевоПеренести заданные вручную примитивы в скрипт.Сдвинуть график внизСдвинуть график вверхСдвиг вправоПереместить выбранное в следующий под-график.Переместить выбранное в предыдущий под-график.Сдвиг вверхУмножить наУмножить на массив данных или числоN - грозовойВсе поля должны быть заполнены!ИмяИмя для результатаНавигацияНовая командаНовый под-графикНовый порядок размерностейНовый скриптНовый размер данных по xНовый размер данных по yНовый размер данных по zСледующийСледующий @->Следующий срезСледующий кадрНетДействие не выбрано.Аргумент не выбранНе введено направление/формулаОтсутствует имя файла.Вхождения '%s' не найдены!Ничего не выбрано.Вхождения не найденыНе вращать текстОбычный видНормироватьНормировать данныеНормировать данные по срезамНормировать симметрично: -max(|v1|,|v2|) ... max(|v1|,|v2|)Не распознаноЧисло точекЧислаЧисленный параметрЧисленное значениеЧисленно дифференцировать данныеЧисленно дифференцировать данные дваждыТолько текущий срез будет вставленОткрыть файл?Загрузить все данные из HDF файлаОткрыть и выполнить скрипт или данные (Ctrl+O). Вы можете отключить автоматическое выполнение в настройках.Открыть диалог создания новых данных.Открыть файлОткрыть файл ...Открыть диалог и напечатать график (CTRl+P)Загрузить скрипт или файл данныхОткрыть таблицу с выбранным массивом данных.ОперацияОперация не поддерживается для данного типа данных.ОперацииОпцииНачалоДругие графикиДругиеНадчеркнутыйСобственная яркость поверхностиP - багровыйPDF поддержка отключена. Включите ее и пересоберите MathGL.PNG файлы *.pngPNG поддержка отключена. Включите ее и пересоберите MathGL.ПалитраПо параболе *5Вставить данныеВставить диапазон значений из буфера обмена (Ctrl+Shift+P).Вставить текстВставить текст из буфера обменаВставить текст из буфера обмена (Ctrl+V).Путь к шрифтам MathGL (без расширения)Путь к файлам справкиПуть к шрифтам MathGLПауза вычисленийПауза вкл/выкл для внешних вычисленийВыполнить шаг Рунге-КуттаУгол Phi (вращать в плоскости x*y)Поместить редактор сверхуID графикаПостроить кривую по формулеНарисовать данныеНарисовать данные в новом окне. Вы можете выбрать тип графика, его стиль и т.д.Настройки графикаСтиль графикаПостроить поверхность по формулеПопулярные цв.схемыПредыдущийПредыдущий срезПредыдущий кадрПросмотрПредыдущее выражениеПримитивыПримитивы ...Вывести версию MathGL или проверить, что она подходитВывести содержимое массива данныхВывести подобранную формулуНапечатать графикВывести список имен переменных в HDF файлеВывести сообщение или информацию о данныхНапечатать графикНапечатать скриптВывести строку в файлПечать отмененаПечать законченаПечатаю ...Команды управленияСвойстваСвойства выбранного массива данныхСвойства импульсаПоместитьПоместить в переменнуюПоместить в этот массив данныхВ скриптПоместить число или массив в заданный элемент данныхQ - коричневыйВыходR - темно-красныйРастеризовать график и установить вместо фонаЗагрузить и объединить данные из нескольких файловЗагрузить данные из файлаЗагрузить данные из файла с размерами из первой строкиЗагрузить данные с именем 'id' из HDF файлаГотовУпорядочить размерности массива данныхПоследние файлыПересоздать данные с новым размером и заполнить нулями (Ctrl+Shift+N).ОтменитьОтменить правку в редакторе (Ctrl+Shift+Z).ПерерисоватьПерерисовать для $0 равногоПерерисовать графикОбновитьОбновить рисунокПоложение i-го цветаПерезагрузитьПерезагрузитьПерезагрузить данные и обновить рисунокУдалить одинаковые строкиУбрать скачки данных, например скачки фазыЗаменитьЗаменить всеЗаменить на:Заменить выражение на его числовое значение.Заменено %ld вхождений.Обязательный аргумент %s не задан!Оставить местоПустое полеОставить место для подписей снизу (стиль '_')Оставить место для подписей слева (стиль '<')Оставить место для подписей справа (стиль '>')Оставить место для подписей сверху (стиль '^')Сбросить настройки и обновить рисунокИзменить размерИзменить размер (интерполоировать) данных (Ctrl+Shift+R).Изменить размер массива данныхИзменить размер массива данных со сглаживаниемВосстановитьВосстановить вращение, приближение и перспективу графикаВосстановить вращение, приближение и перспективу графика (Alt+Space).Восстановить вращение, приближение и перспективу графика (Ctrl+Space).Восстановить статус команды 'once' и перезагрузить данные (F9)ИтогРезультат (будет иметь размеры Итоговая строкаВозврат из функцииПравый нижний уголПравый верхний уголСдвинутьСдвинуть данные по направлениюВращатьВращать мышкойВращать внизВращать влевоПоворотВращать рисунок при удержании кнопок мышиВращать графикВращать вправоВращать вверхВращениеЗапустить анимацию (CTRl+F5).Запустить анимацию (CTRl+F5). Если ее параметры не заданы, то будет показан диалог настройки.Запустить/остановить анимациюРусскийНасыщенностьСохранитьСохранить данные?Сохранить файл?Сохранить кадры в JPEGСохранить как ...Сохранить данныеСохранить данные в HDF5 файлСохранить данные в файл (Ctrl+Shift+S).Сохранить данные в файлСохранить файлСохранить файл перед рисованиемСохранить скриптСохранить скрипт в файл (Ctrl+S)Сохранить скрипт в файлСохранить выбранные данные в файл.Сохранить в файлСохранение прерваноМасштаб и вращениеСкриптИскать назадВыделить всеВыбрать и вставить имя файла.Выбрать и вставить путь к папке.Выбрать данныеВыбрать направлениеВыбрать имя файлаСначала выберите вариант аргументовВыбрать путь к папкеВыбрать тип графикаВыбрать вариант стиля графикаЗадатьЗадает дополнительный сдвиш меток осейЗадает яркость фонового освещенияЗадать произвольную область рисования внутри рисункаЗадать аргументыЗадать соотношение сторонЗадать стиль осей и метокЗадать начало координатЗадать диапазон осейЗадать границы для 2d экспортаЗадать кисть для маски с выбранным idЗадать диапазон цветаЗадать id колонок данныхВкл/выкл обрезание для конкретного графикаЗадать размеры данных вручнуюЗадать размер полос по умолчаниюЗадать имя файла по умолчаниюЗадать прозрачность по умолчаниюЗадать яркость рассеянного светаЗадать область рисования при quality&4Задать область рисования как ячейку матрицы nx*ny.Задать область рисования как ячейку колонки.Задать область рисования как ячейки матрицы nx*ny.Задать область рисования как ячейку бруска.Вкл/выкл освещение отдельного графикаЗадать примерное число линий в mesh/fall/vect ...Задать число маркеров в легендеЗадать число видимых гранейЗадать палитру для 1D графиковЗадать перспективуЗадать размер рисункаЗадать качество рисования картинкиЗадать область рисования как ячейку матрицыЗадать область рисования как блок в матрицеЗадать область рисования как ячейку колонкиЗадать область рисования внутри ячейки колонкиЗадать область рисования как ячейку повернутого брускаЗадать область рисования как ячейку наклоненной колонкиЗадать диапазон по xЗадать диапазон по yЗадать диапазон по zЗадать множитель для всех 'setsize'Задать аргументы скриптаЗадать размер текста, маркеров и пр.Задать размер стрелокЗадать размер маркеровЗадать размер полупрозрачной области около линииРазрешить вывод меток осей в начале координатЗадать длину меток осейЗадать метки для цветовой шкалыЗадать метки для оси xЗадать метки для оси yЗадать метки для оси zЗадать метки в формате времениВключить оптимизацию меток осейРазрешить поворот текстаЗадать использование всей области (стиль '#')Задать тип прозрачностиЗадать значени угла φЗадать значени угла φ. Вы можете использовать клавиши (Shift+Meta+Left или Shift+Meta+Right).Задать значени угла θЗадать значени угла θ. Вы можете использовать клавиши (Shift+Meta+Up или Shift+Meta+Down).НастройкиНастройкиНастроить анимациюНастроить цвета:Настроить шрифтНастроить освещениеНастроить или нарисовать осиНастроить обрезание точек графикаНастроить скриптНастроить анимациюСшить данные по направлениюСшить фазуКонтрастныеНаклон графикаСдвинуть рисунок внизСдвинуть рисунок слевоСдвинуть рисунок вправоСдвинуть рисунок вверхКраткое описание выбранной командыКраткая информация о данныхПоказать при запускеПоказать калькулятор, который вычисляет текстовые формулы, которые могут содержать и переменные из скрипта.Показать окно калькулятораПоказать диалог настроек UDAVПоказать диалог ввода новой команды или редактирования существующейПоказать диалог создания под-графика и вставки его в скриптПоказать диалог ввода опций и вставки их в скрипт. Опции используются для дополнительной настройки графика.Показать диалог настройки рисунка: осей, подписей, освещения и пр.Показать диалог стиля графика и вставить его в скрипт. Стиль задает цветовую схему, маркеры, штриховку и пр.Показать диалог поиска текста (Ctrl+F).Показать справку по командам MGL (F1).Показать скрытые графикиПоказать подсказки при стартеПоказать подсказки по использованию MGL.Показать информациюПоказать строкиПоказать следующий кадрПоказать следующий кадр (Ctrl+.).Показать предыдущий кадрПоказать предыдущий кадр (Ctrl+,).Синус-ФурьеСинус-Фурье преобразование вдоль направленияСинус-Фурье преобразование вдоль направленияСинус-ФурьеРазмерРазмер колонкиРазмер брускаРазмерыПропустить команды до конца цикла forАнимацияСгладитьСгладить массив данныхСгладить массив данных по направлениюРешить гамильтонову ОДУ (найти ГО луч/траекторию)Решить систему обыкновенных диф. уравненийРешить уравнение в частных производныхРешить PDE в сопровождающей системе координат (2d)Решить PDE в сопровождающей системе координат (3d)Решить PDE (сложные уравнения, 2d случай)Решить трехдиагональную системуСортировать данные по значениям в колонкеСпециальныеУкажите новый размер данных. Данные будут интерполированы.Укажите новый размер данных. Данные будут обнулены.Укажите шаг пропуска. Только каждая m-ая точка будет сохранена.СжатьСжать данныеСтартНачало определения функции и остановка выполнения основного скриптаНачать новую итерацию цикла forНачало/конец блока команд, которые будут выполняться единождыИндекс начальной ячейкиСостояниеШаг для расчета дифракции импульсаСтопОстановить рисованиеОстановить выполнение скриптаОстановить выполнение скрипта (F7)Строка для $0Строка для $1Строка для $2Строка для $3Строка для $4Строка для $5Строка для $6Строка для $7Строка для $8Строка для $9Строка для %1Строка для %2Строка для %3Строка для %4Строка для %5Строка для %6Строка для %7Строка для %8Строка для %9СтрокиСтильПодметкиПодметкиВычесть данные или числоВычестьСуффиксыСуммировать вдоль направленияСуммировать вдоль направленияСумма отПоменять местами левую и правую части данныхПоменять местами данные по направлениюПоменять местамиВкл/выкл туманВкл/выкл режим оттенков серогоВкл/выкл рисование сеткиВкл/выкл сетку абсолютных координат (Ctrl+G).Вкл/выкл освещение графика (Alt+L).Вкл/выкл освещение графика (Ctrl+L).Вкл/выкл освещение графикаВкл/выкл изменение графика мышью (вращение, сдвиг, приближение и перспективу).Вкл/выкл приближение мышью выбранной области.Указать тип тернарных координат или проекцийВкл/выкл прозрачностьВкл/выкл прозрачность рисунка (Alt+T).Вкл/выкл прозрачность рисунка (Ctrl+T).Вкл/выкл прозрачность рисункаСимметричный диапазонСимметрично?ТЕСТ: %s ШаблонИмя шаблонаШаблон сохраненТернарныйТекстВыравниваниеТекст и легендаЦвет текстаТекст на кривыхСтиль текстаКалькулятор поможет вставить в скрипт сложное выражение. Просто наберите в калькуляторе выражение (которое может зависеть от координат x,y,z и др.) и вставьте его в скрипт.Текущий документ не сохранен. Сохранить сейчас?Специальный диалог (Правка|Вставить|Новая команда) поможет Вам выбрать команду, заполнить ее аргументы и вставить в скрипт.Повторяющиеся или близкие точки при триангуляцииПопытка изменить временные данные в скриптеЕсть примитивы, заданные вручнуюОтсутствует 'fmt' аргумент для этой командыНет подобранной формулы.Нет запроса. Выхожу. Ничего не выделено для вычисления.Есть мощный калькулятор с большим числом специальных функций. Выражения можно набирать кнопками или с клавиатуры. Также можно использовать переменные из скрипта.Слишком длинная строка в скриптеЛишняя кавычка ' в скриптеНеправильные аргументы команды в скриптеВ скрипте неправильная команд(ы)Угол Theta (наклон оси z)Операция не поддерживается для этого типа данных.МеткиНачать сМетки времениЗаголовокЗаголовок для графика. Следует использовать в SubPlot или MultiPlotдоВ скриптТрансформацияТрансформация данных по направлению (Ctrl+Shift+T).ПрозрачностьТип прозрачностиТранспонироватьТранспонировать данныеТранспонировать данныеТранспонировать данныеТранспонировать данныеТригонометрияНастроить меткиТип операцииТип сглаживанияU - темно-фиолетовыйUDAV - добавить опцииUDAV - настройка анимацииUDAV - очистить данныеUDAV - обрезать данныеUDAV - экспорт в PNGUDAV - заполнить данныеUDAV - найтиUDAV - перейти к срезуUDAV - подсказкиUDAV - импорт PNGUDAV - вставить имя файлаUDAV - вставить путьUDAV - вставить стильUDAV - загрузить данныеUDAV - создать гистограммуUDAV - новая переменнаяUDAV - нормировать по срезамUDAV - нормировать данныеUDAV - открыть файл данныхUDAV - открыть файлUDAV - свойстваUDAV - загрузить из HDFUDAV - упорядочить размеры данныхUDAV - изменить размер данныхUDAV - сохранить шаблонUDAV - сохранить в HDFUDAV - сохранить/экспортировать данныеUDAV - задать аргументыUDAV - задать шаблон параметровUDAV - настройки под-графикаUDAV - настройки графикаUDAV - сжать данныеUDAV - о программеUDAV - анимацияUDAV - изменить данныеUDAV - опции командыUDAV - удалить все данныеUDAV - найти текстUDAV - создать новый массив данныхUDAV - открыть файлUDAV - сохранить текущийUDAV - сохранить файлПодчеркиваниеОтменаОтменить изменения в редакторе (Ctrl+Z).без именибез имени - mgllabОбновить список массивов данныхВерхняя граница для цвета или прозрачностиИспользование: mglconv [параметр(ы)] имя_скрипта Использование: mgllab [параметр(ы)] имя_скрипта Использование: mglview [параметр(ы)] имя_скрипта * 'a', 'd', 'w', 's', 'q', 'e' для изменения углов просмотра * 'j', 'l', 'i', 'k' для изменения углов освещения * 'u', 'o' для изменения расстояния до источника света * 'r' для переключения прозрачности * 'f' для переключения освещения * 'E' для экспорта в EPS * 'S' для экспорта в SVG * 'J' для экспорта в JPEG * 'P' для экспорта в PNG * ',', '.' для показа других кадров * 'm' для запуска анимации * 'h' для этого Сообщения * 'x' для выхода Использовать цветовую схемуИспользовать точки для просмотраРисование в отдельном потокеЗначениеЗначение для i-го цветаВариантВариант порядка аргументов команды. Обозначения: * Заглавные -- данные (например, Ydat); * В кавычках '' -- строки (например, 'fmt'); * Прочие -- числа (например, zval); * Аргументы в скобках [] -- не обязательные.Векторные графикиПо вертикалиВертикальный размерW - светло-серыйWavelet преобразование вдоль направленияВся областьШиринаШирины выбранных ячеекШирины: Wa = %g Wx = %g Wy = %g Wz = %g СетчатыйСетчатый графикКонтурСохранить текущий рисунок в файлОсь XX коор.X коор.X-направлениеX-диапазонРазмер по XХ срез отY - оливковыйОсь YY коор.Y коор.Y-направлениеY-диапазонРазмер по YY срез отДаТекущий рисунок можно скопировать нажав Ctrl-Shift-C. Позже его можно вставить в документ или презентацию.Можно легко вставить имя файла, путь к папке, последнюю подобранную формулу и т.л., используя меню Правка|ВставитьСкрипт MGL можно редактировать в любом текстовом редакторе. Также его можно запустить (и просмотреть) прямо из консоли с помошью программ mglconv, mglview.Текущий рисунок можно экспортировать во множество форматов (EPS, SVG, PNG, JPEG и др.), просто нажав правой кнопкой на рисунке и выбрать 'Экспорт'Рисунок может содержать несколько вставок (под-графиков) при использовании команд 'subplot', 'inplot' и пр.Можно сгруппировать несколько графиков поместив их в одну строку с разделителем ':' или в функцию. Группа графиков будет подсвечиваться и перемещаться как целое.График можно вращать/сдвигать/приближать с помощью мыши. Просто нажмите кнопку 'Вращать' и удерживайте кнопку мыши: левую для вращения, правую для приближения/перспективы, среднюю для сдвига.Параметры анимации можно сохранить внутри скрипта с помощью комментариев '##a' или '##c'.Расцветку скрипта можно настроить в диалоге 'Свойства'.Диапазон осей координат можно сместить нажав среднюю кнопку мыши, при этом колесо мыши приближает/отдаляет график.Аргументом может быть любое выражение. Если требуется число, то будет использован первый элемент массива.Команда 'once on|off' позволяет выделить блок, который будет исполняться только один раз. Например, это могут быть команды чтения больших файлов, длительные вычисления и т.д. Нажмите F9 (меню 'Графика|Перезагрузить') для повторного выполнения этого блока команд.Команда 'stop' останавливает выполение скрипта. Она полезна если Вы не хотите выполнять часть скрипта.Необходимо ввести текст!Необходимо ввести имяНеобходимо перезапустить UDAV для применения изменений.Необходимо выбрать массив данныхНеобходимо выбрать маркер!Необходимо указать направлениеНеобходимо ввести текст в ' ' для аргументаНеобходимо выбрать один из вариантовНеобходимо ввести все аргументы перед Необходимо ввести обязательный аргумент Ось ZZ коор.Z коор.Z-направлениеZ-диапазонРазмер по ZZ срез отУвеличить диапазон осей координатПриблизить мышкойПриблизить рисунокПриблизитьПриблизить рисунокПриблизить выбранную область рисункаУвеличить текстПриблизить рисунокОтдалитьОтдалить рисунокУменьшить текстОтдалить рисунокПриблизить область рисункаПриближение/сдвигвышевсевдольвдоль xвдоль yвдоль zидугастрелкипо центрув максимумев минимумепозицияприкрепить светразмеры осей неправильныеb - синийрастровый EPSобаснизуc - голубойцентрклик в %g, %g, %gне могу открыть файлкриваяобрезаниеразмеры данных несовместимыразмеры данных слишком малызначение данных равно нулюпо умолчаниюразмерностиe - салатовыйэллипсмножительформат не поддерживается для этой сборкикадротg - липовыйстекляннаячерно-белыйh - серыйв строке %ldшаг№k - черныйl - весенне-зеленыйламповаяслеваlight: ID вне диапазонаосвещениелинияm - фуксиявручнуюмаркермаркерыmaxисп.памятиmgl_rumglconv конвертирует mgl скрипт в рисунок (по умолчанию PNG). Текущая версия 2.%g mgllab рисует mgl скрипт интерактивно. Текущая версия 2.%g mgllab v. 2.%g (c) Алексей Балакин, 2017 http://mathgl.sf.net/mglview показывает график MGL скрипта или MGLD файла. Текущая версия 2.%g minминимальное значение отрицательноn - небесно-голубойимянет файла или неверные размерынет записей легендынетнет или по умолчаниюне хватает памятине достаточно места для графикане используетсячисло контуров меньше или равно нулявыкл.вкл.или введите имя новой переменнойp - малиновыйразмытиекартауказатель равен NULLполигонпроекцияq - оранжевыйquaternaryquaternary проекцияr - красныйпрямоугольникромбсправавращать текстсохранить кадрыразмер(ы) меньше или равны нулюсрез вне диапазонасгладитьсплош.PNG с заливкойстрокиsumternaryternary проекциятекстметкидов скриптсверхуu - фиолетовыйснизуне знаюбез имени - UDAVбез имени* - UDAVсимволзначениявекторный EPSw - белыйбез полейсеткойс шагомy - желтыйmathgl-8.0.1/translations/mathgl_en.mo0000664000175000017500000000010214167366473017610 0ustar balakinbalakin$,8=wirewiremathgl-8.0.1/INSTALL0000664000175000017500000000026614167366474013641 0ustar balakinbalakinInstallation is simple. Just execute: cmake . cmake . make sudo make install Sometimes you also need to execute: sudo ldconfig See MathGL documentation for more details. mathgl-8.0.1/udav_new.png0000664000175000017500000003740114167366467015131 0ustar balakinbalakinPNG  IHDRX IDATxYl}׿gS[ݷ}wόc',c;%<@ <9RbB#!#l!$&g;sy9uK:U?cYnn7[y nn7@nn7@nn7@nn7ev#*R$0Dcyߘ(  ++% ab߀s(<;pI}@JR 4`$|0 ,7Uy )0)AIsF]nEQH*E bpQ@"̧(hCRDA:i!I s Q0d%-$q`X9H렧Q?o&sHZLbVf֬d(I<\P4`<<Ӏ0̨4 ɢ ' v><̡P2T$|c֎zYt&7,ϊ3ScfKwzV* &Ff,CCEUJ{˲ }Sf `feqg E++B9 p, u5 Qs!eYia'MaYλ(MMqPW`jQ/T Fz(V²,F#hnEQk? ̫0qm8Ѫy4scc};;B, zG8<<:,A:r f @a愂'UG "jo?~OAï^ԼJIC_HY)}KX\Z]K=|<|ܾ hu?~ 0 ÀiM/gzZ*w"\r?.Rp :-G|]P$,-.buu-`eXZz0MXX^ƭ]@eTUw~>0K*˲`Eqh_^ByAQUa :2l4jsEp4랯2UA9$ (Ea~Hkv27RLA,˂ie,ev:F!&FUŠx<Ơ/Pcca`دC, RyVUuUW @FW4]8x`80T*PiBUUEQ&PU,@48+VAh?WqfV(I&U@7EJ=zfeDiae 9l۰cX\4 2 Χ1 CIQfwf,|f ,˒Wo4|e˂iW,aR*HZIc^\qA}j2]37I=c ?^A=KbGQ_OE &E8 N&5k:9 W +<:PY#WyM+9!Yr!X>M`0ezm^-cϛ!wd ~ӄiEWN;2h~NaYkkkx.~TR*%1XT9@K²L*ID פ*jj Ȭ,\᳟}@ F0ͤvմjݲL"_A*:ɰUV0<_BU%mKtU5؂kƿ.޴q$e?spt|{jC5GEAWi,e9ԃE b%\WNWA0O%>F#׾'OUYfi4y93U=&+$#/g5H^yc8w|v AUzrTAW,ô#?E!JǝVD+-?O|o|8::,CAA !g(pӪ3պ2WYd{t "<>«8*xkx0`:4MCWEaM*SiW4MC4| ]yќGN#F=z̫,FmhvڧYwO }b8B4ғ 2yfn0BiÌ9n ? m%ɪ8ٌ'}ȏA3%dY'.ZAՙy5-rwTO!iL9a/ fN%2 IHz3kqqlcii %Ea,373&77H3dJU˧%)HrnZ%|灈f$peeKx`f nnuӴ)=-*$i4BH)S Y9YՄX$IܬZ0,:P UUlG܀i z;ZyHn6% 5^yC䐤8 ET*"xazPU @QTh)j&,$-S(˼CnRRsfT(I༎t@0Ds8rXP0{1<E9Lquͫ iKJ!g(+EEEl7P̉/#P4}ۨٺ`dt(1LI hwv(*%2 ռ*jZe53TUI"|~3'YBs$$dپQr!|A>W_}a]㱌_~p~Ya4zd^MuRiL'3Wr-kԫDL a@ ~èyFZ$9I6jя>D%7)Wr4"+a_$9gW2a)ˉ帓ENJ@   b}}li4 N» lhZeán#|9..qyRDUQG^{ o}GG_C>k'ιpNOM5/#$\lrBJs)P'e*a@t( Y1qyyi7]x'',vwC ,-}[z/CtoQ >WΑ:f#pUƴ'yr$ ? @q?tsa+P (89-wPVV,,K׿gi3EKiB 琘IPTP&,AIpIK.yl?_a\HA c t:\\ϛh#>h++KX]Iٟ}6p||~)3f 1k(YH D}UPP (=eCCy peMbY& Ä4'ɼ)zOҴ Q 23a` Ð{!UA1;Fz8t b $x|8YB|9x> 90TV38q!naPش-KQƐ;&d8i'Q/Xat= >gzD+E )O)Z^e]$b1 G&NVXQH>Tu)" &TUu> (hH(VV W04`gqn%MAڅL7pC h,,(htinP"u_/ ~Cg9 +B4S*۽gFyή˪@bYaOL%7zt}c=lX.9eIRXuT$0dqLpQ\ ABV?K8UvIDz& Hp~4WY,_D@6OX1 B俙XZ%,--cqaqQU@CUU2P̯|=7+22tsyTU,/`uuKX\$zpED}(7 O@D70ā<,e`@|Soϭ&Q5lmm["C@p8,l@)c@7I>b$gkcsuƛN&9(dwdt]L6H}q DL&*Ϡѐn)aeWIzBF#c4&ȴ?`$_tbϭ:8syYwupnY cAC;5o8?0ȡك4&UUŽ{ EQi\i؎ $-677qmasL481pt:::.}dRgy=*,[n lh.DO Eɽ(F=xАcqdw8g{h,JAbUU Eq9N29Xh4CUUwgbh6*Ɲ;wp.vvU(nh/\4Ut!>Z6VVGC;w$ZY./g@׃,;!^3 BaJ[wl6 AmB8Q\cz9#'<9La xy ;诐%eAxX܇q^/ Qqj`4j`0 v?Ccgg/<;d{N^prrs\^^1û^hj@ȶ^*,!I=p{`ɿ kx^85{N8O,[ߏq "$4WKﱽ}⋸ wxC8mҢIDAT89eD,)gsgB|X/N# 30#vurT2fz*r{ R$E|)& cQ$Nrc?DڈWm 85S{_aii {{x>|yêuIu| qxx3t: C_r0%cnAQ~F(ԁA98SZ,9L˒9/s^{s`~3 y~A c琤8aV5G>6qC"Q~T888 6 Їc\ɐ\CӛTLa #&/`yޚ˚0M7ܿ软 y0KĞ|-iW?002T*Tx$䝓$o{ѣGw簷GLFhDxtO?Z 14b(n&sEm0ӢX U% m1iF9J|x4@.S`H @~а$sT?HZET*"*]Z~KK{ݻo/]`{lm Ig<>qV~Hwr{.00 $@sg8w#MgRyNb / IH' ؋3EEۼl, ժj?[XX `ܹs{w ]l<I8:"qp!NOOqyy* w/]ۗh[ ݺp8`ОCHa|,3}J8ߞZIIQ@LYT{-&Rmpƙf?xK,_җ`oݻ{lDɉCNsn)7G^6...jn΢Z-$v v,.x̤N~"^\]W~'܄e1n!꒳r43ˢ YVcee wz` y珛>9 H zZ&pts,&˲$ҫ=-`oo $No4IqΈAΎ0j`o%~sn3 4DWe,--V -SILAx,F8L4]FI@{%3)5arE-E|Z Z KX[[:6 kxo5 -p~qr"ggng7?_ï^k_./ |I"Pt,,0XXX3ZmHdY`@̺BCQ&cz LJᓾ ]‘ ^_OmH :n d%rw)hq]!L)..H=U`0#T +>=,~'dJŃFUFDQ‚/0`4ZI ^$k0D?7y9vzG %I^-u]GlfUMyJZFÞ ea}} nci:@Z]V1d!`xAJF4sW~Q)1u'br3"u4 R1 Es} p D!-'Glz5SCofg2qL GaQPU5V5*1dn$*vHVr[XhbqqX]]"1^;eo19b\^ҵCt:F8C{+ՍNyO4>^ufzI ^EJ$C$ ZvN>Ep&Ԥ(Eb }C3+]̶!UÀöJ'g%JF޺z\ ^ hDzNvKEs=bF0J>qzzj'!h4@ԐgzAņ/Y$Un!>Nm'*LR 1]=CqxYrKյ^ўLe½*ptVܫsuVh ch,,vciRMh* yͦC0 Y E8\MUk>ub<8ag&-'.:떽bQܱ>؇jàYn'4@AT GT_O ,!],#=rzfOGMH~=p ӹZ&dG2" 3a8Ʋ,B jL|A'p-Pu=X= gqV[!5 Wcg90NdZsGJJH6$<&4`R@a '(u"1f W1OOrȂis^$<,0_ sPǨǨkb r4,wvj9̬< Ģ_d֖~@! YsЌņ2}t/r.U_a_< uӠ5`3Ҁbɺ #1j5T*B 0 pV%_͜0Ic4qJ`L eIPX*eà/K&<ܙ׎/AlJ8NzF)Pq`,@%^_в!jLIGYQ IPHE> )ő|f1ȵ,Zd[:?e`m?t(L-A^ /fjdFE[Lns9I E$\io^|=1!=Xt jUsKq8A > Dկ@2f?dY&\zV~S 4ԭr  ;1FtAw:>qG(c$ xEpR 99/ ʚ0ɼjloS J*U*)wJniT3oP7f IP0a3 يDE{ly]zm6Z̊sY[Qt_ 3 ׊mHÇPwΠk8::1,WxݒEJğ[\c"^X`8VKNpWlP88҂XJL3Xhڢnx9(Hn 4ϓ66ֱV,/Pᐌ=a<^p8lMmJCz=5 Y7$( ʑss MU4÷[M 4H0c3+/  o>$^t 0tc4^w2ɩuTmV dKK@SeYT*h4nØ(.T(;9UϑfƼ5q}1&HeV fV~@ial80knh*D P[HӧDEef%{ǐp )HPEN8MiaFq5R,tS+&{\Hx?闌]ס }$ $ x}t6aYw{ p :IFQ?- t` ReWVrzH:%!AU[PM/u> 308>ރ,H> =Z-gR9:KUU4`YuGf@}"[&aAQ8*0cKID8J*-4ͬh5QL&-U%O?NOO0 #jDxm⿼.[OA8ҫK8U USMx`b}r0+5T# QjBZIA/{0,TUA`mm -4 Rjco6<;n]ݑBN (d\V3Q'Lj¦D"ke9+ip3iEKA91}-$#HOiX^^$Ieͨ,[8;;Iټ$U1\eY{a($7qLQPA*GnyD!GE4fz:4Edcoe^(0 h6nǝn_©ߪk0MnCQT;GeV}+I[.@&t‹8ii^VCzA4,Uq؇ YQ0F,DŽ,aMH}w&MiYs )W4@ \yQjfgjAčj9ٛIw<&U C+wȝbY]}A.5@<*"&< HtiFDU?zOi=M':NgYx8ٞ= (H8Ք*OiU$'1+jfVRD+ Q-]bF`0 0 N.Xd7Wk/R$ִ&2|Ŵʛ Ț[$M>Fn$kSOA訅Yg7Lp 2@i9YLi0isL @ȍ3V-ˁ#8҉'AAgT| K,< T w)QJgj)g!!7v)9m]Eȝ(M+}2/aeLZy"WY1 o@yv~2VƬEdV敕R=4hFa$Y_1gu@ #include #include #include "getopt.h" #ifdef __cplusplus #define _GETOPT_THROW throw() #else #define _GETOPT_THROW #endif int optind = 1; int opterr = 1; int optopt = '?'; enum ENUM_ORDERING { REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER }; // // // Ansi structures and functions follow // // static struct _getopt_data_a { int optind; int opterr; int optopt; char *optarg; int __initialized; char *__nextchar; enum ENUM_ORDERING __ordering; int __posixly_correct; int __first_nonopt; int __last_nonopt; } getopt_data_a; char *optarg_a; static void exchange_a(char **argv, struct _getopt_data_a *d) { int bottom = d->__first_nonopt; int middle = d->__last_nonopt; int top = d->optind; char *tem; while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { int len = middle - bottom; for (int i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; } top -= len; } else { int len = top - middle; for (int i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; } bottom += len; } } d->__first_nonopt += (d->optind - d->__last_nonopt); d->__last_nonopt = d->optind; } static const char *_getopt_initialize_a (const char *optstring, struct _getopt_data_a *d, int posixly_correct) { d->__first_nonopt = d->__last_nonopt = d->optind; d->__nextchar = NULL; d->__posixly_correct = posixly_correct | !!getenv("POSIXLY_CORRECT"); if (optstring[0] == '-') { d->__ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == '+') { d->__ordering = REQUIRE_ORDER; ++optstring; } else if (d->__posixly_correct) d->__ordering = REQUIRE_ORDER; else d->__ordering = PERMUTE; return optstring; } int _getopt_internal_r_a (int argc, char *const *argv, const char *optstring, const struct option_a *longopts, int *longind, int long_only, struct _getopt_data_a *d, int posixly_correct) { int print_errors = d->opterr; if (argc < 1) return -1; d->optarg = NULL; if (d->optind == 0 || !d->__initialized) { if (d->optind == 0) d->optind = 1; optstring = _getopt_initialize_a (optstring, d, posixly_correct); d->__initialized = 1; } else if (optstring[0] == '-' || optstring[0] == '+') optstring++; if (optstring[0] == ':') print_errors = 0; if (d->__nextchar == NULL || *d->__nextchar == '\0') { if (d->__last_nonopt > d->optind) d->__last_nonopt = d->optind; if (d->__first_nonopt > d->optind) d->__first_nonopt = d->optind; if (d->__ordering == PERMUTE) { if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange_a ((char **) argv, d); else if (d->__last_nonopt != d->optind) d->__first_nonopt = d->optind; while (d->optind < argc && (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')) d->optind++; d->__last_nonopt = d->optind; } if (d->optind != argc && !strcmp(argv[d->optind], "--")) { d->optind++; if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange_a((char **) argv, d); else if (d->__first_nonopt == d->__last_nonopt) d->__first_nonopt = d->optind; d->__last_nonopt = argc; d->optind = argc; } if (d->optind == argc) { if (d->__first_nonopt != d->__last_nonopt) d->optind = d->__first_nonopt; return -1; } if ((argv[d->optind][0] != '-' || argv[d->optind][1] == '\0')) { if (d->__ordering == REQUIRE_ORDER) return -1; d->optarg = argv[d->optind++]; return 1; } d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == '-')); } if (longopts != NULL && (argv[d->optind][1] == '-' || (long_only && (argv[d->optind][2] || !strchr(optstring, argv[d->optind][1]))))) { char *nameend; unsigned int namelen; const struct option_a *p; const struct option_a *pfound = NULL; struct option_list { const struct option_a *p; struct option_list *next; } *ambig_list = NULL; int exact = 0; int indfound = -1; int option_index; for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++); namelen = (unsigned int)(nameend - d->__nextchar); for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp(p->name, d->__nextchar, namelen)) { if (namelen == (unsigned int)strlen(p->name)) { pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) { struct option_list *newp = (struct option_list*)alloca(sizeof(*newp)); newp->p = p; newp->next = ambig_list; ambig_list = newp; } } if (ambig_list != NULL && !exact) { if (print_errors) { struct option_list first; first.p = pfound; first.next = ambig_list; ambig_list = &first; fprintf (stderr, "%s: option '%s' is ambiguous; possibilities:", argv[0], argv[d->optind]); do { fprintf (stderr, " '--%s'", ambig_list->p->name); ambig_list = ambig_list->next; } while (ambig_list != NULL); fputc ('\n', stderr); } d->__nextchar += strlen(d->__nextchar); d->optind++; d->optopt = 0; return '?'; } if (pfound != NULL) { option_index = indfound; d->optind++; if (*nameend) { if (pfound->has_arg) d->optarg = nameend + 1; else { if (print_errors) { if (argv[d->optind - 1][1] == '-') { fprintf(stderr, "%s: option '--%s' doesn't allow an argument\n",argv[0], pfound->name); } else { fprintf(stderr, "%s: option '%c%s' doesn't allow an argument\n",argv[0], argv[d->optind - 1][0],pfound->name); } } d->__nextchar += strlen(d->__nextchar); d->optopt = pfound->val; return '?'; } } else if (pfound->has_arg == 1) { if (d->optind < argc) d->optarg = argv[d->optind++]; else { if (print_errors) { fprintf(stderr,"%s: option '--%s' requires an argument\n",argv[0], pfound->name); } d->__nextchar += strlen(d->__nextchar); d->optopt = pfound->val; return optstring[0] == ':' ? ':' : '?'; } } d->__nextchar += strlen(d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } if (!long_only || argv[d->optind][1] == '-' || strchr(optstring, *d->__nextchar) == NULL) { if (print_errors) { if (argv[d->optind][1] == '-') { fprintf(stderr, "%s: unrecognized option '--%s'\n",argv[0], d->__nextchar); } else { fprintf(stderr, "%s: unrecognized option '%c%s'\n",argv[0], argv[d->optind][0], d->__nextchar); } } d->__nextchar = (char *)""; d->optind++; d->optopt = 0; return '?'; } } { char c = *d->__nextchar++; char *temp = (char*)strchr(optstring, c); if (*d->__nextchar == '\0') ++d->optind; if (temp == NULL || c == ':' || c == ';') { if (print_errors) { fprintf(stderr, "%s: invalid option -- '%c'\n", argv[0], c); } d->optopt = c; return '?'; } if (temp[0] == 'W' && temp[1] == ';') { char *nameend; const struct option_a *p; const struct option_a *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; if (longopts == NULL) goto no_longs; if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; d->optind++; } else if (d->optind == argc) { if (print_errors) { fprintf(stderr,"%s: option requires an argument -- '%c'\n",argv[0], c); } d->optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; return c; } else d->optarg = argv[d->optind++]; for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; nameend++); for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!strncmp(p->name, d->__nextchar, nameend - d->__nextchar)) { if ((unsigned int) (nameend - d->__nextchar) == strlen(p->name)) { pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) ambig = 1; } if (ambig && !exact) { if (print_errors) { fprintf(stderr, "%s: option '-W %s' is ambiguous\n",argv[0], d->optarg); } d->__nextchar += strlen(d->__nextchar); d->optind++; return '?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { if (pfound->has_arg) d->optarg = nameend + 1; else { if (print_errors) { fprintf(stderr, "%s: option '-W %s' doesn't allow an argument\n",argv[0], pfound->name); } d->__nextchar += strlen(d->__nextchar); return '?'; } } else if (pfound->has_arg == 1) { if (d->optind < argc) d->optarg = argv[d->optind++]; else { if (print_errors) { fprintf(stderr, "%s: option '-W %s' requires an argument\n",argv[0], pfound->name); } d->__nextchar += strlen(d->__nextchar); return optstring[0] == ':' ? ':' : '?'; } } else d->optarg = NULL; d->__nextchar += strlen(d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } no_longs: d->__nextchar = NULL; return 'W'; } if (temp[1] == ':') { if (temp[2] == ':') { if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; d->optind++; } else d->optarg = NULL; d->__nextchar = NULL; } else { if (*d->__nextchar != '\0') { d->optarg = d->__nextchar; d->optind++; } else if (d->optind == argc) { if (print_errors) { fprintf(stderr,"%s: option requires an argument -- '%c'\n",argv[0], c); } d->optopt = c; if (optstring[0] == ':') c = ':'; else c = '?'; } else d->optarg = argv[d->optind++]; d->__nextchar = NULL; } } return c; } } int _getopt_internal_a (int argc, char *const *argv, const char *optstring, const struct option_a *longopts, int *longind, int long_only, int posixly_correct) { int result; getopt_data_a.optind = optind; getopt_data_a.opterr = opterr; result = _getopt_internal_r_a (argc, argv, optstring, longopts,longind, long_only, &getopt_data_a,posixly_correct); optind = getopt_data_a.optind; optarg_a = getopt_data_a.optarg; optopt = getopt_data_a.optopt; return result; } int getopt_a (int argc, char *const *argv, const char *optstring) _GETOPT_THROW { return _getopt_internal_a (argc, argv, optstring, (const struct option_a *) 0, (int *) 0, 0, 0); } int getopt_long_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW { return _getopt_internal_a (argc, argv, options, long_options, opt_index, 0, 0); } int getopt_long_only_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW { return _getopt_internal_a (argc, argv, options, long_options, opt_index, 1, 0); } int _getopt_long_r_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index, struct _getopt_data_a *d) { return _getopt_internal_r_a (argc, argv, options, long_options, opt_index,0, d, 0); } int _getopt_long_only_r_a (int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index, struct _getopt_data_a *d) { return _getopt_internal_r_a (argc, argv, options, long_options, opt_index, 1, d, 0); } // // // Unicode Structures and Functions // // static struct _getopt_data_w { int optind; int opterr; int optopt; wchar_t *optarg; int __initialized; wchar_t *__nextchar; enum ENUM_ORDERING __ordering; int __posixly_correct; int __first_nonopt; int __last_nonopt; } getopt_data_w; wchar_t *optarg_w; static void exchange_w(wchar_t **argv, struct _getopt_data_w *d) { int bottom = d->__first_nonopt; int middle = d->__last_nonopt; int top = d->optind; wchar_t *tem; while (top > middle && middle > bottom) { if (top - middle > middle - bottom) { int len = middle - bottom; for (int i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[top - (middle - bottom) + i]; argv[top - (middle - bottom) + i] = tem; } top -= len; } else { int len = top - middle; for (int i = 0; i < len; i++) { tem = argv[bottom + i]; argv[bottom + i] = argv[middle + i]; argv[middle + i] = tem; } bottom += len; } } d->__first_nonopt += (d->optind - d->__last_nonopt); d->__last_nonopt = d->optind; } static const wchar_t *_getopt_initialize_w (const wchar_t *optstring, struct _getopt_data_w *d, int posixly_correct) { d->__first_nonopt = d->__last_nonopt = d->optind; d->__nextchar = NULL; d->__posixly_correct = posixly_correct | !!_wgetenv(L"POSIXLY_CORRECT"); if (optstring[0] == L'-') { d->__ordering = RETURN_IN_ORDER; ++optstring; } else if (optstring[0] == L'+') { d->__ordering = REQUIRE_ORDER; ++optstring; } else if (d->__posixly_correct) d->__ordering = REQUIRE_ORDER; else d->__ordering = PERMUTE; return optstring; } int _getopt_internal_r_w (int argc, wchar_t *const *argv, const wchar_t *optstring, const struct option_w *longopts, int *longind, int long_only, struct _getopt_data_w *d, int posixly_correct) { int print_errors = d->opterr; if (argc < 1) return -1; d->optarg = NULL; if (d->optind == 0 || !d->__initialized) { if (d->optind == 0) d->optind = 1; optstring = _getopt_initialize_w (optstring, d, posixly_correct); d->__initialized = 1; } else if (optstring[0] == L'-' || optstring[0] == L'+') optstring++; if (optstring[0] == L':') print_errors = 0; if (d->__nextchar == NULL || *d->__nextchar == L'\0') { if (d->__last_nonopt > d->optind) d->__last_nonopt = d->optind; if (d->__first_nonopt > d->optind) d->__first_nonopt = d->optind; if (d->__ordering == PERMUTE) { if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange_w((wchar_t **) argv, d); else if (d->__last_nonopt != d->optind) d->__first_nonopt = d->optind; while (d->optind < argc && (argv[d->optind][0] != L'-' || argv[d->optind][1] == L'\0')) d->optind++; d->__last_nonopt = d->optind; } if (d->optind != argc && !wcscmp(argv[d->optind], L"--")) { d->optind++; if (d->__first_nonopt != d->__last_nonopt && d->__last_nonopt != d->optind) exchange_w((wchar_t **) argv, d); else if (d->__first_nonopt == d->__last_nonopt) d->__first_nonopt = d->optind; d->__last_nonopt = argc; d->optind = argc; } if (d->optind == argc) { if (d->__first_nonopt != d->__last_nonopt) d->optind = d->__first_nonopt; return -1; } if ((argv[d->optind][0] != L'-' || argv[d->optind][1] == L'\0')) { if (d->__ordering == REQUIRE_ORDER) return -1; d->optarg = argv[d->optind++]; return 1; } d->__nextchar = (argv[d->optind] + 1 + (longopts != NULL && argv[d->optind][1] == L'-')); } if (longopts != NULL && (argv[d->optind][1] == L'-' || (long_only && (argv[d->optind][2] || !wcschr(optstring, argv[d->optind][1]))))) { wchar_t *nameend; unsigned int namelen; const struct option_w *p; const struct option_w *pfound = NULL; struct option_list { const struct option_w *p; struct option_list *next; } *ambig_list = NULL; int exact = 0; int indfound = -1; int option_index; for (nameend = d->__nextchar; *nameend && *nameend != L'='; nameend++); namelen = (unsigned int)(nameend - d->__nextchar); for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!wcsncmp(p->name, d->__nextchar, namelen)) { if (namelen == (unsigned int)wcslen(p->name)) { pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) { struct option_list *newp = (struct option_list*)alloca(sizeof(*newp)); newp->p = p; newp->next = ambig_list; ambig_list = newp; } } if (ambig_list != NULL && !exact) { if (print_errors) { struct option_list first; first.p = pfound; first.next = ambig_list; ambig_list = &first; fwprintf(stderr, L"%ls: option '%ls' is ambiguous; possibilities:", argv[0], argv[d->optind]); do { fwprintf (stderr, L" '--%ls'", ambig_list->p->name); ambig_list = ambig_list->next; } while (ambig_list != NULL); fputwc (L'\n', stderr); } d->__nextchar += wcslen(d->__nextchar); d->optind++; d->optopt = 0; return L'?'; } if (pfound != NULL) { option_index = indfound; d->optind++; if (*nameend) { if (pfound->has_arg) d->optarg = nameend + 1; else { if (print_errors) { if (argv[d->optind - 1][1] == L'-') { fwprintf(stderr, L"%ls: option '--%ls' doesn't allow an argument\n",argv[0], pfound->name); } else { fwprintf(stderr, L"%ls: option '%c%ls' doesn't allow an argument\n",argv[0], argv[d->optind - 1][0],pfound->name); } } d->__nextchar += wcslen(d->__nextchar); d->optopt = pfound->val; return L'?'; } } else if (pfound->has_arg == 1) { if (d->optind < argc) d->optarg = argv[d->optind++]; else { if (print_errors) { fwprintf(stderr,L"%ls: option '--%ls' requires an argument\n",argv[0], pfound->name); } d->__nextchar += wcslen(d->__nextchar); d->optopt = pfound->val; return optstring[0] == L':' ? L':' : L'?'; } } d->__nextchar += wcslen(d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } if (!long_only || argv[d->optind][1] == L'-' || wcschr(optstring, *d->__nextchar) == NULL) { if (print_errors) { if (argv[d->optind][1] == L'-') { fwprintf(stderr, L"%ls: unrecognized option '--%ls'\n",argv[0], d->__nextchar); } else { fwprintf(stderr, L"%ls: unrecognized option '%c%ls'\n",argv[0], argv[d->optind][0], d->__nextchar); } } d->__nextchar = (wchar_t *)L""; d->optind++; d->optopt = 0; return L'?'; } } { wchar_t c = *d->__nextchar++; wchar_t *temp = (wchar_t*)wcschr(optstring, c); if (*d->__nextchar == L'\0') ++d->optind; if (temp == NULL || c == L':' || c == L';') { if (print_errors) { fwprintf(stderr, L"%ls: invalid option -- '%c'\n", argv[0], c); } d->optopt = c; return L'?'; } if (temp[0] == L'W' && temp[1] == L';') { wchar_t *nameend; const struct option_w *p; const struct option_w *pfound = NULL; int exact = 0; int ambig = 0; int indfound = 0; int option_index; if (longopts == NULL) goto no_longs; if (*d->__nextchar != L'\0') { d->optarg = d->__nextchar; d->optind++; } else if (d->optind == argc) { if (print_errors) { fwprintf(stderr,L"%ls: option requires an argument -- '%c'\n",argv[0], c); } d->optopt = c; if (optstring[0] == L':') c = L':'; else c = L'?'; return c; } else d->optarg = argv[d->optind++]; for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != L'='; nameend++); for (p = longopts, option_index = 0; p->name; p++, option_index++) if (!wcsncmp(p->name, d->__nextchar, nameend - d->__nextchar)) { if ((unsigned int) (nameend - d->__nextchar) == wcslen(p->name)) { pfound = p; indfound = option_index; exact = 1; break; } else if (pfound == NULL) { pfound = p; indfound = option_index; } else if (long_only || pfound->has_arg != p->has_arg || pfound->flag != p->flag || pfound->val != p->val) ambig = 1; } if (ambig && !exact) { if (print_errors) { fwprintf(stderr, L"%ls: option '-W %ls' is ambiguous\n",argv[0], d->optarg); } d->__nextchar += wcslen(d->__nextchar); d->optind++; return L'?'; } if (pfound != NULL) { option_index = indfound; if (*nameend) { if (pfound->has_arg) d->optarg = nameend + 1; else { if (print_errors) { fwprintf(stderr, L"%ls: option '-W %ls' doesn't allow an argument\n",argv[0], pfound->name); } d->__nextchar += wcslen(d->__nextchar); return L'?'; } } else if (pfound->has_arg == 1) { if (d->optind < argc) d->optarg = argv[d->optind++]; else { if (print_errors) { fwprintf(stderr, L"%ls: option '-W %ls' requires an argument\n",argv[0], pfound->name); } d->__nextchar += wcslen(d->__nextchar); return optstring[0] == L':' ? L':' : L'?'; } } else d->optarg = NULL; d->__nextchar += wcslen(d->__nextchar); if (longind != NULL) *longind = option_index; if (pfound->flag) { *(pfound->flag) = pfound->val; return 0; } return pfound->val; } no_longs: d->__nextchar = NULL; return L'W'; } if (temp[1] == L':') { if (temp[2] == L':') { if (*d->__nextchar != L'\0') { d->optarg = d->__nextchar; d->optind++; } else d->optarg = NULL; d->__nextchar = NULL; } else { if (*d->__nextchar != L'\0') { d->optarg = d->__nextchar; d->optind++; } else if (d->optind == argc) { if (print_errors) { fwprintf(stderr,L"%ls: option requires an argument -- '%c'\n",argv[0], c); } d->optopt = c; if (optstring[0] == L':') c = L':'; else c = L'?'; } else d->optarg = argv[d->optind++]; d->__nextchar = NULL; } } return c; } } int _getopt_internal_w (int argc, wchar_t *const *argv, const wchar_t *optstring, const struct option_w *longopts, int *longind, int long_only, int posixly_correct) { int result; getopt_data_w.optind = optind; getopt_data_w.opterr = opterr; result = _getopt_internal_r_w (argc, argv, optstring, longopts,longind, long_only, &getopt_data_w,posixly_correct); optind = getopt_data_w.optind; optarg_w = getopt_data_w.optarg; optopt = getopt_data_w.optopt; return result; } int getopt_w (int argc, wchar_t *const *argv, const wchar_t *optstring) _GETOPT_THROW { return _getopt_internal_w (argc, argv, optstring, (const struct option_w *) 0, (int *) 0, 0, 0); } int getopt_long_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW { return _getopt_internal_w (argc, argv, options, long_options, opt_index, 0, 0); } int getopt_long_only_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW { return _getopt_internal_w (argc, argv, options, long_options, opt_index, 1, 0); } int _getopt_long_r_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index, struct _getopt_data_w *d) { return _getopt_internal_r_w (argc, argv, options, long_options, opt_index,0, d, 0); } int _getopt_long_only_r_w (int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index, struct _getopt_data_w *d) { return _getopt_internal_r_w (argc, argv, options, long_options, opt_index, 1, d, 0); } mathgl-8.0.1/addons/getopt/CMakeLists.txt0000664000175000017500000000016714167366474020122 0ustar balakinbalakinadd_library(getopt-static STATIC getopt.c getopt.h) target_compile_definitions(getopt-static PUBLIC MGL_STATIC_DEFINE) mathgl-8.0.1/addons/getopt/getopt.h0000664000175000017500000001077514167366474017043 0ustar balakinbalakin/* Getopt for Microsoft C This code is a modification of the Free Software Foundation, Inc. Getopt library for parsing command line argument the purpose was to provide a Microsoft Visual C friendly derivative. This code provides functionality for both Unicode and Multibyte builds. Date: 02/03/2011 - Ludvik Jerabek - Initial Release Version: 1.0 Comment: Supports getopt, getopt_long, and getopt_long_only and POSIXLY_CORRECT environment flag License: LGPL Revisions: 02/03/2011 - Ludvik Jerabek - Initial Release 02/20/2011 - Ludvik Jerabek - Fixed compiler warnings at Level 4 07/05/2011 - Ludvik Jerabek - Added no_argument, required_argument, optional_argument defs 08/03/2011 - Ludvik Jerabek - Fixed non-argument runtime bug which caused runtime exception 08/09/2011 - Ludvik Jerabek - Added code to export functions for DLL and LIB 02/15/2012 - Ludvik Jerabek - Fixed _GETOPT_THROW definition missing in implementation file 08/01/2012 - Ludvik Jerabek - Created separate functions for char and wchar_t characters so single dll can do both unicode and ansi 10/15/2012 - Ludvik Jerabek - Modified to match latest GNU features 06/19/2015 - Ludvik Jerabek - Fixed maximum option limitation caused by option_a (255) and option_w (65535) structure val variable **DISCLAIMER** THIS MATERIAL IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT Not LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT APPLY TO YOU. IN NO EVENT WILL I BE LIABLE TO ANY PARTY FOR ANY DIRECT, INDIRECT, SPECIAL OR OTHER CONSEQUENTIAL DAMAGES FOR ANY USE OF THIS MATERIAL INCLUDING, WITHOUT LIMITATION, ANY LOST PROFITS, BUSINESS INTERRUPTION, LOSS OF PROGRAMS OR OTHER DATA ON YOUR INFORMATION HANDLING SYSTEM OR OTHERWISE, EVEN If WE ARE EXPRESSLY ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ #ifndef __GETOPT_H_ #define __GETOPT_H_ #include #define _GETOPT_API MGL_EXPORT // Change behavior for C\C++ #ifdef __cplusplus #define _BEGIN_EXTERN_C extern "C" { #define _END_EXTERN_C } #define _GETOPT_THROW throw() #else #define _BEGIN_EXTERN_C #define _END_EXTERN_C #define _GETOPT_THROW #endif // Standard GNU options #define null_argument 0 /*Argument Null*/ #define no_argument 0 /*Argument Switch Only*/ #define required_argument 1 /*Argument Required*/ #define optional_argument 2 /*Argument Optional*/ // Shorter Options #define ARG_NULL 0 /*Argument Null*/ #define ARG_NONE 0 /*Argument Switch Only*/ #define ARG_REQ 1 /*Argument Required*/ #define ARG_OPT 2 /*Argument Optional*/ #include #include _BEGIN_EXTERN_C extern _GETOPT_API int optind; extern _GETOPT_API int opterr; extern _GETOPT_API int optopt; // Ansi struct option_a { const char* name; int has_arg; int *flag; int val; }; extern _GETOPT_API char *optarg_a; extern _GETOPT_API int getopt_a(int argc, char *const *argv, const char *optstring) _GETOPT_THROW; extern _GETOPT_API int getopt_long_a(int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW; extern _GETOPT_API int getopt_long_only_a(int argc, char *const *argv, const char *options, const struct option_a *long_options, int *opt_index) _GETOPT_THROW; // Unicode struct option_w { const wchar_t* name; int has_arg; int *flag; int val; }; extern _GETOPT_API wchar_t *optarg_w; extern _GETOPT_API int getopt_w(int argc, wchar_t *const *argv, const wchar_t *optstring) _GETOPT_THROW; extern _GETOPT_API int getopt_long_w(int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW; extern _GETOPT_API int getopt_long_only_w(int argc, wchar_t *const *argv, const wchar_t *options, const struct option_w *long_options, int *opt_index) _GETOPT_THROW; _END_EXTERN_C #undef _BEGIN_EXTERN_C #undef _END_EXTERN_C #undef _GETOPT_THROW #undef _GETOPT_API #ifdef _UNICODE #define getopt getopt_w #define getopt_long getopt_long_w #define getopt_long_only getopt_long_only_w #define option option_w #define optarg optarg_w #else #define getopt getopt_a #define getopt_long getopt_long_a #define getopt_long_only getopt_long_only_a #define option option_a #define optarg optarg_a #endif #endif // __GETOPT_H_ mathgl-8.0.1/mathgl_es.po0000664000175000017500000050736014167366465015122 0ustar balakinbalakin# MathGL Spanish translation. # Copyright (C) 2018 Diego Sejas Viscarra # This file is distributed under the same license as the MathGL2 package. # Diego Sejas Viscarra , 2018. # msgid "" msgstr "" "Project-Id-Version: MathGL2 2.4.2\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2021-12-27 05:03+0300\n" "PO-Revision-Date: 2018-03-24 11:08-0400\n" "Last-Translator: Diego Sejas Viscarra \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 2.0.4\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: mgllab/mgllab.cpp:424 #, c-format msgid "" "\t-1 str set str as argument $1 for script\n" "\t... ...\n" "\t-9 str set str as argument $9 for script\n" "\t-L loc set locale to loc\n" "\t-h print this message\n" msgstr "" "\t-1 str especificar str como argumento $1 para script\n" "\t... ...\n" "\t-9 str especificar str como argumento $9 para script\n" "\t-L loc especificar lenguaje como loc\n" "\t-h imprimir este mensaje\n" #: utils/mglconv.cpp:86 #, c-format msgid "" "\t-1 str set str as argument $1 for script\n" "\t... ...\n" "\t-9 str set str as argument $9 for script\n" "\t-L loc set locale to loc\n" "\t-s fname set MGL script for setting up the plot\n" "\t-S val set scaling factor for images\n" "\t-q val set quality for output (val=0...9)\n" "\t-g val set gray-scale mode (val=0|1)\n" "\t-v val set variant of arguments\n" "\t-o name set output file name\n" "\t-n no default output (script should save results by itself)\n" "\t-A val add animation value val\n" "\t-C n1:n2:dn add animation value in range [n1,n2] with step dn\n" "\t-C n1:n2 add animation value in range [n1,n2] with step 1\n" "\t- get script from standard input\n" "\t-h print this message\n" msgstr "" "\t-1 str especificar str como argumento $1 para script\n" "\t... ...\n" "\t-9 str especificar str como argumento $9 para script\n" "\t-L loc especificar lenguaje como loc\n" "\t-s fname especificar script MGL para configurar gráfica\n" "\t-S val especificar factor de escalado para imagenes\n" "\t-q val especificar calidad de la imagen (val=0...9)\n" "\t-g val especificar modo de grises (val=0|1)\n" "\t-v val especificar variante de argumentos\n" "\t-o name especificar nombre para archivo de salida\n" "\t-n no crear imagen (el script debe guardar el resultado por si " "mismo)\n" "\t-A val agregar valor de animación val\n" "\t-C n1:n2:dn agregar valor de animación en rango [n1,n2] con paso dn\n" "\t-C n1:n2 agregar valor de animación en rango [n1,n2] con paso 1\n" "\t- recibir script desde entrada estandar\n" "\t-h imprimir este mensaje\n" #: utils/mglview.cpp:85 #, c-format msgid "" "\t-1 str set str as argument $1 for script\n" "\t... ...\n" "\t-9 str set str as argument $9 for script\n" "\t-g val set gray-scale mode (val=0|1)\n" "\t-v val set variant of arguments\n" "\t-s opt set MGL script for setting up the plot\n" "\t-L loc set locale to loc\n" "\t- get script from standard input\n" "\t-h print this message\n" msgstr "" "\t-1 str especificar str como argumento $1 para script\n" "\t... ...\n" "\t-9 str especificar str como argumento $9 para script\n" "\t-g val especificar modo de grises (val=0|1)\n" "\t-v val especificar variante de argumentos\n" "\t-s opt especificar script MGL script para configurar gráfica\n" "\t-L loc especificar lenguaje como loc\n" "\t- recibir script de entrada estandar\n" "\t-h imprimir este mensaje\n" #: widgets/qt.cpp:876 msgid "" "\n" "(c) Alexey Balakin, 2007\n" "http://mathgl.sourceforge.net/" msgstr "" "\n" "(c) Alexey Balakin, 2007\n" "http://mathgl.sourceforge.net/" #: src/parser.cpp:1075 #, c-format msgid "" "\n" "Change temporary data in line %ld" msgstr "" "\n" "Cambiar datos temporales en línea %ld" #: src/parser.cpp:1073 #, c-format msgid "" "\n" "String too long in line %ld" msgstr "" "\n" "Texto demasiado largo en línea %ld" #: src/parser.cpp:1074 #, c-format msgid "" "\n" "Unbalanced ' in line %ld" msgstr "" "\n" "Desbalance de ' en línea %ld" #: src/parser.cpp:1071 #, c-format msgid "" "\n" "Wrong argument(s) in line %ld" msgstr "" "\n" "Argumento(s) incorrecto(s) en línea %ld" #: src/parser.cpp:1072 #, c-format msgid "" "\n" "Wrong command in line %ld" msgstr "" "\n" "Comando incorrecto en línea %ld" #: udav/mem_pnl.cpp:136 udav/dat_pnl.cpp:153 msgid " - UDAV preview" msgstr " - UDAV vista previa" #: udav/dat_pnl.cpp:152 msgid " - UDAV variable" msgstr " - UDAV variable" #. o = new Fl_Button(420, yy, 90, 25, _(" Refresh")); o->callback(mem_update_cb,w); #. o->image(img_update); o->align(FL_ALIGN_IMAGE_NEXT_TO_TEXT); #. o->tooltip(_("Refresh list of variables.")); #: mgllab/help.cpp:180 msgid " Del.all" msgstr " Del.all" #: mgllab/help.cpp:168 msgid " Delete" msgstr " Borrar" #: mgllab/help.cpp:162 msgid " Edit" msgstr " Editar" #: mgllab/help.cpp:165 msgid " Info" msgstr " Info" #: mgllab/help.cpp:171 msgid " New" msgstr " Nuevo" #: mgllab/help.cpp:174 msgid " Save" msgstr " Guardar" #: mgllab/mgllab.cpp:233 msgid " Yes " msgstr " Sí " #: udav/plot_pnl.cpp:192 #, c-format msgid "%d - %d of %d" msgstr "%d - %d de %d" #. : #: udav/style_dlg.cpp:316 mgllab/dialogs.cpp:208 msgid "' ' none" msgstr "' ' ninguno" #: udav/style_dlg.cpp:397 msgid "'#*' Y-sign" msgstr "'#*' símbolo Y" #: udav/style_dlg.cpp:398 msgid "'#+' squared plus" msgstr "'#+' cruz encuadrada" #: udav/style_dlg.cpp:396 msgid "'#.' circled dot" msgstr "'#.' punto en círculo" #: udav/style_dlg.cpp:405 msgid "'#<' solid triangle left" msgstr "'#<' triángulo relleno izq." #: udav/style_dlg.cpp:406 msgid "'#>' solid triangle right" msgstr "'#>' triángulo relleno der." #: udav/style_dlg.cpp:404 msgid "'#^' solid triangle up" msgstr "'#^' triángulo relleno arriba" #: udav/style_dlg.cpp:402 msgid "'#d' solid rhomb" msgstr "'#d' rombo relleno" #: udav/style_dlg.cpp:407 msgid "'#o' solid circle" msgstr "'#o' círculo relleno" #: udav/style_dlg.cpp:401 msgid "'#s' solid square" msgstr "'#s' cuadrado relleno" #: udav/style_dlg.cpp:403 msgid "'#v' solid triangle down" msgstr "'#v' triángulo relleno abajo" #: udav/style_dlg.cpp:399 msgid "'#x' squared cross" msgstr "'#x' equis enmarcada" #. D #: udav/style_dlg.cpp:354 mgllab/dialogs.cpp:245 msgid "'*' cross" msgstr "'*' cruz" #. #: udav/style_dlg.cpp:387 mgllab/dialogs.cpp:215 msgid "'*' star" msgstr "'*' asterisco" #. o #. - #: udav/style_dlg.cpp:341 udav/style_dlg.cpp:385 mgllab/dialogs.cpp:217 #: mgllab/dialogs.cpp:232 msgid "'+' plus" msgstr "'+' cruz" #. #: udav/style_dlg.cpp:340 mgllab/dialogs.cpp:231 msgid "'-' lines" msgstr "'-' segmentos" #. "-|;=ji: " #: udav/style_dlg.cpp:309 mgllab/dialogs.cpp:201 msgid "'-' solid" msgstr "'-' sólido" #. d #: udav/style_dlg.cpp:384 mgllab/dialogs.cpp:221 msgid "'.' dot" msgstr "'.' punto" #. = #: udav/style_dlg.cpp:315 mgllab/dialogs.cpp:207 msgid "':' dots" msgstr "':' puntos" #. j #. = #: udav/style_dlg.cpp:311 udav/style_dlg.cpp:343 mgllab/dialogs.cpp:204 #: mgllab/dialogs.cpp:234 msgid "';' dash" msgstr "';' guión" #. ~ #: udav/style_dlg.cpp:349 mgllab/dialogs.cpp:241 msgid "'<' left sign" msgstr "'<' signo izq." #. v #: udav/style_dlg.cpp:392 mgllab/dialogs.cpp:224 msgid "'<' triangle left" msgstr "'<' triángulo izq." #. + #: udav/style_dlg.cpp:342 mgllab/dialogs.cpp:233 msgid "'=' double lines" msgstr "'=' guión doble" #. i #: udav/style_dlg.cpp:312 mgllab/dialogs.cpp:206 msgid "'=' small dash" msgstr "'=' guión pequeño" #. < #: udav/style_dlg.cpp:350 mgllab/dialogs.cpp:242 msgid "'>' right sign" msgstr "'>' signo der." #. < #: udav/style_dlg.cpp:393 mgllab/dialogs.cpp:225 msgid "'>' triangle right" msgstr "'>' triángulo derecha" #. _ #: udav/style_dlg.cpp:265 udav/style_dlg.cpp:288 mgllab/dialogs.cpp:188 msgid "'A' arrow" msgstr "'A' flecha" #. S #: udav/style_dlg.cpp:271 udav/style_dlg.cpp:294 mgllab/dialogs.cpp:194 msgid "'D' rhomb" msgstr "'D' rombo" #. d #: udav/style_dlg.cpp:353 mgllab/dialogs.cpp:244 msgid "'D' solid rhomb" msgstr "'D' rombo relleno" #. V #: udav/style_dlg.cpp:267 udav/style_dlg.cpp:290 mgllab/dialogs.cpp:191 msgid "'I' stop" msgstr "'I' truncado" #. A #: udav/style_dlg.cpp:268 udav/style_dlg.cpp:291 mgllab/dialogs.cpp:189 msgid "'K' size" msgstr "'K' tamaño" #. D #: udav/style_dlg.cpp:272 udav/style_dlg.cpp:295 mgllab/dialogs.cpp:195 msgid "'O' circle" msgstr "'O' círculo" #. o #: udav/style_dlg.cpp:345 mgllab/dialogs.cpp:237 msgid "'O' solid circle" msgstr "'O' círculo relleno" #. s #: udav/style_dlg.cpp:347 mgllab/dialogs.cpp:239 msgid "'S' solid square" msgstr "'S' cuadrado relleno" #. T #: udav/style_dlg.cpp:270 udav/style_dlg.cpp:293 mgllab/dialogs.cpp:193 msgid "'S' square" msgstr "'S' cuadrado" #. I #: udav/style_dlg.cpp:269 udav/style_dlg.cpp:292 mgllab/dialogs.cpp:192 msgid "'T' triangle" msgstr "'T' triángulo" #. K #: udav/style_dlg.cpp:266 udav/style_dlg.cpp:289 mgllab/dialogs.cpp:190 msgid "'V' back arrow" msgstr "'V' flecha atras" #. O #: mgllab/dialogs.cpp:196 msgid "'X' cross" msgstr "'X' equis" #. * #: udav/style_dlg.cpp:355 mgllab/dialogs.cpp:246 msgid "'^' hats" msgstr "'^' sombrero" #. . #: udav/style_dlg.cpp:391 mgllab/dialogs.cpp:222 msgid "'^' triangle up" msgstr "'^' triángulo arriba" #. "AVIKTSDO" #: udav/style_dlg.cpp:264 udav/style_dlg.cpp:287 mgllab/dialogs.cpp:187 msgid "'_' none" msgstr "'_' ninguno" #. s #. > #: udav/style_dlg.cpp:352 udav/style_dlg.cpp:389 mgllab/dialogs.cpp:220 #: mgllab/dialogs.cpp:243 msgid "'d' rhomb" msgstr "'d' rombo" #. ; #: udav/style_dlg.cpp:314 mgllab/dialogs.cpp:205 msgid "'i' small dash dot" msgstr "'i' guión corto y punto" #. | #. ; #: udav/style_dlg.cpp:313 udav/style_dlg.cpp:351 mgllab/dialogs.cpp:203 #: mgllab/dialogs.cpp:235 msgid "'j' dash dot" msgstr "'j' guión y punto" #. * #. j #: udav/style_dlg.cpp:344 udav/style_dlg.cpp:394 mgllab/dialogs.cpp:216 #: mgllab/dialogs.cpp:236 msgid "'o' circle" msgstr "'o' círculo" #. x #. O #: udav/style_dlg.cpp:346 udav/style_dlg.cpp:388 mgllab/dialogs.cpp:219 #: mgllab/dialogs.cpp:238 msgid "'s' square" msgstr "'s' cuadrado" #. ^ #: udav/style_dlg.cpp:390 mgllab/dialogs.cpp:223 msgid "'v' triangle down" msgstr "'v' triángulo abajo" #. + #: udav/style_dlg.cpp:386 mgllab/dialogs.cpp:218 msgid "'x' skew cross" msgstr "'x' equis" #. - #: udav/style_dlg.cpp:310 mgllab/dialogs.cpp:202 msgid "'|' long dash" msgstr "'|' guión largo" #. S #: udav/style_dlg.cpp:348 mgllab/dialogs.cpp:240 msgid "'~' waves" msgstr "'~' ondas" #: src/parser.cpp:53 msgid "0 - special plot" msgstr "0 - gráfico especial" #: src/parser.cpp:53 msgid "1 - other plot" msgstr "1 - otro gráfico" #: src/parser.cpp:53 msgid "10 - dd plot" msgstr "10 - gráfico dd" #: src/parser.cpp:53 msgid "11 - vector plot" msgstr "11 - gráfico vectorial" #: src/parser.cpp:53 msgid "12 - axis" msgstr "12 - eje" #: src/parser.cpp:53 msgid "13 - primitives" msgstr "13 - primitivas" #: src/parser.cpp:53 msgid "14 - axis setup" msgstr "14 - configurar eje" #: src/parser.cpp:53 msgid "15 - text/legend" msgstr "15 - texto/leyenda" #: src/parser.cpp:53 msgid "16 - data transform" msgstr "16 - transformar datos" #: udav/info_dlg.cpp:49 msgid "1D plot" msgstr "Gráfico 1D" #: udav/newcmd_dlg.cpp:166 mgllab/dialogs.cpp:707 msgid "1D plots" msgstr "Gráficos 1D" #: mgllab/help.cpp:341 msgid "1D view" msgstr "Vista 1D" #: src/parser.cpp:53 msgid "2 - setup" msgstr "2 - configuración" #: udav/info_dlg.cpp:49 msgid "2D plot" msgstr "Gráfico 2D" #: udav/newcmd_dlg.cpp:167 mgllab/dialogs.cpp:708 msgid "2D plots" msgstr "Gráficos 2D" #: mgllab/help.cpp:343 msgid "2D view" msgstr "Vista 2D" #: src/parser.cpp:53 msgid "3 - data handle" msgstr "3 - referencia a datos" #: udav/open_dlg.cpp:71 msgid "3D data with sizes from file" msgstr "Datos 3D con tamaños de archivo" #: udav/newcmd_dlg.cpp:168 mgllab/dialogs.cpp:709 msgid "3D plots" msgstr "Gráficos 3D" #: mgllab/help.cpp:345 msgid "3D view" msgstr "Vista 3D" #: src/parser.cpp:53 msgid "4 - data create" msgstr "4 - crear datos" #: src/parser.cpp:53 msgid "5 - subplot" msgstr "5 - subgráfica" #: src/parser.cpp:53 msgid "6 - program flow" msgstr "6 - flujo de programa" #: src/parser.cpp:53 msgid "7 - 1d plot" msgstr "7 - gráfico 1d" #: src/parser.cpp:53 msgid "8 - 2d plot" msgstr "8 - gráfico 2d" #: src/parser.cpp:53 msgid "9 - 3d plot" msgstr "9 - gráfico 3d" #: udav/udav_wnd.cpp:455 msgid "" "
(c) Alexey Balakin, 2007-present

License is GPL v.2 or later." msgstr "" "
(c) Alexey Balakin, 2007-presente

Bajo licencia GPL v.2 o posterior." #: mgllab/help.cpp:285 msgid "@<- Prev" msgstr "@<- Prev." #: widgets/qt.cpp:1294 udav/udav_wnd.cpp:331 mgllab/mgllab.cpp:338 msgid "About" msgstr "Acerca de" #. ----------------------------------------------------------------------------- #: widgets/qt.cpp:880 widgets/qt.cpp:1295 udav/udav_wnd.cpp:332 #: udav/udav_wnd.cpp:460 msgid "About Qt" msgstr "Acerca de Qt" #: widgets/qt.cpp:1173 udav/plot_pnl.cpp:373 msgid "Add arc" msgstr "Añadir arco" #: widgets/qt.cpp:1176 udav/plot_pnl.cpp:376 msgid "Add arc which properties can be changed later by mouse." msgstr "Añadir arco configurable por el mouse." #: mgllab/dialogs.cpp:84 msgid "Add command option(s)" msgstr "Añadir opción(es) de comando" #: widgets/qt.cpp:1178 udav/plot_pnl.cpp:379 msgid "Add curve" msgstr "Añadir curva" #: widgets/qt.cpp:1181 udav/plot_pnl.cpp:382 msgid "Add curve which properties can be changed later by mouse." msgstr "Añadir curva configurable por el mouse." #: src/exec_dat.cpp:1728 msgid "Add data or number" msgstr "Añadir datos o número" #: widgets/qt.cpp:1193 udav/plot_pnl.cpp:397 msgid "Add ellipse" msgstr "Añadir elipse" #: widgets/qt.cpp:1196 udav/plot_pnl.cpp:400 udav/plot_pnl.cpp:406 msgid "Add ellipse which properties can be changed later by mouse." msgstr "Añadir elipse configurable por el mouse." #: mgllab/dialogs.cpp:1229 msgid "Add inplot" msgstr "Añadir gráfico interno" # Anadir a la leyenda? #: src/exec_set.cpp:808 msgid "Add legend entry" msgstr "Añadir entrada a leyenda" #: mgllab/dialogs.cpp:119 msgid "Add legend entry for the plot" msgstr "Añadir entrada a leyenda del gráfico" #: widgets/qt.cpp:1168 udav/plot_pnl.cpp:367 msgid "Add line" msgstr "Añadir línea" #: widgets/qt.cpp:1171 udav/plot_pnl.cpp:370 msgid "Add line which properties can be changed later by mouse." msgstr "Añadir línea configurable por el mouse." #: widgets/qt.cpp:1203 udav/plot_pnl.cpp:409 msgid "Add mark" msgstr "Añadir marca" # Marker or mark? #: widgets/qt.cpp:1206 udav/plot_pnl.cpp:412 msgid "Add marker which properties can be changed later by mouse." msgstr "Añadir marca configurable por el mouse." #: widgets/qt.cpp:1198 udav/plot_pnl.cpp:403 msgid "Add polygon" msgstr "Añadir polígono" #: widgets/qt.cpp:1201 msgid "Add polygon which properties can be changed later by mouse." msgstr "Añadir polígono configurable por el mouse." #: mgllab/dialogs.cpp:1453 msgid "Add primitive" msgstr "Añadir primitiva" # rect? #: widgets/qt.cpp:1183 udav/plot_pnl.cpp:385 msgid "Add rect" msgstr "Añadir rectángulo" #: widgets/qt.cpp:1186 udav/plot_pnl.cpp:388 msgid "Add rectangle which properties can be changed later by mouse." msgstr "Añadir rectángulo configurable por el mouse." #: widgets/qt.cpp:1188 udav/plot_pnl.cpp:391 msgid "Add rhombus" msgstr "Añadir rombo" #: widgets/qt.cpp:1191 udav/plot_pnl.cpp:394 msgid "Add rhombus which properties can be changed later by mouse." msgstr "Añadir rombo configurable por el mouse." #: widgets/qt.cpp:1208 udav/plot_pnl.cpp:415 msgid "Add text" msgstr "Añadir texto" #: widgets/qt.cpp:1211 udav/plot_pnl.cpp:418 msgid "Add text which properties can be changed later by mouse." msgstr "Añadir texto configurable por el mouse." #: src/exec_prm.cpp:663 msgid "Add title for current subplot/inplot" msgstr "Añadir titulo al subgráfica/gráfica interna" #: mgllab/table.cpp:796 msgid "Add to" msgstr "Añadir a" # user-defined #: src/exec_set.cpp:809 msgid "Add user-defined symbol" msgstr "Añadir símbolo personalizado" #: widgets/fltk.cpp:883 msgid "Adjust picture size to fill drawing area" msgstr "Ajustar imagen al área de dibujo" #: widgets/fltk.cpp:846 widgets/qt.cpp:1156 udav/plot_pnl.cpp:338 msgid "Adjust size" msgstr "Ajustar tamaño" #: src/exec_set.cpp:810 msgid "Adjust ticks for best view" msgstr "Optimizar marcas de los ejes" #: udav/calc_dlg.cpp:193 msgid "Airy and Gamma" msgstr "Funciones de Airy y Gamma" #: src/window.cpp:417 msgid "" "All indexes (of data arrays, subplots and so on) are always start from 0." msgstr "" "Todos los índices (de vectores de datos, subgráficas, etc.) siempre empiezan " "en 0." #. graphics menu #: widgets/qt.cpp:1115 udav/opt_dlg.cpp:51 udav/setup_dlg.cpp:109 #: udav/plot_pnl.cpp:291 mgllab/dialogs.cpp:109 msgid "Alpha" msgstr "Alfa" #: mgllab/dialogs.cpp:110 msgid "Alpha value (transparency) of surface or cloud" msgstr "Valor alfa (transparencia) de superficie o nube" #: udav/setup_dlg.cpp:93 mgllab/dialogs.cpp:1003 msgid "AlphaDef" msgstr "Def. alfa" #: udav/opt_dlg.cpp:56 udav/setup_dlg.cpp:95 mgllab/dialogs.cpp:111 #: mgllab/dialogs.cpp:1004 msgid "Ambient" msgstr "Ambiente" #: udav/subplot_dlg.cpp:167 msgid "Angle around x axis (in degrees)" msgstr "Ángulo alrededor del eje x (en grados)" #: udav/subplot_dlg.cpp:171 msgid "Angle around z axis (in degrees)" msgstr "Ángulo alrededor del eje z (en grados)" #. animation menu #: widgets/qt.cpp:1261 widgets/qt.cpp:1262 udav/plot_pnl.cpp:560 #: mgllab/mathgl.cpp:185 msgid "Animation" msgstr "Animación" #: mgllab/table.cpp:788 msgid "Another" msgstr "Otro" #: mgllab/table.cpp:854 msgid "Apply operator (smoothing, integration, difference ...) to data" msgstr "Aplicar operador (suavizado, integración, diferencia ...) a datos" # Mesh=malla or mesh=grilla depending on context #: mgllab/dialogs.cpp:103 msgid "Approximate number of mesh lines in plot" msgstr "Número aprox. de líneas de malla en gráfica" #: mgllab/help.cpp:135 msgid "Are you sure that you want to delete ALL data arrays?" msgstr "¿Está seguro que desea borrar TODOS los datos?" #: udav/newcmd_dlg.cpp:67 msgid "Argument" msgstr "Argumento" #: mgllab/dialogs.cpp:738 msgid "Arguments" msgstr "Argumentos" #: udav/style_dlg.cpp:63 mgllab/dialogs.cpp:321 msgid "Arrow at end" msgstr "Flecha al final" #. g->setColStretch(0, 1); g->setColStretch(1, 1); g->setColStretch(2, 1); #: udav/style_dlg.cpp:61 mgllab/dialogs.cpp:315 msgid "Arrow at start" msgstr "Flecha al principio" #: widgets/qt.cpp:1154 msgid "Ask to stop plot drawing (F7)." msgstr "Detener creación de gráfico (F7)." #: udav/subplot_dlg.cpp:175 msgid "Aspect" msgstr "Aspecto" # Aspect ratio=Proporcion? Maybe Aspecto x/z #: udav/subplot_dlg.cpp:178 msgid "Aspect ratio of x-scale to z-scale" msgstr "Proporción de escala x a escala z" #: udav/subplot_dlg.cpp:182 msgid "Aspect ratio of y-scale to z-scale" msgstr "Proporción de escala y a escala z" #: mgllab/dialogs.cpp:1298 msgid "Aspect x/z" msgstr "Aspecto x/z" #: src/exec_set.cpp:816 msgid "Attach light settings to inplot" msgstr "Vincular configuración de luz a gráfico interno" #: udav/open_dlg.cpp:60 msgid "Auto detect data sizes" msgstr "Autodetectar tamaño de datos" #: udav/open_dlg.cpp:177 msgid "Auto detect data sizes (%1 x %2 x %3)" msgstr "Autodetectar tamaño de datos (%1 x %2 x %3)" #: udav/prop_dlg.cpp:100 msgid "AutoKey" msgstr "AutoKey" #: udav/prop_dlg.cpp:159 msgid "Automatically execute script after loading" msgstr "Ejecutar script automáticamente al cargarlo" #: udav/prop_dlg.cpp:165 msgid "Automatically save before redrawing (F5)" msgstr "Guardar automáticamente antes de graficar (F5)" #: src/data.cpp:1557 #, c-format msgid "" "Averages are:\n" " = %g\t = %g\t = %g\t = %g\n" msgstr "" "Promedios:\n" " = %g\t = %g\t = %g\t = %g\n" #: udav/style_dlg.cpp:122 mgllab/dialogs.cpp:340 msgid "Axial direction" msgstr "Dirección del eje" #: udav/setup_dlg.cpp:101 msgid "AxialDir" msgstr "Dir. axial" #: mgllab/dialogs.cpp:1008 msgid "Axis" msgstr "Eje" #: udav/newcmd_dlg.cpp:176 mgllab/dialogs.cpp:717 msgid "Axis and colorbar" msgstr "Eje y barra de color" #: udav/newcmd_dlg.cpp:177 mgllab/dialogs.cpp:718 mgllab/dialogs.cpp:949 msgid "Axis setup" msgstr "Configurar eje" #. W #: udav/style_dlg.cpp:237 mgllab/dialogs.cpp:45 msgid "B - navy" msgstr "B - azul marino" #: udav/help_pnl.cpp:48 msgid "Backward" msgstr "Retroceder" #: src/font.cpp:1005 #, c-format msgid "Bad '%ls' at %zu\n" msgstr "\"%ls\" incorrecto en %zu\n" #: src/parser.cpp:778 #, c-format msgid "Bad arguments for %ls: %ld instead of %d\n" msgstr "Error en argumentos de %ls: %ld en vez de %d\n" #: udav/setup_dlg.cpp:97 msgid "BaseWidth" msgstr "BaseWidth" #: udav/calc_dlg.cpp:192 msgid "Basic" msgstr "Básicas" #: mgllab/dialogs.cpp:1461 msgid "Begin" msgstr "Inicio" #: src/parser.cpp:1492 msgid "Begin of do-while loop" msgstr "Inicio de bucle \"do while\"" #: udav/calc_dlg.cpp:193 msgid "Bessel" msgstr "Bessel" #: udav/style_dlg.cpp:157 mgllab/dialogs.cpp:368 msgid "Bold style" msgstr "Negrilla" #: udav/opt_dlg.cpp:115 msgid "Both fields in crange must be filled" msgstr "crange requiere dos valores" #: udav/opt_dlg.cpp:94 msgid "Both fields in xrange must be filled" msgstr "xrange requiere dos valores" #: udav/opt_dlg.cpp:101 msgid "Both fields in yrange must be filled" msgstr "yrange requiere dos valores" #: udav/opt_dlg.cpp:108 msgid "Both fields in zrange must be filled" msgstr "zrange requiere dos valores" #: src/parser.cpp:1489 msgid "Break for-loop" msgstr "Salir de bucle \"for\"" #: udav/setup_dlg.cpp:122 mgllab/dialogs.cpp:1069 msgid "Brightness" msgstr "Luminosidad" #: mgllab/dialogs.cpp:401 msgid "Brightness of i-th color" msgstr "Luminosidad del i-ésimo color" #: mgllab/table.cpp:768 msgid "By formula" msgstr "Por fórmula" #. R #: udav/style_dlg.cpp:240 mgllab/dialogs.cpp:48 msgid "C - teal" msgstr "C - verde azulado" #: udav/setup_dlg.cpp:51 mgllab/dialogs.cpp:989 msgid "C axis" msgstr "Eje c" #: udav/opt_dlg.cpp:47 mgllab/dialogs.cpp:97 msgid "C-range" msgstr "Rango c" #: widgets/qt.cpp:1280 msgid "Calculations" msgstr "Cálculos" #. TODO #. connect(hidden,SIGNAL(cursorPositionChanged()),this,SLOT(hiddenClicked())); #: udav/udav_wnd.cpp:194 udav/udav_wnd.cpp:206 mgllab/mgllab.cpp:332 #: mgllab/mgllab.cpp:567 msgid "Calculator" msgstr "Calculadora" #: udav/anim_dlg.cpp:67 udav/prop_dlg.cpp:180 udav/args_dlg.cpp:63 #: udav/newcmd_dlg.cpp:78 udav/open_dlg.cpp:90 udav/dat_pnl.cpp:460 #: udav/dat_pnl.cpp:510 udav/dat_pnl.cpp:552 udav/dat_pnl.cpp:629 #: udav/opt_dlg.cpp:78 udav/setup_dlg.cpp:145 udav/files_dlg.cpp:58 #: udav/style_dlg.cpp:206 udav/data_dlg.cpp:90 udav/subplot_dlg.cpp:219 #: mgllab/editor.cpp:286 mgllab/mathgl.cpp:166 mgllab/mathgl.cpp:197 #: mgllab/dialogs.cpp:120 mgllab/dialogs.cpp:164 mgllab/dialogs.cpp:410 #: mgllab/dialogs.cpp:584 mgllab/dialogs.cpp:749 mgllab/dialogs.cpp:1071 #: mgllab/dialogs.cpp:1318 mgllab/dialogs.cpp:1473 mgllab/mgllab.cpp:490 #: mgllab/table.cpp:101 mgllab/table.cpp:179 mgllab/table.cpp:353 #: mgllab/table.cpp:556 mgllab/table.cpp:619 mgllab/table.cpp:675 msgid "Cancel" msgstr "Cancelar" #: src/crust.cpp:617 msgid "Cannot triangulate this set!" msgstr "¡Imposible triangular conjunto!" # Area de imagen? Area de figura? #: udav/udav_wnd.cpp:226 mgllab/mgllab.cpp:361 mgllab/mgllab.cpp:362 msgid "Canvas" msgstr "Área de dibujo" #: udav/subplot_dlg.cpp:59 udav/subplot_dlg.cpp:101 udav/subplot_dlg.cpp:118 #: udav/subplot_dlg.cpp:135 msgid "Cell index" msgstr "Índice de celda" #: mgllab/table.cpp:103 mgllab/table.cpp:558 mgllab/table.cpp:772 msgid "Change" msgstr "Cambiar" #: mgllab/table.cpp:104 msgid "Change (resize) data" msgstr "Cambiar (tamaño de) datos" #: widgets/qt.cpp:1158 udav/plot_pnl.cpp:340 msgid "Change canvas size to fill whole region (F6)." msgstr "Maximizar el área de dibujo (F6)." #: src/exec_set.cpp:820 msgid "Change current directory" msgstr "Cambiar directorio actual" #: mgllab/table.cpp:168 msgid "Change data" msgstr "Modificar datos" #: mgllab/table.cpp:91 msgid "Change data sizes" msgstr "Modificar tamaño de datos" #: mgllab/table.cpp:559 mgllab/table.cpp:622 mgllab/table.cpp:678 msgid "Change data values and close this window" msgstr "Cambiar valores y cerrar esta ventana" #: udav/prop_dlg.cpp:71 msgid "Change font" msgstr "Cambiar fuente" #: src/exec_set.cpp:873 msgid "Change view angles - use 'rotate' for plot rotation" msgstr "Modificar ángulos - use \"rotate\" para rotar gráfico" # Limpiar? #: udav/calc_dlg.cpp:68 msgid "Clear" msgstr "Borrar" #: udav/text_pnl.cpp:527 msgid "Clear all" msgstr "Borrar todo" #: src/exec_set.cpp:821 msgid "Clear legend entries" msgstr "Borrar entradas de leyenda" #: src/exec_set.cpp:822 msgid "Clear picture" msgstr "Borrar imagen" #. o = new Fl_Button(180, 130, 25, 25);o->image(img_save); o->tooltip("img_save"); #: widgets/fltk.cpp:1118 widgets/qt.cpp:1108 udav/find_dlg.cpp:52 #: udav/hint_dlg.cpp:52 mgllab/editor.cpp:570 mgllab/help.cpp:289 #: mgllab/help.cpp:349 mgllab/help.cpp:465 msgid "Close" msgstr "Cerrar" #: udav/dat_pnl.cpp:833 msgid "Close tab" msgstr "Cerrar pestaña" #: udav/dat_pnl.cpp:835 msgid "Close this data tab." msgstr "Cerrar esta pestaña de datos." #: udav/setup_dlg.cpp:121 udav/style_dlg.cpp:67 mgllab/dialogs.cpp:1068 #: mgllab/dialogs.cpp:1459 msgid "Color" msgstr "Color" #. g->setColStretch(0, 1); g->setColStretch(1, 1); #: udav/style_dlg.cpp:106 msgid "Color order" msgstr "Orden de color" #: udav/style_dlg.cpp:150 mgllab/dialogs.cpp:339 msgid "Color scheme" msgstr "Esquema de color" #: mgllab/dialogs.cpp:384 msgid "Color(s) or color scheme" msgstr "Color(es) o esquema de color" #: mgllab/dialogs.cpp:1002 msgid "Colors" msgstr "Colores" #: mgllab/table.cpp:881 msgid "" "Colors denote values: magenta - local max, cyan - local min,\n" "\tred - Re(v)>0, blue - Re(v)<0, purple - Im(v)>0, teal - Im(v)<0." msgstr "" "Colores denotan valores: magenta - máx. local, cyan - min. local,\n" "\trojo - Re(v)>0, azul - Re(v)<0, púrpura - Im(v)>0, verde azulado - Im(v)<0." #: mgllab/dialogs.cpp:577 msgid "Column expr" msgstr "Exp. de columna" #: mgllab/dialogs.cpp:724 mgllab/mgllab.cpp:311 msgid "Command" msgstr "Comando" #: udav/newcmd_dlg.cpp:64 mgllab/dialogs.cpp:740 msgid "" "Command arguments. Bold ones are required arguments.\n" "Other are optional arguments but its order is required.\n" "You can use '' for default format. See help at right\n" "for default values." msgstr "" "Argumentos de comando. Obligatorios en negrilla.\n" "Otros son requeridos, pero su orden es obligatorio.\n" "Puede usar '' para predeterminado. Ver ayuda a la\n" "der. para valores por defecto." #: udav/text_pnl.cpp:575 msgid "Command options" msgstr "Opciones de comando" #: udav/prop_dlg.cpp:82 msgid "Comments" msgstr "Comentarios" #: src/exec_prm.cpp:651 msgid "Computes the attractor of an IFS" msgstr "Calcula el atractor de un IFS" #: src/exec_prm.cpp:652 msgid "Computes the attractor of an IFS for 3d case" msgstr "Calcula el atractor de un IFS para el caso 3d" #: src/exec_prm.cpp:653 msgid "Computes the attractor of an IFS with parameters from *.ifs file" msgstr "Calcula el atractor de un IFS con parámetros de un archivo *.ifs" #: src/exec_prm.cpp:647 msgid "Computes the flame fractal" msgstr "Calcula un fractal de flama" #: src/parser.cpp:1508 msgid "Condition of do-while loop" msgstr "Condición de un bucle do-while" #: src/parser.cpp:1498 src/parser.cpp:1502 msgid "Conditional operator" msgstr "Operador condicional" #: udav/plot_pnl.cpp:359 msgid "Copy click coor." msgstr "Copiar coords. al clicar" # Clipboard=? #: udav/plot_pnl.cpp:361 msgid "Copy coordinates of last mouse click to clipboard." msgstr "Copiar coordenadas del último clic. a memoria" #: udav/dat_pnl.cpp:707 msgid "Copy data" msgstr "Copiar datos" #: src/exec_dat.cpp:1736 msgid "Copy data from another variable" msgstr "Copiar datos de otra variable" #: widgets/fltk.cpp:843 msgid "Copy graphics" msgstr "Copiar gráfico" #: widgets/qt.cpp:1162 udav/plot_pnl.cpp:355 msgid "Copy graphics to clipboard (Ctrl+Shift+G)." msgstr "Copiar gráfico a memoria (Ctrl+Shift+G)." #: widgets/fltk.cpp:887 msgid "Copy image to clipboard" msgstr "Copiar imagen a memoria" #: widgets/qt.cpp:1160 udav/plot_pnl.cpp:353 msgid "Copy plot" msgstr "Copiar gráfico" #: udav/dat_pnl.cpp:709 msgid "Copy range of numbers to clipboard (Ctrl+Shift+C)." msgstr "Copiar rango de números a memoria (Ctrl+Shift+C)." #: udav/text_pnl.cpp:535 msgid "Copy selected text or data to clipboard (Ctrl+C)." msgstr "Copiar texto seleccionado o datos a memoria (Ctrl+C)." #: mgllab/editor.cpp:516 msgid "Copy selection to clipboard" msgstr "Copiar selección a memoria" #: udav/text_pnl.cpp:533 mgllab/mgllab.cpp:301 msgid "Copy text" msgstr "Copiar texto" #: mgllab/table.cpp:780 msgid "Cos FFT" msgstr "Cos-FFT" #: udav/dat_pnl.cpp:621 msgid "Cos-Fourier transform along direction(s)" msgstr "Cos-transformada de Fourier en dirrección(es)" #: src/exec_dat.cpp:1738 msgid "Cos-Fourier transform at some direction" msgstr "Cos-transformada de Fourier en una dirección" #: mgllab/table.cpp:165 msgid "Cosine FFT" msgstr "Coseno FFT" #: udav/text_pnl.cpp:365 udav/text_pnl.cpp:482 msgid "Could not write to %1" msgstr "No se pudo escribir a %1" #: udav/setup_dlg.cpp:159 msgid "Could not write to file" msgstr "No se pudo escribir a archivo" #: udav/udav_wnd.cpp:570 msgid "Couldn't change to folder " msgstr "No se puede ir a directorio " #: udav/text_pnl.cpp:431 msgid "Couldn't open file " msgstr "No se pudo abrir archivo " #: mgllab/dialogs.cpp:1190 #, c-format msgid "Couldn't open file %s" msgstr "No se pudo abrir archivo %s" #: udav/newcmd_dlg.cpp:173 msgid "Create data and I/O" msgstr "Crear datos e I/O" #: mgllab/dialogs.cpp:714 msgid "Create data and IO" msgstr "Crear datos e I/O" #: src/exec_dat.cpp:1765 msgid "Create histogram (distribution) of data values" msgstr "Crear histograma (distribución) de valores de datos" #: udav/dat_pnl.cpp:766 mgllab/table.cpp:760 msgid "Create new" msgstr "Crear nuevo" #: src/exec_dat.cpp:1828 msgid "Create new 1D data and fill it in range" msgstr "Crear nuevos datos 1D y llenar en rango" #: src/exec_dat.cpp:1782 msgid "Create new data" msgstr "Crear nuevos datos" #: udav/mem_pnl.cpp:58 msgid "Create new data array" msgstr "Crear nuevo arreglo de datos" #: mgllab/table.cpp:838 msgid "Create new data with zero filling" msgstr "Crear arreglo y llenarlo con ceros" #: udav/udav_wnd.cpp:284 msgid "Create new empty script window (Ctrl+N)." msgstr "Crear ventana para nuevo script (Ctrl+N)." #: src/parser.cpp:1503 msgid "Creates new variable from list of numbers or data" msgstr "Crear nueva variable de una lista de números o datos" #: udav/dat_pnl.cpp:784 mgllab/table.cpp:763 msgid "Crop" msgstr "Cortar" #: mgllab/table.cpp:860 msgid "Crop (cut off edges) data" msgstr "Cortar (bordes) de datos" #: mgllab/table.cpp:607 msgid "Crop data" msgstr "Cortar datos" #: src/exec_dat.cpp:1739 msgid "Crop edge of data" msgstr "Cortar borde de datos" #: udav/dat_pnl.cpp:786 msgid "Crop the data edges. Useful to cut off the zero-filled area." msgstr "Cortar bordes de datos. Útil para cortar área con ceros." #: mgllab/table.cpp:163 mgllab/table.cpp:774 msgid "CumSum" msgstr "SumCum" #: src/exec_dat.cpp:1740 msgid "Cumulative summation along direction(s)" msgstr "Suma acumulativa en la(s) dirección(es)" #: udav/prop_dlg.cpp:106 msgid "CurrLine" msgstr "LíneaAct" #: udav/prop_dlg.cpp:68 msgid "Current font" msgstr "Fuente actual" #: udav/text_pnl.cpp:530 msgid "Cut selected text to clipboard (Ctrl+X)." msgstr "Cortar texto seleccionado a memoria (Ctrl+X)." #: udav/text_pnl.cpp:528 mgllab/mgllab.cpp:300 msgid "Cut text" msgstr "Cortar texto" #: udav/opt_dlg.cpp:61 mgllab/dialogs.cpp:106 msgid "Cutting" msgstr "Recortado" #: mgllab/help.cpp:255 mgllab/table.cpp:428 mgllab/table.cpp:457 msgid "" "DAT Files \t*.{dat,csv}\n" "HDF Files \t*.{h5,hdf}" msgstr "" "Archivos DAT \t*.{dat,csv}\n" "Archivos HDF \t*.{h5,hdf}" #: mgllab/dialogs.cpp:1465 msgid "Dash" msgstr "Guión" #: udav/style_dlg.cpp:62 mgllab/dialogs.cpp:318 msgid "Dashing" msgstr "Guiones" #: udav/dat_pnl.cpp:66 msgid "Data" msgstr "Datos" #: udav/dat_pnl.cpp:249 udav/dat_pnl.cpp:271 msgid "" "Data files (*.dat)\n" "HDF5 files (*.h5 *.hdf)\n" "PNG files (*.png)\n" "All files (*.*)" msgstr "" "Archivos DAT (*.dat)\n" "Archivos HDF5 (*.h5 *.hdf)\n" "Archivos PNG (*.png)\n" "Todos los archivos (*.*)" #: udav/newcmd_dlg.cpp:175 mgllab/dialogs.cpp:716 msgid "Data handling" msgstr "Manipulación de datos" #: mgllab/help.cpp:167 mgllab/table.cpp:851 msgid "Data information and preview." msgstr "Información sobre datos y vista previa." #: udav/open_dlg.cpp:56 udav/data_dlg.cpp:42 mgllab/dialogs.cpp:566 msgid "Data name" msgstr "Nombre de datos" #. mgl->autoResize = true; // TODO: something strange here !!! #: udav/info_dlg.cpp:43 msgid "Data preview" msgstr "Vista previa de datos" #: udav/info_dlg.cpp:44 msgid "Data preview for current slice." msgstr "Vista previa de datos para porción actual." #: udav/newcmd_dlg.cpp:174 mgllab/dialogs.cpp:715 msgid "Data transform" msgstr "Transformar datos" #: udav/plot_pnl.cpp:557 msgid "Decrease \\phi angle by 10 degrees." msgstr "Decrementar ángulo \\phi en 10 grados." #: udav/plot_pnl.cpp:549 msgid "Decrease \\theta angle by 10 degrees." msgstr "Decrementar ángulo \\theta en 10 grados." #: mgllab/help.cpp:105 msgid "Decrease font size" msgstr "Reducir tamaño de fuente" #: src/parser.cpp:1494 msgid "Define constant or parameter" msgstr "Definir constante o parámetro" #: src/parser.cpp:1493 msgid "Define parameter as character" msgstr "Definir parámetro como caracter" #: src/parser.cpp:1495 msgid "Define parameter as numerical value" msgstr "Definir parámetro como valor numérico" #: src/parser.cpp:1488 msgid "Define parameter from user input" msgstr "Definir parámetro de input del usuario" #: udav/anim_dlg.cpp:76 msgid "Delay (in ms)" msgstr "Retraso (en ms)" #: mgllab/mathgl.cpp:204 msgid "Delay (in sec)" msgstr "Retraso (en seg)" #: mgllab/help.cpp:182 msgid "Delete @b all@. data arrays." msgstr "Borrar @b todos@. los datos." #: udav/mem_pnl.cpp:64 msgid "Delete ALL data arrays" msgstr "Borrar TODOS los datos" #: src/exec_dat.cpp:1743 msgid "Delete data or slice of data" msgstr "Borrar datos o porción de los datos" #: udav/plot_pnl.cpp:427 msgid "Delete selected" msgstr "Borrar seleccion" #: udav/mem_pnl.cpp:60 msgid "Delete selected data array" msgstr "Borrar datos seleccionados" #: mgllab/help.cpp:170 msgid "Delete selected data." msgstr "Borrar datos seleccionados." #: udav/plot_pnl.cpp:429 msgid "Delete selected plot." msgstr "Borrar gráfico seleccionado." #: mgllab/dialogs.cpp:734 msgid "Description" msgstr "Descripción" #: src/exec_dat.cpp:1744 msgid "Detect curves for maximums of data array" msgstr "Analizar curvas en busca de máximos" #: mgllab/table.cpp:164 mgllab/table.cpp:776 msgid "Difference" msgstr "Diferencia" #: udav/dat_pnl.cpp:616 msgid "Differentiate data along direction(s)" msgstr "Diferenciar datos en la(s) dirección(es)" #: udav/opt_dlg.cpp:58 mgllab/dialogs.cpp:113 mgllab/dialogs.cpp:1005 msgid "Diffuse" msgstr "Difuso" #: src/exec_dat.cpp:1748 msgid "Dilate data larger val" msgstr "Dilatar datos mayores a val" #: src/exec_dat.cpp:1733 msgid "Direct multiplication of arrays" msgstr "Multiplicación directa de arreglos" #: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:377 udav/dat_pnl.cpp:424 #: mgllab/dialogs.cpp:161 mgllab/table.cpp:549 msgid "Direction" msgstr "Dirección" #: mgllab/table.cpp:551 msgid "Direction along which data will be filled" msgstr "Dirección para llenar los datos" #: src/exec_set.cpp:830 msgid "Disable accurate primitive cutting at axis borders" msgstr "" #: udav/subplot_dlg.cpp:105 udav/subplot_dlg.cpp:122 msgid "Distance between cells" msgstr "Distancia entre celdas" #: mgllab/table.cpp:799 msgid "Divide by" msgstr "Dividir por" #: src/exec_dat.cpp:1749 msgid "Divide by data or number" msgstr "Dividir por datos o número" #: mgllab/table.cpp:180 mgllab/table.cpp:354 mgllab/table.cpp:677 msgid "Do" msgstr "Hacer" #: src/exec_dat.cpp:1817 msgid "Do STFA transform" msgstr "Transformada STFA" #: src/exec_dat.cpp:1823 src/exec_dat.cpp:1824 msgid "Do integral transform of data" msgstr "Transformada integral de datos" #: mgllab/table.cpp:102 mgllab/table.cpp:557 mgllab/table.cpp:620 #: mgllab/table.cpp:676 msgid "Do nothing and close this window" msgstr "Cerrar esta ventana sin hacer nada" #: udav/mem_pnl.cpp:122 msgid "Do you want to delete all data?" msgstr "¿Desea borrar todos los datos?" #: udav/udav_wnd.cpp:341 udav/udav_wnd.cpp:580 udav/udav_wnd.cpp:622 msgid "Do you want to save the changes to the document?" msgstr "¿Desea guardar los cambios del documento?" #: mgllab/editor.cpp:286 msgid "Don't Save" msgstr "No guardar" #: mgllab/table.cpp:164 msgid "Double diff." msgstr "Doble dif." #: src/exec_gr.cpp:1213 msgid "Draw Bifurcation diagram" msgstr "Diagrama de bifurcación" #: src/exec_gr.cpp:1250 msgid "Draw Iris plots" msgstr "Gráfica de Iris" #: src/exec_gr.cpp:1252 msgid "Draw Lamerey diagram" msgstr "Diagrama de Lamerey" # apertura-alto-bajo-clausura? #: src/exec_gr.cpp:1257 msgid "Draw Open-High-Low-Close (OHLC) diagram" msgstr "Diagrama OHLC" #: src/exec_gr.cpp:1260 msgid "Draw Poincare map" msgstr "Mapa de Poincaré" #: src/exec_gr.cpp:1266 msgid "Draw STFA diagram" msgstr "Diagrama STFA" #: src/exec_gr.cpp:1278 msgid "Draw TeX mark at point position" msgstr "Graficar marca de TeX en posición" #: src/exec_prm.cpp:629 msgid "Draw angle arc" msgstr "Graficar arco" #: src/exec_gr.cpp:1206 msgid "Draw area plot for 1D data" msgstr "Gráfica de área para datos 1D" #: src/exec_gr.cpp:1209 msgid "Draw bars for 1D data" msgstr "Gráfica de barras para 1D" #: src/exec_gr.cpp:1211 msgid "Draw belts" msgstr "Gráfica de correas" #: src/exec_gr.cpp:1212 msgid "Draw belts colored by other data" msgstr "Gráfica de correas coloreada por otros datos" #: src/exec_gr.cpp:1276 msgid "Draw binormales for 1D data" msgstr "Gráfica de binormales para datos 1D" #: src/exec_prm.cpp:656 msgid "Draw bitmap (logo) along axis range" msgstr "Graficar imagen (logo) en el rango de ejes" #: src/exec_prm.cpp:633 msgid "Draw bounding box" msgstr "Graficar bordes" #: src/exec_gr.cpp:1215 msgid "Draw boxes" msgstr "Diagrama de cajas" #: src/exec_gr.cpp:1214 msgid "Draw boxplot for 2D data" msgstr "Diagrama de cajas para datos 2D" #: src/exec_gr.cpp:1216 msgid "Draw candlestick chart" msgstr "Diagrama de velas" #: src/exec_gr.cpp:1217 msgid "Draw chart" msgstr "Gráfica de cuadros" #: src/exec_prm.cpp:634 msgid "Draw circle" msgstr "Graficar círculo" #: src/exec_gr.cpp:1218 msgid "Draw cloud" msgstr "Gráfica de nube" #: src/exec_prm.cpp:636 msgid "Draw colorbar" msgstr "Graficar barra de colores" #: src/exec_prm.cpp:637 msgid "Draw cone" msgstr "Dibujar cono" #: src/exec_gr.cpp:1219 msgid "Draw cones for 1D data" msgstr "Gráfica de conos para datos 1D" #: src/exec_gr.cpp:1220 msgid "Draw contour lines" msgstr "Gráfica de curvas de nivel" #: src/exec_gr.cpp:1230 msgid "Draw contour lines at x-slice (or x-plane)" msgstr "Curvas de nivel en el plano x" #: src/exec_gr.cpp:1231 msgid "Draw contour lines at y-slice (or y-plane)" msgstr "Curvas de nivel en el plano y" #: src/exec_gr.cpp:1232 msgid "Draw contour lines at z-slice (or z-plane)" msgstr "Curvas de nivel en el plano z" #: src/exec_gr.cpp:1221 msgid "Draw contour lines for 3D data" msgstr "Gráfica de curvas de nivel para datos 3D" #: src/exec_gr.cpp:1283 msgid "Draw contour lines for surface of triangles" msgstr "Curvas de nivel para superficie de triángulos" #: src/exec_gr.cpp:1228 msgid "Draw contour lines on parametric surface" msgstr "Curvas de nivel sobre superficie paramétrica" #: src/exec_gr.cpp:1229 msgid "Draw contour tubes" msgstr "Cilindros de nivel" #: src/exec_gr.cpp:1284 msgid "Draw contour tubes for surface of triangles" msgstr "Cilindros de nivel para superficie de triángulos" #: src/exec_prm.cpp:638 msgid "Draw curve" msgstr "Graficar curva" #: src/exec_gr.cpp:1286 msgid "Draw curve by tube" msgstr "Graficar curva tubular" #: src/exec_gr.cpp:1234 #, fuzzy msgid "Draw curves of cross-section of isosurfaces a,b for 3D data" msgstr "Isosuperficie para datos 3D" #: src/exec_gr.cpp:1235 msgid "Draw density plot" msgstr "Gráfica de densidad" #: src/exec_gr.cpp:1236 msgid "Draw density plot at slices of 3D data" msgstr "Gráfica de densidad para secciones de datos 3D data" #: src/exec_gr.cpp:1237 msgid "Draw density plot at x-slice (or x-plane)" msgstr "Gráfica de densidad en el plano x" #: src/exec_gr.cpp:1238 msgid "Draw density plot at y-slice (or y-plane)" msgstr "Gráfica de densidad en el plano y" #: src/exec_gr.cpp:1239 msgid "Draw density plot at z-slice (or z-plane)" msgstr "Gráfica de densidad en el plano z" # Esquema de gotas? #: src/exec_gr.cpp:1240 msgid "Draw dew plot" msgstr "Gráfica de gotas" #: src/exec_gr.cpp:1241 msgid "Draw dots for arbitrary data points" msgstr "Diagrama de puntos para datos arbitrarios" #: src/exec_prm.cpp:639 msgid "Draw drop" msgstr "Graficar gota" #: src/exec_prm.cpp:640 msgid "Draw ellipse" msgstr "Graficar elipse" #: src/exec_prm.cpp:641 msgid "Draw error box" msgstr "Graficar caja de error" #: src/exec_gr.cpp:1242 msgid "Draw error boxes" msgstr "Graficar cajas de error" #: src/exec_prm.cpp:642 msgid "Draw face (quadrangle)" msgstr "Graficar faceta (cuadrángulo)" #: src/exec_prm.cpp:643 msgid "Draw face perpendicular to x-axis" msgstr "Graficar faceta perpendicular al eje x" #: src/exec_prm.cpp:644 msgid "Draw face perpendicular to y-axis" msgstr "Graficar faceta perpendicular al eje y" #: src/exec_prm.cpp:645 msgid "Draw face perpendicular to z-axis" msgstr "Graficar faceta perpendicular al eje z" #: src/exec_gr.cpp:1263 msgid "Draw filled region (ribbon) between 2 curves" msgstr "Graficar región rellena (banda) entre dos curbas" #: src/exec_gr.cpp:1258 msgid "Draw flow pipes for vector field" msgstr "Graficar tubos de flujo de campo vectorial" #: src/exec_gr.cpp:1244 msgid "Draw flow threads for vector field" msgstr "Graficar líneas de flujo para campo vectorial" #: src/exec_gr.cpp:1246 msgid "Draw flow threads from plain for vector field" msgstr "Graficar de líneas de flujo desde plano para campo vectorial" #: src/exec_gr.cpp:1247 msgid "Draw gradient lines for scalar field" msgstr "Graficar líneas de gradiente para campo escalar" #: src/exec_prm.cpp:650 msgid "Draw grid" msgstr "Graficar grilla" #: src/exec_gr.cpp:1249 msgid "Draw grid at slices of 3D data" msgstr "Graficar grilla para cortes de datos 3D" #: src/exec_gr.cpp:1248 msgid "Draw grid for data array(s)" msgstr "Graficar grilla para arreglo(s) de datos" #: src/exec_gr.cpp:1208 msgid "Draw horizontal bars for 1D data" msgstr "Graficar barras horizontales pata datos 1D" #: src/exec_gr.cpp:1279 msgid "Draw horizontal tiles" msgstr "Graficar baldosas horizontales" #: src/exec_gr.cpp:1280 msgid "Draw horizontal tiles with variable size" msgstr "Baldosas horizontales con tamaño variable" #: src/exec_gr.cpp:1268 msgid "Draw isosurface for 3D data" msgstr "Isosuperficie para datos 3D" #: src/exec_gr.cpp:1271 msgid "Draw isosurface for 3D data colored and transpared by other data" msgstr "" "Isosuperficie para datos 3D coloreados y con transparencia de otros datos" #: src/exec_gr.cpp:1270 msgid "Draw isosurface for 3D data colored by other data" msgstr "Isosuperficie para datos 3D coloreada por otros datos" #: src/exec_gr.cpp:1269 msgid "Draw isosurface for 3D data transpared by other data" msgstr "Isosuperficie para datos 3D con transparencia de otros datos" #: src/exec_gr.cpp:1251 msgid "Draw label at arbitrary position" msgstr "Etiqueta en posición arbitraria" #: src/exec_prm.cpp:635 #, fuzzy msgid "Draw label for colorbar" msgstr "Etiqueta para eje t" #: src/exec_prm.cpp:664 msgid "Draw label for t-axis" msgstr "Etiqueta para eje t" #: src/exec_prm.cpp:665 msgid "Draw label for x-axis" msgstr "Etiqueta para el eje x" #: src/exec_prm.cpp:666 msgid "Draw label for y-axis" msgstr "Etiqueta para el eje y" #: src/exec_prm.cpp:667 msgid "Draw label for z-axis" msgstr "Etiqueta para el eje z" #: src/exec_prm.cpp:654 msgid "Draw legend" msgstr "Graficar leyenda" #: src/exec_prm.cpp:655 msgid "Draw line" msgstr "Graficar recta" #: src/exec_gr.cpp:1253 #, fuzzy msgid "Draw lines with arrows for 1D data" msgstr "Gráfica de barras para 1D" #: src/exec_gr.cpp:1254 msgid "Draw mapping plot" msgstr "Gráfica de mapeo" #: src/exec_gr.cpp:1255 msgid "Draw mark plot for 1D data" msgstr "Gráfica de marcas para datos 1D" #: src/exec_gr.cpp:1256 msgid "Draw mesh surface" msgstr "Graficar grilla de superficie" #: src/exec_prm.cpp:632 msgid "Draw point (ball)" msgstr "Graficar punto (esfera)" #: src/exec_prm.cpp:657 msgid "Draw polygon" msgstr "Graficar polígono" #: src/exec_gr.cpp:1210 msgid "Draw quasi-optical beam" msgstr "Graficar haz cuasióptico" #: src/exec_gr.cpp:1262 msgid "Draw radar chart" msgstr "Diagrama de radar" #: src/exec_gr.cpp:1233 msgid "Draw reconstructed surface for arbitrary data points" msgstr "Graficar superficie reconstruida para puntos arbitrarios" #: src/exec_prm.cpp:658 msgid "Draw rectangle" msgstr "Graficar rectángulo" #: src/exec_prm.cpp:659 msgid "Draw rhombus" msgstr "Graficar rombo" #: src/exec_gr.cpp:1225 msgid "Draw solid contour lines at x-slice (or x-plane)" msgstr "Curvas de nivel rellenas en el plano x" #: src/exec_gr.cpp:1226 msgid "Draw solid contour lines at y-slice (or y-plane)" msgstr "Curvas de nivel rellenas en el plano y" #: src/exec_gr.cpp:1227 msgid "Draw solid contour lines at z-slice (or z-plane)" msgstr "Curvas de nivel rellenas en el plano z" #: src/exec_gr.cpp:1224 msgid "Draw solid contour lines for 3D data" msgstr "Isosuperficies rellenas para datos 3D" #: src/exec_gr.cpp:1223 msgid "Draw solid contours" msgstr "Curvas de nivel rellenas" #: src/exec_gr.cpp:1222 msgid "Draw solid contours with manual colors" msgstr "Curvas de nivel rellenas con coloración manual" #: src/exec_gr.cpp:1267 msgid "Draw solid surface" msgstr "Graficar superficie sólida" #: src/exec_gr.cpp:1274 msgid "Draw solid surface colored and transpared by other data" msgstr "Superficie sólida con color y transparencia de otros datos" #: src/exec_gr.cpp:1273 msgid "Draw solid surface colored by other data" msgstr "Superficie sólida con coloración de otros datos" #: src/exec_gr.cpp:1272 msgid "Draw solid surface transpared by other data" msgstr "Superficie sólida con transparencia de otros datos" #: src/exec_prm.cpp:660 msgid "Draw sphere" msgstr "Graficar esfera" #: src/exec_gr.cpp:1264 msgid "Draw stem plot for 1D data" msgstr "Gráfica de tallos para datos 1D" #: src/exec_gr.cpp:1265 msgid "Draw step plot for 1D data" msgstr "Gráfica escalonada para datos 1D" #: src/exec_gr.cpp:1281 msgid "Draw surface of curve rotation" msgstr "Graficar superficie de rotación" #: src/exec_gr.cpp:1261 msgid "Draw surface of quadrangles" msgstr "Graficar superficie de cuadrángulos" #: src/exec_gr.cpp:1285 msgid "Draw surface of triangles" msgstr "Graficar superficie de triángulos" #: src/exec_gr.cpp:1207 msgid "Draw surfaces of contour lines rotation" msgstr "Superficie de rotación de curvas de nivel" #: src/exec_gr.cpp:1275 msgid "Draw table with data values" msgstr "Graficar tabla de valores" #: src/exec_gr.cpp:1277 msgid "Draw tension plot for 1D data" msgstr "Gráfica de tensión para datos 1D" #: src/exec_prm.cpp:662 msgid "Draw text at some position or along curve" msgstr "Texto en posición especifica o curva" #: src/exec_prm.cpp:661 msgid "Draw user-defined symbol at given position and direction" msgstr "Símbolo personalizado en posición y dirección dadas" #: src/exec_gr.cpp:1259 msgid "Draw usual plot for 1D data" msgstr "Gráfica estándar para datos 1D" #: src/exec_gr.cpp:1287 msgid "Draw vector field" msgstr "Campo vectorial" #: src/exec_gr.cpp:1288 msgid "Draw vector field at slices of 3D data" msgstr "Campo vectorial de cortes de datos 3D" #: src/exec_gr.cpp:1282 msgid "Draw vectors along a curve" msgstr "Vectores a lo largo de curva" #: src/exec_gr.cpp:1243 msgid "Draw waterfalls" msgstr "Gráfica de cascadas" #: udav/plot_pnl.cpp:112 udav/plot_pnl.cpp:131 msgid "Drawing time %1 ms" msgstr "Tiempo de graficación %1 ms" #: udav/newcmd_dlg.cpp:169 mgllab/dialogs.cpp:710 msgid "Dual plots" msgstr "Gráficas duales" #. L #: udav/style_dlg.cpp:244 mgllab/dialogs.cpp:52 msgid "E - darklawn" msgstr "E - verde pasto oscuro" #: mgllab/dialogs.cpp:1469 msgid "Edges" msgstr "Bordes" #: udav/text_pnl.cpp:84 mgllab/mgllab.cpp:298 msgid "Edit" msgstr "Editar" #: udav/mem_pnl.cpp:59 msgid "Edit selected data array" msgstr "Editor arreglo de datos seleccionado" #: udav/calc_dlg.cpp:193 msgid "Elliptic" msgstr "Elíptico" #: udav/prop_dlg.cpp:171 mgllab/mgllab.cpp:481 msgid "Enable keywords completion" msgstr "Completar palabras clave" #. pure = new QCheckBox(_("Disable face drawing (faster) for mouse rotation/shift/zoom."), this); #. pure->setChecked(mglAutoPure); v->addWidget(pure); pure->setEnabled(false); #: udav/prop_dlg.cpp:169 mgllab/mgllab.cpp:483 msgid "Enable mouse wheel for zooming" msgstr "Rueda del mouse para el zoom" #: mgllab/dialogs.cpp:1463 msgid "End" msgstr "Fin" #: udav/prop_dlg.cpp:141 msgid "English" msgstr "Inglés" #. TODO show dialog for color scheme #: udav/dat_pnl.cpp:255 udav/dat_pnl.cpp:277 mgllab/table.cpp:477 #: mgllab/table.cpp:490 msgid "Enter color scheme" msgstr "Ingresar esquema de colores" #: udav/dat_pnl.cpp:261 udav/dat_pnl.cpp:283 msgid "Enter data name" msgstr "Ingresar nombre de datos" #: mgllab/table.cpp:523 msgid "" "Enter formula for data modification\n" "Here x, y, z in range [0,1], u is data value" msgstr "" "Ingresar fórmula para modificar datos\n" "Aquí, x, y, z están en [0,1], u es valor de dato" #: udav/mem_pnl.cpp:85 mgllab/help.cpp:246 msgid "Enter name for new variable" msgstr "Ingresar nombre para nueva variable" #. this is HDF file #. TODO add dialog with choice of HDF names #: mgllab/table.cpp:436 msgid "Enter name of data" msgstr "Ingresar nombre de datos" #: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436 msgid "Enter new data sizes" msgstr "Nuevo tamaño para datos" #: mgllab/table.cpp:28 msgid "Enter number for addition to data values" msgstr "Número para sumar a valores" #: mgllab/table.cpp:58 msgid "Enter number for division of data values" msgstr "Número para división de valores" #: mgllab/table.cpp:48 msgid "Enter number for multiplication of data values" msgstr "Número para multiplicación por valores" #: mgllab/table.cpp:38 msgid "Enter number for subtraction from data values" msgstr "Número para restar de valores" #: widgets/qt.cpp:953 msgid "Enter number of vertexes" msgstr "Ingresar número de vertices" #: udav/dat_pnl.cpp:351 msgid "Enter range for data and direction of filling" msgstr "Rango para datos y dirección de llenado" #: udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377 msgid "Enter range for final data" msgstr "Rango para datos finales" #: udav/dat_pnl.cpp:424 msgid "Enter range of saved date." msgstr "Rango para datos guardados." #: udav/dat_pnl.cpp:485 msgid "Enter slice id:" msgstr "Ingresar id del corte:" #: udav/dat_pnl.cpp:413 msgid "" "Enter step of saved points. For example, '1' save all, '2' save each 2nd " "point, '3' save each 3rd and so on." msgstr "" "Ingresar distancia para guardar puntos. Ejemplos: '1' todo, '2' cada 2 " "puntos, '3' cada tres puntos, etc." #: widgets/qt.cpp:962 msgid "Enter text" msgstr "Ingresar texto" #: mgllab/dialogs.cpp:860 mgllab/dialogs.cpp:866 #, c-format msgid "Enter value for %s argument" msgstr "Ingresar valor para argumento %s" #: mgllab/table.cpp:166 mgllab/table.cpp:786 msgid "Envelop" msgstr "Envoltura" #: src/exec_dat.cpp:1752 msgid "Erode data larger val" msgstr "Erosionar datos" #: mgllab/editor.cpp:352 #, c-format msgid "" "Error reading from file '%s':\n" "%s." msgstr "" "Error al leer archivo \"%s\":\n" "%s." # Viewer=visor? #: src/export.cpp:629 src/export.cpp:638 src/export.cpp:645 #, c-format msgid "Error to call external viewer\n" msgstr "Error al ejecutar visor externo\n" #: mgllab/editor.cpp:363 #, c-format msgid "" "Error writing to file '%s':\n" "%s." msgstr "" "Error al escribir al archivo \"%s\"s:\n" "%s." #: src/exec_dat.cpp:1753 msgid "" "Evaluate (interpolate) values of array Dat at points i=idat,j=jdat,k=kdat" msgstr "" "Evaluar (interpolar) valores de arreglo Dat en los puntos i=idat,j=jdat," "k=kdat" #. {"defpal",_("Define parameter as palette color"),"defpal $N val", 0, 6}, #: src/parser.cpp:1497 msgid "Execute if condition is false" msgstr "Ejecutar si condición es falsa" #: mgllab/mgllab.cpp:479 msgid "Execute script after loading" msgstr "Ejecutar script al cargarlo" #: widgets/qt.cpp:1149 udav/plot_pnl.cpp:334 msgid "Execute script and redraw graphics (F5)." msgstr "Ejecutar script y volver a graficar (F5)." #: src/parser.cpp:1490 msgid "Execute script in external file" msgstr "Ejecutar script de archivo externo" #: mgllab/help.cpp:148 msgid "Existing data arrays" msgstr "Arreglos de datos existentes" #: mgllab/mgllab.cpp:296 msgid "Exit" msgstr "Salir" #: udav/calc_dlg.cpp:192 msgid "Exp and log" msgstr "Exp y log" #: udav/calc_dlg.cpp:194 msgid "Exp-integrals" msgstr "Integrales exp" #: mgllab/table.cpp:473 msgid "Export Data?" msgstr "¿Exportar datos?" #: widgets/fltk.cpp:821 msgid "Export as ..." msgstr "Exportar como ..." #: widgets/qt.cpp:1084 udav/plot_pnl.cpp:475 msgid "Export as 2D ..." msgstr "Exportar como 2D ..." #: widgets/qt.cpp:1093 udav/plot_pnl.cpp:485 msgid "Export as 3D ..." msgstr "Exportar como 3D ..." #: src/exec_dat.cpp:1754 mgllab/table.cpp:846 msgid "Export data to PNG file" msgstr "Exportar a PNG" #. fname = new QLineEdit(this); a->addWidget(fname); #: udav/anim_dlg.cpp:82 msgid "Export to GIF" msgstr "Exportar a GIF" #: mgllab/table.cpp:754 msgid "Export to PNG" msgstr "Exportar a PNG" #: src/exec_dat.cpp:1755 msgid "Extend data array" msgstr "Extender arreglo de datos" #: mgllab/table.cpp:343 msgid "Extract data" msgstr "Extraer datos" #: src/exec_dat.cpp:1818 msgid "Extract sub-array" msgstr "Extraer subarreglo" #: src/exec_dat.cpp:1810 msgid "Extract sub-array between values" msgstr "Extraer subarreglo entre valores" #: mgllab/dialogs.cpp:962 msgid "Factor" msgstr "Factorizar" #. file menu #: widgets/qt.cpp:1083 udav/udav_wnd.cpp:281 udav/dat_pnl.cpp:681 #: mgllab/mgllab.cpp:283 mgllab/table.cpp:750 msgid "File" msgstr "Archivo" #: udav/text_pnl.cpp:405 udav/text_pnl.cpp:489 msgid "File %1 saved" msgstr "Archivo %1 guardado" #: mgllab/mgllab.cpp:233 msgid "File exist. Overwrite it?" msgstr "¿Sobreescribir archivo existente?" #: udav/text_pnl.cpp:583 msgid "File name" msgstr "Nombre de archivo" #: mgllab/mgllab.cpp:309 msgid "File path" msgstr "Ubicación de archivo" #: mgllab/dialogs.cpp:1073 msgid "File to export" msgstr "Archivo a exportar" #: mgllab/editor.cpp:271 mgllab/mgllab.cpp:403 msgid "File/Recent files" msgstr "Archivo/Archivos recientes" #: mgllab/table.cpp:767 msgid "Fill" msgstr "Llenar" #: udav/dat_pnl.cpp:611 mgllab/table.cpp:856 msgid "Fill data by formula" msgstr "Llenar datos por fórmula" #: src/exec_dat.cpp:1763 msgid "Fill data by global spline of Vdat" msgstr "Llenar datos con spline global de Vdat" #: src/exec_dat.cpp:1802 msgid "Fill data by interpolation of Vdat" msgstr "Llenar datos por interpolación de Vdat" #: src/exec_dat.cpp:1741 msgid "Fill data by triangulated values" msgstr "Llenar datos con valores triángulados" #: src/exec_dat.cpp:1757 msgid "Fill data linearly in range [v1, v2]" msgstr "Llenar datos linealmente en rango [v1, v2]" #: mgllab/table.cpp:578 mgllab/table.cpp:592 msgid "Fill in range" msgstr "Llenar en rango" #: src/exec_dat.cpp:1758 msgid "Fill x-,k-samples for transforms" msgstr "Llenar muestreo x o k para transformada" #: src/random.cpp:345 msgid "Fills by fractional brownian motion" msgstr "" #: src/random.cpp:351 msgid "Fills by random integers uniformly chosen in [lo, hi)" msgstr "" #: src/random.cpp:343 msgid "" "Fills by random numbers according to Bernoulli distribution with probability " "p" msgstr "" #: src/random.cpp:348 msgid "Fills by random numbers according to Gaussian distribution" msgstr "" #: src/random.cpp:344 msgid "" "Fills by random numbers according to binomial distribution in n coin flips " "with probability p" msgstr "" #: src/random.cpp:346 msgid "Fills by random numbers according to discrete distribution" msgstr "" #: src/random.cpp:347 msgid "" "Fills by random numbers according to exponential distribution with " "probability p" msgstr "" #: src/random.cpp:350 msgid "Fills by random numbers uniformly chosen in [lo,hi)" msgstr "" #: udav/find_dlg.cpp:48 mgllab/editor.cpp:564 msgid "Find" msgstr "Buscar" #: src/exec_dat.cpp:1737 msgid "Find correlation between data arrays" msgstr "Correlación entre arreglos de datos" #: src/exec_dat.cpp:1751 msgid "Find envelop for the data" msgstr "Envoltura para datos" #: udav/dat_pnl.cpp:624 msgid "Find envelope along direction(s)" msgstr "Envoltura a lo largo de dirección(es)" #: src/exec_dat.cpp:1759 #, fuzzy msgid "Find first indexes of values larger val over direction" msgstr "Valor minimal en una dirección" #: udav/dat_pnl.cpp:804 msgid "Find histogram of data." msgstr "Histograma de datos." #: src/exec_dat.cpp:1773 #, fuzzy msgid "Find last indexes of values larger val over direction" msgstr "Valor maximal en una dirección" #: src/exec_dat.cpp:1776 msgid "Find maximal value over direction" msgstr "Valor maximal en una dirección" #: src/exec_dat.cpp:1777 msgid "Find minimal value over direction" msgstr "Valor minimal en una dirección" #: udav/text_pnl.cpp:551 mgllab/mgllab.cpp:307 msgid "Find next" msgstr "Buscar siguiente" #: mgllab/editor.cpp:520 msgid "Find or replace text" msgstr "Buscar o reemplazar texto" #: src/exec_dat.cpp:1814 msgid "Find root Dat[i,j,k]=val (inverse evaluate)" msgstr "Encontrar raíz Dat[i,j,k]=val (evaluación inversa)" #: src/exec_dat.cpp:1806 msgid "Find roots using data as initial values" msgstr "Encontrar raíces usando datos como valores iniciales" #: src/exec_dat.cpp:1820 msgid "Find summation over direction" msgstr "Suma en una dirección" #: src/exec_dat.cpp:1826 msgid "Find triangles of randomly placed points" msgstr "Triangulación de puntos arbitrarios" #: udav/find_dlg.cpp:36 mgllab/editor.cpp:563 msgid "Find what:" msgstr "Buscar:" #: udav/text_pnl.cpp:546 mgllab/editor.cpp:562 msgid "Find/Replace" msgstr "Buscar/Reemplazar" #: mgllab/mgllab.cpp:306 msgid "Find|Replace" msgstr "Buscar|Reemplazar" #: src/parser.cpp:1499 msgid "Finish if/else block" msgstr "Terminar bloque \"if/else\"" #: mgllab/table.cpp:806 msgid "First cell" msgstr "Primera celda" #: udav/dat_pnl.cpp:721 mgllab/table.cpp:802 msgid "First slice" msgstr "Primera sección" #: src/exec_dat.cpp:1760 src/exec_dat.cpp:1761 msgid "Fit data to formula" msgstr "Ajustar datos a fórmula" #: udav/text_pnl.cpp:567 mgllab/mgllab.cpp:313 msgid "Fitted formula" msgstr "Fórmula ajustada" #: udav/prop_dlg.cpp:103 msgid "FlowKey" msgstr "FlowKey" #: mgllab/dialogs.cpp:1009 msgid "Fog" msgstr "Niebla" #: mgllab/dialogs.cpp:1010 msgid "Fog dist." msgstr "Dist. niebla" #: mgllab/mgllab.cpp:543 msgid "Folder for help files" msgstr "Fólder de archivos de ayuda" #: udav/text_pnl.cpp:587 mgllab/mgllab.cpp:310 msgid "Folder path" msgstr "Ubicación de directorio" #: udav/setup_dlg.cpp:105 mgllab/dialogs.cpp:1007 msgid "Font" msgstr "Fuente" #: mgllab/mgllab.cpp:534 msgid "Font file name" msgstr "Nombre de archivo de fuente" #: udav/prop_dlg.cpp:199 msgid "Font files (*.vfm)" msgstr "Archivos de fuente (*.vfm)" #: mgllab/mgllab.cpp:470 msgid "Font kind" msgstr "Tipo de fuente" #: mgllab/mgllab.cpp:472 msgid "Font size" msgstr "Tamaño de fuente" #: udav/style_dlg.cpp:183 msgid "Font style" msgstr "Estilo de fuente" #: udav/setup_dlg.cpp:107 msgid "FontSize" msgstr "FontSize" #: src/parser.cpp:1500 msgid "For loop" msgstr "Bucle \"for\"" #: udav/help_pnl.cpp:52 msgid "Forward" msgstr "Adelante" #: udav/plot_pnl.cpp:193 msgid "Frame %1 of %2" msgstr "Cuadro %1 de %2" #: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377 #: udav/dat_pnl.cpp:424 udav/dat_pnl.cpp:452 mgllab/table.cpp:608 msgid "From" msgstr "Desde" #: mgllab/mgllab.cpp:602 msgid "Function" msgstr "Función" #. B #: udav/style_dlg.cpp:238 mgllab/dialogs.cpp:46 msgid "G - green" msgstr "G - verde" #: src/export.cpp:306 src/export.cpp:375 src/export.cpp:388 msgid "GIF support was disabled. Please, enable it and rebuild MathGL." msgstr "Formato GIF deshabilitado. Habilítelo y recompile MathGL." #: udav/newcmd_dlg.cpp:178 udav/setup_dlg.cpp:112 mgllab/dialogs.cpp:719 #: mgllab/dialogs.cpp:1001 msgid "General setup" msgstr "Config. general" #: src/exec_dat.cpp:1771 msgid "Get Jacobian" msgstr "Obtener Jacobiano" #: src/exec_dat.cpp:1735 msgid "Get contour lines for dat[i,j]=val, separated by NAN" msgstr "" #: src/exec_dat.cpp:1732 msgid "Get data column filled by formula on column ids" msgstr "Llenar columna de datos por fórmula en ids de columnas" #: src/exec_dat.cpp:1809 msgid "Get formatted data from file" msgstr "Obtener datos con formato de archivo" #: src/exec_dat.cpp:1734 msgid "" "Get indexes or resort data for found connected surfaces dependent on j,k" msgstr "" #: src/exec_dat.cpp:1780 msgid "Get momentum along direction" msgstr "Obtener el momento en una dirección" #: src/exec_dat.cpp:1756 #, fuzzy msgid "Get positions of local maximums and minimums" msgstr "Especificar posición de gráfica en matriz" #: src/exec_dat.cpp:1790 msgid "Get pulse properties" msgstr "Obtener propiedades de pulso" #: src/exec_dat.cpp:1822 msgid "Get trace of array" msgstr "Obtener la traza de un arreglo" #: src/base_cf.cpp:86 #, c-format msgid "Global message - %s\n" msgstr "Mensaje global - %s\n" #: udav/dat_pnl.cpp:723 mgllab/table.cpp:867 msgid "Go to first slice for 3D data (Ctrl-F1)." msgstr "Ir a primera sección de datos 3D (Ctrl-F1)." #: udav/dat_pnl.cpp:753 mgllab/table.cpp:871 msgid "Go to last slice for 3D data (Ctrl-F4)." msgstr "Ir a última sección de datos 3D (Ctrl-F4)." #: udav/dat_pnl.cpp:740 msgid "Go to slice" msgstr "Ir a sección" #: udav/dat_pnl.cpp:747 msgid "Go to the next slice for 3D data." msgstr "Ir a la sgte. sección de datos 3D." #: udav/dat_pnl.cpp:729 msgid "Go to the previous slice for 3D data." msgstr "Ir a la sección previa de datos 3D." #: udav/dat_pnl.cpp:735 udav/dat_pnl.cpp:742 msgid "Go to the specified slice for 3D data." msgstr "Ir a la sección especificada de datos 3D." #: widgets/qt.cpp:1112 widgets/qt.cpp:1114 udav/plot_pnl.cpp:67 #: mgllab/mgllab.cpp:325 msgid "Graphics" msgstr "Gráfica" #: udav/text_pnl.cpp:596 msgid "Graphics setup" msgstr "Config. gráfica" #: widgets/fltk.cpp:970 msgid "Graphics/Adjust size" msgstr "Gráfica/Ajustar tamaño" #. ----------------------------------------------------------------------------- #: widgets/fltk.cpp:964 widgets/fltk.cpp:1094 msgid "Graphics/Alpha" msgstr "Gráfica/Alfa" #: widgets/fltk.cpp:999 msgid "Graphics/Animation/Next frame" msgstr "Gráfica/Animación/Sgte. cuadro" #: widgets/fltk.cpp:1000 msgid "Graphics/Animation/Prev frame" msgstr "Gráfica/Animación/Ant. cuadro" #: mgllab/mgllab.cpp:377 msgid "Graphics/Animation/Setup animation" msgstr "Gráfica/Animación/Animación" #: widgets/fltk.cpp:998 widgets/fltk.cpp:1096 msgid "Graphics/Animation/Slideshow" msgstr "Gráfica/Animación/Presentacion" #: widgets/fltk.cpp:974 msgid "Graphics/Copy click coor." msgstr "Gráfica/Copiar coord. al clicar" #: widgets/fltk.cpp:973 msgid "Graphics/Copy graphics" msgstr "Gráfica/Copiar gráfica" #: widgets/fltk.cpp:987 msgid "Graphics/Export/as BMP" msgstr "Gráfica/Exportar/como BMP" #: widgets/fltk.cpp:985 msgid "Graphics/Export/as GIF" msgstr "Gráfica/Exportar/como GIF" #: widgets/fltk.cpp:982 msgid "Graphics/Export/as JPEG" msgstr "Gráfica/Exportar/como JPEG" #: widgets/fltk.cpp:993 msgid "Graphics/Export/as OBJ" msgstr "Gráfica/Exportar/como OBJ" #: widgets/fltk.cpp:994 msgid "Graphics/Export/as OFF" msgstr "Gráfica/Exportar/como OFF" #: widgets/fltk.cpp:978 msgid "Graphics/Export/as PNG" msgstr "Gráfica/Exportar/como PNG" #: widgets/fltk.cpp:992 msgid "Graphics/Export/as PRC" msgstr "Gráfica/Exportar/como PRC" #: widgets/fltk.cpp:995 msgid "Graphics/Export/as STL" msgstr "Gráfica/Exportar/como STL" #: widgets/fltk.cpp:988 msgid "Graphics/Export/as SVG" msgstr "Gráfica/Exportar/como SVG" #: widgets/fltk.cpp:991 msgid "Graphics/Export/as TeX" msgstr "Gráfica/Exportar/como TeX" #: widgets/fltk.cpp:996 msgid "Graphics/Export/as XYZ" msgstr "Gráfica/Exportar/como XYZ" #: widgets/fltk.cpp:990 msgid "Graphics/Export/as bitmap EPS" msgstr "Gráfica/Exportar/como mapa de bits EPS" #: widgets/fltk.cpp:979 msgid "Graphics/Export/as solid PNG" msgstr "Gráfica/Exportar/como PNG sólido" #: widgets/fltk.cpp:989 msgid "Graphics/Export/as vector EPS" msgstr "Gráfica/Exportar/como EPS vectorial" #: widgets/fltk.cpp:966 widgets/fltk.cpp:1097 msgid "Graphics/Grid" msgstr "Gráfica/Grilla" #: widgets/fltk.cpp:965 widgets/fltk.cpp:1095 msgid "Graphics/Light" msgstr "Gráfica/Luz" #: widgets/fltk.cpp:975 widgets/fltk.cpp:1098 mgllab/mgllab.cpp:378 msgid "Graphics/Pause calc" msgstr "Gráfica/Pausar calc." #: mgllab/mgllab.cpp:376 msgid "Graphics/Primitive" msgstr "Gráfica/Primitiva" #: widgets/fltk.cpp:969 msgid "Graphics/Redraw" msgstr "Gráfica/Redibujar" #: widgets/fltk.cpp:971 msgid "Graphics/Reload data" msgstr "Gráfica/Volver a cargar datos" #: widgets/fltk.cpp:968 msgid "Graphics/Restore" msgstr "Gráfica/Reestablecer" #: widgets/fltk.cpp:972 msgid "Graphics/Stop" msgstr "Gráfica/Detener" #: widgets/fltk.cpp:1006 msgid "Graphics/Transform/Move down" msgstr "Gráfica/Transformar/Mover abajo" #: widgets/fltk.cpp:1002 msgid "Graphics/Transform/Move left" msgstr "Gráfica/Transformar/Mover izq." #: widgets/fltk.cpp:1007 msgid "Graphics/Transform/Move right" msgstr "Gráfica/Transformar/Mover der." #: widgets/fltk.cpp:1003 msgid "Graphics/Transform/Move up" msgstr "Gráfica/Transformar/Mover arriba" #: widgets/fltk.cpp:1004 msgid "Graphics/Transform/Zoom in" msgstr "Gráfica/Transformar/Acercar" #: widgets/fltk.cpp:1005 msgid "Graphics/Transform/Zoom out" msgstr "Gráfica/Transformar/Alejar" #: udav/plot_pnl.cpp:305 msgid "Grid" msgstr "Grilla" #: udav/newcmd_dlg.cpp:50 mgllab/dialogs.cpp:705 msgid "Groups of MGL commands" msgstr "Grupos de comandos de MGL" #. P #: udav/style_dlg.cpp:249 mgllab/dialogs.cpp:57 msgid "H - darkgray" msgstr "H - gris oscuro" #: src/data_io.cpp:1204 msgid "HDF4 support was disabled. Please, enable it and rebuild MathGL." msgstr "Formato HDF4 deshabilitado. Habilítelo y recompile MathGL." #: src/complex_io.cpp:924 src/complex_io.cpp:926 src/data_io.cpp:1359 #: src/data_io.cpp:1361 src/data_io.cpp:1363 src/data_io.cpp:1365 #: src/data_io.cpp:1367 src/data_io.cpp:1369 src/data_io.cpp:1371 msgid "HDF5 support was disabled. Please, enable it and rebuild MathGL." msgstr "Formato HDF5 deshabilitado. Habilítelo y recompile MathGL." #: mgllab/table.cpp:165 mgllab/table.cpp:781 msgid "Hankel" msgstr "Hankel" #: udav/dat_pnl.cpp:622 msgid "Hankel transform along direction(s)" msgstr "Transformada de Hankel en alguna(s) dirección(es)" #: src/exec_dat.cpp:1764 msgid "Hankel transform at some direction" msgstr "Transformada de Hankel en alguna dirección" #: udav/subplot_dlg.cpp:84 msgid "Height of selected cells" msgstr "Altura de celdas seleccionadas" #: widgets/qt.cpp:1293 udav/help_pnl.cpp:57 udav/udav_wnd.cpp:231 #: udav/udav_wnd.cpp:323 mgllab/mgllab.cpp:335 mgllab/mgllab.cpp:336 #: mgllab/mgllab.cpp:364 msgid "Help" msgstr "Ayuda" #: udav/newcmd_dlg.cpp:73 msgid "" "Here you can specify command options.\n" "Options are used for additional plot tunning." msgstr "" "Aquí puede especificar opciones de comando.\n" "Úselas para configuración adicional del gráfico." #: udav/udav_wnd.cpp:186 mgllab/mgllab.cpp:304 msgid "Hidden plots" msgstr "Gráficos ocultos" #: udav/plot_pnl.cpp:432 msgid "Hide selected" msgstr "Ocultar seleccionados" #: udav/plot_pnl.cpp:434 msgid "Hide selected plots." msgstr "Ocultar gráficos seleccionados." #: udav/prop_dlg.cpp:173 mgllab/mgllab.cpp:482 msgid "Highlight current object(s)" msgstr "Resaltar objeto(s) actuales" #: udav/udav_wnd.cpp:328 mgllab/mgllab.cpp:337 msgid "Hints" msgstr "Consejos" #: udav/dat_pnl.cpp:802 msgid "Histogram (Ctrl+Shift+H)" msgstr "Histograma (Ctrl+Shift+H)" #: udav/subplot_dlg.cpp:51 udav/subplot_dlg.cpp:68 udav/subplot_dlg.cpp:93 msgid "Horizontal size" msgstr "Tamaño horizontal" #: udav/calc_dlg.cpp:192 msgid "Hyperbolic" msgstr "Hiperbólicas" #: udav/setup_dlg.cpp:116 msgid "ID" msgstr "ID" #: mgllab/mgllab.cpp:339 msgid "Icon list" msgstr "Lista de íconos" #: mgllab/table.cpp:869 msgid "Id of slice on third (z-) dimension" msgstr "Id de sección en la tercera dimensión (z)" #: udav/prop_dlg.cpp:154 msgid "Image size" msgstr "Tamaño de imagen" #: src/exec_dat.cpp:1789 msgid "Immediately display the progress of calculation" msgstr "Mostrar inmediatamente el progreso de cálculo" #: src/exec_dat.cpp:1788 msgid "Immediately print the message" msgstr "Mostrar inmediatamente el mensaje" #: mgllab/table.cpp:485 msgid "Import Data?" msgstr "¿Importar datos?" #: src/exec_dat.cpp:1767 mgllab/table.cpp:842 msgid "Import data from PNG file" msgstr "Importar datos de archivo PNG" #: mgllab/table.cpp:752 msgid "Import from PNG" msgstr "Importar de PNG" #: mgllab/table.cpp:769 msgid "In range" msgstr "En rango" #: src/exec_dat.cpp:1762 msgid "In-place Fourier transform" msgstr "Transformada de Gabor" #: mgllab/mathgl.cpp:247 msgid "Incompatible loop parameters!" msgstr "¡Parámetros de bucle incompatibles!" #: mgllab/table.cpp:503 msgid "Incorrect type of base data" msgstr "Tipo incorrecto de datos base" #: udav/plot_pnl.cpp:553 msgid "Increase \\phi angle by 10 degrees." msgstr "Incrementar ángulo \\phi en 10 grados." #: udav/plot_pnl.cpp:545 msgid "Increase \\theta angle by 10 degrees." msgstr "Incrementar ángulo \\theta en 10 grados." #: mgllab/help.cpp:103 msgid "Increase font size" msgstr "Aumentar tamaño de fuente" #: udav/udav_wnd.cpp:229 msgid "Info" msgstr "Info" #: udav/info_dlg.cpp:57 mgllab/help.cpp:335 msgid "Information" msgstr "Información" #: mgllab/mgllab.cpp:312 msgid "Inplot" msgstr "Gráfica interna" #. insert menu #: udav/text_pnl.cpp:557 mgllab/mgllab.cpp:308 msgid "Insert" msgstr "Insertar" #: mgllab/editor.cpp:523 msgid "Insert MGL command" msgstr "Insertar comando de MGL" #: mgllab/table.cpp:755 msgid "Insert as 'list'" msgstr "Insertar como \"list\"" #: mgllab/editor.cpp:525 msgid "Insert filename" msgstr "Insertar nombre de archivo" #: mgllab/editor.cpp:527 msgid "Insert inplot command" msgstr "Insertar comando de gráfica interna" #: udav/text_pnl.cpp:569 msgid "Insert last fitted formula with found coefficients." msgstr "Insertar última fórmula ajustada con coeficientes encontrados." #: src/exec_dat.cpp:1769 msgid "Insert slice of data" msgstr "Insertar sección de datos" #: mgllab/table.cpp:849 msgid "Insert to script as 'list' command" msgstr "Insertar al script como comando 'list'" #: mgllab/table.cpp:163 mgllab/table.cpp:775 msgid "Integrate" msgstr "Integrar" #: src/exec_dat.cpp:1770 udav/dat_pnl.cpp:615 msgid "Integrate data along direction(s)" msgstr "Integrar datos en una(s) dirección(es)" #: mgllab/dialogs.cpp:114 msgid "Intensity of diffuse light" msgstr "Intensidad de luz difusa" #: udav/style_dlg.cpp:158 mgllab/dialogs.cpp:369 msgid "Italic style" msgstr "Estilo itálico" #: widgets/qt.cpp:1087 udav/plot_pnl.cpp:478 msgid "JPEG" msgstr "JPEG" #: src/data_png.cpp:158 src/export.cpp:192 msgid "JPEG support was disabled. Please, enable it and rebuild MathGL." msgstr "Formato JPEG deshabilitado. Habilítelo y recompile MathGL." #: udav/calc_dlg.cpp:193 msgid "Jacobi" msgstr "Jacobi" #: src/exec_dat.cpp:1772 msgid "Join data arrays" msgstr "Juntar arreglos de datos" #: mgllab/dialogs.cpp:1075 msgid "Keep empty to put at beginning of main script." msgstr "Mantener vacío para poner al principio del script principal." #: udav/dat_pnl.cpp:780 msgid "Keep only each n-th element of the data array." msgstr "Mantener solo cada n-ésimo elemento del arreglo." #: src/exec_dat.cpp:1774 msgid "Keep phase/amplitude along line" msgstr "" #: mgllab/mathgl.cpp:200 msgid "Keep slides in memory (faster animation but require more memory)" msgstr "Mantener cuadros en memoria (animación rápida, ocupa mas memoria)" #: udav/prop_dlg.cpp:88 msgid "Keywords" msgstr "Palabras clave" #: mgllab/dialogs.cpp:354 mgllab/dialogs.cpp:704 mgllab/dialogs.cpp:1457 msgid "Kind" msgstr "Tipo" #: udav/newcmd_dlg.cpp:58 msgid "" "Kind of command argument order. The notation is:\n" " * Capital arguments are data (like, Ydat);\n" " * Argument in '' are strings (like, 'fmt');\n" " * Other arguments are numbers (like, zval);\n" " * Arguments in [] are optional arguments." msgstr "" "Tipo de argumentos de comando. La notación es:\n" " * mayusculas denotan datos (ej.: Ydat);\n" " * argumentos en '' son texto (ej.: 'fmt');\n" " * otros argumentos son números (ej.: zval);\n" " * argumentos en [] son opcionales." #: udav/info_dlg.cpp:52 msgid "Kind of plots: lines for 1D, density for 2D." msgstr "Tipo de gráficos: líneas para 1D, densidad para 2D." #. Y #: udav/style_dlg.cpp:243 mgllab/dialogs.cpp:51 msgid "L - seagreen" msgstr "L - verde marino" #: widgets/qt.cpp:1091 udav/plot_pnl.cpp:482 msgid "LaTeX" msgstr "LaTeX" #: udav/setup_dlg.cpp:66 mgllab/dialogs.cpp:954 msgid "Label" msgstr "Etiqueta" #: udav/prop_dlg.cpp:139 msgid "Language for UDAV" msgstr "Lenguaje para UDAV" #: mgllab/mgllab.cpp:486 msgid "Language for mgllab" msgstr "Lenguaje para mgllab" #: udav/dat_pnl.cpp:617 msgid "Laplace transform along direction(s)" msgstr "Transformada de Laplace an alguna(s) dirección(es)" #: mgllab/table.cpp:777 msgid "Laplacian" msgstr "Laplaciano" #: udav/dat_pnl.cpp:751 mgllab/table.cpp:805 msgid "Last slice" msgstr "Última sección" #: udav/subplot_dlg.cpp:144 msgid "Left bottom edge" msgstr "Esquina inferior izq." #: udav/subplot_dlg.cpp:152 msgid "Left top edge" msgstr "Esquina superior izq." #: udav/opt_dlg.cpp:74 mgllab/dialogs.cpp:118 msgid "Legend" msgstr "Leyenda" #: widgets/qt.cpp:1121 udav/opt_dlg.cpp:64 udav/setup_dlg.cpp:110 #: udav/plot_pnl.cpp:298 mgllab/dialogs.cpp:115 msgid "Light" msgstr "Luz" #: udav/setup_dlg.cpp:190 msgid "Light position should be filled. Ignore it." msgstr "Posición de luz no indicada. Ignorar." #: udav/setup_dlg.cpp:136 mgllab/dialogs.cpp:1053 msgid "Light settings" msgstr "Config. de luz" #: src/exec_dat.cpp:1775 msgid "Limit data to be inside [-v,v]" msgstr "Limitar datos al rango [-v,v]" #: udav/style_dlg.cpp:99 mgllab/dialogs.cpp:314 msgid "Line style" msgstr "Estilo de línea" #: udav/style_dlg.cpp:78 msgid "Line width" msgstr "Ancho de línea" #: mgllab/table.cpp:167 msgid "Linear *3" msgstr "Lineal *3" #: mgllab/table.cpp:167 msgid "Linear *5" msgstr "Lineal *5" #: mgllab/help.cpp:159 msgid "List of available data." msgstr "Lista de datos disponibles." #: mgllab/table.cpp:427 msgid "Load Data?" msgstr "¿Cargar datos?" #: src/exec_set.cpp:838 msgid "Load commands from external DLL" msgstr "Cargar comandos de librería externa" #: udav/dat_pnl.cpp:682 msgid "Load data" msgstr "Cargar datos" #: mgllab/table.cpp:840 msgid "Load data from file" msgstr "Cargar datos de archivo" #: udav/dat_pnl.cpp:684 msgid "" "Load data from file. Data will be deleted only\n" "at exit but UDAV will not ask to save it (Ctrl+Shift+O)." msgstr "" "Cargar datos de archivo. Estos se borraran solo al\n" "cerrar UDAV, sin advertencia explicita (Ctrl+Shift+O)." #: src/exec_set.cpp:839 msgid "Load fontfaces" msgstr "Cargar fuentes" #: mgllab/table.cpp:751 msgid "Load from file" msgstr "Cargar de archivo" #: src/exec_prm.cpp:631 msgid "Load image for background" msgstr "Cargar imagen como fondo" #: udav/prop_dlg.cpp:163 msgid "Load script to new window" msgstr "Cargar script a nueva ventana" #: udav/text_pnl.cpp:467 msgid "Loaded document " msgstr "Se cargo documento " #: udav/text_pnl.cpp:325 msgid "Loaded document %1" msgstr "Se cargo documento %1" #: udav/udav_wnd.cpp:638 msgid "Loading aborted" msgstr "Cargado abortado" #: mgllab/dialogs.cpp:98 msgid "Low border for determining color or alpha" msgstr "Borde inferior para determinar color o alfa" #. C #: udav/style_dlg.cpp:241 mgllab/dialogs.cpp:49 msgid "M - purple" msgstr "M - púrpura" #: src/parser.cpp:1083 msgid "MGL Parser" msgstr "Intérprete MGL" #: udav/newcmd_dlg.cpp:53 mgllab/dialogs.cpp:725 msgid "MGL commands for selected group" msgstr "Comandos de MGL para grupo seleccionado" #: mgllab/mgllab.cpp:220 msgid "MGL files \t*.mgl" msgstr "Archivos MGL \t*.mgl" #: mgllab/mgllab.cpp:173 msgid "" "MGL files \t*.mgl\n" "DAT files \t*.{dat,csv}" msgstr "" "Archivos MGL \t*.mgl\n" "Archivos DAT \t*.{dat,csv}" #: udav/open_dlg.cpp:102 msgid "MGL files (*.mgl)" msgstr "Archivos MGL (*.mgl)" #: udav/udav_wnd.cpp:324 msgid "MGL help" msgstr "Ayuda de MGL" #: mgllab/mathgl.cpp:397 msgid "MGL messages" msgstr "Mensaje de MGL" #: mgllab/help.cpp:101 msgid "MGL samples and hints" msgstr "Ejemplos y sugerencias de MGL" #: udav/udav_wnd.cpp:670 msgid "" "MGL scripts (*.mgl)\n" "HDF5 files (*.hdf *.h5)\n" "All files (*.*)" msgstr "" "Scripts MGL (*.mgl)\n" "Archivos HDF5 (*.hdf *.h5)\n" "Todos los archivos (*.*)" #: udav/udav_wnd.cpp:635 msgid "" "MGL scripts (*.mgl)\n" "HDF5 files (*.hdf *.h5)\n" "Text files (*.txt)\n" "Data files (*.dat)\n" "All files (*.*)" msgstr "" "Scripts MGL (*.mgl)\n" "Archivos HDF5 (*.hdf *.h5)\n" "Archivos de texto (*.txt)\n" "Archivos de datos (*.dat)\n" "Todos los archivos (*.*)" #: widgets/qt.cpp:1094 udav/plot_pnl.cpp:486 msgid "MGLD" msgstr "MGLD" #: udav/dat_pnl.cpp:798 msgid "Make another data." msgstr "Crear otros datos." #: udav/dat_pnl.cpp:796 msgid "Make new (Ctrl+Shift+M)" msgstr "Crear nuevo (Ctrl+Shift+M)" #: udav/style_dlg.cpp:83 mgllab/dialogs.cpp:336 msgid "Manual dashing" msgstr "Guiones peronalizados" #: udav/style_dlg.cpp:196 msgid "Manual mask" msgstr "Máscaras personalozadas" #: udav/text_pnl.cpp:591 mgllab/mgllab.cpp:314 msgid "Manual primitives" msgstr "Primitivas personalizadas" #: mgllab/dialogs.cpp:1467 msgid "Mark" msgstr "Marca" #: udav/style_dlg.cpp:76 mgllab/dialogs.cpp:324 msgid "Marks" msgstr "Marcas" #: mgllab/dialogs.cpp:352 msgid "Mask" msgstr "Máscara" #: udav/style_dlg.cpp:124 msgid "Mask for bitmap coloring" msgstr "Máscara para coloreo de imagen" #: udav/style_dlg.cpp:125 msgid "Mask rotation angle" msgstr "Ángulo de rotacion de máscara" #: udav/style_dlg.cpp:126 msgid "Mask size" msgstr "Tamaño de máscara" #: udav/find_dlg.cpp:42 mgllab/editor.cpp:567 msgid "Match case" msgstr "Match case" #: widgets/qt.cpp:877 msgid "MathGL - about" msgstr "MathGL - acerca de" #: src/base.cpp:276 #, c-format msgid "MathGL message - %s\n" msgstr "Mensaje de MathGL - %s\n" #: widgets/qt.cpp:876 msgid "MathGL v. 2." msgstr "MathGL v. 2." #: udav/open_dlg.cpp:70 msgid "Matrix with sizes from file" msgstr "Matriz con tamaño de archivo" #: udav/dat_pnl.cpp:541 msgid "Max along direction(s)" msgstr "Max en dirección(es)" #: udav/setup_dlg.cpp:57 mgllab/dialogs.cpp:952 msgid "Maximal" msgstr "Maximal" #: mgllab/table.cpp:546 msgid "Maximal value (v2)" msgstr "Valor maximal (v2)" #: mgllab/table.cpp:548 msgid "Maximal value for resulting data values" msgstr "Valor maximal para valores resultantes" #: mgllab/dialogs.cpp:88 msgid "Maximal value of X for cutting or for coordinate filling" msgstr "Valor maximal de X para corte o para llenado de coord." #: mgllab/dialogs.cpp:92 msgid "Maximal value of Y for cutting or for coordinate filling" msgstr "Valor maximal de Y para o para llenado de coord." #: mgllab/dialogs.cpp:96 msgid "Maximal value of Z for cutting or for coordinate filling" msgstr "Valor maximal de Z para corte o para llenado de coord." #: src/data.cpp:1549 #, c-format msgid "Maximum is %g\t at x = %ld\ty = %ld\tz = %ld\n" msgstr "Maximo es %g\t en x = %ld\ty = %ld\tz = %ld\n" #: mgllab/table.cpp:342 mgllab/table.cpp:791 msgid "Maximum of" msgstr "Maximo de" #: udav/mem_pnl.cpp:68 udav/mem_pnl.cpp:73 mgllab/mgllab.cpp:366 msgid "Memory" msgstr "Memoria" #: udav/opt_dlg.cpp:53 msgid "Mesh num" msgstr "Mesh num" #: udav/setup_dlg.cpp:99 mgllab/dialogs.cpp:102 msgid "MeshNum" msgstr "MeshNum" #: mgllab/mgllab.cpp:333 msgid "Messages" msgstr "Mensajes" #: udav/udav_wnd.cpp:178 msgid "Messages and warnings" msgstr "Mansajes y advertencias" #: udav/dat_pnl.cpp:540 msgid "Min along direction(s)" msgstr "Min la(s) dirección(es)" #: udav/setup_dlg.cpp:52 mgllab/dialogs.cpp:951 msgid "Minimal" msgstr "Minimal" #: mgllab/table.cpp:543 msgid "Minimal value (v1)" msgstr "Valor minimal (v1)" #: mgllab/table.cpp:545 msgid "Minimal value for resulting data values" msgstr "Valor minimal para datos resultantes" #: mgllab/dialogs.cpp:86 msgid "Minimal value of X for cutting or for coordinate filling" msgstr "Valor minimal de X para corte o para llenado de coord." #: mgllab/dialogs.cpp:90 msgid "Minimal value of Y for cutting or for coordinate filling" msgstr "Valor minimal de Y para corte o para llenado de coord." #: mgllab/dialogs.cpp:94 msgid "Minimal value of Z for cutting or for coordinate filling" msgstr "Valor minimal de Z para corte o para llenado de coord." #: src/data.cpp:1552 #, c-format msgid "Minimum is %g\t at x = %ld\ty = %ld\tz = %ld\n" msgstr "Minimo es %g\t en x = %ld\ty = %ld\tz = %ld\n" #: mgllab/table.cpp:342 mgllab/table.cpp:792 msgid "Minimum of" msgstr "Minimo de" #. { _("Wavelet"), 0, wavelet_cb }, #: mgllab/table.cpp:166 mgllab/table.cpp:783 msgid "Mirror" msgstr "Reflejar" #: udav/dat_pnl.cpp:619 msgid "Mirror data along direction(s)" msgstr "Reflejar datos en una(s) dirección(es)" #: src/exec_dat.cpp:1778 msgid "Mirror data at some direction" msgstr "Reflejar datos en alguna(s) dirección(es)" #: src/exec_dat.cpp:1779 msgid "Modify data values by formula" msgstr "Modificar datos por fórmula" #: udav/dat_pnl.cpp:542 msgid "Momentum along 'x' for function" msgstr "Momento en dirección 'x' para función" #: udav/dat_pnl.cpp:543 msgid "Momentum along 'y' for function" msgstr "Momento en dirección 'y' para función" #: udav/dat_pnl.cpp:544 msgid "Momentum along 'z' for function" msgstr "Momento en dirección 'z' para función" #: widgets/qt.cpp:1250 udav/plot_pnl.cpp:528 msgid "Move down" msgstr "Mover abajo" #: widgets/qt.cpp:1252 udav/plot_pnl.cpp:531 msgid "Move graphics down 1/3 of its height." msgstr "Mover gráfico abajo 1/3 de su altura." #: widgets/qt.cpp:1236 udav/plot_pnl.cpp:507 msgid "Move graphics left by 1/3 of its width." msgstr "Mover gráfico a la izq. 1/3 de su ancho." #: widgets/qt.cpp:1256 udav/plot_pnl.cpp:537 msgid "Move graphics right by 1/3 of its width." msgstr "Mover gráfico a la der. 1/3 de su ancho." #: widgets/qt.cpp:1240 udav/plot_pnl.cpp:513 msgid "Move graphics up by 1/3 of its height." msgstr "Mover gráfico arriba 1/3 de su altura." #: widgets/qt.cpp:1234 udav/plot_pnl.cpp:504 msgid "Move left" msgstr "Mover a la izq." #: udav/text_pnl.cpp:593 msgid "Move mouse-handled primitives to script." msgstr "Move mouse-handled primitives to script." #: udav/plot_pnl.cpp:455 msgid "Move plot down" msgstr "Mover gráfica abajo" #: udav/plot_pnl.cpp:450 msgid "Move plot up" msgstr "Mover gráfica arriba" #: widgets/qt.cpp:1254 udav/plot_pnl.cpp:534 msgid "Move right" msgstr "Mover a la der." #: udav/plot_pnl.cpp:457 msgid "Move selected plot down to next subplot." msgstr "Mover gráfica seleccionada al subgráfica abajo." #: udav/plot_pnl.cpp:452 msgid "Move selected plot up to previous subplot." msgstr "Mover gráfica seleccionada al subgráfica arriba." #: widgets/qt.cpp:1238 udav/plot_pnl.cpp:510 msgid "Move up" msgstr "Mover arriba" #: mgllab/table.cpp:798 msgid "Multiply by" msgstr "Multiplicar por" #: src/exec_dat.cpp:1781 msgid "Multiply by data or number" msgstr "Multiplicar por datos o número" #. E #: udav/style_dlg.cpp:245 mgllab/dialogs.cpp:53 msgid "N - darkskyblue" msgstr "N - azul cielo oscuro" #: udav/dat_pnl.cpp:500 msgid "NOTE: All fields must be filled!" msgstr "NOTA: ¡Todos los campos deben llenarse!" #: udav/mem_pnl.cpp:68 msgid "Name" msgstr "Nombre" #: mgllab/table.cpp:349 msgid "Name for output" msgstr "Nombre para salida" #. navigation menu #: udav/dat_pnl.cpp:720 mgllab/table.cpp:801 msgid "Navigation" msgstr "Navegacion" #: udav/newcmd_dlg.cpp:101 udav/newcmd_dlg.cpp:308 udav/newcmd_dlg.cpp:336 #: udav/newcmd_dlg.cpp:340 udav/newcmd_dlg.cpp:354 udav/newcmd_dlg.cpp:367 #: udav/newcmd_dlg.cpp:375 udav/newcmd_dlg.cpp:379 udav/newcmd_dlg.cpp:383 #: udav/text_pnl.cpp:558 udav/plot_pnl.cpp:440 mgllab/dialogs.cpp:702 msgid "New command" msgstr "Nuevo comando" #: src/window.cpp:415 msgid "" "New drawing never clears things drawn already. For example, you can make a " "surface with contour lines by calling commands 'surf' and 'cont' one after " "another (in any order). " msgstr "" "Nuevos gráficos no sobreescriben lo ya graficado. por ejemplo, se puede " "hacer una superficie con curvas de nivel usando los comandos 'surf' y 'cont' " "uno luego del otro (en cualquier orden). " #: udav/text_pnl.cpp:562 udav/plot_pnl.cpp:445 msgid "New inplot" msgstr "Nuevo gráfico interno" #: mgllab/table.cpp:672 msgid "New order of dimensions" msgstr "Nuevo orden de dimensiones" #: udav/udav_wnd.cpp:282 mgllab/mgllab.cpp:284 msgid "New script" msgstr "Nuevo script" #: mgllab/table.cpp:95 msgid "New size of data on 1st dimension (x-direction)" msgstr "Nuevo tamaño de datos en la 1ra dimension (dirección x)" #: mgllab/table.cpp:97 msgid "New size of data on 2nd dimension (y-direction)" msgstr "Nuevo tamaño de datos en la 2da dimension (dirección y)" #: mgllab/table.cpp:99 msgid "New size of data on 3d dimension (z-direction)" msgstr "Nuevo tamaño de datos en la 3ra dimension (dirección z)" #: udav/hint_dlg.cpp:50 msgid "Next" msgstr "Siguiente" #: mgllab/help.cpp:287 msgid "Next @->" msgstr "Sgte. @->" #: udav/dat_pnl.cpp:745 mgllab/table.cpp:804 msgid "Next slice" msgstr "Siguiente sección" #: widgets/qt.cpp:1264 udav/plot_pnl.cpp:561 msgid "Next slide" msgstr "Siguiente cuadro" #: mgllab/help.cpp:135 mgllab/mgllab.cpp:233 msgid "No" msgstr "No" #: udav/dat_pnl.cpp:567 udav/dat_pnl.cpp:644 msgid "No action is selected. Do nothing." msgstr "No se solicito hacer nada. No proceder." #: udav/newcmd_dlg.cpp:308 msgid "No argument is selected" msgstr "No se seleccinó argumento" #: udav/dat_pnl.cpp:573 msgid "No direction/formula is entered. Do nothing." msgstr "No se ingreso dirección/fórmula. No proceder." #: widgets/qt.cpp:696 widgets/qt.cpp:708 widgets/qt.cpp:720 widgets/qt.cpp:732 #: widgets/qt.cpp:744 widgets/qt.cpp:752 widgets/qt.cpp:760 widgets/qt.cpp:768 #: widgets/qt.cpp:776 widgets/qt.cpp:784 widgets/qt.cpp:792 widgets/qt.cpp:800 #: widgets/qt.cpp:816 widgets/qt.cpp:824 widgets/qt.cpp:832 msgid "No filename." msgstr "No se ingreso nombre de archivo." #: mgllab/editor.cpp:589 mgllab/editor.cpp:611 mgllab/editor.cpp:636 #, c-format msgid "No occurrences of '%s' found!" msgstr "¡No se encontró ningun '%s'!" #: mgllab/mathgl.cpp:262 msgid "No selection. So nothing to do" msgstr "No se seleccinó nada. No proceder." #: udav/text_pnl.cpp:202 msgid "No string occurrence is found" msgstr "No se encontró el texto" #: udav/setup_dlg.cpp:111 msgid "No text rotation" msgstr "No hay ángulo para texto" #: widgets/fltk.cpp:844 msgid "Normal view" msgstr "Vista normal" #: mgllab/table.cpp:770 msgid "Normalize" msgstr "Normalizar" #: src/exec_dat.cpp:1783 msgid "Normalize data" msgstr "Normalizar datos" #: src/exec_dat.cpp:1784 msgid "Normalize data slice by slice" msgstr "Normalizar datos sección por sección" #: mgllab/table.cpp:553 msgid "Normalize in symmetrical range: -max(|v1|,|v2|) ... max(|v1|,|v2|)" msgstr "Normalizar en rango simétrico: -máx(|v1|,|v2|) ... máx(|v1|,|v2|)" #: udav/udav_wnd.cpp:444 msgid "Not recognized" msgstr "Desconocido" #: udav/dat_pnl.cpp:456 msgid "Number of points" msgstr "Número de puntos" #: udav/prop_dlg.cpp:97 msgid "Numbers" msgstr "Números" #: mgllab/table.cpp:176 msgid "Numeric parameter" msgstr "Parámetro numérico" #: udav/text_pnl.cpp:579 msgid "Numeric value" msgstr "Valor numérico" #: src/exec_dat.cpp:1745 msgid "Numerically differentiate data" msgstr "Diferenciar numéricamente datos" #: src/exec_dat.cpp:1746 msgid "Numerically double differentiate data" msgstr "Diferenciar numéricamente dos veces datos" #: udav/open_dlg.cpp:64 msgid "Nx" msgstr "Nx" #: udav/open_dlg.cpp:66 msgid "Ny" msgstr "Ny" #: udav/open_dlg.cpp:68 msgid "Nz" msgstr "Nz" #: widgets/qt.cpp:1096 udav/plot_pnl.cpp:488 msgid "OBJ" msgstr "OBJ" #: udav/anim_dlg.cpp:69 udav/prop_dlg.cpp:182 udav/args_dlg.cpp:65 #: udav/newcmd_dlg.cpp:80 udav/open_dlg.cpp:92 udav/dat_pnl.cpp:462 #: udav/dat_pnl.cpp:512 udav/dat_pnl.cpp:554 udav/dat_pnl.cpp:631 #: udav/opt_dlg.cpp:80 udav/files_dlg.cpp:60 udav/style_dlg.cpp:208 #: udav/data_dlg.cpp:92 udav/subplot_dlg.cpp:221 mgllab/mathgl.cpp:198 #: mgllab/dialogs.cpp:121 mgllab/dialogs.cpp:165 mgllab/dialogs.cpp:411 #: mgllab/dialogs.cpp:585 mgllab/dialogs.cpp:750 mgllab/dialogs.cpp:1072 #: mgllab/dialogs.cpp:1319 mgllab/dialogs.cpp:1474 mgllab/mgllab.cpp:491 #: mgllab/table.cpp:621 msgid "OK" msgstr "OK" #: mgllab/table.cpp:504 msgid "Only current slice will be inserted" msgstr "Solo la sección actual sera insertada" #: mgllab/mgllab.cpp:172 msgid "Open File?" msgstr "¿Abrir archivo?" #: src/exec_dat.cpp:1786 msgid "Open all data arrays from HDF file" msgstr "Cargar todos los arreglos del archivo HDF" #: udav/udav_wnd.cpp:198 msgid "" "Open and execute/show script or data from file (Ctrl+O).\n" "You may switch off automatic execution in UDAV properties." msgstr "" "Abrir y ejecutar/mostrar script o datos de archivo (Ctrl+O).\n" "Puede desactivar ejecucion automatica en propiedades de UDAV." #: mgllab/help.cpp:173 msgid "Open dialog for new data creation." msgstr "Abrir dialogo de creacion de datos nuevos." #: udav/udav_wnd.cpp:196 msgid "Open file" msgstr "Abrir archivo" #: mgllab/mgllab.cpp:285 msgid "Open file ..." msgstr "Abrir archivo ..." #: widgets/qt.cpp:1105 udav/udav_wnd.cpp:298 msgid "Open printer dialog and print graphics (Ctrl+P)" msgstr "Abrir dialogo de impresion e imprimir gráfica (Ctrl+P)" #: mgllab/editor.cpp:511 msgid "Open script or data file" msgstr "Abrir script o archivo de datos" #: mgllab/help.cpp:164 msgid "Open table with selected data for editing." msgstr "Abrir tabla con datos seleccionados para edicion." #: udav/data_dlg.cpp:65 mgllab/dialogs.cpp:578 msgid "Operation" msgstr "Operacion" #: mgllab/table.cpp:231 msgid "Operation is not supported for this type of data." msgstr "Operacion no soportada para tipo de datos actual." #: mgllab/table.cpp:795 msgid "Operations" msgstr "Operaciones" #: udav/prop_dlg.cpp:91 udav/newcmd_dlg.cpp:72 mgllab/dialogs.cpp:746 #: mgllab/mgllab.cpp:316 msgid "Options" msgstr "Opciones" #: udav/setup_dlg.cpp:62 mgllab/dialogs.cpp:953 msgid "Origin" msgstr "Origen" #: udav/newcmd_dlg.cpp:171 mgllab/dialogs.cpp:712 msgid "Other plots" msgstr "Otras gráficas" #: mgllab/dialogs.cpp:1025 msgid "Others" msgstr "Otros" #: udav/style_dlg.cpp:161 mgllab/dialogs.cpp:372 msgid "Overline" msgstr "Sobrerraya" # brightness=luminosidad? #: mgllab/dialogs.cpp:112 msgid "Own brightness of the surface" msgstr "Brillo propio de la superficie" #. Q #: udav/style_dlg.cpp:248 mgllab/dialogs.cpp:56 msgid "P - darkpink" msgstr "P - rosado oscuro" #: src/prc.cpp:982 msgid "PDF support was disabled. Please, enable it and rebuild MathGL." msgstr "Formato PDF deshabilitado. Habilítelo y recompile MathGL." #: widgets/qt.cpp:1085 udav/plot_pnl.cpp:476 msgid "PNG" msgstr "PNG" #: mgllab/table.cpp:474 mgllab/table.cpp:486 msgid "PNG Files \t*.png" msgstr "Archivos PNG \t*.png" #: src/canvas_cf.cpp:551 src/canvas_cf.cpp:553 src/data_png.cpp:118 #: src/export.cpp:75 src/export.cpp:109 msgid "PNG support was disabled. Please, enable it and rebuild MathGL." msgstr "Formato PNG deshabilitado. Habilítelo y recompile MathGL." #: widgets/qt.cpp:1095 udav/plot_pnl.cpp:487 msgid "PRC" msgstr "PRC" #: mgllab/dialogs.cpp:1006 msgid "Palette" msgstr "Paleta" #: mgllab/table.cpp:167 msgid "Parabolic *5" msgstr "Parabolica *5" #: udav/dat_pnl.cpp:713 msgid "Paste data" msgstr "Pegar datos" #: udav/dat_pnl.cpp:715 msgid "Paste range of numbers from clipboard (Ctrl+Shift+P)." msgstr "Pegar rango de números desde memoria (Ctrl+Shift+P)." #: udav/text_pnl.cpp:538 mgllab/mgllab.cpp:302 msgid "Paste text" msgstr "Pegar texto" #: mgllab/editor.cpp:518 msgid "Paste text from clipboard" msgstr "Pegar texto desde memoria" #: udav/text_pnl.cpp:540 msgid "Paste text or data from clipboard (Ctrl+V)." msgstr "Pegar texto o datos desde memoria (Ctrl+V)." #: mgllab/mgllab.cpp:476 msgid "Path for MathGL font (without extension)" msgstr "Dirreccion de fuentes de MathGL (sin extension)" #: udav/prop_dlg.cpp:110 mgllab/mgllab.cpp:473 msgid "Path for help files" msgstr "Direccion de archivos de ayuda" #: udav/prop_dlg.cpp:130 msgid "Path for user MathGL font files" msgstr "Direccion de fuentes de MathGL del usuario" #: widgets/qt.cpp:1282 msgid "Pause calculation" msgstr "Paudar calculos" #. Wnd->connect(a, SIGNAL(triggered()), QMGL, SLOT(setPause())); #: widgets/fltk.cpp:927 widgets/qt.cpp:1287 msgid "Pause on/off external calculations" msgstr "Pausar on/off calculos externos" #: src/exec_dat.cpp:1804 msgid "Perform Runge-Kutta step" msgstr "Ejecutar un paso de Runge-Kutta" #: widgets/fltk.cpp:896 msgid "Phi angle (rotate in x*y plane)" msgstr "Ángulo phi (rotar en plano xy)" #: udav/prop_dlg.cpp:161 msgid "Place editor at top" msgstr "Mover editor arriba" #: mgllab/dialogs.cpp:1050 msgid "Plot ID" msgstr "ID del gráfico" #: src/exec_prm.cpp:648 msgid "Plot curve by formula" msgstr "Gráficar curva por fórmula" #. o->addSeparator(); bb->addSeparator(); #. a = new QAction(QPixmap(insert_xpm), _("Insert as list"), this); #. connect(a, SIGNAL(triggered()), this, SLOT(list())); #. o->addAction(a); #. bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); #: udav/dat_pnl.cpp:701 msgid "Plot data" msgstr "Graficar datos" #: udav/dat_pnl.cpp:703 msgid "" "Plot data in new script window. You may select the kind\n" "of plot, its style and so on." msgstr "" "Graficar datos en ventana nueva de script. Puede elejir\n" "el tipo de gráfica, estilo, etc." #: mgllab/mgllab.cpp:331 msgid "Plot setup" msgstr "Gráfica" #: udav/text_pnl.cpp:571 mgllab/dialogs.cpp:312 mgllab/mgllab.cpp:315 msgid "Plot style" msgstr "Estilo de gráfica" #: src/exec_prm.cpp:649 msgid "Plot surface by formula" msgstr "Graficar superficie por fórmula" #: mgllab/dialogs.cpp:386 msgid "Popular color schemes" msgstr "Esquemas de colores populares" #: udav/hint_dlg.cpp:48 msgid "Prev" msgstr "Prev" #: udav/dat_pnl.cpp:727 mgllab/table.cpp:803 msgid "Prev slice" msgstr "Seccion prev." #: widgets/qt.cpp:1273 udav/plot_pnl.cpp:576 msgid "Prev slide" msgstr "Seccion prev." #: udav/info_dlg.cpp:53 msgid "Preview" msgstr "Vista previa" #: mgllab/mgllab.cpp:576 msgid "Previous expressions" msgstr "Expresiones previas" #: udav/newcmd_dlg.cpp:181 mgllab/dialogs.cpp:722 msgid "Primitives" msgstr "Primitivas" #: widgets/qt.cpp:1167 udav/plot_pnl.cpp:366 msgid "Primitives ..." msgstr "Primitivas ..." #: src/exec_set.cpp:872 msgid "Print MathGL version or check if it is valid" msgstr "Imprimir version de MathGL o verificar su validez" #: src/exec_dat.cpp:1750 msgid "Print content of the data" msgstr "Imprimir contenido de datos" #: src/exec_dat.cpp:1792 msgid "Print fitted formula" msgstr "Imprimir fórmula ajustada" #: widgets/qt.cpp:1103 udav/udav_wnd.cpp:296 msgid "Print graphics" msgstr "Imprimir gráfica" #: src/exec_dat.cpp:1742 msgid "Print list of data names in HDF file" msgstr "Imprimir lista de nombres de datos de archivo HDF" #: src/exec_dat.cpp:1768 msgid "Print message or information about the data" msgstr "Imprimir mensaje o información acerca de datos" #: mgllab/mgllab.cpp:288 msgid "Print plot" msgstr "Imprimir gráfica" #: udav/udav_wnd.cpp:295 msgid "Print script" msgstr "Imprimir script" #: src/exec_prm.cpp:646 msgid "Print string from file" msgstr "Imprimir texto de archivo" #: udav/text_pnl.cpp:178 msgid "Printing aborted" msgstr "I\tmpresión abortada" #: udav/text_pnl.cpp:176 msgid "Printing completed" msgstr "Impresión completa" #: udav/text_pnl.cpp:174 msgid "Printing..." msgstr "Imprimiendo..." #: udav/newcmd_dlg.cpp:180 mgllab/dialogs.cpp:721 msgid "Program flow" msgstr "Flujo de programa" #: src/exec_dat.cpp:1731 msgid "Project periodical data in [v1,v2]" msgstr "Proyectar datos periódicos en [v1,v2]" #: udav/udav_wnd.cpp:312 mgllab/mgllab.cpp:328 mgllab/mgllab.cpp:468 msgid "Properties" msgstr "Propiedades" #: udav/mem_pnl.cpp:61 msgid "Properties of selected data array" msgstr "Propiedades del arreglo seleccionado" #: mgllab/table.cpp:342 mgllab/table.cpp:793 msgid "Pulse prop." msgstr "Prop. de pulso" #: udav/calc_dlg.cpp:127 mgllab/mgllab.cpp:610 msgid "Put function" msgstr "Usar función" #: udav/dat_pnl.cpp:457 msgid "Put in variable" msgstr "Poner en variable" #: udav/dat_pnl.cpp:548 msgid "Put into this data array" msgstr "Poner en el arreglo actual" #: udav/anim_dlg.cpp:74 mgllab/mathgl.cpp:203 msgid "Put to script" msgstr "Poner en script" #: src/exec_dat.cpp:1791 msgid "Put value (numeric or array) to given data element" msgstr "Poner valor (numérico o arreglo) al elemento dado" #. U #: udav/style_dlg.cpp:247 mgllab/dialogs.cpp:55 msgid "Q - brown" msgstr "Q - café" #: udav/udav_wnd.cpp:303 msgid "Quit" msgstr "Salir" #. G #: udav/style_dlg.cpp:239 mgllab/dialogs.cpp:47 msgid "R - maroon" msgstr "R - carmesí" #: src/exec_set.cpp:852 msgid "Rasterize plot and save to background" msgstr "Rasterizar gráfica y guardar de fondo" #: src/exec_dat.cpp:1797 msgid "Read and join data from several files" msgstr "Leer y juntar datos de varios archivos" #: src/exec_dat.cpp:1798 #, fuzzy msgid "Read data from binary file of specified type" msgstr "Leer datos de archivo con tamaño indicado en la 1ra fila" #: src/exec_dat.cpp:1796 msgid "Read data from file" msgstr "Leer datos de archivo" #: src/exec_dat.cpp:1800 msgid "Read data from file with sizes specified in first row" msgstr "Leer datos de archivo con tamaño indicado en la 1ra fila" #: src/exec_dat.cpp:1799 msgid "Read data with name 'id' from HDF file" msgstr "Leer datos con nombre 'id' de archivo HDF" #: udav/udav_wnd.cpp:268 mgllab/mgllab.cpp:373 msgid "Ready" msgstr "Listo" #: src/exec_dat.cpp:1801 msgid "Rearrange data dimensions" msgstr "Reordenar dimensiones de datos" #: udav/udav_wnd.cpp:301 mgllab/mgllab.cpp:289 msgid "Recent files" msgstr "Archivos recientes" #: udav/dat_pnl.cpp:768 msgid "Recreate the data with new sizes and fill it by zeros (Ctrl+Shift+N)." msgstr "" "Volver a crear arreglo con tamaño nuevo y llenar con ceros (Ctrl+Shift+N)." #: udav/text_pnl.cpp:521 msgid "Redo" msgstr "Rehacer" #: udav/text_pnl.cpp:523 msgid "Redo editor change (Ctrl+Shift+Z)." msgstr "Rehacer cambios de editor (Ctrl+Shift+Z)." #: widgets/qt.cpp:1147 udav/plot_pnl.cpp:332 msgid "Redraw" msgstr "Volver a graficar" #: udav/anim_dlg.cpp:41 mgllab/mathgl.cpp:186 msgid "Redraw picture for $0 equal to" msgstr "Volver a graficar para $0 igual a" #: widgets/fltk.cpp:845 msgid "Redraw plot" msgstr "Volver a graficar" #: mgllab/dialogs.cpp:1320 msgid "Refresh" msgstr "Actualizar" #: widgets/fltk.cpp:879 msgid "Refresh the picture" msgstr "Actualizar la imagen" #: mgllab/dialogs.cpp:404 msgid "Relative position of i-th color" msgstr "Posición relativa al i-ésimo color" #: udav/plot_pnl.cpp:343 msgid "Reload" msgstr "Recargar" #: widgets/fltk.cpp:847 msgid "Reload data" msgstr "Recargar datos" #: widgets/fltk.cpp:885 msgid "Reload data and refresh the picture" msgstr "REcargar datos y actualizar imagen" #: src/exec_dat.cpp:1730 msgid "Remove duplicate rows" msgstr "Borrar filas duplicadas" #: src/exec_dat.cpp:1811 msgid "Remove jump into the data, like phase jumps" msgstr "Remover saltos en datos, como saltos de fase" #: udav/find_dlg.cpp:50 mgllab/editor.cpp:566 msgid "Replace" msgstr "Reemplazar" #: mgllab/editor.cpp:569 msgid "Replace all" msgstr "Reemplazar todo" #: udav/find_dlg.cpp:39 mgllab/editor.cpp:565 msgid "Replace by:" msgstr "Reemplazar con:" #: udav/text_pnl.cpp:581 msgid "Replace expression by its numerical value." msgstr "Reemplazar expresiones con sus valore numericos." #: mgllab/editor.cpp:635 #, c-format msgid "Replaced %ld occurrences." msgstr "%ld ocurrencias reemplazadas." #: mgllab/dialogs.cpp:891 #, c-format msgid "Required argument %s is not specified!" msgstr "¡Argumento obligatorio %s no especificado!" #: udav/subplot_dlg.cpp:186 msgid "Reserve at" msgstr "Reservar en" #: mgllab/dialogs.cpp:1303 msgid "Reserve at:" msgstr "Reservar en:" #: udav/subplot_dlg.cpp:190 msgid "Reserve space for labels at bottom side (style '_')" msgstr "Reservar espacio para etiquetas al fondo (estilo '_')" #: udav/subplot_dlg.cpp:188 msgid "Reserve space for labels at left side (style '<')" msgstr "Reservar espacio para etiquetas a la izq. (estilo '<')" #: udav/subplot_dlg.cpp:194 msgid "Reserve space for labels at right side (style '>')" msgstr "Reservar espacio para etiquetas a la der. (estilo '>')" #: udav/subplot_dlg.cpp:192 msgid "Reserve space for labels at top side (style '^')" msgstr "Reservar espacio para etiquetas arriba (estilo '^')" #: src/exec_set.cpp:853 msgid "Reset settings and clear picture" msgstr "Reestablecer config. y limpiar imagen" #: udav/dat_pnl.cpp:772 mgllab/table.cpp:761 msgid "Resize" msgstr "Reescalar" #: udav/dat_pnl.cpp:774 msgid "Resize (interpolate) the data to specified sizes (Ctrl+Shift+R)." msgstr "Reescalar (interpolar) datos a tamaño especificado (Ctrl+Shift+R)." #: src/exec_dat.cpp:1803 msgid "Resize data array" msgstr "Reescalar datos" #: mgllab/table.cpp:858 msgid "Resize data with smoothing" msgstr "Reescalar datos con suavizado" #: widgets/qt.cpp:1140 udav/plot_pnl.cpp:326 msgid "Restore" msgstr "Reestablecer" #: widgets/fltk.cpp:876 msgid "Restore default graphics rotation, zoom and perspective" msgstr "Reestablecer rotacion , zoom y perspectiva por defecto" #: widgets/qt.cpp:1142 msgid "Restore default graphics rotation, zoom and perspective (Alt+Space)." msgstr "Reestablecer rotacion, zoom y perspectiva por defecto (Alt+Space)." #: udav/plot_pnl.cpp:328 msgid "Restore default graphics rotation, zoom and perspective (Ctrl+Space)." msgstr "Reestablecer rotacion, zoom y perspectiva por defecto (Ctrl+Space)." #: udav/plot_pnl.cpp:345 msgid "Restore status for 'once' command and reload data (F9)." msgstr "Reestablecer estado para comando 'once' y recargar datos (F9)." #: udav/calc_dlg.cpp:63 udav/data_dlg.cpp:85 udav/data_dlg.cpp:143 #: udav/subplot_dlg.cpp:212 mgllab/dialogs.cpp:1315 msgid "Result" msgstr "Resultado" #: udav/data_dlg.cpp:124 msgid "Result (will have sizes " msgstr "Resulto (tendra tamaño " #: udav/style_dlg.cpp:201 udav/subplot_dlg.cpp:214 mgllab/dialogs.cpp:408 msgid "Resulting string" msgstr "Texto resultante" #: src/parser.cpp:1506 msgid "Return from function" msgstr "Salida de la función" #: udav/subplot_dlg.cpp:148 msgid "Right bottom edge" msgstr "Equina inferior der." #: udav/subplot_dlg.cpp:156 msgid "Right top edge" msgstr "Esquina superior der." #: mgllab/table.cpp:166 mgllab/table.cpp:784 msgid "Roll" msgstr "Roll" #: src/exec_dat.cpp:1805 msgid "Roll data along direction(s)" msgstr "Roll data along direction(s)" #. rotate menu #: udav/plot_pnl.cpp:541 msgid "Rotate" msgstr "Rotar" #: widgets/qt.cpp:1127 udav/plot_pnl.cpp:311 msgid "Rotate by mouse" msgstr "Rotar con el mouse" #: udav/plot_pnl.cpp:546 msgid "Rotate down" msgstr "Rotar abajo" #: udav/plot_pnl.cpp:550 msgid "Rotate left" msgstr "Rotar a la izq." #: udav/subplot_dlg.cpp:164 mgllab/dialogs.cpp:1294 msgid "Rotate on" msgstr "Rotate on" #: widgets/fltk.cpp:872 msgid "Rotate picture by holding left mouse button" msgstr "Rotar figura al presionando el botón izq. del mouse" #: src/exec_set.cpp:854 msgid "Rotate plot" msgstr "Rotar gráfica" #: udav/plot_pnl.cpp:554 msgid "Rotate right" msgstr "Rotar a la der." #: udav/plot_pnl.cpp:542 msgid "Rotate up" msgstr "Rotar arriba" #: mgllab/dialogs.cpp:356 msgid "Rotation" msgstr "Rotacion" #: widgets/qt.cpp:1271 msgid "Run slideshow (CTRl+F5)." msgstr "Correr animación (CTRl+F5)." #: udav/plot_pnl.cpp:571 msgid "" "Run slideshow (Ctrl+F5). If no parameter specified\n" "then the dialog with slideshow options will appear." msgstr "" "Correr animación (Ctrl+F5). Si no se especifican\n" "parámetros, se mostrará el dialogo de animación." #: widgets/fltk.cpp:918 msgid "Run/Stop slideshow (graphics animation)" msgstr "Correr/detener animación" #: udav/prop_dlg.cpp:141 msgid "Russian" msgstr "Ruso" #: widgets/qt.cpp:1097 udav/plot_pnl.cpp:489 msgid "STL" msgstr "STL" #: widgets/qt.cpp:1090 udav/plot_pnl.cpp:481 msgid "SVG" msgstr "SVG" #: udav/style_dlg.cpp:107 msgid "Saturation" msgstr "Saturacion" #: udav/setup_dlg.cpp:143 mgllab/editor.cpp:286 msgid "Save" msgstr "Guardar" #: mgllab/help.cpp:254 mgllab/table.cpp:456 msgid "Save Data?" msgstr "¿Guardar datos?" #: widgets/fltk.cpp:601 mgllab/mgllab.cpp:220 msgid "Save File As?" msgstr "Guardar archivo como" #: udav/anim_dlg.cpp:83 msgid "Save JPEG frames" msgstr "Guardar cuadros JPEG" #: udav/udav_wnd.cpp:290 mgllab/mgllab.cpp:287 msgid "Save as ..." msgstr "Guardar como ..." #: udav/dat_pnl.cpp:688 msgid "Save data" msgstr "Guardar datos" #: src/exec_dat.cpp:1808 msgid "Save data to HDF5 file" msgstr "Guardar datos a archivo HDF5" #: udav/dat_pnl.cpp:690 msgid "Save data to a file (Ctrl+Shift+S)." msgstr "Guardar datos a archivo (Ctrl+Shift+S)." #: src/exec_dat.cpp:1807 mgllab/table.cpp:844 msgid "Save data to file" msgstr "Guardar datos a archivo" #: mgllab/mgllab.cpp:286 msgid "Save file" msgstr "Guardar archivo" #: mgllab/mgllab.cpp:480 msgid "Save file before redrawing" msgstr "Guardar archivo antes de volver a graficar" #: udav/udav_wnd.cpp:201 msgid "Save script" msgstr "Guardar script" #: udav/udav_wnd.cpp:203 msgid "Save script to a file (Ctrl+S)" msgstr "Guardar script a archivo (Ctrl+S)" #: mgllab/editor.cpp:513 msgid "Save script to file" msgstr "Guardar script a archivo" #: mgllab/help.cpp:176 msgid "Save selected data to file." msgstr "Guardar datos seleccionados a archivo." #: mgllab/table.cpp:753 msgid "Save to file" msgstr "Guardar a archivo" #: udav/udav_wnd.cpp:672 msgid "Saving aborted" msgstr "Guardado abortado" #: udav/newcmd_dlg.cpp:179 mgllab/dialogs.cpp:720 msgid "Scale and rotate" msgstr "Escalar y rotar" #: udav/udav_wnd.cpp:237 msgid "Script" msgstr "Script" #: udav/find_dlg.cpp:43 mgllab/editor.cpp:568 msgid "Search backward" msgstr "Buscar atras" #: udav/text_pnl.cpp:543 mgllab/mgllab.cpp:303 msgid "Select all" msgstr "Seleccionar todo" #: udav/text_pnl.cpp:585 msgid "Select and insert file name." msgstr "Seleccionar e insertar nombre de archivo." #: udav/text_pnl.cpp:589 msgid "Select and insert folder name." msgstr "Seleccionar e insertar nombre de directorio." #: mgllab/dialogs.cpp:565 msgid "Select data argument" msgstr "Seleccionar argumento de datos" #: mgllab/dialogs.cpp:160 msgid "Select direction" msgstr "Seleccionar dirección" #: mgllab/editor.cpp:658 msgid "Select file name" msgstr "Seleccionar nombre de archivo" #: udav/newcmd_dlg.cpp:337 udav/newcmd_dlg.cpp:355 msgid "Select first the proper kind of arguments" msgstr "Seleccione primero los tipos adecuados de argumentos" #: mgllab/editor.cpp:671 msgid "Select folder name" msgstr "Seleccionar nombre de directorio" #: udav/info_dlg.cpp:39 msgid "Select kind of plot" msgstr "Seleccionar tipo de gráfica" #: src/exec_set.cpp:871 msgid "Select variant of plot style(s)" msgstr "Seleccionar variante de estilo(s) de gráfica" #: mgllab/mathgl.cpp:168 msgid "Set" msgstr "Especificar" #: src/exec_set.cpp:867 msgid "Set additional tick and axis labels shift" msgstr "Desplazamiento adicional para etiquetas y escala del eje" #: src/exec_set.cpp:813 msgid "Set ambient light brightness" msgstr "Especificar brillo de luz ambiental" #: src/exec_set.cpp:835 msgid "Set arbitrary position of plot in picture" msgstr "Especificar posición arbitraria de gráfica en imagen" #: udav/udav_wnd.cpp:315 mgllab/mgllab.cpp:329 msgid "Set arguments" msgstr "Argumentos" #: src/exec_set.cpp:815 msgid "Set aspect ration" msgstr "Especificar proporcion de apariencia" #: src/exec_set.cpp:817 msgid "Set axis and tick style" msgstr "Especificar estilos de eje y escala" #: src/exec_set.cpp:844 msgid "Set axis origin" msgstr "Especificar origen de ejes" #: src/exec_set.cpp:851 msgid "Set axis ranges" msgstr "Especificar rango de ejes" #: src/exec_set.cpp:859 msgid "Set bit-flags (for advanced users only)" msgstr "Especificar bit-flags (para usuarios avanzados)" #: src/exec_set.cpp:819 msgid "Set bounding box for 2d export" msgstr "Especificar \"bounding box\" para exportar 2D" #: src/exec_set.cpp:841 msgid "Set brush for given mask id" msgstr "Especificar brocha para máscara id dada" #: src/exec_set.cpp:824 msgid "Set color range" msgstr "Especificar rango de colores" #: src/exec_dat.cpp:1766 msgid "Set column id for data" msgstr "Especificar id de columna para datos" #: mgllab/dialogs.cpp:108 msgid "Set cutting off/on for particular plot" msgstr "Activar/desactivar cortado para gráfica particular" #: udav/open_dlg.cpp:62 msgid "Set data sizes manually" msgstr "Especificar tamaño de datos manualmente" #: src/exec_set.cpp:818 msgid "Set default bars width" msgstr "Especificar ancho de barras" #: src/exec_set.cpp:849 msgid "Set default filename" msgstr "Especificar nombre de archivo" #: src/exec_set.cpp:812 msgid "Set default transparency" msgstr "Especificar transparencia" #: src/exec_set.cpp:827 msgid "Set diffusive light brightness" msgstr "Especificar brillo de luz difusa" #: src/exec_set.cpp:828 msgid "Set draw region for quality&4" msgstr "Especificar region de dibujo para calida&4" #: udav/subplot_dlg.cpp:47 udav/subplot_dlg.cpp:89 msgid "Set drawing area as cell of matrix nx*ny." msgstr "Establecer area de dibujo como celda de matriz nx*ny." #: udav/subplot_dlg.cpp:110 msgid "Set drawing area as cells of column." msgstr "Establecer area de dibujo como celdas de columna." #: udav/subplot_dlg.cpp:64 udav/subplot_dlg.cpp:140 msgid "Set drawing area as cells of matrix nx*ny." msgstr "Establecer area de dibujo como celdas de matriz nx*ny." #: udav/subplot_dlg.cpp:127 msgid "Set drawing area as cells of stick." msgstr "Especificar area de dibujo como celda de barra." #: mgllab/dialogs.cpp:117 msgid "Set lighting off/on for particular plot" msgstr "Activar/desactivar luz para gráfica particular" #: src/exec_set.cpp:842 msgid "Set number of lines in mesh/fall/vect and so on" msgstr "Especificar número de líneas en grilla/cascada/etc." #: src/exec_set.cpp:836 msgid "Set number of marks in the legend" msgstr "Especificar número de marcas en leyenda" #: src/exec_set.cpp:829 msgid "Set number of visible faces" msgstr "Especificar número de facetas visibles" #: src/exec_set.cpp:846 msgid "Set palette for 1D plots" msgstr "Especificar paleta para gráficas 1D" #: src/exec_set.cpp:848 msgid "Set perspective" msgstr "Especificar perspectiva" #: src/exec_set.cpp:857 msgid "Set picture size" msgstr "Especificar tamaño de imagen" #: src/exec_set.cpp:850 msgid "Set plot quality" msgstr "Especificar calidad de gráfica" #: src/exec_set.cpp:863 msgid "Set position of plot as cell of matrix" msgstr "Especificar posición de gráfica como celda de matriz" #: src/exec_set.cpp:843 msgid "Set position of plot block in matrix" msgstr "Especificar posición de gráfica en matriz" #: src/exec_set.cpp:823 msgid "Set position of plot inside cell of column" msgstr "Especificar posición de gráfica en celda de columna" #: src/exec_set.cpp:834 msgid "Set position of plot inside cell of matrix" msgstr "Especificar posición de gráfica en celda de matriz" #: src/exec_set.cpp:862 msgid "Set position of plot inside cell of rotated stick" msgstr "Especificar posición de gráfica en celda de barra rotada" #: src/exec_set.cpp:861 msgid "Set position of plot inside cell of sheared stick" msgstr "Especificar posición de gráfica en celda de barra recortada" #: src/exec_set.cpp:875 msgid "Set range for x-axis" msgstr "Especificar rango de eje x" #: src/exec_set.cpp:877 msgid "Set range for y-axis" msgstr "Especificar rango de eje y" #: src/exec_set.cpp:881 msgid "Set range for z-axis" msgstr "Especificar rango de eje z" #: src/exec_set.cpp:856 msgid "Set scale text in relative subplots too" msgstr "Set scale text in relative subplots too" #: src/exec_set.cpp:858 msgid "Set scaling factor for further setsize" msgstr "Especificar factor de escala para \"setsize\"" #: mgllab/mathgl.cpp:145 msgid "Set script arguments" msgstr "Especificar argumentos de script" #: mgllab/dialogs.cpp:105 msgid "Set size for text, marks and others" msgstr "Especificar tamaño de texto, marcas y otros" #: src/exec_set.cpp:814 msgid "Set size of arrows" msgstr "Especificar tamaño de flechas" #: src/exec_set.cpp:840 msgid "Set size of markers" msgstr "Especificar tamaño de marcadores" #: src/exec_set.cpp:847 msgid "Set size of semi-transparent area around line" msgstr "Especificar tamaño de area semitransparente alrededor de línea" #: src/exec_set.cpp:845 msgid "Set tick labels drawing at origin" msgstr "Set tick labels drawing at origin" #: src/exec_set.cpp:866 msgid "Set tick length" msgstr "Especificar longtud de marcas" #: src/exec_set.cpp:825 msgid "Set ticks for colorbar" msgstr "Especificar escala para barra de colores" #: src/exec_set.cpp:876 msgid "Set ticks for x-axis" msgstr "Especificar escala para el eje x" #: src/exec_set.cpp:878 msgid "Set ticks for y-axis" msgstr "Especificar escala para el eje y" #: src/exec_set.cpp:882 msgid "Set ticks for z-axis" msgstr "Especificar escala para el eje z" #: src/exec_set.cpp:868 msgid "Set ticks in time format" msgstr "Especificar escala en formato de tiempo" #: src/exec_set.cpp:870 msgid "Set ticks tuning" msgstr "Afinar escala" #: src/exec_set.cpp:855 msgid "Set to auto rotate text or not" msgstr "Activar/desactivar rotacion de texto" #: udav/subplot_dlg.cpp:196 msgid "Set to use whole area (style '#')" msgstr "Usar toda el area (estilo '#')" #: src/exec_set.cpp:869 msgid "Set type transparency" msgstr "Especificar tipo de transparencia" #: widgets/qt.cpp:1226 msgid "Set value of \\phi angle." msgstr "Especificar valor de ángulo \\phi." #: udav/plot_pnl.cpp:473 msgid "" "Set value of \\phi angle.\n" "You can use keys (Shift+Meta+Left or Shift+Meta+Right)." msgstr "" "Especificar valor de ángulo \\phi.\n" "Puede usar el teclado (Shift+Meta+Left o Shift+Meta+Right)." #: widgets/qt.cpp:1220 msgid "Set value of \\theta angle." msgstr "Especificar valor de ángulo \\theta." #: udav/plot_pnl.cpp:467 msgid "" "Set value of \\theta angle.\n" "You can use keys (Shift+Meta+Up or Shift+Meta+Down)." msgstr "" "Especificar valor de ángulo \\theta.\n" "Puede usar el teclado (Shift+Meta+Up o Shift+Meta+Down)." #: udav/udav_wnd.cpp:311 msgid "Settings" msgstr "Ajustes" #: mgllab/mgllab.cpp:327 msgid "Setup" msgstr "Configurar" #: mgllab/mgllab.cpp:330 msgid "Setup animation" msgstr "Animación" #: udav/prop_dlg.cpp:80 msgid "Setup colors for:" msgstr "Config. colores para:" #: src/exec_set.cpp:832 msgid "Setup font" msgstr "Config. fuente" #: src/exec_set.cpp:837 msgid "Setup light" msgstr "Config. luz" #: src/exec_prm.cpp:630 msgid "Setup or draw axis" msgstr "Config. o graficar eje" #: src/exec_set.cpp:826 msgid "Setup plot points cutting" msgstr "Config. cortado de gráfica" #: mgllab/dialogs.cpp:947 msgid "Setup script" msgstr "Config. script" #: udav/plot_pnl.cpp:574 msgid "Setup show" msgstr "Config. animación" #: udav/dat_pnl.cpp:623 msgid "Sew data along direction(s)" msgstr "Eliminar saltos de datos en dirección(es)" #: mgllab/table.cpp:166 mgllab/table.cpp:785 msgid "Sew phase" msgstr "Sew phase" #: mgllab/dialogs.cpp:350 msgid "Sharp colors" msgstr "Colores fuertes" #: src/exec_set.cpp:860 msgid "Shear plot" msgstr "Recortar gráfica" #: widgets/fltk.cpp:911 msgid "Shift the picture down" msgstr "Mover la imagen abajo" #: widgets/fltk.cpp:903 msgid "Shift the picture left" msgstr "Mover la imagen a la izq." #: widgets/fltk.cpp:909 msgid "Shift the picture right" msgstr "Mover la imagen a la der." #: widgets/fltk.cpp:901 msgid "Shift the picture up" msgstr "Mover la imagen arriba" #: udav/newcmd_dlg.cpp:56 mgllab/dialogs.cpp:737 msgid "Short description of selected command" msgstr "Descripción corta del comando seleccionado" #: udav/info_dlg.cpp:56 msgid "Short information about the data." msgstr "Info. resumida de los datos." #: udav/hint_dlg.cpp:44 msgid "Show at startup" msgstr "Mostrar al iniciar" #: udav/udav_wnd.cpp:210 msgid "" "Show calculator which evaluate and help to type textual formulas.\n" "Textual formulas may contain data variables too." msgstr "" "Mostrar calculadora que escribe y evalua formulas textuales.\n" "Las formulas textuales pueden contener variables también." #: mgllab/editor.cpp:530 msgid "Show calculator window" msgstr "Mostrar ventana de calculadora" #: widgets/fltk.cpp:922 msgid "Show custom dialog for plot setup" msgstr "Mostrar dialogo de config. de gráfica" #: udav/udav_wnd.cpp:314 msgid "Show dialog for UDAV properties." msgstr "Mostrar dialogo de propiedades de UDAV." #: udav/text_pnl.cpp:560 udav/plot_pnl.cpp:442 msgid "Show dialog for new command or edit arguments of existed one." msgstr "" "Mostrar dialogo de nuevo comando o editar argumentos de los existentes." #: udav/text_pnl.cpp:564 udav/plot_pnl.cpp:447 msgid "Show dialog for new inplot and put it into the script." msgstr "Mostrar dialogo para nuevo gráfico interno y añadirlo al script." #: udav/text_pnl.cpp:577 msgid "" "Show dialog for options and put it into the script.\n" "Options are used for additional setup the plot." msgstr "" "Mostrar dialogo de opciones y añadir al script.\n" "Las opciones son usadas para config. adicional de la gráfica." #: udav/text_pnl.cpp:598 msgid "" "Show dialog for plot setup and put code into the script.\n" "This dialog setup axis, labels, lighting and other general things." msgstr "" "Mostrar dialogo para config. de gráfica y añadir al script.\n" "Este dialogo configura ejes, etiquetas, luz, y otras cosas generales." #: udav/text_pnl.cpp:573 msgid "" "Show dialog for styles and put it into the script.\n" "Styles define the plot view (color scheme, marks, dashing and so on)." msgstr "" "Mostrar dialogo de estilos y añadir al script.\n" "Los estilos definen el aspecto de la gráfica(esquema de color, marcas, etc.)." #: udav/text_pnl.cpp:548 msgid "Show dialog for text finding (Ctrl+F)." msgstr "Mostrar dialogo de búsqueda de texto (Ctrl+F)." #: udav/udav_wnd.cpp:326 msgid "Show help on MGL commands (F1)." msgstr "Mostrar ayuda de comandos de MGL (F1)." #: udav/udav_wnd.cpp:219 msgid "Show hidden plots" msgstr "Mostrar gráficos ocultos" #: mgllab/help.cpp:284 msgid "Show hint on startup" msgstr "Mostrar sugerencias al iniciar" #: udav/udav_wnd.cpp:330 msgid "Show hints of MGL usage." msgstr "Mostrar sugerencias de uso de MGL." #: udav/udav_wnd.cpp:213 msgid "Show info" msgstr "Mostrar info." #: mgllab/mgllab.cpp:305 msgid "Show lines" msgstr "Mostrar líneas" #: widgets/fltk.cpp:919 msgid "Show next frame in slideshow" msgstr "Mostrar sgte. cuadro de la animación" #: widgets/qt.cpp:1266 udav/plot_pnl.cpp:564 msgid "Show next slide (Ctrl+.)." msgstr "Mostrar sgte. cuadro (Ctrl+.)." #: widgets/fltk.cpp:914 msgid "Show previous frame in slideshow" msgstr "Mostrar cuadro previo de la animación" #: widgets/qt.cpp:1275 udav/plot_pnl.cpp:579 msgid "Show previous slide (Ctrl+,)." msgstr "Mostrar cuadro previo (Ctrl+,)." #: mgllab/editor.cpp:532 #, fuzzy msgid "Show window for primitives" msgstr "Mostrar dialogo de propiedades de UDAV." #: src/random.cpp:349 msgid "Shuffle data cells (for dir='a') or slices (for dir='xyz')" msgstr "" #: mgllab/table.cpp:779 msgid "Sin FFT" msgstr "Sin FFT" #: udav/dat_pnl.cpp:620 msgid "Sin-Fourier transform along direction(s)" msgstr "Transformada Sin-Fourier en dirección(es)" #: src/exec_dat.cpp:1812 msgid "Sin-Fourier transform at some direction" msgstr "Transformada Sin-Fourier en alguna dirección" #: mgllab/table.cpp:165 msgid "Sinus FFT" msgstr "Sin-FFT" #: udav/opt_dlg.cpp:70 mgllab/dialogs.cpp:104 mgllab/dialogs.cpp:359 msgid "Size" msgstr "Tamaño" #: udav/subplot_dlg.cpp:114 msgid "Size of column" msgstr "Tamaño de columna" #: udav/subplot_dlg.cpp:131 msgid "Size of stick" msgstr "Tamaño de barra" #. size menu #: udav/mem_pnl.cpp:68 udav/dat_pnl.cpp:765 mgllab/dialogs.cpp:1015 #: mgllab/table.cpp:759 msgid "Sizes" msgstr "Tamaños" #: src/parser.cpp:1491 msgid "Skip commands and iterate for-loop again" msgstr "Saltar comandos e iterar bucle \"for\" nuevamente" #: widgets/qt.cpp:1268 udav/plot_pnl.cpp:567 msgid "Slideshow" msgstr "Animación" #: mgllab/table.cpp:163 mgllab/table.cpp:773 msgid "Smooth" msgstr "Suavizado" #: src/exec_dat.cpp:1813 msgid "Smooth data" msgstr "Suavizar datos" #: udav/dat_pnl.cpp:613 msgid "Smooth data along direction(s)" msgstr "Suavizar datos en dirección(es)" # Mantener ODE y GO o llevar al español? #: src/exec_dat.cpp:1795 msgid "Solve Hamiltonian ODE (find GO ray or trajectory)" msgstr "Resolver ODE (encontrar rayo GO o trayectoria)" #: src/exec_dat.cpp:1785 msgid "Solve ODE" msgstr "Resolver ODE" #: src/exec_dat.cpp:1787 msgid "Solve PDE" msgstr "Resolver PDE" #: src/exec_dat.cpp:1793 msgid "Solve PDE in accompanied coordinates for 2d case" msgstr "Solve PDE in accompanied coordinates for 2d case" #: src/exec_dat.cpp:1794 msgid "Solve PDE in accompanied coordinates for 3d case" msgstr "Solve PDE in accompanied coordinates for 3d case" #: src/exec_dat.cpp:1729 msgid "Solve PDE using advanced method (X-Y only)" msgstr "Resolver PDE usando método avanzado (solo X-Y)" #: src/exec_dat.cpp:1827 msgid "Solve tridiagonal matrix" msgstr "Resolver matriz tridiagonal" #: src/exec_dat.cpp:1815 msgid "Sort data by values in column" msgstr "Ordenar datos por valores en columna" #: udav/prop_dlg.cpp:141 msgid "Spanish" msgstr "Español" #: udav/calc_dlg.cpp:194 msgid "Special" msgstr "Especial" #: mgllab/table.cpp:129 msgid "" "Specify new data size\n" "Data will be interpolated" msgstr "" "Especificar nuevo tamaño de datos.\n" "Los datos serán interpolados" #: mgllab/table.cpp:114 msgid "" "Specify new data size\n" "Data will be zero filled" msgstr "" "Especificar nuevo tamaño de datos\n" "Los datos serán llenados con ceros" #: mgllab/table.cpp:144 msgid "" "Specify the skipping step\n" "Each m-th point will be saved only" msgstr "" "Especificar el paso de salto.\n" "Solo cada m-ésimo punto sera guardado" #: udav/dat_pnl.cpp:778 mgllab/table.cpp:762 msgid "Squeeze" msgstr "Comprimir" #: src/exec_dat.cpp:1816 msgid "Squeeze data" msgstr "Comprimir datos" #: udav/setup_dlg.cpp:84 msgid "Start" msgstr "Inicio" #: src/parser.cpp:1501 msgid "Start function definition and stop execution of main script" msgstr "Definir función y detener ejecución de script principal" #: src/parser.cpp:1504 msgid "Start next for-loop iteration" msgstr "Iniciar sgte. iteración de bucle for" #: src/parser.cpp:1505 msgid "Start/close commands which should executed only once" msgstr "Iniciar/terminar bloque de comandos ejecutables una sola vez" #: udav/subplot_dlg.cpp:76 msgid "Starting cell index" msgstr "Índice de celda inicial" #: udav/setup_dlg.cpp:117 msgid "State" msgstr "Estado" #: src/exec_dat.cpp:1747 msgid "Step for pulse diffraction" msgstr "Paso para pulso de difracción" #: widgets/qt.cpp:1152 udav/plot_pnl.cpp:348 msgid "Stop" msgstr "Deterner" #: widgets/fltk.cpp:881 msgid "Stop drawing" msgstr "Detener graficación" #: src/parser.cpp:1507 msgid "Stop execution" msgstr "Detener ejecución" #: udav/plot_pnl.cpp:350 msgid "Stop script execution (F7)." msgstr "Detener ejecución de script (F7)." #: udav/args_dlg.cpp:59 mgllab/mathgl.cpp:164 msgid "String for $0" msgstr "Texto para $0" #: udav/args_dlg.cpp:41 mgllab/mathgl.cpp:146 msgid "String for $1" msgstr "Testo para $1" #: udav/args_dlg.cpp:43 mgllab/mathgl.cpp:148 msgid "String for $2" msgstr "Texto para $2" #: udav/args_dlg.cpp:45 mgllab/mathgl.cpp:150 msgid "String for $3" msgstr "Texto para $3" #: udav/args_dlg.cpp:47 mgllab/mathgl.cpp:152 msgid "String for $4" msgstr "Texto para $4" #: udav/args_dlg.cpp:49 mgllab/mathgl.cpp:154 msgid "String for $5" msgstr "Texto para $5" #: udav/args_dlg.cpp:51 mgllab/mathgl.cpp:156 msgid "String for $6" msgstr "Texto para $6" #: udav/args_dlg.cpp:53 mgllab/mathgl.cpp:158 msgid "String for $7" msgstr "Texto para $7" #: udav/args_dlg.cpp:55 mgllab/mathgl.cpp:160 msgid "String for $8" msgstr "Texto para $8" #: udav/args_dlg.cpp:57 mgllab/mathgl.cpp:162 msgid "String for $9" msgstr "Texto para $9" #: udav/files_dlg.cpp:38 msgid "String for %1" msgstr "Texto para %1" #: udav/files_dlg.cpp:40 msgid "String for %2" msgstr "Texto para %2" #: udav/files_dlg.cpp:42 msgid "String for %3" msgstr "Texto para %3" #: udav/files_dlg.cpp:44 msgid "String for %4" msgstr "Texto para %4" #: udav/files_dlg.cpp:46 msgid "String for %5" msgstr "Texto para %5" #: udav/files_dlg.cpp:48 msgid "String for %6" msgstr "Texto para %6" #: udav/files_dlg.cpp:50 msgid "String for %7" msgstr "Texto para %7" #: udav/files_dlg.cpp:52 msgid "String for %8" msgstr "Texto para %8" #: udav/files_dlg.cpp:54 msgid "String for %9" msgstr "Texto para %9" #: udav/prop_dlg.cpp:85 msgid "Strings" msgstr "Texto" #: udav/subplot_dlg.cpp:208 mgllab/dialogs.cpp:1314 msgid "Style" msgstr "Estilo" #: udav/setup_dlg.cpp:80 msgid "SubTicks" msgstr "Subescala" #: mgllab/dialogs.cpp:959 msgid "Subticks" msgstr "Subescala" #: src/exec_dat.cpp:1819 msgid "Subtract data or number" msgstr "Restar datos o número" #: mgllab/table.cpp:797 msgid "Subtract to" msgstr "Restar a" #: udav/prop_dlg.cpp:94 msgid "Suffixes" msgstr "Sufijos" #: udav/dat_pnl.cpp:539 msgid "Sum along direction(s)" msgstr "Sumar en alguna(s) dirección(es)" #: udav/dat_pnl.cpp:614 msgid "Summarize data along direction(s)" msgstr "Sumar datos en una(s) dirección(es)" # Suma or sumatoria? #. { _("Histogram of"), 0, hist_cb }, #: mgllab/table.cpp:342 mgllab/table.cpp:790 msgid "Summation of" msgstr "Suma de" #: src/exec_dat.cpp:1821 msgid "Swap data (useful after Fourier transform)" msgstr "Invertir orden de datos (útil luego de la Tranformada de Fourier)" #: udav/dat_pnl.cpp:618 msgid "Swap data along direction(s)" msgstr "Invertir orden de datos en dirección(es)" #: mgllab/table.cpp:164 mgllab/table.cpp:778 msgid "Swap parts" msgstr "Intercambiar partes" #: src/exec_set.cpp:865 #, fuzzy msgid "Switch on/off TeX parsing at text output" msgstr "Activar/desactivar transparencia en la imagen" #: src/exec_set.cpp:831 msgid "Switch on/off fog" msgstr "Activar/desactivar niebla" #: src/exec_set.cpp:833 msgid "Switch on/off gray-scale mode" msgstr "Activar/desactivar modo B/N" #: widgets/fltk.cpp:868 msgid "Switch on/off grid drawing" msgstr "Activar/desactivar dibujado de grilla" # Activar/desactivar=(Des)activar? #: udav/plot_pnl.cpp:308 msgid "Switch on/off grid of absolute coordinates (Ctrl+G)." msgstr "Activar/desactivar grilla de coordenadas absolutas (Ctrl+G)." #: widgets/qt.cpp:1125 msgid "Switch on/off lightning for the graphics (Alt+L)." msgstr "Activar/desactivar luz para las gráficas (Alt+L)." #: udav/plot_pnl.cpp:302 msgid "Switch on/off lightning for the graphics (Ctrl+L)." msgstr "Activar/desactivar luz para las gráficas (Alt+L)." #: widgets/fltk.cpp:865 msgid "Switch on/off lightning in the picture" msgstr "Activar/desactivar luz en la imagen" #: widgets/qt.cpp:1131 udav/plot_pnl.cpp:315 msgid "" "Switch on/off mouse handling of the graphics\n" "(rotation, shifting, zooming and perspective)." msgstr "" "Activar/desactivar manipulacion de gráfica con el mouse\n" "(rotación, traslación, zoom y perspectiva)." #: widgets/qt.cpp:1137 msgid "Switch on/off mouse zoom of selected region." msgstr "Activar/desactivar zoom con el mouse de la región seleccionada." # Ternario or triple? #: src/exec_set.cpp:864 msgid "Switch on/off to use ternary axis" msgstr "Activar/desactivar uso de ejes ternarios" #: src/exec_set.cpp:811 msgid "Switch on/off transparency" msgstr "Activar/desactivar transparencia" #: widgets/qt.cpp:1119 msgid "Switch on/off transparency for the graphics (Alt+T)." msgstr "Activar/desactivar transparencia para gráfica (Alt+T)." #: udav/plot_pnl.cpp:295 msgid "Switch on/off transparency for the graphics (Ctrl+T)." msgstr "Activar/desactivar transparencia para gráfica (Alt+T)." #: widgets/fltk.cpp:862 msgid "Switch on/off transparency in the picture" msgstr "Activar/desactivar transparencia en la imagen" #: mgllab/table.cpp:552 msgid "Symmetrical range" msgstr "Rango simétrico" #: udav/dat_pnl.cpp:366 msgid "Symmetrical?" msgstr "¿Simétrico?" #: src/addon.cpp:122 src/base_cf.cpp:283 #, c-format msgid "TEST: %s\n" msgstr "TEST: %s\n" #: udav/open_dlg.cpp:82 udav/setup_dlg.cpp:88 mgllab/dialogs.cpp:961 msgid "Template" msgstr "Plantilla" #: udav/setup_dlg.cpp:140 msgid "Template name" msgstr "Nombre de plantilla" #: udav/setup_dlg.cpp:163 msgid "Template saved" msgstr "Plantilla guardada" #: mgllab/dialogs.cpp:1038 msgid "Ternary" msgstr "Ternario" #: mgllab/dialogs.cpp:1472 msgid "Text" msgstr "Texto" #: udav/style_dlg.cpp:167 mgllab/dialogs.cpp:376 msgid "Text align" msgstr "Alineación de texto" #: udav/newcmd_dlg.cpp:172 mgllab/dialogs.cpp:713 msgid "Text and legend" msgstr "Texto y leyenda" #: udav/style_dlg.cpp:164 msgid "Text color" msgstr "Color del texto" #: udav/style_dlg.cpp:123 mgllab/dialogs.cpp:343 msgid "Text on contours" msgstr "Texto en contornos" #: mgllab/dialogs.cpp:367 msgid "Text style" msgstr "Estilo de texto" #: src/window.cpp:423 msgid "" "The calculator can help you to put complex expression in the script. Just " "type the expression (which may depend on coordinates x,y,z and so on) and " "put it into the script." msgstr "" "La calculadora puede ayudar a añadir expresiones complejas en el script. " "Solo escriba la expresión (que puede depender de las coordenadas x,y,z, " "etc.) y añádala al script." #: mgllab/editor.cpp:284 msgid "" "The current file has not been saved.\n" "Would you like to save it now?" msgstr "" "El archivo actual no se ha guardado.\n" "¿Desea guardarlo ahora?" #: src/window.cpp:425 msgid "" "The special dialog (Edit|Insert|New Command) help you select the command, " "fill its arguments and put it into the script." msgstr "" "Los diálogos especiales (Editar|Insertar|Nuevo comando) ayudan a seleccionar " "un comando, llenar sus argumentos y añadirlo al script." #: src/crust.cpp:619 msgid "" "There are duplicated or indistinguishably adjacent points for triangulation." msgstr "" "Hay puntos duplicados o indistinguiblemente juntos para la triangulación." #. mglScrStr #: src/base.cpp:262 msgid "There is changing temporary data in script" msgstr "Algunos datos temporales cambiaron en el script" #: udav/text_pnl.cpp:124 msgid "There is manual primitives." msgstr "Hay primitivas del usuario." #: udav/newcmd_dlg.cpp:341 msgid "There is no 'fmt' argument for this command" msgstr "No hay argumento \"fmt\" para este comando" #: udav/text_pnl.cpp:137 mgllab/editor.cpp:685 msgid "There is no fitted formula." msgstr "No hay fórmula ajustada." #: utils/mglcgi.cpp:74 #, c-format msgid "There is no query. Exit.\n" msgstr "No hay solicitud. Salir.\n" #: udav/text_pnl.cpp:109 msgid "There is no selection to evaluate." msgstr "No hay selección para evaluar." #: src/window.cpp:422 msgid "" "There is powerful calculator with a lot of special functions. You can use " "buttons or keyboard to type the expression. Also you can use existed " "variables in the expression." msgstr "" "Existe una calculador con muchas funciones especiales. Puede usar botones o " "el teclado para escribir expresiones. También se pueden usar variables " "existentes en las expresiones." #. mglScrCmd #: src/base.cpp:260 msgid "There is too long string(s) in script" msgstr "Texto muy largo en el script" #. mglScrLong #: src/base.cpp:261 msgid "There is unbalanced ' in script" msgstr "Desbalance de ' en el script" #. mglWarnSpc #: src/base.cpp:258 msgid "There is wrong argument(s) in script" msgstr "Argumento(s) incorrecto(s) en el script" #. mglScrArg #: src/base.cpp:259 msgid "There is wrong command(s) in script" msgstr "Comando(s) incorrecto(s) en el script" #: widgets/fltk.cpp:894 msgid "Theta angle (tilt z-axis)" msgstr "Ángulo theta (inclinación del eje z)" #: widgets/fltk.cpp:1206 msgid "This is for parameter " msgstr "Esto es para parámetro " #: mgllab/table.cpp:494 msgid "This operation is not supported for this kind of data." msgstr "Operación no soportada para este tipo de datos." #: udav/setup_dlg.cpp:76 mgllab/dialogs.cpp:955 msgid "Ticks" msgstr "Escala" #: mgllab/dialogs.cpp:960 msgid "Ticks start" msgstr "Inicio de escala" #: mgllab/dialogs.cpp:1031 msgid "Time ticks" msgstr "Escala de tiempo" #: udav/subplot_dlg.cpp:204 mgllab/dialogs.cpp:1313 msgid "Title" msgstr "Titulo" #: udav/subplot_dlg.cpp:206 msgid "Title for plot. Can be used in SubPlot or MultiPlot only." msgstr "Titulo para gráfica. Se puede usar solo en subgráfica y multigráfica." #: udav/dat_pnl.cpp:351 udav/dat_pnl.cpp:366 udav/dat_pnl.cpp:377 #: udav/dat_pnl.cpp:424 udav/dat_pnl.cpp:453 mgllab/table.cpp:609 msgid "To" msgstr "A" #: udav/calc_dlg.cpp:66 udav/setup_dlg.cpp:147 msgid "To script" msgstr "Al script" #: udav/dat_pnl.cpp:790 msgid "Transform" msgstr "Transformar" #: udav/dat_pnl.cpp:792 msgid "Transform data along dimension(s) (Ctrl+Shift+T)." msgstr "Transformar datos en la(s) dirección(es) (Ctrl+Shift+T)." #: mgllab/dialogs.cpp:346 msgid "Transparency" msgstr "Transparencia" #: mgllab/dialogs.cpp:1043 msgid "Transparency type" msgstr "Tipo de transparencia" #: mgllab/table.cpp:764 msgid "Transpose" msgstr "Transponer" #: mgllab/table.cpp:671 msgid "Transpose data" msgstr "Transponer datos" #: src/exec_dat.cpp:1825 msgid "Transpose data array" msgstr "Transponer arreglo de datos" #: mgllab/table.cpp:862 msgid "Transpose data dimensions" msgstr "Transponer dimensiones de datos" #: udav/dat_pnl.cpp:612 msgid "Transpose data with new dimensions" msgstr "Transponer datos con nuevas dimensiones" #: udav/calc_dlg.cpp:192 msgid "Trigonometric" msgstr "Trigonometricas" #: mgllab/dialogs.cpp:1034 msgid "Tune ticks" msgstr "Afinar escala" #: mgllab/table.cpp:169 mgllab/table.cpp:344 msgid "Type of operation" msgstr "Tipo de operacion" #: mgllab/table.cpp:174 msgid "Type of smoothing" msgstr "Tipo de suavizado" #. N #: udav/style_dlg.cpp:246 mgllab/dialogs.cpp:54 msgid "U - indigo" msgstr "U - indigo" #: udav/text_pnl.cpp:109 udav/text_pnl.cpp:124 udav/text_pnl.cpp:137 #: udav/udav_wnd.cpp:340 msgid "UDAV" msgstr "UDAV" #: udav/opt_dlg.cpp:31 msgid "UDAV - Add options" msgstr "UDAV - Añadir opciones" #: udav/anim_dlg.cpp:35 msgid "UDAV - Animation setup" msgstr "UDAV - Config. animación" #: udav/dat_pnl.cpp:388 msgid "UDAV - Clear data" msgstr "UDAV - Borrar datos" #: udav/dat_pnl.cpp:424 msgid "UDAV - Crop data" msgstr "UDAV - Cortar datos" #: udav/dat_pnl.cpp:255 msgid "UDAV - Export to PNG" msgstr "UDAV - Exportar a PNG" #: udav/dat_pnl.cpp:351 msgid "UDAV - Fill data" msgstr "UDAV - Llenar datos" #: udav/find_dlg.cpp:33 msgid "UDAV - Find" msgstr "UDAV - Buscar" #: udav/dat_pnl.cpp:485 msgid "UDAV - Go to slice" msgstr "UDAV - Ir a sección" #: udav/hint_dlg.cpp:37 msgid "UDAV - Hint" msgstr "UDAV - Sugerencia" #: udav/dat_pnl.cpp:277 msgid "UDAV - Import PNG" msgstr "UDAV - Importar PNG" #: udav/prop_dlg.cpp:192 udav/prop_dlg.cpp:198 udav/newcmd_dlg.cpp:322 #: udav/text_pnl.cpp:145 udav/open_dlg.cpp:101 msgid "UDAV - Insert filename" msgstr "UDAV - Ingresar nombre de archivo" #: udav/newcmd_dlg.cpp:327 udav/text_pnl.cpp:152 msgid "UDAV - Insert path" msgstr "UDAV - Ingresar dirección" #: udav/style_dlg.cpp:48 udav/data_dlg.cpp:33 msgid "UDAV - Insert style/scheme" msgstr "UDAV - Ingresar estilo/esquema" #: udav/dat_pnl.cpp:270 msgid "UDAV - Load data" msgstr "UDAV - Cargar datos" #: udav/dat_pnl.cpp:450 msgid "UDAV - Make histogram" msgstr "UDAV - Crear histograma" #: udav/mem_pnl.cpp:84 msgid "UDAV - New variable" msgstr "UDAV - Nueva variable" #: udav/dat_pnl.cpp:377 msgid "UDAV - Normalize by slice" msgstr "UDAV - Normalizar por sección" #: udav/dat_pnl.cpp:366 msgid "UDAV - Normalize data" msgstr "UDAV - Normalizar datos" #: udav/open_dlg.cpp:49 msgid "UDAV - Open data file" msgstr "UDAV - Archivo archivo de datos" #: udav/udav_wnd.cpp:633 msgid "UDAV - Open file" msgstr "UDAV - Abrir archivo" #: udav/prop_dlg.cpp:60 udav/prop_dlg.cpp:285 msgid "UDAV - Properties" msgstr "UDAV - Propiedades" #: udav/dat_pnl.cpp:283 msgid "UDAV - Read from HDF" msgstr "UDAV - Leer desde HDF" #: udav/dat_pnl.cpp:436 msgid "UDAV - Rearrange data" msgstr "UDAV - Reordenar datos" #: udav/dat_pnl.cpp:402 msgid "UDAV - Resize data" msgstr "UDAV - Reescalar datos" #: udav/setup_dlg.cpp:159 udav/setup_dlg.cpp:163 msgid "UDAV - Save template" msgstr "UDAV - Guardar plantilla" #: udav/dat_pnl.cpp:261 msgid "UDAV - Save to HDF" msgstr "UDAV - Guardar a HDF" #: udav/dat_pnl.cpp:248 msgid "UDAV - Save/export data" msgstr "UDAV - Guardar/exportar datos" #: udav/args_dlg.cpp:32 msgid "UDAV - Set script arguments" msgstr "UDAV - Especificar argumentos de script" #: udav/files_dlg.cpp:29 msgid "UDAV - Set template parameters" msgstr "UDAV - Especificar parámetros de plantilla" #: udav/subplot_dlg.cpp:37 msgid "UDAV - Setup inplot" msgstr "UDAV - Config. gráfica interna" #: udav/setup_dlg.cpp:39 udav/setup_dlg.cpp:190 msgid "UDAV - Setup plot" msgstr "UDAV - Config. gráfica" #: udav/dat_pnl.cpp:413 msgid "UDAV - Squeeze data" msgstr "UDAV - Comprimir datos" #: udav/udav_wnd.cpp:456 msgid "UDAV - about" msgstr "UDAV - Acerca de" #: udav/anim_dlg.cpp:104 msgid "UDAV - animation" msgstr "UDAV - Animación" # Cambiar or modificar? #: udav/dat_pnl.cpp:608 msgid "UDAV - change data" msgstr "UDAV - Cambiar datos" #: udav/opt_dlg.cpp:94 udav/opt_dlg.cpp:101 udav/opt_dlg.cpp:108 #: udav/opt_dlg.cpp:115 msgid "UDAV - command options" msgstr "UDAV - Opciones de comando" #: udav/mem_pnl.cpp:121 msgid "UDAV - delete all data" msgstr "UDAV - Borrar todos los datos" #: udav/text_pnl.cpp:202 msgid "UDAV - find text" msgstr "UDAV - Buscar texto" #: udav/dat_pnl.cpp:536 udav/dat_pnl.cpp:566 udav/dat_pnl.cpp:572 #: udav/dat_pnl.cpp:643 msgid "UDAV - make new data" msgstr "UDAV - Crear nuevos datos" #: udav/text_pnl.cpp:431 msgid "UDAV - open file" msgstr "UDAV - Abrir archivo" #: udav/udav_wnd.cpp:569 udav/udav_wnd.cpp:579 udav/udav_wnd.cpp:621 msgid "UDAV - save current" msgstr "UDAV - Guardar actual" #: udav/udav_wnd.cpp:669 msgid "UDAV - save file" msgstr "UDAV - Guardar archivo" #: udav/style_dlg.cpp:160 mgllab/dialogs.cpp:371 msgid "Underline" msgstr "Subrayado" #. edit menu #: udav/text_pnl.cpp:516 mgllab/mgllab.cpp:299 msgid "Undo" msgstr "Deshacer" #: udav/text_pnl.cpp:518 msgid "Undo editor change (Ctrl+Z)." msgstr "Deshacer cambios de editor (Ctrl+Z)." #: mgllab/mgllab.cpp:140 msgid "Untitled" msgstr "Sin nombre" #: mgllab/mgllab.cpp:351 mgllab/mgllab.cpp:355 msgid "Untitled - mgllab" msgstr "Sin nombre - mgllab" #: widgets/fltk.cpp:1120 msgid "Update" msgstr "Actualizar" #: udav/mem_pnl.cpp:62 msgid "Update list of data arrays" msgstr "Actualizar lista de arreglos de datos" #: mgllab/dialogs.cpp:100 msgid "Upper border for determining color or alpha" msgstr "Limite superior para determinar color o alfa" #: utils/mglconv.cpp:84 #, c-format msgid "Usage:\tmglconv [parameter(s)] scriptfile\n" msgstr "Uso:\tmglconv [parámetro(s)] script\n" #: mgllab/mgllab.cpp:423 #, c-format msgid "Usage:\tmgllab [parameter(s)] scriptfile\n" msgstr "Uso:\tmgllab [parámetro(s)] script\n" #: utils/mglview.cpp:83 #, c-format msgid "Usage:\tmglview [parameter(s)] scriptfile\n" msgstr "Uso:\tmglview [parámetro(s)] script\n" #: widgets/glut.cpp:103 #, c-format msgid "" "Use 'a', 'd', 'w', 's', 'q', 'e' for changing view angles\n" "Use 'j', 'l', 'i', 'k' for changing light angles\n" "Use 'u', 'o' for changing distance to light\n" "Use 'r' for switching transparency\n" "Use 'f' for switching lightning\n" "Use 'E' for exporting to EPS file\n" "Use 'S' for exporting to SVG file\n" "Use 'J' for exporting to JPEG file\n" "Use 'P' for exporting to PNG file\n" "Use ',', '.' for show other frames\n" "Use 'm' for view movie\n" "Use 'h' for view this text\n" "Use 'x' for exit\n" msgstr "" "Use 'a', 'd', 'w', 's', 'q', 'e' para cambiar ángulo de visión\n" "Use 'j', 'l', 'i', 'k' para cambiar angulos de luz\n" "Use 'u', 'o' para cambiar distancia de luz\n" "Use 'r' para alternar transparencia\n" "Use 'f' para alternar luz\n" "Use 'E' para exportar a archivo EPS\n" "Use 'S' para exportar a archivo SVG\n" "Use 'J' para exportar a archivo JPEG\n" "Use 'P' para exportar a archivo PNG\n" "Use ',', '.' para mostrar otros cuadros\n" "Use 'm' para ver animación\n" "Use 'h' para ver este texto\n" "Use 'x' para salir\n" #: udav/style_dlg.cpp:162 msgid "Use color scheme" msgstr "Usar esquema de colores" #: mgllab/mgllab.cpp:485 #, fuzzy msgid "Use dark color scheme" msgstr "Usar esquema de colores" #: udav/prop_dlg.cpp:175 msgid "Use dots plot for preview" msgstr "Usar gráfica de puntos para vista previa" # Thread=hilo? #: mgllab/mgllab.cpp:484 msgid "Use multi-threading for drawing" msgstr "Usar múltiples subprocesos para graficar" #: udav/newcmd_dlg.cpp:67 udav/opt_dlg.cpp:68 mgllab/dialogs.cpp:101 msgid "Value" msgstr "Valor" #: mgllab/dialogs.cpp:398 msgid "Value for i-th color" msgstr "Valor para el i-ésimo color" #: mgllab/dialogs.cpp:727 mgllab/dialogs.cpp:1047 msgid "Variant" msgstr "Variante" #: mgllab/dialogs.cpp:728 msgid "" "Variant of command argument order. The notation is:\n" " * Capital arguments are data (like, Ydat);\n" " * Argument in '' are strings (like, 'fmt');\n" " * Other arguments are numbers (like, zval);\n" " * Arguments in [] are optional arguments." msgstr "" "Tipo de argumentos de comando. La notación es:\n" " * mayusculas denotan datos (ej.: Ydat);\n" " * argumentos en '' son texto (ej.: 'fmt');\n" " * otros argumentos son números (ej.: zval);\n" " * argumento en [] son opcionales." #: udav/newcmd_dlg.cpp:170 mgllab/dialogs.cpp:711 msgid "Vector plots" msgstr "Gráfica vectorial" #: mgllab/dialogs.cpp:379 msgid "Vertical align" msgstr "Alineación vertical" #: udav/subplot_dlg.cpp:55 udav/subplot_dlg.cpp:72 udav/subplot_dlg.cpp:97 msgid "Vertical size" msgstr "Tamaño vertical" #. k #: udav/style_dlg.cpp:236 mgllab/dialogs.cpp:44 msgid "W - lightgray" msgstr "W - gris claro" #: src/exec_dat.cpp:1829 msgid "Wavelet transform at some direction" msgstr "Transformada wavelet en alguna dirección" #: udav/subplot_dlg.cpp:195 msgid "Whole area" msgstr "Área completa" #: mgllab/mgllab.cpp:488 msgid "Widget scheme" msgstr "Esquema del widget" #: mgllab/dialogs.cpp:329 msgid "Width" msgstr "Ancho" #: udav/subplot_dlg.cpp:80 msgid "Width of selected cells" msgstr "Ancho de las celdas seleccionadas" #: src/data.cpp:1559 #, c-format msgid "" "Widths are:\n" "Wa = %g\tWx = %g\tWy = %g\tWz = %g\n" msgstr "" "Los anchos son:\n" "Wa = %g\tWx = %g\tWy = %g\tWz = %g\n" #: mgllab/dialogs.cpp:348 msgid "Wire or mesh" msgstr "Alambre o grilla" #: udav/style_dlg.cpp:120 msgid "Wire or mesh plot" msgstr "Gráfica de cables o grilla" #: udav/style_dlg.cpp:159 mgllab/dialogs.cpp:370 msgid "Wire style" msgstr "Estilo de alambre" #: src/exec_set.cpp:874 msgid "Write current image to graphical file" msgstr "Guardar imagen actual a archivo gráfico" #: udav/setup_dlg.cpp:48 mgllab/dialogs.cpp:950 msgid "X axis" msgstr "Eje x" #: udav/setup_dlg.cpp:118 msgid "X pos" msgstr "Pos. x" #: mgllab/dialogs.cpp:1065 msgid "X position" msgstr "Posición x" #: udav/dat_pnl.cpp:413 msgid "X-direction" msgstr "Dirección x" #: udav/opt_dlg.cpp:38 mgllab/dialogs.cpp:85 msgid "X-range" msgstr "Rango x" #: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436 msgid "X-size" msgstr "Tamaño x" #: mgllab/dialogs.cpp:568 msgid "X-slice from" msgstr "Sección x desde" #: udav/subplot_dlg.cpp:176 msgid "X/Z" msgstr "X/Z" #: widgets/qt.cpp:1098 udav/plot_pnl.cpp:490 msgid "XYZ" msgstr "XYZ" #. M #: udav/style_dlg.cpp:242 mgllab/dialogs.cpp:50 msgid "Y - olive" msgstr "Y - verde oliva" #: udav/setup_dlg.cpp:49 mgllab/dialogs.cpp:963 msgid "Y axis" msgstr "Eje y" #: udav/setup_dlg.cpp:119 msgid "Y pos" msgstr "Pos. y" #: mgllab/dialogs.cpp:1066 msgid "Y position" msgstr "Posición y" #: udav/dat_pnl.cpp:413 msgid "Y-direction" msgstr "Dirección y" #: udav/opt_dlg.cpp:41 mgllab/dialogs.cpp:89 msgid "Y-range" msgstr "Rango y" #: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436 msgid "Y-size" msgstr "Tamaño y" #: mgllab/dialogs.cpp:571 msgid "Y-slice from" msgstr "Sección y desde" #: udav/subplot_dlg.cpp:180 msgid "Y/Z" msgstr "Y/Z" #: mgllab/help.cpp:135 msgid "Yes" msgstr "Sí" #: src/window.cpp:427 msgid "" "You can concatenation of strings and numbers using `,` with out spaces (for " "example, `'max(u)=',u.max,' a.u.'` or `'u=',!(1+i2)` for complex numbers). " "Also you can get n-th symbol of the string using `[]` (for example, " "`'abc'[1]` will give 'b'), or add a value to the last character of the " "string using `+` (for example, `'abc'+3` will give 'abf'), or use it all " "together." msgstr "" #: src/window.cpp:411 msgid "" "You can copy the current image to clipboard by pressing Ctrl-Shift-C. Later " "you can paste it directly into yours document or presentation." msgstr "" "Puede copiar la imagen actual a memoria presionando Ctrl-Shift-C. Luego se " "puede pegar directamente en un documento o presentación." #: src/window.cpp:424 msgid "" "You can easily insert file or folder names, last fitted formula or numerical " "value of selection by using menu Edit|Insert." msgstr "" "Puede insertar fácilmente nombres de archivos o directorios, la última " "fórmula ajustada o o valores numéricos seleccionados usando el menú Editar|" "Insertar." #: src/window.cpp:418 msgid "" "You can edit MGL file in any text editor. Also you can run it in console by " "help of commands: mglconv, mglview." msgstr "" "Puede editar un archivo MGL en cualquier editor. También lo puede ejecutar " "en una terminal con ayuda de los comandos mglconv, mglview." #: src/window.cpp:412 msgid "" "You can export image into a set of format (EPS, SVG, PNG, JPEG) by pressing " "right mouse button inside image and selecting 'Export as ...'." msgstr "" "Puede exportar sus gráficas a varios formatos (EPS, SVG, PNG, JPEG) " "presionando el botón derecho del mouse sobre la imagen y seleccionado " "\"Exportar como ...'." #: src/window.cpp:416 msgid "" "You can put several plots in the same image by help of commands 'subplot' or " "'inplot'." msgstr "" "Puede poner varias gráficas en la misma imagen con ayuda de los comando " "\"subplot\" o \"inplot\"." #: src/window.cpp:426 msgid "" "You can put several plotting commands in the same line or in separate " "function, for highlighting all of them simultaneously." msgstr "" "Puede poner varios comandos en la misma línea o en una función separada, " "para resaltarlos todos simultáneamente." #: src/window.cpp:409 msgid "" "You can rotate/shift/zoom whole plot by mouse. Just press 'Rotate' " "toolbutton, click image and hold a mouse button: left button for rotation, " "right button for zoom/perspective, middle button for shift." msgstr "" "Puede rotar/trasladar/escalar toda la gráfica con el mouse. Solo presione el " "botón 'Rotar', haga clic en la imagen y mantenga presionado un botón del " "mouse: izquierdo para rotación, derecho para zoom/perspectiva, del medio " "para traslación." #: src/window.cpp:414 msgid "" "You can save the parameter of animation inside MGL script by using comment " "started from '##a ' or '##c ' for loops." msgstr "" "Puede guardar los parámetros de una animación en un script MGL usando " "comentarios que inicien con '##a ' o '##c ' para bucles." #: src/window.cpp:413 msgid "" "You can setup colors for script highlighting in Property dialog. Just select " "menu item 'Settings/Properties'." msgstr "" "Puede configurar los colores para el resaltado del script en el dialogo " "\"Propiedades\". Solo seleccione 'Configuración/Propiedades'." #: src/window.cpp:408 msgid "" "You can shift axis range by pressing middle button and moving mouse. Also, " "you can zoom in/out axis range by using mouse wheel." msgstr "" "Puede trasladar el rango de los ejes presionando el botón medio del mouse y " "moviendo el mouse. También puede escalar el rango de los ejes usando la " "rueda del mouse." # Needs revision of the English version #: src/window.cpp:421 msgid "" "You can type arbitrary expression as input argument for data or number. In " "last case (for numbers), the first value of data array is used." msgstr "" "Puede usar números o expresiones arbitrarias como argumento de entrada para " "datos. En el primer caso (para números), el primer valor del arreglo es " "usado." #: src/window.cpp:419 msgid "" "You can use command 'once on|off' for marking the block which should be " "executed only once. For example, this can be the block of large data reading/" "creating/handling. Press F9 (or menu item 'Graphics/Reload') to re-execute " "this block." msgstr "" "Puede usar las instrucciones 'once on|off' para hacer que el bloque de " "comandos entre ellas se ejecute una sola vez. Por ejemplo, este podría ser " "un bloque largo de lectura/creación/manipulación de datos. Presione F9 (o " "seleccione 'Gráfica/Recargar') para volver a ejecutar el bloque." #: src/window.cpp:420 msgid "" "You can use command 'stop' for terminating script parsing. It is useful if " "you don't want to execute a part of script." msgstr "" "Puede usar el comando \"stop\" para terminar la ejecución del script. Esto " "es útil si se desea que una parte de este no se ejecute." #: src/window.cpp:410 msgid "" "You may quickly draw the data from file. Just use: mgllab 'filename.dat' in " "command line." msgstr "" "Puede graficar rápidamente los datos de un archivo. Solo escriba \"mgllab " "'archivo.dat'\" en la línea de comandos." #: mgllab/dialogs.cpp:1529 msgid "You need to enter text!" msgstr "¡Debe ingresar texto!" #: mgllab/table.cpp:367 msgid "You need to provide output name" msgstr "Debe indicar un nombre para el archivo" #: udav/prop_dlg.cpp:285 msgid "You need to restart UDAV for applying the changes." msgstr "Debe reiniciar UDAV para aplicar los cambios." #: mgllab/dialogs.cpp:592 msgid "You need to select data array" msgstr "Debe seleccionar un arreglo de datos" # marker=marca? #: mgllab/dialogs.cpp:1489 msgid "You need to select marker!" msgstr "¡Debe seleccionar un marcador!" #: mgllab/table.cpp:190 mgllab/table.cpp:364 msgid "You need to specify direction(s)" msgstr "Debe especificar dirección(es)" #: udav/newcmd_dlg.cpp:376 udav/newcmd_dlg.cpp:380 msgid "You should put text inside ' ' for argument " msgstr "Debe poner el texto entre ' para el argumento " #: udav/anim_dlg.cpp:105 msgid "You should select one of case" msgstr "Debe seleccionar uno de los casos" #: udav/newcmd_dlg.cpp:384 msgid "You should specify all optional arguments before " msgstr "Debe especificar todos los argumentos opcionales primero " #: udav/newcmd_dlg.cpp:368 msgid "You should specify required argument " msgstr "Debe especificar el argumento requerido " #: udav/setup_dlg.cpp:50 mgllab/dialogs.cpp:976 msgid "Z axis" msgstr "Eje z" #: udav/setup_dlg.cpp:120 msgid "Z pos" msgstr "Pos. z" #: mgllab/dialogs.cpp:1067 msgid "Z position" msgstr "Posición z" #: udav/dat_pnl.cpp:413 msgid "Z-direction" msgstr "Dirección z" #: udav/opt_dlg.cpp:44 mgllab/dialogs.cpp:93 msgid "Z-range" msgstr "Rango z" #: udav/dat_pnl.cpp:388 udav/dat_pnl.cpp:402 udav/dat_pnl.cpp:436 msgid "Z-size" msgstr "Tamaño z" #: mgllab/dialogs.cpp:574 msgid "Z-slice from" msgstr "Sección z para" #: src/exec_set.cpp:880 msgid "Zoom axis range" msgstr "Rango de zoom para eje" #: widgets/qt.cpp:1133 msgid "Zoom by mouse" msgstr "Zoom con el mouse" #: widgets/qt.cpp:1232 msgid "Zoom graphics" msgstr "Escalar gráfica" # Zoom in=acercar or ampliar? #: widgets/qt.cpp:1242 udav/plot_pnl.cpp:516 msgid "Zoom in" msgstr "Magnificar" #: widgets/qt.cpp:1244 udav/plot_pnl.cpp:519 msgid "Zoom in graphics." msgstr "Magnificar gráfica." #: widgets/fltk.cpp:875 msgid "Zoom in selected region of the picture" msgstr "Magnificar región seleccionada de la imagen" #. t->addAction(QPixmap(":/png/help-faq.png"), _("Examples"), this, SLOT(showExamples())); #: udav/help_pnl.cpp:55 msgid "Zoom in text" msgstr "Magnificar texto" #: widgets/fltk.cpp:905 msgid "Zoom in the picture" msgstr "Magnificar la imagen" #: widgets/qt.cpp:1246 udav/plot_pnl.cpp:522 msgid "Zoom out" msgstr "Reducir" #: widgets/qt.cpp:1248 udav/plot_pnl.cpp:525 msgid "Zoom out graphics." msgstr "Reducir gráfica." #: udav/help_pnl.cpp:56 msgid "Zoom out text" msgstr "Reducir texto" #: widgets/fltk.cpp:907 msgid "Zoom out the picture" msgstr "Reducir la imagen" #: src/exec_set.cpp:879 msgid "Zoom plot region" msgstr "Escalar región de gráfica" #. zooming menu #: widgets/qt.cpp:1231 udav/plot_pnl.cpp:503 msgid "Zoom/move" msgstr "Zoom/mover" # Above=sobre or encima #: udav/style_dlg.cpp:131 msgid "above" msgstr "arriba" #: mgllab/dialogs.cpp:570 mgllab/dialogs.cpp:573 mgllab/dialogs.cpp:576 msgid "all" msgstr "todo" #: mgllab/dialogs.cpp:581 msgid "along" msgstr "a lo largo de" #: mgllab/table.cpp:171 mgllab/table.cpp:346 msgid "along x" msgstr "a lo largo de x" #: mgllab/table.cpp:172 mgllab/table.cpp:347 msgid "along y" msgstr "a lo largo de y" #: mgllab/table.cpp:173 mgllab/table.cpp:348 msgid "along z" msgstr "a lo largo de z" #: mgllab/dialogs.cpp:1012 msgid "alpha" msgstr "alfa" #: mgllab/dialogs.cpp:1296 msgid "and" msgstr "y" #: mgllab/dialogs.cpp:1456 msgid "arc" msgstr "arco" #: mgllab/dialogs.cpp:1018 msgid "arrows" msgstr "flechas" #: udav/setup_dlg.cpp:72 udav/style_dlg.cpp:170 msgid "at center" msgstr "en el centro" #: udav/setup_dlg.cpp:72 msgid "at maximum" msgstr "en el máximo" #: udav/setup_dlg.cpp:72 msgid "at minimum" msgstr "en el minimo" #: udav/setup_dlg.cpp:70 mgllab/dialogs.cpp:956 msgid "at position" msgstr "en la posición" #: mgllab/dialogs.cpp:1027 msgid "attach light" msgstr "vincular luz" #. mglWarnFmt #: src/base.cpp:255 msgid "axis ranges are incompatible" msgstr "rangos de ejes incompletos" #. w #: udav/style_dlg.cpp:222 mgllab/dialogs.cpp:29 msgid "b - blue" msgstr "b - azul" #: mgllab/dialogs.cpp:1019 msgid "bars" msgstr "barras" #: widgets/qt.cpp:1088 udav/plot_pnl.cpp:479 msgid "bitmap EPS" msgstr "mapa de bits EPS" #: mgllab/dialogs.cpp:1036 msgid "both" msgstr "ambos" #: udav/subplot_dlg.cpp:189 mgllab/dialogs.cpp:1306 msgid "bottom" msgstr "fondo" #. r #: udav/style_dlg.cpp:225 mgllab/dialogs.cpp:32 msgid "c - cyan" msgstr "c - cian" #: mgllab/dialogs.cpp:957 mgllab/dialogs.cpp:970 mgllab/dialogs.cpp:983 #: mgllab/dialogs.cpp:996 msgid "center" msgstr "centro" #: widgets/fltk.cpp:800 #, c-format msgid "click at %g, %g, %g" msgstr "clic en %g, %g, %g" #. mglWarnCnt #: src/base.cpp:251 msgid "couldn't open file" msgstr "no se pudo abrir archivo" #: mgllab/dialogs.cpp:1455 msgid "curve" msgstr "curva" #: mgllab/dialogs.cpp:1026 msgid "cutting" msgstr "cortado" #. ----------------------------------------------------------------------------- #: src/base.cpp:242 msgid "data dimension(s) is incompatible" msgstr "dimensión(es) de datos incompatible(s)" #. mglWarnDim #: src/base.cpp:243 msgid "data dimension(s) is too small" msgstr "dimensión(es) de datos muy pequeña(s)" #. mglWarnMem #: src/base.cpp:247 msgid "data values are zero" msgstr "valores nulos" #: udav/open_dlg.cpp:85 udav/open_dlg.cpp:144 udav/opt_dlg.cpp:63 #: udav/opt_dlg.cpp:66 mgllab/dialogs.cpp:107 mgllab/dialogs.cpp:116 #: mgllab/dialogs.cpp:1044 msgid "default" msgstr "por defecto" #: mgllab/help.cpp:151 msgid "dimensions" msgstr "dimensiones" #. l #: udav/style_dlg.cpp:229 mgllab/dialogs.cpp:36 msgid "e - lawngreen" msgstr "E - verde pasto oscuro" #: mgllab/dialogs.cpp:1455 msgid "ellipse" msgstr "elipse" #: mgllab/dialogs.cpp:1017 msgid "facenum" msgstr "facenum" #: mgllab/dialogs.cpp:1035 msgid "factor" msgstr "factor" #. mglWarnSize #: src/base.cpp:254 msgid "format is not supported for that build" msgstr "formato no soportado" #: src/canvas.cpp:31 msgid "frame" msgstr "cuadro" #: udav/anim_dlg.cpp:55 mgllab/mathgl.cpp:192 msgid "from" msgstr "desde" #. b #: udav/style_dlg.cpp:223 mgllab/dialogs.cpp:30 msgid "g - lime" msgstr "g - lima" #: mgllab/dialogs.cpp:1044 msgid "glass-like" msgstr "vidrioso" #: mgllab/dialogs.cpp:1011 msgid "grayscale" msgstr "escala de grises" #. p #: udav/style_dlg.cpp:234 mgllab/dialogs.cpp:41 msgid "h - gray" msgstr "h - gris" #: src/parser.cpp:1076 #, c-format msgid "in line %ld" msgstr "en línea %ld" #: mgllab/dialogs.cpp:1036 msgid "increment" msgstr "incrementar" #: mgllab/dialogs.cpp:1236 mgllab/dialogs.cpp:1249 mgllab/dialogs.cpp:1262 #: mgllab/dialogs.cpp:1271 mgllab/dialogs.cpp:1280 msgid "ind" msgstr "ind" #. h #: udav/style_dlg.cpp:235 mgllab/dialogs.cpp:43 msgid "k - black" msgstr "k - negro" #. y #: udav/style_dlg.cpp:228 mgllab/dialogs.cpp:35 msgid "l - springgreen" msgstr "l - verde primavera" #: mgllab/dialogs.cpp:1045 msgid "lamp-like" msgstr "lamp-like" #. vv->addSpacing(11); #: udav/style_dlg.cpp:169 udav/subplot_dlg.cpp:187 mgllab/dialogs.cpp:957 #: mgllab/dialogs.cpp:970 mgllab/dialogs.cpp:983 mgllab/dialogs.cpp:996 #: mgllab/dialogs.cpp:1304 msgid "left" msgstr "izquierda" #. mglWarnOpen #: src/base.cpp:252 msgid "light: ID is out of range" msgstr "luz: ID fuera de rango" #: mgllab/dialogs.cpp:1013 msgid "lighting" msgstr "iluminacion" #: mgllab/dialogs.cpp:1454 msgid "line" msgstr "línea" #. c #: udav/style_dlg.cpp:226 mgllab/dialogs.cpp:33 msgid "m - magenta" msgstr "m - magenta" #. #. ^ #: udav/style_dlg.cpp:317 udav/style_dlg.cpp:356 mgllab/dialogs.cpp:209 #: mgllab/dialogs.cpp:247 msgid "manual" msgstr "manual" # marker=marca or marcador? #: mgllab/dialogs.cpp:1454 msgid "marker" msgstr "marcador" #: mgllab/dialogs.cpp:1020 msgid "markers" msgstr "marcadores" #: udav/data_dlg.cpp:68 msgid "max" msgstr "máx" #: mgllab/help.cpp:153 msgid "mem. usage" msgstr "uso de mem." #: mgllab/dialogs.cpp:1016 msgid "meshnum" msgstr "meshnum" #: udav/newcmd_dlg.cpp:247 msgid "mgl_en" msgstr "mgl_en" #: utils/mglconv.cpp:83 #, c-format msgid "" "mglconv convert mgl script to image file (default PNG).\n" "Current version is %s\n" msgstr "" "mglconv convierte scripts MGL a archivos de imagen (PNG por defecto).\n" "La version actual es %s\n" #: mgllab/mgllab.cpp:422 #, c-format msgid "" "mgllab draw mgl script interactively.\n" "Current version is %s\n" msgstr "" "mgllab gráfica scripts MGL de manera interactiva.\n" "La version actual es %s\n" #: mgllab/help.cpp:78 #, c-format msgid "" "mgllab v. %s\n" "(c) Alexey Balakin, 2017\n" "http://mathgl.sf.net/" msgstr "" "mgllab v. %s\n" "(c) Alexey Balakin, 2017\n" "http://mathgl.sf.net/" #: utils/mglview.cpp:82 #, c-format msgid "" "mglview show plot from MGL script or MGLD file.\n" "Current version is %s\n" msgstr "" "mglview muestra la gráfica de un script MGL o de un archivo MGLD.\n" "La version actual es %s\n" #: udav/data_dlg.cpp:68 msgid "min" msgstr "min" #. mglWarnLow #: src/base.cpp:244 msgid "minimal data value is negative" msgstr "valor minimal de datos es negativo" #. e #: udav/style_dlg.cpp:230 mgllab/dialogs.cpp:37 msgid "n - skyblue" msgstr "n - azul cielo" #: mgllab/help.cpp:149 msgid "name" msgstr "nombre" #. mglWarnNeg #: src/base.cpp:245 msgid "no file or wrong data dimensions" msgstr "archivo no existe o las dimensiones de datos son incorrectas" #. mglWarnZero #: src/base.cpp:248 msgid "no legend entries" msgstr "leyenda vacia" #: mgllab/dialogs.cpp:1028 msgid "no origin tick" msgstr "no hay marca del origen" #. "-+=;oOsS~<>jdD*^" #. ".+x*sdv^<>o.*+xsdv^<>o" : nf = 10 #: udav/style_dlg.cpp:128 udav/style_dlg.cpp:131 udav/style_dlg.cpp:134 #: udav/style_dlg.cpp:339 udav/style_dlg.cpp:383 udav/data_dlg.cpp:67 #: mgllab/dialogs.cpp:214 mgllab/dialogs.cpp:230 mgllab/dialogs.cpp:1035 #: mgllab/dialogs.cpp:1039 msgid "none" msgstr "ninguno" #: udav/style_dlg.cpp:220 msgid "none or default" msgstr "ninguno o por defecto" #. mglWarnFile #: src/base.cpp:246 msgid "not enough memory" msgstr "no hay suficiente memoria" #. mglWarnNull #: src/base.cpp:257 msgid "not enough space for plot" msgstr "no hay suficiente espacio para gráfica" #: mgllab/table.cpp:85 msgid "not used" msgstr "no usado" #. mglWarnSlc #: src/base.cpp:250 msgid "number of contours is zero or negative" msgstr "número de curvas de nivel es cero o negativo" #: udav/opt_dlg.cpp:63 udav/opt_dlg.cpp:66 msgid "off" msgstr "off" #: udav/opt_dlg.cpp:63 udav/opt_dlg.cpp:66 udav/setup_dlg.cpp:128 msgid "on" msgstr "on" #: udav/dat_pnl.cpp:549 msgid "or enter name for new variable" msgstr "o ingrese nombre para nueva variable" # rosado fuerte? #. q #: udav/style_dlg.cpp:233 mgllab/dialogs.cpp:40 msgid "p - deeppink" msgstr "p - rosado profundo" #: mgllab/dialogs.cpp:1023 msgid "pen blur" msgstr "difuminacion del trazo" #: mgllab/dialogs.cpp:392 msgid "plain" msgstr "plano" #. mglWarnTern #: src/base.cpp:256 msgid "pointer is NULL" msgstr "puntero es NULL" #: mgllab/dialogs.cpp:1456 msgid "polygon" msgstr "poligono" #: mgllab/dialogs.cpp:1040 msgid "projection" msgstr "proyeccion" #. u #: udav/style_dlg.cpp:232 mgllab/dialogs.cpp:39 msgid "q - orange" msgstr "q - naranja" # cuadruple? #: mgllab/dialogs.cpp:1040 msgid "quaternary" msgstr "cuaternario" #: mgllab/dialogs.cpp:1041 msgid "quaternary proj" msgstr "proy. cuaternaria" #. g #: udav/style_dlg.cpp:224 mgllab/dialogs.cpp:31 msgid "r - red" msgstr "r - rojo" #: mgllab/dialogs.cpp:1454 msgid "rectangle" msgstr "rectangulo" #: mgllab/dialogs.cpp:1455 msgid "rhomb" msgstr "rombo" #: udav/style_dlg.cpp:172 udav/subplot_dlg.cpp:193 mgllab/dialogs.cpp:958 #: mgllab/dialogs.cpp:971 mgllab/dialogs.cpp:984 mgllab/dialogs.cpp:997 #: mgllab/dialogs.cpp:1310 msgid "right" msgstr "derecha" #: mgllab/dialogs.cpp:1029 msgid "rotate text" msgstr "rotar texto" # guardar animacion? #: mgllab/mathgl.cpp:199 msgid "save slides" msgstr "guardar cuadros" #. mglWarnLId #: src/base.cpp:253 msgid "size(s) is zero or negative" msgstr "tamaño(s) nulo(s) o negativo(s)" #. mglWarnLeg #: src/base.cpp:249 msgid "slice value is out of range" msgstr "valor de sección fuera de rango" #: mgllab/table.cpp:144 msgid "smoothed" msgstr "suavizado" #: mgllab/dialogs.cpp:326 msgid "solid" msgstr "sólido" #: widgets/qt.cpp:1086 udav/plot_pnl.cpp:477 msgid "solid PNG" msgstr "PNG sólido" #: udav/anim_dlg.cpp:45 mgllab/mathgl.cpp:187 msgid "strings" msgstr "texto" #: udav/data_dlg.cpp:67 msgid "sum" msgstr "suma" # triple? #: mgllab/dialogs.cpp:1039 msgid "ternary" msgstr "ternario" #: mgllab/dialogs.cpp:1041 msgid "ternary proj" msgstr "proy. ternaria" #: mgllab/dialogs.cpp:1021 mgllab/dialogs.cpp:1456 msgid "text" msgstr "texto" #: mgllab/dialogs.cpp:1022 msgid "ticks" msgstr "escala" #: udav/anim_dlg.cpp:59 mgllab/mathgl.cpp:193 mgllab/dialogs.cpp:569 #: mgllab/dialogs.cpp:572 mgllab/dialogs.cpp:575 msgid "to" msgstr "hacia" #: mgllab/mgllab.cpp:574 msgid "to script" msgstr "al script" #: udav/subplot_dlg.cpp:191 mgllab/dialogs.cpp:1308 msgid "top" msgstr "arriba" #. n #: udav/style_dlg.cpp:231 mgllab/dialogs.cpp:38 msgid "u - blueviolet" msgstr "u - azul violeta" #: udav/style_dlg.cpp:131 msgid "under" msgstr "abajo" #: udav/mem_pnl.cpp:168 mgllab/help.cpp:203 msgid "unknown" msgstr "desconocido" #: udav/udav_wnd.cpp:168 udav/udav_wnd.cpp:560 udav/udav_wnd.cpp:693 msgid "untitled - UDAV" msgstr "sin nombre - UDAV" #: udav/udav_wnd.cpp:686 msgid "untitled* - UDAV" msgstr "sin nombre* - UDAV" #: mgllab/dialogs.cpp:327 msgid "user" msgstr "usuario" #: udav/anim_dlg.cpp:52 mgllab/mathgl.cpp:189 msgid "values" msgstr "valores" #: widgets/qt.cpp:1089 udav/plot_pnl.cpp:480 msgid "vector EPS" msgstr "EPS vectorial" #. #: udav/style_dlg.cpp:221 mgllab/dialogs.cpp:28 msgid "w - white" msgstr "w - blanco" #: mgllab/dialogs.cpp:1312 msgid "whole area" msgstr "toda el area" #: mgllab/dialogs.cpp:1471 msgid "wire" msgstr "cable" #: udav/anim_dlg.cpp:63 mgllab/mathgl.cpp:194 msgid "with step" msgstr "con paso" #. m #: udav/style_dlg.cpp:227 mgllab/dialogs.cpp:34 msgid "y - yellow" msgstr "y - amarillo" #~ msgid "Insert file content?" #~ msgstr "¿Insertar contenido de archivo?" #~ msgid "Insert file name?" #~ msgstr "¿Insertar nombre de archivo?" #~ msgid "" #~ "You may quickly draw the data from file. Just use: udav 'filename.dat' in " #~ "command line." #~ msgstr "" #~ "Puede graficar rápidamente los datos de un archivo. Solo escriba \"udav " #~ "'archivo.dat'\" en la línea de comandos." mathgl-8.0.1/AUTHORS0000664000175000017500000000035714167366474013661 0ustar balakinbalakinAuthor of MathGL: Alexey Balakin Some extensions was written by: Dmitriy Kulagin - cmake script Mikhail Vidassov - U3D/PDF/OBJ export Mikhail Barg - Pascal/Delphi interface Sergey Plis - Forth interfacemathgl-8.0.1/scripts/0000775000175000017500000000000014167366473014272 5ustar balakinbalakinmathgl-8.0.1/scripts/CodeCoverage.cmake0000664000175000017500000002115214167366473017623 0ustar balakinbalakin# Copyright (c) 2012 - 2017, Lars Bilke # All rights reserved. # # Redistribution and use in source and binary forms, with or without modification, # are permitted provided that the following conditions are met: # # 1. Redistributions of source code must retain the above copyright notice, this # list of conditions and the following disclaimer. # # 2. Redistributions in binary form must reproduce the above copyright notice, # this list of conditions and the following disclaimer in the documentation # and/or other materials provided with the distribution. # # 3. Neither the name of the copyright holder nor the names of its contributors # may be used to endorse or promote products derived from this software without # specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR # ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON # ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # CHANGES: # # 2012-01-31, Lars Bilke # - Enable Code Coverage # # 2013-09-17, Joakim Söderberg # - Added support for Clang. # - Some additional usage instructions. # # 2016-02-03, Lars Bilke # - Refactored functions to use named parameters # # 2017-06-02, Lars Bilke # - Merged with modified version from github.com/ufz/ogs # # # USAGE: # # 1. Copy this file into your cmake modules path. # # 2. Add the following line to your CMakeLists.txt: # include(CodeCoverage) # # 3. Append necessary compiler flags: # APPEND_COVERAGE_COMPILER_FLAGS() # # 4. If you need to exclude additional directories from the report, specify them # using the COVERAGE_EXCLUDES variable before calling SETUP_TARGET_FOR_COVERAGE. # Example: # set(COVERAGE_EXCLUDES 'dir1/*' 'dir2/*') # # 5. Use the functions described below to create a custom make target which # runs your test executable and produces a code coverage report. # # 6. Build a Debug build: # cmake -DCMAKE_BUILD_TYPE=Debug .. # make # make my_coverage_target # include(CMakeParseArguments) # Check prereqs find_program( GCOV_PATH gcov ) find_program( LCOV_PATH lcov ) find_program( GENHTML_PATH genhtml ) find_program( GCOVR_PATH gcovr PATHS ${CMAKE_SOURCE_DIR}/scripts/test) find_program( SIMPLE_PYTHON_EXECUTABLE python ) if(NOT GCOV_PATH) message(FATAL_ERROR "gcov not found! Aborting...") endif() # NOT GCOV_PATH if("${CMAKE_CXX_COMPILER_ID}" MATCHES "(Apple)?[Cc]lang") if("${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 3) message(FATAL_ERROR "Clang version must be 3.0.0 or greater! Aborting...") endif() elseif(NOT CMAKE_COMPILER_IS_GNUCXX) message(FATAL_ERROR "Compiler is not GNU gcc! Aborting...") endif() set(COVERAGE_COMPILER_FLAGS "-g -O0 --coverage -fprofile-arcs -ftest-coverage" CACHE INTERNAL "") set(CMAKE_CXX_FLAGS_COVERAGE ${COVERAGE_COMPILER_FLAGS} CACHE STRING "Flags used by the C++ compiler during coverage builds." FORCE ) set(CMAKE_C_FLAGS_COVERAGE ${COVERAGE_COMPILER_FLAGS} CACHE STRING "Flags used by the C compiler during coverage builds." FORCE ) set(CMAKE_EXE_LINKER_FLAGS_COVERAGE "" CACHE STRING "Flags used for linking binaries during coverage builds." FORCE ) set(CMAKE_SHARED_LINKER_FLAGS_COVERAGE "" CACHE STRING "Flags used by the shared libraries linker during coverage builds." FORCE ) mark_as_advanced( CMAKE_CXX_FLAGS_COVERAGE CMAKE_C_FLAGS_COVERAGE CMAKE_EXE_LINKER_FLAGS_COVERAGE CMAKE_SHARED_LINKER_FLAGS_COVERAGE ) if(NOT CMAKE_BUILD_TYPE STREQUAL "Debug") message(WARNING "Code coverage results with an optimised (non-Debug) build may be misleading") endif() # NOT CMAKE_BUILD_TYPE STREQUAL "Debug" if(CMAKE_C_COMPILER_ID STREQUAL "GNU") link_libraries(gcov) else() set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") endif() # Defines a target for running and collection code coverage information # Builds dependencies, runs the given executable and outputs reports. # NOTE! The executable should always have a ZERO as exit code otherwise # the coverage generation will not complete. # # SETUP_TARGET_FOR_COVERAGE( # NAME testrunner_coverage # New target name # EXECUTABLE testrunner -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR # DEPENDENCIES testrunner # Dependencies to build first # ) function(SETUP_TARGET_FOR_COVERAGE) set(options NONE) set(oneValueArgs NAME) set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT LCOV_PATH) message(FATAL_ERROR "lcov not found! Aborting...") endif() # NOT LCOV_PATH if(NOT GENHTML_PATH) message(FATAL_ERROR "genhtml not found! Aborting...") endif() # NOT GENHTML_PATH # Setup target add_custom_target(${Coverage_NAME} # Cleanup lcov COMMAND ${LCOV_PATH} --directory . --zerocounters # Run tests COMMAND ${Coverage_EXECUTABLE} # Capturing lcov counters and generating report COMMAND ${LCOV_PATH} --directory . --capture --output-file ${Coverage_NAME}.info COMMAND ${LCOV_PATH} --remove ${Coverage_NAME}.info ${COVERAGE_EXCLUDES} --output-file ${Coverage_NAME}.info.cleaned COMMAND ${GENHTML_PATH} -o ${Coverage_NAME} ${Coverage_NAME}.info.cleaned COMMAND ${CMAKE_COMMAND} -E remove ${Coverage_NAME}.info ${Coverage_NAME}.info.cleaned WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} COMMENT "Resetting code coverage counters to zero.\nProcessing code coverage counters and generating report." ) # Show info where to find the report add_custom_command(TARGET ${Coverage_NAME} POST_BUILD COMMAND ; COMMENT "Open ./${Coverage_NAME}/index.html in your browser to view the coverage report." ) endfunction() # SETUP_TARGET_FOR_COVERAGE # Defines a target for running and collection code coverage information # Builds dependencies, runs the given executable and outputs reports. # NOTE! The executable should always have a ZERO as exit code otherwise # the coverage generation will not complete. # # SETUP_TARGET_FOR_COVERAGE_COBERTURA( # NAME ctest_coverage # New target name # EXECUTABLE ctest -j ${PROCESSOR_COUNT} # Executable in PROJECT_BINARY_DIR # DEPENDENCIES executable_target # Dependencies to build first # ) function(SETUP_TARGET_FOR_COVERAGE_COBERTURA) set(options NONE) set(oneValueArgs NAME) set(multiValueArgs EXECUTABLE EXECUTABLE_ARGS DEPENDENCIES) cmake_parse_arguments(Coverage "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) if(NOT SIMPLE_PYTHON_EXECUTABLE) message(FATAL_ERROR "python not found! Aborting...") endif() # NOT SIMPLE_PYTHON_EXECUTABLE if(NOT GCOVR_PATH) message(FATAL_ERROR "gcovr not found! Aborting...") endif() # NOT GCOVR_PATH # Combine excludes to several -e arguments set(COBERTURA_EXCLUDES "") foreach(EXCLUDE ${COVERAGE_EXCLUDES}) set(COBERTURA_EXCLUDES "-e ${EXCLUDE} ${COBERTURA_EXCLUDES}") endforeach() add_custom_target(${Coverage_NAME} # Run tests ${Coverage_EXECUTABLE} # Running gcovr COMMAND ${GCOVR_PATH} -x -r ${CMAKE_SOURCE_DIR} ${COBERTURA_EXCLUDES} -o ${Coverage_NAME}.xml WORKING_DIRECTORY ${PROJECT_BINARY_DIR} DEPENDS ${Coverage_DEPENDENCIES} COMMENT "Running gcovr to produce Cobertura code coverage report." ) # Show info where to find the report add_custom_command(TARGET ${Coverage_NAME} POST_BUILD COMMAND ; COMMENT "Cobertura code coverage report saved in ${Coverage_NAME}.xml." ) endfunction() # SETUP_TARGET_FOR_COVERAGE_COBERTURA function(APPEND_COVERAGE_COMPILER_FLAGS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COVERAGE_COMPILER_FLAGS}" PARENT_SCOPE) message(STATUS "Appending code coverage compiler flags: ${COVERAGE_COMPILER_FLAGS}") endfunction() # APPEND_COVERAGE_COMPILER_FLAGS mathgl-8.0.1/scripts/qt5.cmake0000664000175000017500000000122614167366473016006 0ustar balakinbalakinset(MGL_HAVE_QT5 1) macro(find_qt5_libs qt5_lib_req qt5_lib_add) foreach(mgl_qt5_lib ${ARGN}) find_package(Qt5${mgl_qt5_lib} QUIET) if(NOT Qt5${mgl_qt5_lib}_FOUND) if(${qt5_lib_req}) message(SEND_ERROR "Couldn't find Qt5 ${mgl_qt5_lib} library.") endif(${qt5_lib_req}) else(NOT Qt5${mgl_qt5_lib}_FOUND) if(${qt5_lib_add}) set(MGL_QT5_LIBS ${MGL_QT5_LIBS} Qt5::${mgl_qt5_lib}) endif(${qt5_lib_add}) endif(NOT Qt5${mgl_qt5_lib}_FOUND) endforeach(mgl_qt5_lib) endmacro(find_qt5_libs qt5_lib_req) find_qt5_libs(ON ON Core Gui Widgets PrintSupport OpenGL) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) mathgl-8.0.1/scripts/qt4.cmake0000664000175000017500000000060014167366473016000 0ustar balakinbalakinset(MGL_HAVE_QT4 1) set(MGL_QT4_LIBS_FIND QtCore QtGui QtOpenGL) set(MGL_QT4_LIBS_FIND_JSON QtNetwork QtWebKit) FIND_PACKAGE(Qt4 4.8 REQUIRED ${MGL_QT4_LIBS_FIND}) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(MGL_QT4_LIBS) foreach(mgl_qt4_lib ${MGL_QT4_LIBS_FIND}) set(MGL_QT4_LIBS ${MGL_QT4_LIBS} Qt4::${mgl_qt4_lib}) endforeach(mgl_qt4_lib) mathgl-8.0.1/scripts/CMakeLists.txt0000664000175000017500000000246214167366473017036 0ustar balakinbalakinif(enable-dep-dll) if(enable-qt5) find_package(Qt5Gui QUIET) if(Qt5Gui_FOUND) get_target_property(mgl_qt_loc Qt5::QWindowsIntegrationPlugin LOCATION) endif(Qt5Gui_FOUND) endif(enable-qt5) install(CODE "SET(mgl_qt_loc \"${mgl_qt_loc}\")") install(CODE "SET(CMAKE_INSTALL_PREFIX \"${CMAKE_INSTALL_PREFIX}\")") install(SCRIPT install-deps.cmake) endif(enable-dep-dll) if(WIN32) set(dest ${CMAKE_INSTALL_PREFIX}) install(FILES ${CMAKE_SOURCE_DIR}/scripts/FindMathGL2.cmake DESTINATION ${CMAKE_INSTALL_PREFIX} RENAME mathgl2-config.cmake) else(WIN32) set(dest ${MathGL_INSTALL_LIB_DIR}/cmake/mathgl2/) install(FILES ${CMAKE_SOURCE_DIR}/scripts/FindMathGL2.cmake DESTINATION ${MathGL_INSTALL_LIB_DIR}/cmake/mathgl2/ RENAME mathgl2-config.cmake) endif(WIN32) #export(TARGETS MathGLTargets FILE "${PROJECT_BINARY_DIR}/MathGL2Targets.cmake") export(PACKAGE MathGL2) configure_file(MathGLConfig.cmake.in "${MathGL2_BINARY_DIR}/MathGL2Config.cmake" @ONLY) configure_file(MathGLConfigVersion.cmake.in "${MathGL2_BINARY_DIR}/MathGL2ConfigVersion.cmake" @ONLY) install(FILES "${MathGL2_BINARY_DIR}/MathGL2Config.cmake" "${MathGL2_BINARY_DIR}/MathGL2ConfigVersion.cmake" DESTINATION "${MathGL_INSTALL_CMAKE_DIR}" COMPONENT dev) install(EXPORT MathGLTargets DESTINATION "${MathGL_INSTALL_CMAKE_DIR}" COMPONENT dev) mathgl-8.0.1/scripts/install-deps.cmake0000664000175000017500000000236414167366473017700 0ustar balakinbalakininclude(GetPrerequisites) message("\nInstalling depended libraries to ${CMAKE_INSTALL_PREFIX}/bin:\n") file(GLOB_RECURSE exe_list "${CMAKE_INSTALL_PREFIX}/*.exe") file(GLOB_RECURSE dll_list "${CMAKE_INSTALL_PREFIX}/*.dll") if(NOT (exe_list OR dll_list)) message("Exe and dll files not found, cannot generate dependency list") return() endif(NOT (exe_list OR dll_list)) set(mgl_all_dep) foreach(exe_file ${exe_list} ${dll_list}) get_prerequisites(${exe_file} DEPENDENCIES 1 1 "" "${CMAKE_INSTALL_PREFIX}/bin") foreach(DEPENDENCY_FILE ${DEPENDENCIES}) gp_resolve_item("${exe_file}" "${DEPENDENCY_FILE}" "" "${CMAKE_INSTALL_PREFIX}/bin" resolved_file) if(NOT resolved_file MATCHES ".*libmgl.*") list(APPEND mgl_all_dep ${resolved_file}) endif(NOT resolved_file MATCHES ".*libmgl.*") endforeach(DEPENDENCY_FILE ${DEPENDENCIES}) endforeach(exe_file ${exe_list}) list(REMOVE_DUPLICATES mgl_all_dep) list(SORT mgl_all_dep) foreach(dll_file ${mgl_all_dep}) message("Installing: ${dll_file}") endforeach(dll_file ${mgl_all_dep}) file(COPY ${mgl_all_dep} DESTINATION "${CMAKE_INSTALL_PREFIX}/bin") if(mgl_qt_loc) message("Installing: ${mgl_qt_loc}") file(COPY ${mgl_qt_loc} DESTINATION "${CMAKE_INSTALL_PREFIX}/bin/plugins/platforms") endif(mgl_qt_loc) mathgl-8.0.1/scripts/MathGLConfigVersion.cmake.in0000664000175000017500000000057314167366473021516 0ustar balakinbalakinset(PACKAGE_VERSION "@MathGL_VERSION@") # Check whether the requested PACKAGE_FIND_VERSION is compatible if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") set(PACKAGE_VERSION_COMPATIBLE FALSE) else() set(PACKAGE_VERSION_COMPATIBLE TRUE) if ("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") set(PACKAGE_VERSION_EXACT TRUE) endif() endif() mathgl-8.0.1/scripts/MathGLConfig.cmake.in0000664000175000017500000000200014167366473020133 0ustar balakinbalakin# - Config file for the MathGL package # It defines the following variables set(MathGL2_INCLUDE_DIRS "@MathGL_INSTALL_INCLUDE_DIR@") set(MathGL2_LIBRARIES_DIRS "@MathGL_INSTALL_LIB_DIR@") set(MathGL2_HAVE_QT5 "@enable-qt5@") set(MathGL2_HAVE_QT4 "@enable-qt4@") set(MathGL2_HAVE_WX "@enable-wx@") set(MathGL2_HAVE_FLTK "@enable-fltk@") set(MathGL2_HAVE_GLUT "@enable-glut@") set(MathGL2_HAVE_PTHREAD "@CMAKE_USE_PTHREADS_INIT@") set(MathGL2_HAVE_OPENMP "@OPENMP_FOUND@") include(CMakeFindDependencyMacro) # Adding dependency for Threads imported target if (MathGL2_HAVE_PTHREAD STRGREATER "") find_dependency(Threads) endif() # Adding dependency for OpenMP imported target if (MathGL2_HAVE_OPENMP STRGREATER "") find_dependency(OpenMP) endif() # Compute paths get_filename_component(MathGL2_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH) # Our library dependencies (contains definitions for IMPORTED targets) if(NOT TARGET mgl AND NOT MathGL_BINARY_DIR) include("${MathGL2_CMAKE_DIR}/MathGLTargets.cmake") endif() mathgl-8.0.1/scripts/FindMathGL2.cmake0000664000175000017500000001357514167366473017306 0ustar balakinbalakin# - FindMathGL2.cmake # This module can be used to find MathGL v.2.* and several of its optional components. # # You can specify one or more component as you call this find module. # Possible components are: FLTK, GLUT, Qt, WX. # # The following variables will be defined for your use: # # MATHGL2_FOUND = MathGL v.2 and all specified components found # MATHGL2_INCLUDE_DIRS = The MathGL v.2 include directories # MATHGL2_LIBRARIES = The libraries to link against to use MathGL v.2 # and all specified components # MATHGL2_VERSION_STRING = A human-readable version of the MathGL v.2 (e.g. 2.1) # MATHGL2_XXX_FOUND = Component XXX found (replace XXX with uppercased # component name -- for example, QT or FLTK) # # The minimum required version and needed components can be specified using # the standard find_package()-syntax, here are some examples: # find_package(MathGL2 REQUIRED) - v.2.* (no interfaces), required # find_package(MathGL2 REQUIRED Qt) - v.2.1 + Qt interface, required # find_package(MathGL2 2.1 REQUIRED) - v.2.1 (no interfaces), required # find_package(MathGL2 COMPONENTS Qt WX) - v.2.0 + Qt and WX interfaces, optional # # Note, some cmake builds require to write "COMPONENTS" always, like # find_package(MathGL2 REQUIRED COMPONENTS Qt) - v.2.* + Qt interface, required # # Typical usage could be something like this: # find_package(MathGL REQUIRED FLTK) # include_directories(${MATHGL2_INCLUDE_DIRS}) # add_executable(myexe main.cpp) # target_link_libraries(myexe ${MATHGL2_LIBRARIES} ${MATHGL2_FLTK_LIBRARIES}) # #============================================================================= # Copyright (c) 2011 Denis Pesotsky , 2014 Alexey Balakin # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file COPYING-CMAKE-MODULES for details. # # This software is distributed WITHOUT ANY WARRANTY; without even the # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= FIND_PATH(MATHGL2_INCLUDE_DIR NAMES mgl2/mgl.h DOC "The MathGL2 v.2.* include directory") FIND_LIBRARY(MATHGL2_LIBRARY NAMES mgl PATHS ${MATHGL2_LIBRARY_DIR} DOC "The MathGL v.2.* include directory") GET_FILENAME_COMPONENT(MATHGL2_LIBRARY_DIR ${MATHGL2_LIBRARY} PATH) SET(MATHGL2_LIBRARIES ${MATHGL2_LIBRARY}) SET(MATHGL2_INCLUDE_DIRS ${MATHGL2_INCLUDE_DIR}) IF(MATHGL2_INCLUDE_DIR) SET(_CONFIG_FILE_PATH "${MATHGL2_INCLUDE_DIR}/mgl2/define.h") SET(_VERSION_ERR "Cannot determine MathGL v.2.* version") IF(EXISTS "${_CONFIG_FILE_PATH}") FILE(STRINGS "${_CONFIG_FILE_PATH}" MATHGL2_VERSION_STRING REGEX "^#define MGL_VER2.*$") IF(MATHGL2_VERSION_STRING) STRING(REGEX REPLACE "#define MGL_VER2" "" MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING}) STRING(REGEX REPLACE "//.*" "" MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING}) STRING(STRIP ${MATHGL2_VERSION_STRING} MATHGL2_VERSION_STRING) SET(MATHGL2_VERSION_STRING 2.${MATHGL2_VERSION_STRING}) # MESSAGE(STATUS "Find MathGL version -- ${MATHGL2_VERSION_STRING}") ELSE() SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} parse error") ENDIF() ELSE() SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} not found") ENDIF() IF(_ERR_MESSAGE) UNSET(_ERR_MESSAGE) SET(_CONFIG_FILE_PATH "${MATHGL2_INCLUDE_DIR}/mgl2/config.h") SET(_VERSION_ERR "Cannot determine MathGL v.2.* version") IF(EXISTS "${_CONFIG_FILE_PATH}") FILE(STRINGS "${_CONFIG_FILE_PATH}" MATHGL2_VERSION_STRING REGEX "^#define MGL_VER2.*$") IF(MATHGL2_VERSION_STRING) STRING(REGEX REPLACE "#define MGL_VER2" "" MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING}) STRING(REGEX REPLACE "//.*" "" MATHGL2_VERSION_STRING ${MATHGL2_VERSION_STRING}) STRING(STRIP ${MATHGL2_VERSION_STRING} MATHGL2_VERSION_STRING) SET(MATHGL2_VERSION_STRING 2.${MATHGL2_VERSION_STRING}) # MESSAGE(STATUS "Find MathGL version -- ${MATHGL2_VERSION_STRING}") ELSE() SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} parse error") ENDIF() ELSE() SET(_ERR_MESSAGE "${_VERSION_ERR}: ${_CONFIG_FILE_PATH} not found") ENDIF() ENDIF(_ERR_MESSAGE) if(_ERR_MESSAGE) MESSAGE(FATAL_ERROR ${_ERR_MESSAGE}) endif(_ERR_MESSAGE) ENDIF() INCLUDE(FindPackageHandleStandardArgs) FIND_PACKAGE_HANDLE_STANDARD_ARGS(MathGL2 REQUIRED_VARS MATHGL2_LIBRARY MATHGL2_INCLUDE_DIR VERSION_VAR MATHGL2_VERSION_STRING) FOREACH(_Component ${MathGL2_FIND_COMPONENTS}) STRING(TOLOWER ${_Component} _component) STRING(TOUPPER ${_Component} _COMPONENT) SET(MATHGL2_${_Component}_FIND_REQUIRED ${MATHGL2_FIND_REQUIRED}) SET(MATHGL2_${_Component}_FIND_QUIETLY true) if(${_component} STREQUAL "qt4" OR ${_component} STREQUAL "qt5") FIND_PATH(MATHGL2_${_COMPONENT}_INCLUDE_DIR NAMES mgl2/qt.h PATHS ${MATHGL2_INCLUDE_DIR} NO_DEFAULT_PATH) else(${_component} STREQUAL "qt4" OR ${_component} STREQUAL "qt5") FIND_PATH(MATHGL2_${_COMPONENT}_INCLUDE_DIR NAMES mgl2/${_component}.h PATHS ${MATHGL2_INCLUDE_DIR} NO_DEFAULT_PATH) endif(${_component} STREQUAL "qt4" OR ${_component} STREQUAL "qt5") FIND_LIBRARY(MATHGL2_${_COMPONENT}_LIBRARY NAMES mgl-${_component} PATHS ${MATHGL2_LIBRARY_DIR} NO_DEFAULT_PATH) FIND_PACKAGE_HANDLE_STANDARD_ARGS(MATHGL2_${_Component} DEFAULT_MSG MATHGL2_${_COMPONENT}_LIBRARY MATHGL2_${_COMPONENT}_INCLUDE_DIR) IF(MATHGL2_${_COMPONENT}_FOUND) SET(MATHGL2_LIBRARIES ${MATHGL2_LIBRARIES} ${MATHGL2_${_COMPONENT}_LIBRARY}) SET(MATHGL2_INCLUDE_DIRS ${MATHGL2_INCLUDE_DIRS} ${MATHGL2_${_COMPONENT}_INCLUDE_DIR}) ENDIF() MARK_AS_ADVANCED(MATHGL2_${_COMPONENT}_INCLUDE_DIR MATHGL2_${_COMPONENT}_LIBRARY) ENDFOREACH() MARK_AS_ADVANCED(MATHGL2_INCLUDE_DIR MATHGL2_LIBRARY MATHGL2_VERSION_STRING) mathgl-8.0.1/COPYING0000664000175000017500000010451314167366474013643 0ustar balakinbalakin GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . mathgl-8.0.1/udav/0000775000175000017500000000000014167366466013544 5ustar balakinbalakinmathgl-8.0.1/udav/anim_dlg.h0000664000175000017500000000474414167366466015500 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef ANIMPARAM_H #define ANIMPARAM_H //----------------------------------------------------------------------------- #include #include "mgl2/define.h" //----------------------------------------------------------------------------- class QLineEdit; class QTextEdit; class QRadioButton; class QCheckBox; /// Setup animation parqmeters class AnimParam : public QDialog { Q_OBJECT public: bool gifOn, jpgOn; /// string with resulting animation parameters const QString &getResult() { return res; } void setResult(const QString &s); void setResult(double a1,double a2,double da); AnimParam(QWidget *parent=0); ~AnimParam(); signals: void putText(const QString &par); private slots: void fillRes(); void putTxt(); void setRBF(); void setRBT(); private: QString res; QLineEdit *p1, *p2, *dp, *delay;//, *fname; QTextEdit *text; QRadioButton *rbt, *rbf; QCheckBox *gif, *jpg; }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/calc_dlg.cpp0000664000175000017500000003325014167366466016003 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include "calc_dlg.h" extern mglParse parser; //----------------------------------------------------------------------------- // // Calc dialog // //----------------------------------------------------------------------------- QWidget *createCalcDlg(QWidget *p, QTextEdit *e) { CalcDialog *c = new CalcDialog(p); QObject::connect(c, SIGNAL(putNumber(QString)),e,SLOT(insertPlainText(QString))); return c; } //----------------------------------------------------------------------------- CalcDialog::CalcDialog(QWidget *parent) : QWidget(parent) { QPushButton *b; QHBoxLayout *m=new QHBoxLayout(this); QVBoxLayout *o=new QVBoxLayout; m->addLayout(o); m->setStretchFactor(o,1); // QStandardItem *it; text = new QLineEdit(this); o->addWidget(text); connect(text,SIGNAL(textChanged(QString)),this,SLOT(evaluate())); connect(text,SIGNAL(returnPressed()),this,SLOT(addResult())); hist = new QStandardItemModel(this); // it = new QStandardItem(_("Formula")); hist->setHorizontalHeaderItem(0,it); // it = new QStandardItem(_("Result")); hist->setHorizontalHeaderItem(1,it); prev = new QListView(this); o->addWidget(prev); connect(prev,SIGNAL(clicked(QModelIndex)),this,SLOT(putText(QModelIndex))); QFont f(font()); f.setPointSize(f.pointSize()*0.75); prev->setModel(hist); prev->setFont(f); prev->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Ignored); o = new QVBoxLayout; m->addLayout(o); QLabel *l = new QLabel(_("Result"),this); o->addWidget(l); result=new QLineEdit(this); result->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored); result->setReadOnly(true); o->addWidget(result); b = new QPushButton(_("To script"), this); o->addWidget(b); connect(b, SIGNAL(clicked()), this, SLOT(keyPut())); b = new QPushButton(_("Clear"), this); o->addWidget(b); connect(b, SIGNAL(clicked()), this, SLOT(clear())); QGridLayout *g = new QGridLayout; m->addLayout(g); m->setStretchFactor(g,0); b = new QPushButton("7", this); g->addWidget(b, 0, 0); int minw=b->height(); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(key7())); b = new QPushButton("8", this); g->addWidget(b, 0, 1); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(key8())); b = new QPushButton("9", this); g->addWidget(b, 0, 2); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(key9())); b = new QPushButton("+", this); g->addWidget(b, 0, 3); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(keyAdd())); b = new QPushButton(QString::fromWCharArray(L"\u03c0"), this); g->addWidget(b, 0, 4); connect(b, SIGNAL(clicked()), this, SLOT(keyPi())); b->setMaximumWidth(minw); b = new QPushButton("4", this); g->addWidget(b, 1, 0); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(key4())); b = new QPushButton("5", this); g->addWidget(b, 1, 1); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(key5())); b = new QPushButton("6", this); g->addWidget(b, 1, 2); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(key6())); b = new QPushButton("-", this); g->addWidget(b, 1, 3); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(keySub())); b = new QPushButton(QString::fromWCharArray(L"x\xb2"), this); g->addWidget(b, 1, 4); connect(b, SIGNAL(clicked()), this, SLOT(keyX2())); b->setMaximumWidth(minw); b = new QPushButton("1", this); g->addWidget(b, 2, 0); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(key1())); b = new QPushButton("2", this); g->addWidget(b, 2, 1); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(key2())); b = new QPushButton("3", this); g->addWidget(b, 2, 2); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(key3())); b = new QPushButton("*", this); g->addWidget(b, 2, 3); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(keyMul())); b = new QPushButton("(", this); g->addWidget(b, 2, 4); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(keyBrO())); b = new QPushButton("0", this); g->addWidget(b, 3, 0); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(key0())); b = new QPushButton(".", this); g->addWidget(b, 3, 1); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(keyDot())); b = new QPushButton("E", this); g->addWidget(b, 3, 2); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(keyE())); b = new QPushButton("/", this); g->addWidget(b, 3, 3); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(keyDiv())); b = new QPushButton(")", this); g->addWidget(b, 3, 4); b->setMaximumWidth(minw); connect(b, SIGNAL(clicked()), this, SLOT(keyBrC())); fillFuncName(); o=new QVBoxLayout; m->addLayout(o); m->setStretchFactor(o,0); type = new QComboBox(this); o->addWidget(type); type->addItems(names); type->setCurrentIndex(0); func = new QComboBox(this); o->addWidget(func); func->addItems(funcName[0]); type->setCurrentIndex(0); descr= new QLabel(this); o->addWidget(descr); o->setStretchFactor(descr,0); descr->setText(funcInfo[0].at(0)); connect(type, SIGNAL(currentIndexChanged(int)), this, SLOT(typeUpdate(int))); connect(func, SIGNAL(currentIndexChanged(int)), this, SLOT(funcUpdate(int))); b = new QPushButton(_("Put function"), this); o->addWidget(b); connect(b, SIGNAL(clicked()), this, SLOT(keyFnc())); } //----------------------------------------------------------------------------- CalcDialog::~CalcDialog() {} void CalcDialog::foc() { text->setFocus(Qt::ActiveWindowFocusReason); } //----------------------------------------------------------------------------- void CalcDialog::key1() { text->insert("1"); foc(); } void CalcDialog::key2() { text->insert("2"); foc(); } void CalcDialog::key3() { text->insert("3"); foc(); } void CalcDialog::key4() { text->insert("4"); foc(); } void CalcDialog::key5() { text->insert("5"); foc(); } void CalcDialog::key6() { text->insert("6"); foc(); } void CalcDialog::key7() { text->insert("7"); foc(); } void CalcDialog::key8() { text->insert("8"); foc(); } void CalcDialog::key9() { text->insert("9"); foc(); } void CalcDialog::key0() { text->insert("0"); foc(); } void CalcDialog::keyE() { text->insert("E"); foc(); } void CalcDialog::keyPi() { text->insert("pi"); foc(); } void CalcDialog::keyX2() { text->insert("^2"); foc(); } void CalcDialog::keyAdd() { text->insert("+"); foc(); } void CalcDialog::keyMul() { text->insert("*"); foc(); } void CalcDialog::keySub() { text->insert("-"); foc(); } void CalcDialog::keyDiv() { text->insert("/"); foc(); } void CalcDialog::keyBrO() { text->insert("("); foc(); } void CalcDialog::keyBrC() { text->insert(")"); foc(); } void CalcDialog::keyDot() { text->insert("."); foc(); } void CalcDialog::clear() { text->clear(); foc(); } //----------------------------------------------------------------------------- void CalcDialog::keyFnc() { text->insert(func->currentText()); text->setCursorPosition(text->cursorPosition()-1); foc(); } //----------------------------------------------------------------------------- void CalcDialog::keyPut() { emit putNumber(result->text()); } //----------------------------------------------------------------------------- void CalcDialog::putText(QModelIndex ind) { text->setText(hist->data(ind).toString()); } //----------------------------------------------------------------------------- void CalcDialog::addResult() { QStandardItem *it; QFont f(prev->font()); f.setBold(true); hist->insertRows(0,2); it = new QStandardItem(text->text()); it->setFont(f); hist->setItem(0,it); it = new QStandardItem(result->text()); hist->setItem(1,it); } //----------------------------------------------------------------------------- void CalcDialog::evaluate() { QString sel=text->text(); if(sel.isEmpty()) return; wchar_t *txt=new wchar_t[sel.length()+1]; sel.toWCharArray(txt); txt[sel.length()]=0; setlocale(LC_NUMERIC, "C"); mglData res=parser.Calc(txt); setlocale(LC_NUMERIC, ""); // result->setText(QString::fromWCharArray(txt)); delete []txt; result->setText(QString::number(res.GetVal(0))); } //----------------------------------------------------------------------------- void CalcDialog::fillFuncName() { names<<_("Basic")<<_("Exp and log")<<_("Trigonometric")<<_("Hyperbolic") <<_("Bessel")<<_("Elliptic")<<_("Jacobi")<<_("Airy and Gamma") <<_("Exp-integrals")<<_("Special"); // basic funcName[0]<<"abs()"<<"sign()"<<"step()"<<"sqrt()"<<"mod(,)"<<"arg(,)"; funcInfo[0]<<"Absolute value"<<"Sign of number"<<"Step function" <<"Square root"<<"x modulo y"<<"Argument of complex number"; // exp and logarithms funcName[1]<<"exp()"<<"pow(,)"<<"ln()"<<"lg()"<<"log(,)"; funcInfo[1]<<"Exponential function e^x"<<"Power x^y"<<"Logarithm of x" <<"Decimal logarithm of x"<<"Logarithm of x on base a"; // trigonometric funcName[2]<<"sin()"<<"cos()"<<"tan()"<<"sinc()"<<"asin()"<<"acos()"<<"atan()"; funcInfo[2]<<"Sine function"<<"Cosine function"<<"Tangent function"<<"sin(x)/x" <<"Inverse sine function"<<"Inverse cosine function"<<"Inverse tangent function"; // hyperbolic funcName[3]<<"sinh()"<<"cosh()"<<"tanh()"<<"asinh()"<<"acosh()"<<"atanh()"; funcInfo[3]<<"Hyperbolic sine function"<<"Hyperbolic cosine function" <<"Hyperbolic tangent function"<<"Inverse hyperbolic sine function" <<"Inverse hyperbolic cosine function"<<"Inverse hyperbolic tangent function"; // bessel funcName[4]<<"bessel_j(,)"<<"bessel_y(,)"<<"bessel_i(,)"<<"bessel_k(,)"; funcInfo[4]<<"Regular cylindrical Bessel function"<<"Irregular cylindrical Bessel function" <<"Regular modified Bessel function"<<"Irregular modified Bessel function"; // elliptic funcName[5]<<"elliptic_e(,)"<<"elliptic_f(,)"<<"elliptic_ec()"<<"elliptic_kc()"; funcInfo[5]<<"Elliptic integral E(phi,k)"<<"Elliptic integral F(phi,k)" <<"Complete elliptic integral E(k)"<<"Complete elliptic integral K(k)"; // jacobi funcName[6]<<"sn(,)"<<"cn(,)"<<"dn(,)"<<"sc(,)"<<"dc(,)"<<"nc(,)"<<"cs(,)" <<"ds(,)"<<"ns(,)"<<"sd(,)"<<"cd(,)"<<"nd(,)"; funcInfo[6]<<"Jacobi function sn(u|m)"<<"Jacobi function cn(u|m)" <<"Jacobi function dn(u|m)"<<"Jacobi function sn(u|m)/cn(u|m)" <<"Jacobi function dn(u|m)/cn(u|m)"<<"Jacobi function 1/cn(u|m)" <<"Jacobi function cn(u|m)/sn(u|m)"<<"Jacobi function dn(u|m)/sn(u|m)" <<"Jacobi function 1/sn(u|m)"<<"Jacobi function sn(u|m)/dn(u|m)" <<"Jacobi function cn(u|m)/dn(u|m)"<<"Jacobi function 1/dn(u|m)"; // airy and gamma funcName[7]<<"airy_ai()"<<"airy_bi()"<<"airy_dai()"<<"airy_dbi()"<<"gamma()"<<"psi()"<<"beta(,)"; funcInfo[7]<<"Airy function Ai(x)"<<"Airy function Bi(x)" <<"Derivative of Airy function Ai'(x)"<<"Derivative of Airy function Bi'(x)" <9) return; func->clear(); func->addItems(funcName[s]); func->setCurrentIndex(0); } //----------------------------------------------------------------------------- void CalcDialog::funcUpdate(int f) { int s=type->currentIndex(); if(s<0 || s>9 || f<0) return; // wrong index descr->setText(funcInfo[s].at(f)); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/prop_dlg.h0000664000175000017500000000524314167366466015527 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef PROPDIALOG_H #define PROPDIALOG_H //----------------------------------------------------------------------------- #include class QLabel; class QPushButton; class QCheckBox; class QLineEdit; class QComboBox; //----------------------------------------------------------------------------- /// Set UDAV general properties class PropDialog : public QDialog { Q_OBJECT public: PropDialog(QWidget *parent = 0); ~PropDialog(); signals: void sizeChanged(int w, int h); void propUpdated(); private slots: void applyChanges(); void setC0() { setC(0); } void setC1() { setC(1); } void setC2() { setC(2); } void setC3() { setC(3); } void setC4() { setC(4); } void setC5() { setC(5); } void setC6() { setC(6); } void setC7() { setC(7); } void setC8() { setC(8); } void setC9() { setC(9); } void setF(); void getPathH(); void getPathF(); private: void setC(int k); QLabel *lbl; QPushButton *cb[10]; QCheckBox *run, *edt, *load, *save, *cmpl, *high, *dots, *wheel; //, *pure; QLineEdit *hlp, *defW, *defH; QFont defFont; QColor cc[10]; QComboBox *lng, *fnt; }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/png/0000775000175000017500000000000014167366466014330 5ustar balakinbalakinmathgl-8.0.1/udav/png/process-stop.png0000664000175000017500000000115214167366466017476 0ustar balakinbalakinPNG  IHDRa1IDATxOSaƏ `0ŖBAY DDPFiB`(`'C V-#-qm$8q'o]JtJMO[i5 $lIo" ?; ;2 sj |і -2csd[Po! ".HxԞ=ywYú֏P.u#x.&3R0WUxC;(r(YzQ4 `t# IH4?rWPO4V8 1:N)xE/<s/^@Qװ=,YbXY: f%E=ԔR Ç"QMc5w#~žgKl;܈,#0#DkrxS?3R7^M? PD&"JS='{.3R-abJ$-`wt.HI@^W>1e\*JL!3>áURJ=IENDB`mathgl-8.0.1/udav/png/edit-cut.png0000664000175000017500000000056014167366466016555 0ustar balakinbalakinPNG  IHDR7sBITUF pHYs B(xtEXtSoftwarewww.inkscape.org<IDATxm1jQE@M. 2L Hkeq@H3CAH5AEs/ݏC/3ZZFQ6Uc¤+aRi~ev4[ [Jaf33%\dG="FRh̊b-ik`eM.0ʛ[_m=Wn†xㅎюߡzN|(!Xsr 䋰(IENDB`mathgl-8.0.1/udav/png/document-open.png0000664000175000017500000000127514167366466017620 0ustar balakinbalakinPNG  IHDRaIDATxu]Ho= J (j3҉BR!xP97_M_(*:ЃLcslL nfNJ6N!^>Kh7ޏId䘘YFX\XBqQ]ƔeFn4x^l `T%Pȫ@Џ|wI.e=Pen r%477ޜ+.^ hMndGs58](Jkke>kyi.ŵvVJGL" ~<7!dT@U&(Rޣ!`Z sG^X,XR2؟Z phs1Y;41 Gm6 N78FzBly݋6&[;pAK~L0~@j &eD r*L5}uU2:DqB;*&Tv4tdS/Hw"Tݮ9(`IWmDh$i>C &ҋ=LeXbi*#lW A9xfYٓ|7&1IENDB`mathgl-8.0.1/udav/png/edit-delete.png0000664000175000017500000000141714167366466017226 0ustar balakinbalakinPNG  IHDRabKGDC pHYs  tIME6r8>IDAT8uKq?۳=s^D+IP [$fJ]]t]E7DW]t'݈]RJEL4|3$]{{(mcu}89Q -@(!s30q7QP+]A#afvAP9Wht? =B߳L}deiȥNθ8 *oQP\\zDb,o`um(Z NqvdppZ`h"Jny@{{xRPd0ȄLTjubfe>$DeERݧ),r(qRb`.$Aju//C Li49t:MZU5XUUx^,^OC#D[yf>Md4IqSy7o yVYJIENDB`mathgl-8.0.1/udav/png/edit-clear.png0000664000175000017500000000134514167366466017052 0ustar balakinbalakinPNG  IHDRaIDATxc l_ڙmNUgK&ryOYF惛g\PN$kZ=iշ#Hs~ 5OOHͥk'1rvc``ɯcddeU6<ۚҾV1 hևe>Xa@OURډ.yJUqT}KYnjs#wxICe wB{/bOp1oG} }ZQj9E(L/_%gGX4Q6G{LA^ Jg<1ƨh1b|G3g4v^M@ĖsCh+/i wSO}9*[tU.?|@\bc IFx=%掘[4 Θ?|^w:_ThRdb>_S -G}i +TVGӟo':!љw ;-˪M7o4EYY?=q\+;]VuDOkoGOM S$JHb Ş1oН 'tUgL=CVi> 8/IENDB`mathgl-8.0.1/udav/png/text-plain.png0000664000175000017500000000103414167366466017121 0ustar balakinbalakinPNG  IHDRaIDATxڕSMkQ*[W6B(,v]ɲ4$V@RQ;b%P̌3]2ûsG  qDnjGQ3 ggh{j5Eeo:'n 6pbKzšE4M,tM34,˜@!V(Q`z]+rl6\۶ ˲0 ]R)n{oo oc8'ȝFruyl6|>oӝL NCß~ng؂-$8&-K3/ d2L&h{(z] TТm4iDu{"H˭>->{ZW̹hPjׁu[$J2JD Dy8FiF0GD/QLϥu Kn/ybt#TJ Au۞o]uX㪿Q<*nDD9ĺmev?Qq$9){iLQrb7 'IENDB`mathgl-8.0.1/udav/png/table.png0000664000175000017500000000111614167366466016124 0ustar balakinbalakinPNG  IHDRaIDATx}nP ,;X XetXT*Ď8N,X&Z#V+Jt,Kt"U6g #F+[._@=s5^x@"G &O *W+X/`3i1a9q=y7dB9kF>mL!R#Fy$N})J}+P-L{.R.W1O{2\5Ry6Y7`9^AnChDiDjMlMsOuW}W~XYZ[x[]_abbcfhilnopqstw{|}؂΄ʄۅljωՌˍ㎱䏰ԏۑϑԒȔ˕͗ЙҚبڱߒ7tRNS &-01Vafi]IDATxeb@vk۶m۶mms=%sB B<7MC^|q7kM3Ic l: qkZerav)[9}S!md#b~uWԥEK:^294]k\}Qtc3,yoBb)1 \b-D!i-,F&n E 9cz9gC6@X^!Q9e>TakpA8d# #Z59N &t0pLL? Z ݤHӟҰL͐Y!OMɐU4Ӱ醛ƃ n??nEW~IENDB`mathgl-8.0.1/udav/png/edit-select-all.png0000664000175000017500000000071714167366466020013 0ustar balakinbalakinPNG  IHDRaIDATx˫RQ 'ҟм;FE6=?(G Yq(m +*bkoсcqo׆V6ݥʦd)I.7DR73ؑ5*9:/0s _%xxN9p!>[P+r=J;=8S߱fA̧ûc| v SŎr ŖY˺@V@@pl8Y^m!"2F?OW*S,5yif8XgVf90yXNa *0Lp` m<b0Ho?9KPbbpra*-奱h+@?0d%N&ii(> IW[ @ F"`a8&[[2'ٯVާ5=O&2kOcYŞŞ0h7Rb1~y,|]#4/YPwX'\gREo 67 $-`pTxo65:=Lc.4r}1 6ORuỴxrl´b60?`pQEOc*kl+ҘqۥHAsnߟ/[}&e&NdaY[ &s(4x!É^p)"]g]mD= "$Pbn2yTSޮ=Jw%A}lBtXo)[Q 2+ێ e75|xZyrݣ_Co|)eV^bWyN3g?ѼCjWVT\k*/~jW IENDB`mathgl-8.0.1/udav/png/system-file-manager.png0000664000175000017500000000057214167366466020713 0ustar balakinbalakinPNG  IHDRabKGDC pHYs B(xtIME)0,C]ZIDAT8˽JAEI,|h%"h pNxZh{k%^R8; }IgN.I{Z!$Q }ӗ0ƙ17:#;֔v/Fٷ՗R^;Zא FrS(ҿs痔#\Q4<˕ZGڂOG,@0!`+c{R>8'Z;k LT_Ze҆IENDB`mathgl-8.0.1/udav/png/format-stroke-color.png0000664000175000017500000000126614167366466020754 0ustar balakinbalakinPNG  IHDRa}IDATxcpuu5geeR1Amm_g OZiV߈a)! Lgt oHcɅbSGKE@oDt5Id ΃ TCCcrrruuuPL bUa@W$YZZ^h-)))#,f n -@|^II郦 Q4x2ہfgPb~ɐ.!PVVг,py 7t4x}kZjRk  d3D# mu?7sUP `^bnl!䥽r7֧0;= *sSu(r^&NTaвߠx2޽ OԤm10`kTL+5rP mTwMd8km%M8h8-Sj8'MI" fb&/LgIENDB`mathgl-8.0.1/udav/png/object-rotate-right.png0000664000175000017500000000121014167366466020705 0ustar balakinbalakinPNG  IHDR(-SMPLTEUUqUU@P0`f=hBU"J/iAW;Y@N1"WlDX5e?n^:c=Z8lDC+yN13sB%H-!WR2g?_<[8>'p?(xlJnMsN$^T2V@W;XBZ@[B`;bGnXuZu]u^x[|emmpy||¡ƪɪͭʮͷѹѻӼ׼ԿֿŻƼȿ1D3=tRNS $&2::;@@AHMMMhhyw+UIDATxcTuP\ٓeiC+ZV44(P `VLTjlnwwn0:~p + s +R N8].n)Jxh Y!HX)=Q }pǂE K`Y6"PL\;E*䩸/AB zGiFe~RGG8"P3)y,-"  F͕8}qbrȤ/wd JCԊC\e>6V zD+?]aK`LWf?زiy229NZپ L49U6'zVpp17$ %IENDB`mathgl-8.0.1/udav/png/media-seek-forward.png0000664000175000017500000000077214167366466020512 0ustar balakinbalakinPNG  IHDR7sBITUF pHYs:tEXtSoftwarewww.inkscape.org<yIDATAKSNKmbCRȒ)Ě&s /%C:Ġ%BfhYk/VGwj%QX}8R۱4QۙԌkޚqMMeYE3]24V i45ǮL^s5ͽX(.d 2|zRf0Uȼ1ƠbЕع`$BFTE[zגFIBz֯sQ5e!~m IENDB`mathgl-8.0.1/udav/png/view-refresh.png0000664000175000017500000000162014167366466017443 0ustar balakinbalakinPNG  IHDRasBIT|dtEXtSoftwarewww.inkscape.org<"IDAT8mRMlTe={3m[ 3јF7`XDa M ta1L%47!«qВF;̴Yp=''\bfHe4jՄ'¸.ؖp|t&E@O*}]gQ(V02v|g'-lzW6ÌĈdǂЉ  3EW Ŋ 5>.W f43=gOk40ĭCձž _M^l8l?3]X1/23ǕgƧg^hڷuS( wD-HU/<A2e^ۏ^,}?,az  ,Hc$UgnSui&vn{'v>Eq4Akw_?߼''k'W%߼[0j>AX-/?ԩT=eYcJ奎Go@W!'$_ԓSln\{&?3 DV%r=?JeFmXv@x\qqah=Ѿ2;}З|9r-k5tT2>hMA҄ǡ̖MD, z=*];[x 8wyIuI1MN<-I7, #?[FՕD(̗ˣRmcer-0{ W1oR ]!PՑl.UvjeIENDB`mathgl-8.0.1/udav/png/text-x-generic.png0000664000175000017500000000051514167366466017702 0ustar balakinbalakinPNG  IHDRabKGD pHYs  tIME8`&BIDAT8˭=n0H[!!l"A!QsL$^Xj,{|3m1 Z;騬8xt/5ǒ4MW(w=ιURW/P&AH৞"psTZ? CƕWy?G@鵡X/^\ i` g߽~ܧ4l@ fՍ/ΉIl,4t,rE/r@%#%- Tv>N#;]^Nh6E{1S9cĽTt&ū 8"u\[n|!j?^eAbNY^8O⎈rfT%o.bQ5WAMgu ` ).2gxStUqO RդR( 1rw` Јv}g GT8[=.5I#dC)d@mG{KEۿ ]Vm9CG~Ir ؋wIENDB`mathgl-8.0.1/udav/png/transform-crop.png0000664000175000017500000000132114167366466020007 0ustar balakinbalakinPNG  IHDR(-SPLTEKKKUUUqqqw̿ꮮѭ˅q;?Annliqqq,355:L]&+-)V dPCa^FO Q_oO /hEVz({RJVIY@{c 2-:IENDB`mathgl-8.0.1/udav/png/media-playback-start.png0000664000175000017500000000076514167366466021044 0ustar balakinbalakinPNG  IHDR7sBITUF pHYs:tEXtSoftwarewww.inkscape.org<tIDATAKS;ڡ}.]|?>:!EY1O-b밺ן?u˅3_?kv];^y俐aU!s'Dֱ߽ۖ O|WA[wӢ#׍?yF`ҹs;V߽5.j={.oW#.2.>RԽdR|N:?9O?(g;?j[HPp(W|l E5sHRpϥCFL2 EpOd g -!yp+8\3_5vq$'e.y;.NR&%إإ,D8IENDB`mathgl-8.0.1/udav/png/transform-scale.png0000664000175000017500000000066414167366466020144 0ustar balakinbalakinPNG  IHDR(-SPLTEdHE0// wňno h?qqv`deqw$tRNS1:WIDATxM0 UT4C;Uےtk@e:2d52l0aYi2,囄Rd/$R'tٚ,i"hW *Vr&\ء/"~"0 DZIENDB`mathgl-8.0.1/udav/png/document-properties.png0000664000175000017500000000072014167366466021045 0ustar balakinbalakinPNG  IHDRabKGD pHYs  tIME  +T]IDAT8˭jP l"ނfuء-8(q%.]tiQpNDdМ)v1}qAG%rE"糈d0M3%Q~¥Dz׍j5z^u:JR r}Vv5Zk`:bfneYXVjWwpθX,<A$v{sN-fb1FA0$ C!Zm6& B\.|>RJ;pza4$h\..v-4))? ``0x}+ڶm1$IENDB`mathgl-8.0.1/udav/png/go-jump-locationbar.png0000664000175000017500000000103514167366466020706 0ustar balakinbalakinPNG  IHDRaIDATxcpzrjhƮa֌\BSL>O9d:$;qaK Ajˈ33worw> _>x."6-k#_w}SXB?g+_7/>6{E) uAs`ai3Oo?{[_5b.0o_It^J[Ͽ:v}8 uM:ߠt/R'ۀyNEl+nKؕ  D~oXS'qHNܦh?rQS=$.`@\Bs/jSI]?4[&Lvp6%_IENDB`mathgl-8.0.1/udav/png/go-next-view-page.png0000664000175000017500000000106514167366466020303 0ustar balakinbalakinPNG  IHDR(-SPLTE2q-HI(WV!b'p(24=<>~TLU]UO[Vc8dStwu wP|x #$ jrޚy%tRNS$%&:;DNO~7IDATx=v0Uefօaf+:Ow挘_mNخRVG*Z_]ls`0:c/$BBciL"քprsǂ߿/Rl4tl1H_ !$8PDŽWB}m#m_qkkYU9di$F<1_ܗC*'98?egї 35j@d3=we A@{ [:X6uS8c"  aJo$6YemvhNY S|GB1i~ff[Shj"Iӟy(ӴUgR{o&IENDB`mathgl-8.0.1/udav/png/transform-rotate.png0000664000175000017500000000063114167366466020345 0ustar balakinbalakinPNG  IHDRa`IDATxc?N\:0rI6>5X Hצ\u L};;K5dXNI35@\Č8 )߮єNEaz<bob>l?qGNp͐h`fa/t7 UHb;8QF64ɐ90cFH%$>c1@bXMec\$`X  (q5Xj"D/oc@<0}c> Ŀ1N *73A7?^eeEyv?7PN4l IENDB`mathgl-8.0.1/udav/png/document-new.png0000664000175000017500000000100414167366466017436 0ustar balakinbalakinPNG  IHDRaIDATxMkQ_ZD]K5حTP\KtׅJDA"qQP0`V)]ؙ|c&$3{djp 5KHvſkw+< ̪eY83MX&Z6ڝ: qtث 0gk) ?qq#4[-5U`CǒE 8Î P8*`*s@L`5q`O  F`@ 둀`S xe`aQgYO~^Փ kp2DNINܗMY0A`9=9 a{^YXC<;vBŔfnFju<}{+3YϕJ%:?9Y~SհM:ܟpZnnm'gW)W.w-L1`IENDB`mathgl-8.0.1/udav/png/edit-find.png0000664000175000017500000000105714167366466016704 0ustar balakinbalakinPNG  IHDR(-SPLTE  ###$$$&%#'''(((+++,,,---2224216(6(6*$6668(9,%<0(EB@H!JJJMMMN) NNNS3USRVVVYH=hXMhhhiWFiiijjjrposssvbRxxx~}@W4C [;I a=b?rTz{: tRNS $&)GbPIIDATxc p 00sll>(.kb)4q3ST1p1jPrVUqQbr01sPQp23qb pVQq 7c0aa 5`r c` qe`2`f``6g$a !IENDB`mathgl-8.0.1/udav/png/document-open-folder.png0000664000175000017500000000122314167366466021062 0ustar balakinbalakinPNG  IHDRasRGBbKGD pHYs B(xtIME)frIDAT8ˍKQ}]mm\"4V.o"EFEAIi{=g{Z)D}=}9=d)If{1( 6<7u_dvs_̠aEhǂD "Is݋㶳ӢMY`8=:ĥ )(ATeqi M6)1|P@D>0v8EO{{ng1ʻ*(ֶP]Fݢj9o(Ah,e*.^)"/|Z_eh?ZHkOL\ռ1B=a V>-fnߺAhP3>|\pgr lɣ)+f dy>Ƞ"ZAaEf*u[-P~(B>ЎCĎ8p6u4X 9!m.`n"wapHШ޽>@gcat2ΝlL )"UcR7dž0,1IENDB`mathgl-8.0.1/udav/png/zoom-out.png0000664000175000017500000000141214167366466016625 0ustar balakinbalakinPNG  IHDRaIDATxڝkHq "TTDA>X K5( jSbʴ-˜MN:ͶYtnsuw222~p|#?PUn79%Cpǥv@6djJ%m7Q FBSTޮeW9O CQQ:kqހQʀfBآkFj+(J|—]ӓS8gr-uGWUZ0*>6:DYiBXۡ Pp:rϦj1lEy, 'Dݳv$h.<@̔DN|#$q f*m&!iNȕl!uRbۭx o;v|뻥N:0"T U$u bW͝Mi\  p]J ΊB /2RCz,wmxnZ+|<3HR$JyMLL& pFoIY9O"Bw>J :v.g\|,i(J‚->nA:,<{Co7&HngX^_ϗԑB gIENDB`mathgl-8.0.1/udav/png/go-top.png0000664000175000017500000000111714167366466016243 0ustar balakinbalakinPNG  IHDRaIDATxcBgMbjHVq/zVZ:9(fe7{?kN8sGW1]Ko[?`?VڮOi]`UsN_tӒ_2u4\hm/=;M1 m>Xi=L?v/ϟrb&Noߧg >BZ N *v.Im@w{5 wMn/ eݠ^^kXXG3Z|\< Ι߭d34&!IENDB`mathgl-8.0.1/udav/png/object-rotate-left.png0000664000175000017500000000121014167366466020522 0ustar balakinbalakinPNG  IHDR(-SMPLTEUUqUU@P0`f=hBU"J/iAW;Y@N1lDX5"We?n^:c=Z8C+y!WN1lD3sB%H-R2g?_<[8>'p?(xlJnMsN$^T2V@W;XBZ@[B`;bGnXuZu]u^x[|emmpy||¡ƪɪͭʮͷѹѻӼ׼ԿֿŻƼȿg=tRNS $&2::;@@@HMMMhhyyD1IDATxc TlI.H|AS<;U)f(_&&++'=]"g2LLNMjb 5 S p 驉;GA b `>oXGQ3:50:I,1(!!јvV9] ]9V[PIENDB`mathgl-8.0.1/udav/png/zoom-original.png0000664000175000017500000000135014167366466017623 0ustar balakinbalakinPNG  IHDRaIDATxڝ]L.h.iyW[ִ5.j)Po_PtC DPh3aLD(h— ~Ij1m-Ol6YI{,o[.ZnD8uP &Q݌9]8jfњ&M#tH} Z3X17-E;>cyV\;:cחVy]߲zb`WO_s) ;hvze NO٭l4=}*UsgSʭ)܋! t)9/,fz`D9ĥ)svCZ 6^5 _KcĘ$\&*藧,3I)SP5U<\$R.!E?i%Ybs >w-ujݰA>v1H%WYу6IW@Lt#oc/!'P^}P}&Hk!Y5*Y;)mdr i"{&oNj^%;|vً4ΎE'?D ]}7RI3$ v^=@&NA2A~@%ww( x|w0vet:9n~isr9\o1?xICbY8t׽)IENDB`mathgl-8.0.1/udav/png/folder.png0000664000175000017500000000121414167366466016307 0ustar balakinbalakinPNG  IHDRasRGBbKGD pHYs B(xtIME+6W@d IDAT8ˍKUQ?3x,E,#2!Ai׾]&6IQT"FB(D-z|̴Plgb/55})yEqBu}ȿg+7|$sT$  K׾;T'b8No/WILyIENDB`mathgl-8.0.1/udav/png/go-next.png0000664000175000017500000000123314167366466016416 0ustar balakinbalakinPNG  IHDR(-S}PLTE1_&Z >%W:m%X%I%YD6%X)\.Y%X!O#T 7$G`#R7h+\'G1]Cy8e)A^Nh#BjKvD}'O+ 8 "D #F =&H!0';-T.E.Y2a0W1\8k9n2U0L;o?W+L},U5X6Z:^>cCkInLoMuQqTzU|Wt\\_`cdeehhkmnnnoppqrtuuvwwx|}}ĀȀ؁ɁႢƒˆLJȉʊNJ̋ʋːʑ͓ϖЗѠצڹw'tRNS 26MNNXtxGdIDATxcإDl%P,kl&_S]"P235Ѯ(/ f)LBcSsr2=]}##=mUEcBݜ845u줹HQfF8 EɡV.g`0m˚IENDB`mathgl-8.0.1/udav/png/alpha.png0000664000175000017500000000137214167366466016126 0ustar balakinbalakinPNG  IHDRasRGBbKGD pHYsvv`OtIME$`fzIDAT8˝kHqƟKVdrBQ Jļ%Էf v IBL045^XfaJ n>ؤY9<$fs pϓ4dºXERk|3ջDD|`Z lOJ>TMgn9֫c =W(Xz.W[*<[k#z (\D&7ITD";&= H֥T*rX l~=bNU|pkwk2P[xa`L֚ Pymٕ fmh0co.:~2)OhK~ E M9 [L?^ݩK]a]rc^F6燎SXk`Sނ"b{YSE"`|<ƒz_^ _a6]Gk;06wF0u<. g E&5#8c#?>P}@Bmѡ[* .~\t3aެiUC%tgA}8Z fNwGKﷻ˓"{L)vm&hE"u%&Oń ؖ`|>_M7BkyBD|2!A*ɃIENDB`mathgl-8.0.1/udav/png/edit-redo.png0000664000175000017500000000136114167366466016713 0ustar balakinbalakinPNG  IHDRaIDATxڥ_HSQϹwwmw87N)Z:aFb`惚DH! L 1Ðz87ݦkIJI>X.>hbuvQs}s.;@dV|kO-heۅ$B 3MH. -RxJ'C'o!L+iIjֈty̐W-]]*O5қ2?ݣ6{ -AW KzJOA7 d@B1T+ޞU/۳ X6RVj=(5CA7 a WA>*c/3Wyۂ.E c N%Dt~.FYp`yKd*˝6 H`^4Ɵbϲx$!+H   & b+,VӘ>`rƑ8f[*'*;B_ь| F59tCsG^4.+p^FQT3?Ǣ]w\Q8:g:x^v/uiidܳ^־tbp,;L/+@<4ix$ef!d`̾ n;mFeNI<^QR-yPm\d[s+QS3؆h>xùaWTmyP]0'qwѓЙvRqPR}0j a_ttQRVj~CVYKP1%J B=e?`,UM *<AK bkܑ(wDIENDB`mathgl-8.0.1/udav/png/text-csv.png0000664000175000017500000000104314167366466016611 0ustar balakinbalakinPNG  IHDRaIDATxϋaƥy)SܮlAQ{Hasm):OtKupZ*B# Z;۸#`^լL} ;yޱqnQ6L?*`ۏ񟰝a0JUQ,]q>pIj=7*D^m/#"@Ttxx7 6ƕ@]f> 6cn]-pxֱADŒ`0Hs2X+Tyk3-GQZ] X 2}zPM8F(h4{RIA% tNǑdn 7$hF \,#Lb`SKK7A8`ѠDH$zn -juvl6T*EV >։C-EAR'\#6 ΁n]~Kzwf<7 4{j'u9J3X}IENDB`mathgl-8.0.1/udav/png/go-up.png0000664000175000017500000000116614167366466016071 0ustar balakinbalakinPNG  IHDRa=IDATxcTB*Lmb F,0JXO/b_F4E.W _kͩ+v|&n/Jf蕌G֯?cY0+_,}A N\ZhWK)/C߆j~m0o{7qݜ]zV3ƯᯃUo?G-YKl_9cY{bœϧsGŃi%Z^ϟ4ƙ8?k%-"FVrY&?T Ex#k7Oh?}/Y!e- emQ+f\&G?v=M:?ʉ} hxϣC? d0$ yp/~«__6nE<\ʮ<v@lÄ36$Wͻko\zDD>Uwe@T<7@ W^.%W 1$j_(n~`q;|"l<. ;bʩ:FJN,C.˵W1/6imL77cS>]={)I?h#MlT3K~޺hfH(;VWOBON MhH{kUxA HʝK+?Nlsvvvvvx~$IDATxUN`.(hU,uy3!id^:2KGcy} `v@o6c~NJ~AhPh{!PBQTnHU/] 岌(#Oi : ( IENDB`mathgl-8.0.1/udav/png/list-remove.png0000664000175000017500000000040214167366466017300 0ustar balakinbalakinPNG  IHDRaIDATxҭ `g^iX0mE0 a ,`0Y" ATPQgQYP,,NG|xH>PdCKe[:QКt5/uIY.HK5,J]bHs]2mcN@d^"4q*"&rkpjRӀ=)OӚ϶dIENDB`mathgl-8.0.1/udav/png/view-fullscreen.png0000664000175000017500000000051114167366466020145 0ustar balakinbalakinPNG  IHDR(-SPLTE<<>>CCFFRR]]^^^^``ddggؓڗژۙܜܝܞݟݠޡޢߥਨltRNS3ǽ=tIDATxeG@ c^؋"?9_ W@W3W2Uݒ>`kE8-?lx[Q^ . '$.0~onuIENDB`mathgl-8.0.1/udav/png/document-import.png0000664000175000017500000000142414167366466020165 0ustar balakinbalakinPNG  IHDRabKGD pHYs  tIME 1IDAT8m[qwnjaJvZ:C Ǣ )R\qF"E1 l5;s^-<=P ,E* >d2Y>d:[DuЮO#t@$PeU )ڮ뼓k1TStZY4N݅#H= dqUGh|َ{(uOsIơԣUraDCY*oZv\"GwE9D|2IY6nC:a8R2tq/et1<蛅 qs@uwq٣^SŋWs{)[L;5y'G:"4_iD5ct/E@hm7E'TIu Pa{y~b*yS-m X=ꑄRn=7eٮݶu "X`M)<$qq!G/ 383U?gUCPp" 'OIENDB`mathgl-8.0.1/udav/png/tab-close.png0000664000175000017500000000102314167366466016703 0ustar balakinbalakinPNG  IHDRaIDATxc9`eeaaabYs T;!x `ffV)> H## { 7 #lxX?@&&&] a+=]e{2V^x3aұy__YYI_s9)` E^Bs"y?G# !0(nio޼A">?kԬY{Ff?#LjH?X00^N sz21_h{,,//[%&,aަwJ [ceebrfgPl.FQoX66OX<]U <5guIENDB`mathgl-8.0.1/udav/png/go-previous-view-page.png0000664000175000017500000000105514167366466021200 0ustar balakinbalakinPNG  IHDR(-S PLTE GG\ Y#n%(V245?<@~TQTLU*Za]XaQsNtpu| # $ ƤjqޙTtRNS$%&:DNOo~Ɛ:IDATx=V@늽^XP{ ?Ifp_|ٕ%9Fytaˡqss<16P>< Ɖ`$@~q1nv_0i 4yk1Da?bԜz]o,)}QosQeɋWe1XIENDB`mathgl-8.0.1/udav/png/udav.png0000664000175000017500000001005314167366466015774 0ustar balakinbalakinPNG  IHDR@@iqIDATxky̜3{k1^6 ń YF %TJBܴJR`{%A UBH-@ Ji┛0 B_v˹s;0眝}wTGz4sn3#A rxͼ* f¸kfs-d\glPy>¸s- ArFZŸ`^Iay!n\Μ /]>"&! !RJT!QK]oB!<;tSj59g^d^n\i\˝ 8@eG6 H^1w۶mr X":|ᕽ)(@8 l,)c 1?Iϖ-Wpp%P(@uq˶' KUFB@0Tg0P@&VC1wG0g7"`nz9 ( RUODU)].^H2L! 4-S7"J "c!lPJ*-c[߈5!;\PyPA0RMя)4w78OU2f݂ `Pt_e0P a͎21|z ڋ):dR JH}wcu.a Q0+28;_ OeBIըQM0fXD.$Bv&;=ɛoc8;^nm,j˜W(9j툰hhhI07lxO.>o84~'`0oe\ADE㟥RIǡT:Cp]σ+@Be5"jvD`"Td  D"/y^ HnW_}5= Yry6LO9r=*/]֍l4G5a|;?_.0_DU= ҮAI9,+):t_|[mmc'\}× E8oN󟇡!L  /V5ޮӱ,Q}UXn["[ 2~!"H ]EWWfid?qdTV͸'?R>}oq\E6JI2kۤzfҝU3d߿24\t:C:&r]qb8:إZQ*)(򌍍S,un21 DayB]Q NgYx*]]r9\.G.;:ttI!dRnd+p]TЇ£3rpQ՛ + "UaN6腴Ue:lL&K&!NL& r0 b1x$L:: ^X:xN<4'I&Z3mza`D~(=˗wNg0M!UgjJRT4^+u ʼnMR$Ll6COO>_bx. ~;x")* Rz}_nرcntz@XUha٠ZJe3G2DxϠ-m뺸y4]0x4d2;vla`Ϟy」 JctW<^}U<ٳ_[%*I,BŅ $rGuwwёEujlj>>."C:= 4 ]׹;پkw_ѣGIJ9]}Ua^޽{9p+L2P"ܨZo4Md <([) KB˲zXljdf;馻, (J02r᷽9>qիWuVnjO> !{=FF15Uƶ-]>V\ڵ38C?p>ӧ9qrΜchȿ޺uw>C.cժwT\daX $ZWJRitڥRI1>>xF\|񊖯7M'2~X[A> 'NLpqΝ;8SSe0 :ccYjRDP`|RΞ]͂AXnAk胓'OR}SaPK \?SضE8dT*(bd2ي )}ƛ>?| <JEij*m7o;|5lӾH\murz CCll )-{"-~i-Vo~i~=BCeu,R#۶U{!4mM +Z.u]qj8N/CC͆ PV2jx*){ӆqt `YuU4Mk6ɖa!/Hzzcs]X繁k`D^6l5k`rr=R'g";!l ّM!LYT]lf[07/ހ 8}_7K䚶_ֶ*1\%HӬ^K§? ]]בɤoro"e %oTUeBBpcu)w}PVqf7l\s3CIz{J,bFȓm0+6uv)3i8ί+fvȐTu B3gNё%]I{-iI19ø\ x9! G_,6A2^zzzZa{^gr28㌌#0*vP226(,m}jNX ͣ=0(N<0 АRwVz²,jo% ϚkBzQx!jya4,дGbZ;b žΙS[ۆb)aQjw$}b`$=2E2)m߫kn7,lf#ˇҵ{`BTm} Kp<0.fVYc32.5HpB R d(Q}gT0M#bOFG%` mDDŊ pGgU9^x{}b_ '0#DIENDB`IENDB`mathgl-8.0.1/udav/png/weather-clear.png0000664000175000017500000000152714167366466017566 0ustar balakinbalakinPNG  IHDRasRGBbKGD pHYs B(xtIME(9uƉIDATx}[k\Uo503{&43iJ p腖"?Q!7E)&4143{{f^0ڢcvK*TerNQozMbGg_+z 9BBAV]fOn˷݋W ⓿̛_8 0{]ᦂ{shHԙOmnojZ'3,%E}SU Mѭ,|zC8H 1|N;Gⴒ(>Rg::> Aj4N1IO7 (7P]5*9Rg%R=H R. %8OgufgRk$rEHɭmEFXjzǃö1 p=Lay"})I"AqYU i0aKS7`bi'@ǁW/}˩g΂LCdhVS8Uw U@c=|+!׺Ο%9'[gV'W0 d0{8v+]@^.쵹;v]& QuFJ$5<9rߓ&Syz#;KA*),oo6[G`>ÿfchQIENDB`mathgl-8.0.1/udav/png/object-rotate-down.png0000664000175000017500000000151114167366466020543 0ustar balakinbalakinPNG  IHDR(-SgAMA asRGB cHRMz&u0`:pQ<PPLTEV7Z8[8_'p"iA|P0R2g?qUN1Y@t\`f=lJsNrFUIDATc` 0213vN\>?X@? 0(8D, .,"*%dONL $$´+dDff)*A UVQUQZq19ԩV چ(2"g80%tEXtdate:create2014-07-01T13:25:16+04:00|%tEXtdate:modify2014-04-11T03:57:22+04:00yIENDB`mathgl-8.0.1/udav/png/office-chart-bar.png0000664000175000017500000000073714167366466020141 0ustar balakinbalakinPNG  IHDR(-SPLTEyyyyyyyyyxxx}}}~}{}|z~|}{+`.d玺(\*_6j;n?qExGzPQQZ[\cfglstuိኵ1 HStRNS''NvvPIDATx]@ٕTEi%Md&!jH4iSjSIޯRJG?Ac 9dx16>L)rj!3\B\p̡ynU[ a( ߥMܓq\GH5" QJIENDB`mathgl-8.0.1/udav/png/go-down.png0000664000175000017500000000113414167366466016407 0ustar balakinbalakinPNG  IHDRa#IDATxc:P ɨ4Rϊ?+O7D7IoE{-}>0hKL@kgm_7{9SqH93^?gޕ`,n[B6L6EkfO?n$ 5muaegQ/"i_DLROZ4X0-d_0Ag'Vwk?h9#+/? ozEy5@8nT~fq-›gLXxo_ͭnn9UVryR%ccwm?fϼus*8Tt֎< 6} O9xƙϙpHŚ|*.8LzwgU.W&nPE0YXdO4o^~ba&*-0JI|)Y?lv>, $e*fND~I|8ʙKx>5 ^ 5IENDB`mathgl-8.0.1/udav/png/go-bottom.png0000664000175000017500000000121714167366466016746 0ustar balakinbalakinPNG  IHDR(-S\PLTE#'k:4   &K (N2).8Dm8er <7@j ;%A&U&U .,#R#T#U%S%X%X'F'B\|7Y3D#8G#>`&?^5Wm6Wm6Y"Dp'Hs:^<_8g8hpt8MjccB`Ec)Dk9b6W:W}<^=_BbClDbHoMmNmNsOkOpOqOtPqRkRmSnTpTtTtVrVsWuWxXwYtYxZ[\}]]^wa}a~aab~cdegkklllnuyzՁ׈ޒ瓵>9tRNS$(223@ILOOOOadEIDATxcf77WWc0Iq (xxE+85}B<@zm="--![;LJ(0@jdFvvfp0xJaQ0)02 u vϋ50CJEJJF׾IENDB`mathgl-8.0.1/udav/png/object-rotate-up.png0000664000175000017500000000151314167366466020222 0ustar balakinbalakinPNG  IHDR(-SgAMA asRGB cHRMz&u0`:pQ<PPLTEU"iAC+yB%;!|-f?(xnMnF>'pIDATc` 021(V( H:8:II:Ɂ=<]}TTj~ A!p Hm](h}1q .0kSR3 3319ƌ(20Zr%tEXtdate:create2014-07-01T13:25:16+04:00|%tEXtdate:modify2014-04-11T03:57:09+04:00*2IENDB`mathgl-8.0.1/udav/png/go-previous-view.png0000664000175000017500000000074414167366466020272 0ustar balakinbalakinPNG  IHDRaIDATxc?EhjDT—W wdT"YG,zռb$$qɛvy~ P ]ůx{ӷ?e _֣* "ߏ]s_{8]/jĆEK&_=s.=}ٱ P_08z˧OkYpUo\tŬ p7KŻ韪s>9'_27,:_,dl?Pjs.o^~뿐a@U3K]?jg~_7hdeҋ?mEW#ħ)j)|Ys+c@ewnesjNY9I2ؘ]j"Et(' rIENDB`mathgl-8.0.1/udav/png/dialog-information.png0000664000175000017500000000153714167366466020626 0ustar balakinbalakinPNG  IHDRabKGDC pHYs  tIME 2:P5tEXtComment(c) 2004 Jakub Steiner Created with The GIMPًoIDAT8˕KHTqƿ;:G&YjfR>E"ġ%ԤlbpaE1EM%It&JJ͊4Lqtwo5~s~s8T\L)%) 1ek^v}STޔ0bmeZqU7S{z?\!&,zIW׈%ooߓc,RFg}ZUYEӣm%Y{[n=v_0kEI珖D N Jhs;u&%srm'$=Wn/@ ,C-f PPn(.*rraB+YWUH43 sW߽%::6ilZN̾24PU}z YXXx(7VL6^|IENDB`mathgl-8.0.1/udav/png/office-chart-line.png0000664000175000017500000000105314167366466020314 0ustar balakinbalakinPNG  IHDRaIDATxcJ?2LzuuZubmں̀2e4/'׊4oojKHs ~^dNzN<ǃyO dEE7whP3? q.ءżU˧a-!jX7jMSb-{KlW6U/57yxӃ]| ]|w.xg) 50&ÛR-ʯp鞹]psv,|{j,Tdfșy@tM]*8P\0`\6<1?>,IENDB`mathgl-8.0.1/udav/png/accessories-calculator.png0000664000175000017500000000113614167366466021471 0ustar balakinbalakinPNG  IHDR(-S&PLTEMMMEEEwwwyyyvvvvvvyyy|||zzzGGGGGGeeefffiiilllmmm111121666676888;;;<<<===>>>AAABCBIKHKKKMMLMMMgiehjgiiirsqtvtuwtwww©ʵ˷̷itRNS BOQRS[`(IDATx-g#@3M"_mj(=I.C\clpzvaqX` ͳihw6dV;*M~C=-˺z!$R*utn@DN0+xqsp5%jb:WF@ kF%ێ$mZ< CѽeEXQV/h0CCCl}Ք 翖 &[id_CIENDB`mathgl-8.0.1/udav/png/go-next-view.png0000664000175000017500000000075714167366466017400 0ustar balakinbalakinPNG  IHDRaIDATxc?E:JjD2@1p-#=Q\fI>]{궋͒VXZHɡ[߷tհBWes)y0=iG.ܐ;V߹'.9a9=8bV߰GW?}9{vW"fS;O?i=_ǯῬk?yn&??{i6Pe̤Ҏdz_7 g_0-eU&[V߸IkyUҏFT4rx%M>k8ۄVq?ïLrR攵.k`lJJf _PR'Y$c@|WLn?a˞ *jh4h6hZPUш[l%Yhokٌw]p= d2!DԒv.d0/Mؔ@̅rz+:_o-Pq1N4ҡ+W:ٗn!e pE-alyďN)p'H;/bf,*KәvЧdIǣ0˕ (2,lstX#TYkeP`t%,/\[_u*<5sIENDB`mathgl-8.0.1/udav/png/format-indent-more.png0000664000175000017500000000065314167366466020551 0ustar balakinbalakinPNG  IHDRasRGBbKGDC pHYs  tIME '7 +IDAT8˝?KBa]'h Z/-BkKC$JAݬ% QD6IH&'(A"(pjR= My=yyQeWwSLr:+2-Vk`Hτ}eFz Z8KˡnB[Ht*F^)7&zBZ o毈*Ĥ137%>$ cwh__8,! ?>M$C rw-il!=fss}I7&'^F]DDlczjdq$QiU`XIENDB`mathgl-8.0.1/udav/png/object-order-raise.png0000664000175000017500000000066314167366466020523 0ustar balakinbalakinPNG  IHDRazIDATxڥ[KQ d+C$&{.(9)_ sV-b63[=s6%z$)9N`0|2lvf0iKJ/˨T*Vj4 ~͛_@&Qo4t:3 ш^nZl6) Ju C fsP73B1\nmq'"]r~<ū9UVǹ0X!8IHiߋ?\ Rv#SQ6$KtE#@|Ǎ0y2.:*e5UNR42,$p}_ʩ"${^@"IENDB`mathgl-8.0.1/udav/png/arrow-right.png0000664000175000017500000000066614167366466017313 0ustar balakinbalakinPNG  IHDRa}IDATxڥ+}w1r^.v9UKY2Bj5J~$Be5!SrQ׵_\ç< otC}PNr>) GNuu/h8j2P2Y0k Z?p`COCoK߱/8јB7 CBubKVӽs֙w.Q1a;=:Vl69(~tٙN 6AMTCaB `<-_r!HD b,h4a9hŕ* AqGaFˆ6XPRMO<ʹ^Ę\+תn \ԦͫwR!6,w q;eSSa,P3^_}OET)IENDB`mathgl-8.0.1/udav/png/view-filter.png0000664000175000017500000000065514167366466017301 0ustar balakinbalakinPNG  IHDR7sBITUF pHYs:tEXtSoftwarewww.inkscape.org<,IDAT(cI4`yRwzTXfjǸ@-_{_=w{kRF?CƲ5?&~FӋce &g6h>{7ں1(g}pu0Ag TYn|+{& ]* 1˞]+I?rd1T9_ޞYnSWgVY$VT2Oά­`u NV//i ,xE;/:IENDB`mathgl-8.0.1/udav/png/arrow-left.png0000664000175000017500000000063514167366466017124 0ustar balakinbalakinPNG  IHDRadIDATxc?ExN B ~ $`dT`֫?C'ImMpnt|k+0400SVV %×Z_S A FiOq<\V7!!H>]e?:u'W_y2 c1?S>z x.i\Dx!Ռ@-goR.fu y "W35/ 7M<%Ka\a-'$|ײ[-AװXI͒Td D&cLaJh0ܭA6IENDB`mathgl-8.0.1/udav/png/arrow-up.png0000664000175000017500000000063714167366466016620 0ustar balakinbalakinPNG  IHDRafIDATxc?ExlPoB &r?Ҥ1ؑdhk2,,x >01HeC#oiN?&&YcY#hk I~ܧoV?o#oFux `cH$Lu350gb_tzr0x0968,\?|ivfig< c4eo4|U!n u ?iR$2zxwmuoj_Sj29qY-VKW_m6 `d`$ 3@bdd&'h?,IENDB`mathgl-8.0.1/udav/png/zoom-in.png0000664000175000017500000000135614167366466016433 0ustar balakinbalakinPNG  IHDRaIDATxڝ[Ly񡹞6_Z[O\a. S!PR1iJ^*(9tJ 5/("xa_OHTZL]l7(""I ZT}^ܿaj3 CKeKv,L~u00kq6ŬgDYVi4^Ͳ.WgtJ7iN%{~GgߙH7|>ym6Lȭ&HIȬvi'k Xh,pzLk<㷽$RC V-rj_?6?U5rۆHXZ+!'<Eluzǚ@tf nuFGImmGowgC;\ʕXmNߍ_uo=&xp1bK(3OQM2| ׻ Rd80gd mGfޤĆQj2f堔$:t2Rz+ۉk?sXD9#F#P'9 gu:@ ⩔XdäO99C@| bbIENDB`mathgl-8.0.1/udav/png/text-field.png0000664000175000017500000000040714167366466017104 0ustar balakinbalakinPNG  IHDR(-SHPLTE fz g h h/UwgihihghLtRNS224Gxxxxxyz{|}~ZXIDATx 94p;m@ 0*Ljtș`p7NP&dA> {>0l1!x8gxw, SIENDB`mathgl-8.0.1/udav/png/layer-visible-on.png0000664000175000017500000000126314167366466020221 0ustar balakinbalakinPNG  IHDRazIDATxڭS]hQb-w/A@aܺq^42?eCI_ ҠƢ،؆Dl(qfmE=Ⱥٹy}xNݾ?m$ibx<4L:V(  ndBOOz{{aVmX,b,<8I%RBUR 1kd: Ў3+i=N=+<O lH$:[dZ͕zL滺}\).,7P( gхRtp].׺FW|D+&DzmDT8ΓB*f{CCUe^u>Hπ Ẉ#Nh4ڬ|)l6C%pqnUh -@ebKbd>d+ULVG3[/SP=߃g]9@677ɐ,)"u\%\pn]2݆H'\)%]]$p5HrMƖ"8gOuYIiR0ۼOE&'LK Ac RԔz!2f3?Zh||on{ 7kaP'ӢU7M$g^JsPp4}RzRSGIuN}X\*+ƫ ] T1܄륣.snIJwVY(Js<_58Ņ @RĂ&#cx_]J)ΞCӖvttM.$u1 G_lox|ssW0- sWpvLh4jn=9ƓR"34IENDB`mathgl-8.0.1/udav/png/layer-visible-off.png0000664000175000017500000000123214167366466020353 0ustar balakinbalakinPNG  IHDRaaIDATxڭR]hQw#c.W`h/"D0F ,6zq|\ Ɗ!s"n~#?ۇ.1F1(dR:ɒs=wwJ tmll|.H$h4G( C6D"a=0ȤRh0:?? Ol6O ^/..>d2yx`eeZ[[}9M-sda™lT*P*rHRhnsss{ՑH#IpttX]%d2JP(KFD"rJ&u~~Nw NN8EՂZB~t:]j!vv@<3J%B݆=dyyYaaLMMC*O^<^/ mt:l6-żn28z...ЫV&6#.hjaX|C[[[@ EuT* ^_X,+_`ˤ(IENDB`mathgl-8.0.1/udav/png/tools-wizard.png0000664000175000017500000000122514167366466017474 0ustar balakinbalakinPNG  IHDRa\IDATxc?Nl% b:! Ap>j آZFl,z60;bI.q=si'j(.1θɕ!x5C$?ܜN|ArcO dnԵċ;dn;^?... ˟Ooa`|3ԷJLO=ihjii ـG]2>þ< 80HOOh7^mm/! ?]+/v3]stտI^2@ *Ldoϟs^g`{XOL;,tiA~Lpӓ0[b޵08886ikk*a& RPPphYXC8Xh&&7_Կ.6H! 66B {@oy d3a@f ?i Qrrr01c(eIENDB`mathgl-8.0.1/udav/png/view-grid.png0000664000175000017500000000116114167366466016732 0ustar balakinbalakinPNG  IHDR(-SMPLTE`ab1 tRNS 23=>?@1=7IDATxc``deVF<< ))i9籃mU|#l><q/tnʦ3 k?#X¨#3-INn{}kOIςqh^gO{jja!N^(`heZ6#V߳,w<7?elsWOZ%dme'/ӽٴ]߶5wmY@\%;JS ;T͞?i){7.:{6F5gWsHiycW.~eX?ʹcͽ/wJh{ C#r [0(:Y~ ?EO/d*H0 #N$u_>֕w_@ͺa$>UV֠_<-2iBI {6%Mu &kxyQ%w %!IENDB`mathgl-8.0.1/udav/png/package-x-generic.png0000664000175000017500000000103414167366466020306 0ustar balakinbalakinPNG  IHDRabKGDC pHYs B(xtIME IDAT8˭1hTAww=b A I#MR (X( ;H) h,Ebl"*Q]۱x9#xQفٙ4h0lڑВF4ѳWc[6#H>/bJi"/3sV,1;ZEsSpZ8vKo[G-Cb 4ET }W(Pٲ ٰ|r@ UPmҏHV?1(>9! d Bj}Xk`<h~pb+@zP$3_F0׌Q3_Aszy]❇{ 3Al'2=֮G%J=.]q{ klf_o҇)IENDB`mathgl-8.0.1/udav/png/edit-copy.png0000664000175000017500000000066414167366466016741 0ustar balakinbalakinPNG  IHDRa{IDATxMNPljx5Ѹq!798xZAP (`0>z&/fᐛފ#8&=J)Տ`$~ hN[0m2N4?4S 5juzi2Jyj1{Vx"]=Q_o5_pTPUoA29n߿'}P$tEqΫ|ƇHaKz+doDFIENDB`mathgl-8.0.1/udav/png/arrow-left-double.png0000664000175000017500000000110414167366466020364 0ustar balakinbalakinPNG  IHDRa IDATxڥKaǿmm.sDD6AtNFnA1 i!PS'ӌV ).]#_<6~~ K9>/<χy#qxY@ JT3޳AqvMۏ;\Szܧ9u0*F^EDǤ`f ]Krd#±ct?GF8bd~/D·9Xdb ?';fT~B6^o>0P%}O/GgI{ήLI+i5W p! K9R}xʶ6ZW4eL4$ 먏\_ 7(iq.izFvLCq[=..o$$KK%KI͔[cTWc꫊ PLW沐`V3!+c*_1d3-YKIZ%MDL6rY)j NpJtl+\靎*AMAH ɽ|Wù՟%kaeCimM*к~$~HcuK> Zcl}NgJ* ̎^T qTCu:I\'*1B m&󟑦qObUvgc8DuP?BaD(Y?Q,bldIP"%eTqpcoy1?Tah~Dcf0{!? X/U;e.,庭Mɫ(?>XXFcK8IS'RVxݳ.(ٹM@KԳY9Qw53L@ٮ=_ulIENDB`mathgl-8.0.1/udav/png/weather-clouds.png0000664000175000017500000000140714167366466017766 0ustar balakinbalakinPNG  IHDRaIDATxՒ[HSqǏ~RT0y{(2%H={OhK}(KI4Msesl͝y\K.oA}?~Q]>h(&K1|I](,By%'+N׬T,]0b>_ǹ MzȼO 5`62/? 4؏JߣGOegvF3#찏װԴ̹OJb}`,?XxP}W-Wax|{!]KkE9kس  +k"z iJb(MW70_ ;;׈@q wd3L2#Ll6[d& &&(k!K$ Xql{ ܆TP9܊:yMI40 wly<NZ".b6uk4#ΎEzU a;=`,qb6 Fg8ywMHgl[nN'EtZYzuzl.?8TD0ItzCV;ۨh\PT*SjMP*L3>b?J)Ykgliv㶌NyojkdzԎfY[b{r0e@̄-m-]=]&Q11}]]Uwa#Vʊ b &3TH/|eK@NI b5؈IPH67;wo{i%.!)<G%IJd{GW}@qq F555&Pcae1fa++AAAl% ɛ1119R ""E98:0\>z߃GFc + L~~L`HHdEOH2/^yś?,JH@ ',R VIAQ,6vvff]wsU-- -`F'$$.bbcgdd,̸s%0@)` WX7(l ܳҎ|IENDB`mathgl-8.0.1/udav/png/preferences-system.png0000664000175000017500000000133014167366466020656 0ustar balakinbalakinPNG  IHDRaIDATxc?Ck[&/_}'Ot1޽{oܴi>'NX׮]m֏Œ`***\v_`MsAAݻyu100p^xx~;s1999G'Nx̻h񂠴4Y" `wuw?wǎsCè%ϙ7˗/]ɓ~kii,n߹ hHlʔ)"{„?c挿a[a^@7))9eە~oٲ`͚5::)--uեa!---[ϝ?ggoSS`83:/_OvvcOŚ|vA-^ee忥F^jӿM Fx 9s?;;#""&{3g/W+d^Հ'2i&'%Ġxxۏ_T:}>'L6-{Ŋ,--aPl ۔P|eWE9/S1ý{@yA`ٗ6Njt [%2d^]vp?°!33Sei|[OO#f|*ځ!lV0Ha M#,,,NLVdаQg4@IENDB`mathgl-8.0.1/udav/png/document-save.png0000664000175000017500000000161714167366466017615 0ustar balakinbalakinPNG  IHDRabKGDC pHYs  tIME 7*ؿtEXtCommentMenu-sized icon ========== (c) 2003 Jakub 'jimmac' Steiner, http://jimmac.musichall.cz created with the GIMP, http://www.gimp.orggGIDAT8˝MHTaL1͑QlQQ4&E.B(,V-*ETR( "((j["DETjܛN al6<=_'?[ظ3 T[&Ÿ?ͻϝ 4wt퍭Uk:#km'-Q7˺; <}۝;ƨf(ce#+s >b$y,%_FDDdsZzD/Hϫ/.wY%<r$qDxXBAA(W'n۱wp=/x|vl_PPP#wҘX̌M4єXi^"2"0e1.XͻǪ Q_ͭ{h\Î,4M9H*|!mkص)i8(m41MCRO-hm aPYYޚ <۶qy!<]s?D30DQ,@.x]:R,Fs4_;3L"bmIENDB`mathgl-8.0.1/udav/png/view-group.png0000664000175000017500000000043314167366466017142 0ustar balakinbalakinPNG  IHDR(-S`PLTE PR\`FJQQx}͏ʌtRNS()fIDATxڍI DQhgAKME/~Ri!#C`0`uaeSaEr|,}nR=GLaue!IENDB`mathgl-8.0.1/udav/png/zoom-draw.png0000664000175000017500000000133214167366466016754 0ustar balakinbalakinPNG  IHDRaIDATxڍ[HaGXE*XYW]Hx#ԍT ]X924WeVN̥4Xr66'ijs'7W;|;?[ w>}^IffnDAdG>Z-CO OLHII\oqkdɂWjtPNlP^UXcXpw08ϭ yT!o>,{ڐ,hUa%°.BO̬ ]a^aN75tY g]蝶gʌe/Z5XXQLݟz A`+u0{DxX @ ` QTq_y&*0m` "PطW`pr~ށS+K(PM*"El q7:K{:AF"(S,!v[Rqfd+aJAKIaxh #q!! oU3 pE& #wAӝ /yh7KPX|%U|x<3V"#"?qCbD[ټ3],`~ F7V:kh=Pgvg51ISKSFqdJ5knkIENDB`mathgl-8.0.1/udav/info_dlg.cpp0000664000175000017500000000764414167366466016044 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include "mgl2/qmathgl.h" #include "info_dlg.h" extern mglParse parser; //----------------------------------------------------------------------------- InfoDialog::InfoDialog(QWidget *parent) : QDialog(parent) { var = 0; kz = 0; allowRefresh = true; QWidget *p; QVBoxLayout *v, *u; QLabel *l; QTabWidget *tab = new QTabWidget(this); u = new QVBoxLayout(this); u->addWidget(tab); // graphics p = new QWidget(this); v = new QVBoxLayout(p); l = new QLabel(_("Select kind of plot"),this); v->addWidget(l); kind = new QComboBox(this); v->addWidget(kind); mgl = new QMathGL(this); v->addWidget(mgl,1); //mgl->autoResize = true; // TODO: something strange here !!! mgl->appName = _("Data preview"); mgl->setToolTip(_("Data preview for current slice.")); mgl->setDotsPreview(false); draw = new mglDrawScript(parser.Self()); mgl->setDraw(draw); kind->addItem(_("1D plot")); kind->addItem(_("2D plot")); kind->setCurrentIndex(0); // kind->addItem(_("3D plot")); connect(kind, SIGNAL(currentIndexChanged(int)), this, SLOT(refresh())); kind->setToolTip(_("Kind of plots: lines for 1D, density for 2D.")); tab->addTab(p, _("Preview")); // information info = new QTextEdit(this); info->setToolTip(_("Short information about the data.")); tab->addTab(info, _("Information")); connect(mgl,SIGNAL(showWarn(QString)),info,SLOT(setText(QString))); } //----------------------------------------------------------------------------- InfoDialog::~InfoDialog() {} //----------------------------------------------------------------------------- #include void InfoDialog::refresh(bool force) { if(!var || (!force && (!allowRefresh || !isVisible()))) return; QString text, name, sub; name = QString::fromWCharArray(var->Name()); sub = "(:,:,"+QString::number(kz)+")\n"; int i = kind->currentIndex(); if(i<1) text = "yrange "+name+"\nplot "+name + sub; else text = "crange "+name+"\ndens "+name + sub; text = "zoom 0.15 0.15 0.85 0.85\nbox\n" + text + "\ninfo "+name; draw->text = text; mgl->update(); } //----------------------------------------------------------------------------- void InfoDialog::setVar(mglDataA *v) { var=v; if(v) kind->setCurrentIndex(v->GetNy()>1 ? 1:0); refresh(); } //----------------------------------------------------------------------------- void InfoDialog::showEvent(QShowEvent *) { refresh(true); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/udav_ru.ts0000664000175000017500000053111614167366466015570 0ustar balakinbalakin AnimParam UDAV - Animation setup UDAV - Параметры анимации Redraw picture for $0 equal to Перерисовать для $0 равного strings strings in lines строкам values числам from от to до with step с шагом Cancel Отмена OK OK Put to script Вставить в код Delay (in ms) Задержка (в мсек) Export to GIF Экспорт в GIF Save JPEG frames Сохранить кадры в JPEG UDAV - animation UDAV - анимация You should select one of case Вы должны выбрать строки или числа ArgsDialog UDAV - Set script arguments UDAV - Аргументы программы String for $1 Строка для $1 String for $2 Строка для $2 String for $3 Строка для $3 String for $4 Строка для $4 String for $5 Строка для $5 String for $6 Строка для $6 String for $7 Строка для $7 String for $8 Строка для $8 String for $9 Строка для $9 String for $0 Строка для $0 Cancel Отмена OK OK CalcDialog Result Результат To script В код Clear Очистить Put function Вставить функцию Basic Базовые Exp and log Exp и log Trigonometric Тригонометрические Hyperbolic Гиперболические Bessel Бесселя Elliptic Эллиптические Jacobi Якоби Airy and Gamma Airy и Gamma Exp-integrals Exp-интегралы Special Специальные DatPanel &Data &Данные - UDAV variable - UDAV переменная - UDAV preview - UDAV просмотр UDAV - Import PNG UDAV - Импорт PNG Data files (*.dat) All files (*.*) Файлы данных (*.dat) Все файлы (*.*) UDAV - Export to PNG UDAV - Экспорт в PNG Enter color scheme for picture. Note that data will be normalized in range [0,1]. Введите цветовую схему рисунка. Данные будут нормированы в [0,1]. PNG files (*.png) All files (*.*) PNG файлы (*.png) Все файлы (*.*) Enter color scheme for picture Введите цветовую схему рисунка UDAV - Save data UDAV - Сохранить данные UDAV - Load data UDAV - Загрузить данные UDAV - Fill data UDAV - Заполнить данные Enter formula for data filling. Note that variables x,y,z supposed to be in range [0,1]. Введите формулу для данных. Переменные x,y,z меняются в интервале [0,1]. Enter range for data and direction of filling Введите диапазон и направление заполнения From От To До Direction Направление UDAV - Normalize data UDAV - Нормировать данные Enter range for final data Введите диапазон результата Symmetrical? Симметрично? UDAV - Normalize by slice UDAV - Нормировать по срезам UDAV - Clear data UDAV - Очистить данные Enter new data sizes Введите новые размеры X-size Размер по X Y-size Размер по Y Z-size Размер по Z UDAV - Resize data UDAV - Изменить размер данных UDAV - Squeeze data UDAV - Сжать данные Enter step of saved points. For example, '1' save all, '2' save each 2nd point, '3' save each 3d and so on. Введите шаг сохраняемых точек. Например, '1' сохранить все, '2' каждую вторую точку, '3' каждую третью и т.д. X-direction X направление Y-direction Y направление Z-direction Z направление UDAV - Crop data UDAV - Обрезать данные Enter range of saved date. Введите интервал сохраняемых данных. UDAV - Rearrange data UDAV - Поменять размеры данных UDAV - Transpose data UDAV - Транспонировать данные Enter new order of dimensions. For example, 'yx' or 'yxz' for transpose x-y, 'zyx' for transposing x-z and so on. Введите новый порядок размерностей. Например, 'yx' или 'yxz' для транспонирования x-y, 'zyx' для транспонирования x-z и т.д. UDAV - Smooth data UDAV - Сгладить данные Enter direction(s) for smoothing. Optionally you may enter the kind of smoothing by 3 or by 5 points. For example 'xy3' - smooth only in x and y directions and use 3-points scheme. Введите направление(я) сглаживания. Можно также ввести тип сглаживания по 3 или по 5 точкам. Например 'xy3' - сгладит только в x и y направлениях по 3-точечной схеме. UDAV - Summarize data UDAV - Суммировать данные Enter direction(s) for cumulative summation. For example 'xy' - summate along x and y directions. Введите направление(я) для суммирования. Например 'xy' - суммировать вдоль x и y направлений. UDAV - Integrate data UDAV - Интегрировать данные Enter direction(s) for integration. For example 'xy' - integrate along x and y directions. Введите направление(я) для инткгрирования. Например 'xy' - интегрировать вдоль x и y направлений. UDAV - Differentiate data UDAV - Дифференцировать данные Enter direction(s) for differentiation. For example 'xy' - differentiate along x and y directions. Введите направление(я) для дифференцирования. Например 'xy' - дифференцировать вдоль x и y направлений. UDAV - Laplace transform UDAV - Преобразование Лапласа Enter direction(s) for laplace transform. For example 'xy' - do transform along x and y directions. Введите направление(я) для преобразования Лапласа. Например 'xy' - преобразовать вдоль x и y направлений. UDAV - Swap data UDAV - Поменять местами Enter direction(s) for swapping (exchange left and right parts). For example 'xy' - swap along x and y directions. Useful for Fourier spectrum. Введите направление(я) для обмена левой и правой частями данных. Например 'xy' - меняет вдоль x и y направлений. Полезно для Фурье спектров. UDAV - Mirror data UDAV - Отразить данные Enter direction(s) for mirroring. For example 'xy' - mirror along x and y directions. Введите направление(я) для отражения. Например 'xy' - отразить по x и y направлениям. UDAV - Sum along ... UDAV - Сумма по ... Specify direction(s) of summation Введите направление(я) суммирования UDAV - Max along ... UDAV - Максимум по ... Specify direction(s) of maximal values Введите направление(я) поиска максимумов UDAV - Min along ... UDAV - Минимум по ... Specify direction(s) of minimal values Введите направление(я) поиска минимумов UDAV - Momentum along 'x' UDAV - Момент по 'x' Specify which momentum evaluate. The momentum is res_i = sum_jk how(x_i,y_j,z_k) a_jk/ sum_jk a_jk. Coordinates x, y, z are data indexes normalized in range [0,1]. Укажите какой момент вычислять. Момент равен res_i = Σ_jk how(x_i,y_j,z_k) a_jk/ Σ_jk a_jk. Координаты x, y, z находятся в диапазоне [0,1]. UDAV - Momentum along 'y' UDAV - Момент по 'y' Specify which momentum evaluate. The momentum is res_j = sum_ik how(x_i,y_j,z_k) a_ik/ sum_ik a_ik. Coordinates x, y, z are data indexes normalized in range [0,1]. Укажите какой момент вычислять. Момент равен res_j = Σ_ik how(x_i,y_j,z_k) a_ik/ Σ_ik a_ik. Координаты x, y, z находятся в диапазоне [0,1]. UDAV - Momentum along 'z' UDAV - Момент по 'z' Specify which momentum evaluate. The momentum is res_k = sum_ij how(x_i,y_j,z_k) a_ij/ sum_ij a_ij. Coordinates x, y, z are data indexes normalized in range [0,1]. Укажите какой момент вычислять. Момент равен res_k = Σ_ij how(x_i,y_j,z_k) a_ij/ Σ_ij a_ij. Координаты x, y, z находятся в диапазоне [0,1]. UDAV - Make histogram UDAV - Найти гистограмму Number of points Число точек Put in variable Поместить в переменную Cancel Отмена OK OK UDAV - Change data UDAV - Изменить данные Enter number for adding to data elements: Введите число для добавления к элементам массива: Enter number for subtraction from data elements: Введите число для вычитания из элементов массива: Enter number for division of data elements: Введите число для деления элементов массива: Enter number for multiplication of data elements: Введите число для умножения элементов массива: UDAV - Go to slice UDAV - Перейти к срезу Enter slice id: Введите номер среза: NOTE: All fields must be filled! Все поля должны быть заполнены! Enter the name for new variable Введите имя новой переменной &File &Файл &Load data &Загрузить данные Load data from file. Data will be deleted only at exit but UDAV will not ask to save it. Загрузить данные из файла. Данные будут удалены при выходе, но UDAV не спросит об их сохранении. &Import PNG &Импорт PNG Import data from PNG picture with specified color scheme. Data will be deleted only at exit but UDAV will not ask it saving. Импортировать данные из PNG рисунка с заданной цветовой схемой. Данные будут удалены при выходе, но UDAV не спросит об их сохранении. &Save data Сохранить &данные Save data to tab-separeted file. Сохранить данные в текстовый файл с разделителем табуляцией. &Export PNG &Экспорт PNG Export data to PNG picture. The colors defined by specified color scheme. The same as in 'dens' command. Экспортирует данные в PNG рисунок. Цвета определяются указанной цветовой схемой. Рисунок аналогичен команде 'dens'. Plot &data &Отобразить данные Plot data in new script window. You may select the kind of plot, its style and so on. Отобразить данные в новом окне. Вы можете выбрать тип графика, его стиль и т.д. Copy &data Копировать &данные Copy range of numbers to clipboard. Копировать диапазон чисел в буфер обмена. Paste &data Вставить &данные Paste range of numbers from clipboard. Вставить диапазон чисел из буфера обмена. &Navigate Пере&ход &First slice &Первый срез Go to the first data slice for 3D data. Перейти к первому срезу 3D данных. &Prev. slice &Предыдущий срез Go to the previous data slice for 3D data. Перейти к предыдущему срезу 3D данных. Go to the specified data slice for 3D data. Перейти к указанному срезу 3D данных. Go to slice Перейти к срезу Next slice Следующий срез Go to the next data slice for 3D data. Перейти к следующему срезу 3D данных. Last slice Последний срез Go to the last data slice for 3D data. Перейти к последнему срезу 3D данных. &Sizes &Размеры &Create new &Создать новые Recreate the data with new sizes and fill it by zeros (Ctrl+N). Создает заново данные нового размера и заполняет их нулями (Ctrl+N). &Resize &Изменить размер Resize (interpolate) the data to specified sizes (Ctrl+R). Изменяет размер (интерполирует) данных в указанному (Ctrl+R). &Squeeze С&жать Keep only each n-th element of the data array. Сохраняет каждый n-ый элемент массива данных. Cro&p О&брезать Crop the data edges. Useful to cut off the zero-filled area. Обрезает края данных. Полезно для удаления заполненных нулями областей. &Transpose &Транспонировать Transpose data dimensions, like x<->y or x<->z and so on. Транспонирует массив данных, типа x<->y или x<->z и т.д. Re&arrange По&менять размеры Rearrange data sizes without changing data values. Меняет размеры данных без изменения самого массива данных. &Modify &Изменить By &formula По &формуле Change data values according to formula depended on 'x', 'y' and 'z' variables. A set of special function is availible also. Изменяет данные по формуле, зависяещей от переменных 'x', 'y' и 'z'. Поддерживаются также многие специальные функции. Fill in &range &Распределить Fill data equidistantly from one value to another. Распределить равномерно данные от одного значения до другого. &Normalize &Нормировать Normalize data so that its minimal and maximal values be in specified range. Нормирует данные так, что их максимальное и минимальное значения равны заданным. Norm. s&lices Норм. по &срезам Normalize each data slice perpendicular to some direction so that its minimal and maximal values be in specified range. Нормирует данные по срезам перпендикулярно заданному направлению так, что их максимальное и минимальное значения равны заданным. &Smooth data С&гладить Smooth data by one of 4 methods along specified direction(s). Сглаживает данные одним из 4-х методов вдоль заданного направления(ий). &Operators &Опраторы &Cum. sum &Суммировать Summate data values along specified direction(s). Суммирует данные вдоль указанного направления(ий). &Integrate &Интегрировать Integrate data values along specified direction(s). Интегрирует данные по заданному направлению(ям). &Differentiate &Дифференцировать Differentiate data values along specified direction(s). Дифференцирует данные по заданному направлению(ям). &Laplace &Лаплас Double differentiate data values along specified direction(s). Дважды дифференцирует данные по заданному направлению(ям). &Swap &Поменять местами Swap left and right data part along specified direction(s). This operation is useful for data after Fourier transform. Меняет местами левую и правую часть данных вдоль указанного направления(ий). Операция полезна для данных после Фурье преобразования. &Mirror &Отразить Mirror left and right data part along specified direction(s). This operation do like index change from 'i' to 'n-i'. Отражает данные относительно указанного направления(ий). Действует как замена индекса 'i' на 'n-i'. &Algebraic &Алгебраические &Add &Добавить Add a number to all data values. Добавляет число к элементам массива данных. &Subtract &Вычесть Subtract a number to all data values. Вычитает из элементов массива данных число. &Multiply &Умножить Multiply all data values by a number. Умножает элементы массива данных на число. &Divide &Разделить Divide all data values by a number. Делит элементы массива данных на число. A&nother data &Новые данные &Sum of &Сумма по M&in of М&инимум по M&ax of М&аксимум по Momentum along &x Момент вдоль &x Momentum along &y Момент вдоль &y Momentum along &z Момент вдоль &z &Histogram &Гистограмма DataOpenDialog UDAV - Open data file UDAV - Открыть файл данных Data name Имя данных Auto detect data sizes Автом. определение размеров Set data sizes manually Задать размеры вручную Nx Nx Ny Ny Nz Nz Matrix with sizes from file Матрица с размерами из файла 3D data with sizes from file 3D данные с размерами из файла Cancel Отмена OK OK Auto detect data sizes (%1 x %2 x %3) Определить размер автоматически (%1 x %2 x %3) default по умолчанию UDAV - Insert filename UDAV - Вставить имя файла MGL files (*.mgl) Файлы MGL (*.mgl) Template Шаблон FilesDialog UDAV - Set script arguments UDAV - Аргументы программы String for %1 Строка для %1 String for %2 Строка для %2 String for %3 Строка для %3 String for %4 Строка для %4 String for %5 Строка для %5 String for %6 Строка для %6 String for %7 Строка для %7 String for %8 Строка для %8 String for %9 Строка для %9 Cancel Отмена OK OK UDAV - Set template parameters UDAV - Параметры шаблона FindDialog UDAV - Find UDAV - Найти Find &what: &Что найти: Replace &by: З&аменить на: Match &case Учитывать &регистр Search &backward Искать на&зад &Find &Найти &Replace &Заменить Close Закрыть GraphWindow Printing... Печатаю... Printing completed Печать завершена Printing aborted Печать прервана Drawing time %1 ms Время рисования %1 мсек Frame %1 of %2 Кадр %1 из %2 Graphics График &Graphics &График &Alpha &Прозрачность Switch on/off transparency for the graphics (Alt+T). Включить/выключить прозрачность графика (Alt+T). &Light &Освещение Switch on/off lightning for the graphics (Alt+L). Включить/выключить освещение графика (Alt+L). &Grid &Сетка Switch on/off grid drawing for absolute coordinates (Alt+G). Включить/выключить сетку абсолютных координат (Alt+G). &Rotate by mouse &Вращать мышкой Switch on/off mouse handling of the graphics (rotation, shifting, zooming and perspective). Включить/выключить изменение графика мышью (вращение, сдвиг, приближение и перспектива). &Zoom by mouse &Приближение мышью Switch on/off mouse zoom of selected region. Включить/выключить приближение выбранного региона. Res&tore В&осстановить Restore default graphics rotation, zoom and perspective (Alt+Space). Восстановить вращение, масштаб и перспективу по умолчанию (Alt+Space). Re&draw Пе&рерисовать Execute script and redraw graphics (F5). Выполнить код и перерисовать график (F5). &Adjust size &Подобрать размер Change canvas size to fill whole region (F6). Изменить размер рисунка так, чтобы он заполнял всю область (F6). Re&load Пере&грузить Restore status for 'once' command and reload data (F9). Восстановить статус команды 'once' и перегрузить данные (F9). &Stop &Остановить Stop script execution (F7). Остановить выполенение кода (F7). &Copy plot &Копировать график Copy graphics to clipboard (Ctrl+Shift+C). Копировать график в буфер обмена (Ctrl+Shift+C). Set value of \theta angle. Установить значение угла \theta. Set value of \phi angle. Установить значение угла \phi. &Export as ... &Экспорт в ... bitmap EPS растровый EPS vector EPS векторный EPS Zoom/move Масштаб/сдвиг Zoom graphics Приближение графика Move &left Сдвиг в&лево Move graphics left by 1/3 of its width. Сдвиг графика влево на 1/3 его ширины. Move &up Сдвиг &вверх Move graphics up by 1/3 of its height. Сдвиг графика вверх на 1/3 его высоты. Zoom &in &Приблизить Zoom in graphics. Приблизить график. Zoom &out &Отдалить Zoom out graphics. Отдалить график. Move &down Сдвиг в&низ Move graphics up down 1/3 of its height. Сдвиг графика вниз на 1/3 его высоты. Move &right Сдвиг вп&раво Move graphics right by 1/3 of its width. Сдвиг графика вправо на 1/3 его ширины. &Animation &Анимация Animation Анимация &Next slide &Следующий кадр Show next slide (Alt+Right). Показать следующий кадр (Alt+Right). &Prev slide &Предыдущий кадр Show previous slide (Alt+Left). Показать предыдущий кадр (Alt+Left). &Slideshow &Запустить Run slideshow (Ctrl+F5). If no parameter specified then the dialog with slideshow options will appear. Запустить анимацию (Ctrl+F5). Если параметры не были указаны, то показывается диалог с параметрами анимации. Se&tup show &Настроить анимацию Switch on/off transparency for the graphics (Ctrl+T). Включить/выключить прозрачность графика (Ctrl+T). Switch on/off lightning for the graphics (Ctrl+L). Включить/выключить освещение графика (Ctrl+L). Switch on/off grid drawing for absolute coordinates (Ctrl+G). Включить/выключить рисование сетки абсолютных координат (Ctrl+G). Restore default graphics rotation, zoom and perspective (Ctrl+Space). Восстановить вращение, масштаб и перспективу по умолчанию (Ctrl+Space). &Copy click coor. &Копировать коор. Copy coordinates of last mouse click to clipboard. Копировать в буфер обмена координаты последнего щелчка мыши. Show next slide (Meta+Right). Показать следующий кадр (Meta+Right). Show previous slide (Meta+Left). Показать предыдущий кадр (Meta+Left). Set value of \theta angle. You can use keys (Shift+Meta+Up or Shift+Meta+Down). Изменить значение угла \theta. Можно использовать клавиши (Shift+Meta+Up или Shift+Meta+Down). Set value of \phi angle. You can use keys (Shift+Meta+Left or Shift+Meta+Right). Изменить значение угла \phi. Можно использовать клавиши (Shift+Meta+Left или Shift+Meta+Right). Rotate Вращать Rotate up Вращать вверх Increase \theta angle by 10 degrees. Увеличить угол \theta на 10 градусов. Rotate down Вращать вниз Decrease \theta angle by 10 degrees. Уменьшить угол \theta на 10 градусов. Rotate left Вращать влево Increase \phi angle by 10 degrees. Увеличить угол \phi на 10 градусов. Rotate right Вращать вправо Decrease \phi angle by 10 degrees. Уменьшить угол \phi на 10 градусов. HelpPanel Backward Назад Forward Вперед &Examples &Примеры Help Помощь mgl_en mgl_ru HelpWindow Backward Назад Forward Вперед &Examples &Примеры Help Помощь mgl_en mgl_ru HintDialog UDAV - Hint UDAV - Советы &Show at startup Показывать при з&апуске &Prev &Предыдущий &Next &Следующий &Close &Закрыть InfoDialog Select kind of plot Выберите тип графика Data preview for current slice. Просмотр для текущего среза. 1D plot 1D график 2D plot 2D график Kind of plots: lines for 1D, density for 2D. Тип графика: линии для 1D, график плотности для 2D. Preview Просмотр Short information about the data. Краткая информация о данных. Information Информация MGLThread In line В линии -- wrong argument(s): -- неправильный аргумент(ы): -- wrong command: -- неправильная команда: -- string too long: -- строка слишком длинная: -- unbalanced ' : -- не хватает ' : MainWindow untitled - UDAV без имени - UDAV Messages and warnings Сообщения и предупреждения Calculator Калькулятор &Open file &Открыть файл Open and execute/show script or data from file (Ctrl+O). You may switch off automatic exection in UDAV properties. Открыть и выполнить/показать код или данные из файла (Ctrl+O). Вы можете выключить автоматическое выполнение в настройках UDAV. &Save script &Сохранить код Save script to a file (Ctrl+S) Сохранить код в файл (Ctrl+S) Show calculator which evaluate and help to type textual formulas. Textual formulas may contain data variables too. Показывает калькулятор, который вычисляет и помогает набрать текстовые формулы. Текстовые формулы могут содержать также и определенные в коде данные. Show info Окно сообщений Canvas График Help Помощь Info Информация Script Код Ready Готово &File &Файл &New script &Новый код Create new empty script window (Ctrl+N). Создать новое пустое окно для кода (Ctrl+N). Save &As ... Сохранить &как ... &Print script Печатать &код Print &graphics &Печатать график Open printer dialog and print graphics (Ctrl+P) Открыть диалог принтера и напечатать график (Ctrl+P) Recent files Последние файлы &Quit В&ыход &Settings &Настройки Properties Настройки UDAV Show dialog for UDAV properties. Показать диалог настроек программы UDAV. Set ar&guments &Аргументы кода &Help &Справка MGL &help MGL &справка Show help on MGL commands (F1). Показывает справку по текущей команде MGL (F1). &Examples &Примеры Show examples of MGL usage (Shift+F1). Показывает примеры использования MGL (Shift+F1). H&ints С&оветы Show hints of MGL usage. Показывает советы по использованию MGL. &About О &программе About &Qt О библиотеке &Qt UDAV Do you want to save the changes to the document? Вы хотите сохранить изменения в коде? Not recognized Не распознано UDAV v. 0. (c) Alexey Balakin, 2008 http://udav.sf.net/ (c) Алексей Балакин, 2008 http://udav.sf.net/ UDAV - about UDAV - о программе About Qt О библиотеке Qt - UDAV UDAV - save current UDAV - сохранить текущий код Couldn't change to folder Не могу перейти в папку UDAV - Open file UDAV - Открыть файл MGL scripts (*.mgl) HDF5 files (*.hdf *.h5) Text files (*.txt) Data files (*.dat) All files (*.*) MGL код (*.mgl) HDF5 файлы (*.hdf *.h5) Текст (*.txt) Файлы данных (*.dat) Все файлы (*.*) Loading aborted Загрузка прервана UDAV - save file UDAV - сохранить файл MGL scripts (*.mgl) HDF5 files (*.hdf *.h5) All files (*.*) MGL код (*.mgl) HDF5 файлы (*.hdf *.h5) Все файлы (*.*) Saving aborted Сохранение прервано untitled* - UDAV без имени* - UDAV * - UDAV MemPanel Create new data array Создать новый массив данных Edit selected data array Редактировать выбранный массив данных Delete selected data array Удалить выбранный массив данных Properties of selected data array Свойства выбранного массива данных Update list of data arrays Обновить список массивов данных Delete ALL data arrays Удалить ВСЕ массивы данных Name Имя Sizes Размеры Memory Память UDAV - New variable UDAV - Новая переменная Enter name for new variable Введите имя для новой переменной UDAV - delete all data UDAV - Удалить все данные Do you want to delete all data? Вы хотите удалить все данные? - UDAV preview - UDAV просмотр MemoryWindow New Новый Edit Правка Delete Удалить Info Информация Update Обновить Delete All Удалить все Name Имя Sizes Размеры Memory Память UDAV - New variable UDAV - Новая переменная Enter name for new variable Введите имя для новой переменной UDAV - delete all data UDAV - Удалить все данные Do you want to delete all data? Вы хотите удалить все данные? - UDAV preview - UDAV просмотр NewCmdDialog Argument Аргумент Value Значение Add style Добавить стиль Add data Добавить данные Options Опции Cancel Отмена OK OK 1D plots 1D графики 2D plots 2D графики 3D plots 3D графики Dual plots Парные графики Vector plots Векторные графики Other plots Прочие графики Text and legend Текст и легенда Create data and I/O Создание данных и I/O Data handling Обработка данных Data extraction Выделение данных Axis and colorbar Оси координат General setup Настройка графика Axis setup Настройка осей Scale and rotate Положение и поворот Program flow Условия и циклы Nonlinear fitting Подбор функции Primitives Примитивы New command Новая команда Select first the proper kind of arguments Сначала выберите тип аргументов There is no 'fmt' argument for this command Нет аргумента 'fmt' для данной команды You should specify required argument Вы должны ввести все обязательные аргументы You should put text inside ' ' for argument Вы должны вводить текст внутри ' ' You should specify all optional arguments before Вы должны ввести все опциональные аргументы перед Groups of MGL commands Группы команд MGL MGL commands for selected group Команды MGL для выбранной группы Short description of selected command Краткое описание выбранной команды Kind of command argument order. The notation is: * Capital arguments are data (like, Ydat); * Argument in '' are strings (like, 'fmt'); * Other arguments are numbers (like, zval); * Arguments in [] are optional arguments. Тип аргументов команды. Используются обозначения: * Заглавными обозначены данные (например, Ydat); * Аргументы в '' означают строки (например, 'fmt'); * Прочие аргументы -- числа (например, zval); * Аргументы в [] опциональны (могут не указываться). Command arguments. Bold ones are required arguments. Other are optional arguments but its order is required. You can use '' for default format. See help at right for default values. Аргументы команды. Жирным обозначены обязательные аргументы. Все прочие аргументы опциональны, но их порядок должен соблюдаться. Можно использовать '' для формата по умолчанию. Справка справа дает подробное описание команды и значения аргументов по умолчанию. Here you can select the plot style. The result will be placed in 'fmt' argument. Здесь можно выбрать стиль графика. Результат будет помещен в аргумент 'fmt'. Here you can specify command options. Options are used for additional plot tunning. Здесь можно выбрать опции команд. Опции используются для дополнительной настройки вида графика. mgl_en mgl_ru OptionDialog UDAV - Add options UDAV - Добавить опцию X-range Диапазон по X Y-range Диапазон по Y Z-range Диапазон по Z C-range Диапазон по C Alpha Прозрачность Ambient Фоновое освещение Mesh num Число линий сетки Font size Размер шрифта Cutting Обрезание Legend Легенда Cancel Отмена OK OK UDAV - command options UDAV - опции команд Both fields in xrange must be filled Оба поля в xrange должны быть заполнены Both fields in yrange must be filled Оба поля в yrange должны быть заполнены Both fields in zrange must be filled Оба поля в zrange должны быть заполнены Both fields in crange must be filled Оба поля в crange должны быть заполнены on вкл off выкл PlotPanel &Graphics &График Printing... Печатаю... Printing completed Печать завершена Printing aborted Печать прервана Drawing time %1 ms Время рисования %1 мсек Frame %1 of %2 Кадр %1 из %2 &Alpha &Прозрачность Switch on/off transparency for the graphics (Ctrl+T). Включить/выключить прозрачность графика (Ctrl+T). &Light &Освещение Switch on/off lightning for the graphics (Ctrl+L). Включить/выключить освещение графика (Ctrl+L). &Grid &Сетка Switch on/off grid drawing for absolute coordinates (Ctrl+G). Включить/выключить рисование сетки абсолютных координат (Ctrl+G). &Rotate by mouse &Вращать мышкой Switch on/off mouse handling of the graphics (rotation, shifting, zooming and perspective). Включить/выключить изменение графика мышью (вращение, сдвиг, приближение и перспектива). &Zoom by mouse &Приближение мышью Switch on/off mouse zoom of selected region. Включить/выключить приближение выбранного региона. Res&tore В&осстановить Restore default graphics rotation, zoom and perspective (Ctrl+Space). Восстановить вращение, масштаб и перспективу по умолчанию (Ctrl+Space). Re&draw Пе&рерисовать Execute script and redraw graphics (F5). Выполнить код и перерисовать график (F5). &Adjust size &Подобрать размер Change canvas size to fill whole region (F6). Изменить размер рисунка так, чтобы он заполнял всю область (F6). Re&load Пере&грузить Restore status for 'once' command and reload data (F9). Восстановить статус команды 'once' и перегрузить данные (F9). &Stop &Остановить Stop script execution (F7). Остановить выполенение кода (F7). &Copy plot &Копировать график Copy graphics to clipboard (Ctrl+Shift+C). Копировать график в буфер обмена (Ctrl+Shift+C). &Copy click coor. &Копировать коор. Copy coordinates of last mouse click to clipboard. Копировать в буфер обмена координаты последнего щелчка мыши. Set value of \theta angle. You can use keys (Shift+Meta+Up or Shift+Meta+Down). Изменить значение угла \theta. Можно использовать клавиши (Shift+Meta+Up или Shift+Meta+Down). Set value of \phi angle. You can use keys (Shift+Meta+Left or Shift+Meta+Right). Изменить значение угла \phi. Можно использовать клавиши (Shift+Meta+Left или Shift+Meta+Right). &Export as ... &Экспорт в ... PNG solid PNG JPEG GIF bitmap EPS растровый EPS vector EPS векторный EPS SVG C++ IDTF Zoom/move Масштаб/сдвиг Move &left Сдвиг в&лево Move graphics left by 1/3 of its width. Сдвиг графика влево на 1/3 его ширины. Move &up Сдвиг &вверх Move graphics up by 1/3 of its height. Сдвиг графика вверх на 1/3 его высоты. Zoom &in &Приблизить Zoom in graphics. Приблизить график. Zoom &out &Отдалить Zoom out graphics. Отдалить график. Move &down Сдвиг в&низ Move graphics up down 1/3 of its height. Сдвиг графика вниз на 1/3 его высоты. Move &right Сдвиг вп&раво Move graphics right by 1/3 of its width. Сдвиг графика вправо на 1/3 его ширины. Rotate Вращать Rotate up Вращать вверх Increase \theta angle by 10 degrees. Увеличить угол \theta на 10 градусов. Rotate down Вращать вниз Decrease \theta angle by 10 degrees. Уменьшить угол \theta на 10 градусов. Rotate left Вращать влево Increase \phi angle by 10 degrees. Увеличить угол \phi на 10 градусов. Rotate right Вращать вправо Decrease \phi angle by 10 degrees. Уменьшить угол \phi на 10 градусов. &Animation &Анимация &Next slide &Следующий кадр Show next slide (Meta+Right). Показать следующий кадр (Meta+Right). &Prev slide &Предыдущий кадр Show previous slide (Meta+Left). Показать предыдущий кадр (Meta+Left). &Slideshow &Запустить Run slideshow (Ctrl+F5). If no parameter specified then the dialog with slideshow options will appear. Запустить анимацию (Ctrl+F5). Если параметры не были указаны, то показывается диалог с параметрами анимации. Se&tup show &Настроить анимацию PropDialog UDAV - Properties UDAV - Настройки Select font Выбрать шрифт Current font Текущий шрифт Change font Изменить шрифт Setup colors for: Настроить цвета для: Comments Коментарии Strings Строки Keywords Команды Options Опции Suffixes Суффиксы Numbers Числа AutoKey Созд.данных FlowKey Упр.команды Path for help files Путь к файлам справки Path for user MathGL font files Путь к шрифтам MathGL Language for UDAV Язык для UDAV Russian Русский Automatically execute script after loading Автоматически выполнять после загрузки Place editor at top Поместить редактор сверху Load script to new window Загружать скрипт в новое окно Automatical save before redrawing (F5) Автоматически сохранять перед перерисовкой (F5) Cancel Отмена OK OK UDAV - Insert filename UDAV - Вставить имя файла You have to restart UDAV for applying the cahnges. Вы должны перезапустить UDAV для применения изменений. English Image size Размер рисунка Font files (*.vfm) Файлы шрифтов (*.vfm) Disable face drawing (faster) for mouse rotation/shift/zoom. Не рисовать грани (быстрее) при вращении мышью. Automatically save before redrawing (F5) Автоматически сохранять перед перерисовкой (F5) Enable keywords completition Включить дополнение ключевых слов QMGLCanvas No filename. Please save script first. Нет имени файла. Сохраните сначала код. UDAV Not initialized! Не инициализировано! QObject none or default нет или по-умолчанию w - white w - белый b - blue b - синий g - lime g - ярко-зеленый r - red r - красный c - cyan c - голубой m - magenta m - малиновый y - yellow y - желтый l - springgreen l - сине-зеленый e - lawngreen e - желто-зеленый n - skyblue n - небесно-голубой u - blueviolet u - сине-фиолетовый q - orange q - оранжевый p - deeppink p - фиолетовый h - gray h - серый k - black k - черный W - lightgray W - светло-серый B - navy B - темно синий G - green G - зеленый R - maroon R - темно красный C - teal C - темно голубой M - purple M -purple M - пурпурный Y - olive Y - оливковый L - seagreen L - темно сине-зеленый E - darklawn E - темно желто-зеленый N - darkskyblue N - темно небесно-голубой U - indigo U - индиго Q - brown Q - коричневый P - darkpink P - темно фиолетовый H - darkgray H - темно серый none нет arrow стрелка back arrow обратная стрелка stop стоп size размер triangle треугольник square квадрат rhomb ромб circle окружность solid сплошная dash пунктир dash dot пунктир-точка small dash мелкий пунктир small dash dot мелкий пунктир-точка dots точки dot точка cross крест skew cross косой крест asterix звездочка triangle down треугольник вниз triangle up треугольник вверх filled square закрашенный квадрат filled rhomb закрашенный ромб filled triangle down закрашенный треугольник вниз filled triangle up закрашенный треугольник вверх filled circle круг long dash длинный пунктир plus плюс triangle left треугольник влево triangle right треугольник вправо circled dot точка в окружности Y-sign знак Y squared plus плюс в квадрате squared cross косой крест в квадрате solid square закрашенный квадрат solid rhomb закрашенный ромб solid triangle down закрашенный треугольник вниз solid triangle up закрашенный треугольник вверх solid triangle left закрашенный треугольник влево solid triangle right закрашенный треугольник вправо solid circle круг ScriptWindow (c) Alexey Balakin, 2008 http://udav.sf.net/ (c) Алексей Балакин, 2008 http://udav.sf.net/ UDAV - about UDAV - о программе File/Edit Operations Файл/Правка &File &Файл &New script &Новый код Create new empty script window (Ctrl+N). Создать новое пустое окно для кода (Ctrl+N). &Open file &Открыть файл Open and execute/show script or data from file (Ctrl+O). You may switch off automatic exection in UDAV properties. Открыть и выполнить/показать код или данные из файла (Ctrl+O). Вы можете выключить автоматическое выполнение в настройках UDAV. &Save script &Сохранить файл Save script to a file (Ctrl+S) Сохранить код в файл (Ctrl+S) Save &As ... Сохранить &как ... &Print script Печатать &код Print &graphics &Печатать график Open printer dialog and print graphics (Ctrl+P) Открыть диалог принтера и напечатать график (Ctrl+P) Recent files Последние файлы &Quit В&ыход &Edit &Правка &Undo &Отменить Undo editor change (Ctrl+Z). Отменить изменения в редакторе (Ctrl+Z). &Redo &Вернуть Redo editor change (Ctrl+Shift+Z). Вернуть изменения в редакторе (Ctrl+Shift+Z). Clear all Очистить все Cu&t text В&ырезать Cut selected text to clipboard (Ctrl+X). Вырезать выделенный текст в буфер обмена (Ctrl+X). &Copy &Копировать Copy selected text or data to clipboard (Ctrl+C). Копировать выделенный текст в буфер обмена (Ctrl+C). &Paste &Вставить Paste text or data from clipboard (Ctrl+V). Вставить текст или данные из буфера обмена (Ctrl+V). Select &all Выделить вс&е &Find/Replace &Найти/заменить Show dialog for text finding (Ctrl+F). Показать диалог поиска текста (Ctrl+F). Find next Найти текст Insert Вставить New command Новая команда Show dialog for new command and put it into the script. Показать диалог вставки новой команды. Fitted formula Найденная формула Insert last fitted formula with found coefficients. Вставить последнюю найденную формулу в текст. Plot style Стиль графика Show dialog for styles and put it into the script. Styles define the plot view (color scheme, marks, dashing and so on). Показать диалог стиля графика и вставить его в код. Стиль определяет вид графика (цвет, маркеры, пунктир и пр). Command options Опции команды Show dialog for options and put it into the script. Options are used for additional setup the plot. Показать диалог выбора опций команды. Опции используются для дополнительной настройки выбранного графика. Numeric value Численное значение Replace expression by its numerical value. Заменить выделенное выражение его числовым значением. File path Путь файла Select and insert file name. Выбрать и вставить путь файла. Folder path Путь папки Select and insert folder name. Выбрать и вставить путь папки. Graphics setup Настройка графика Show dialog for plot setup and put code into the script. This dialog setup axis, labels, lighting and other general things. Показать диалог настройки графика и вставить ее в код. Диалог позволяет настроить оси, подписи, освещение и пр. Properties Настройки UDAV Show dialog for UDAV properties. Показать диалог настроек программы UDAV. Set ar&guments &Аргументы кода Calculator Калькулятор Show calculator which evaluate and help to type textual formulas. Textual formulas may contain data variables too. Показывает калькулятор, который вычисляет и помогает набрать текстовые формулы. Текстовые формулы могут содержать также и определенные в коде данные. Show info Окно сообщений &Window &Окна Tile Плиткой Cascade Каскадом Close all Закрыть все UDAV Help Справка по UDAV &Help &Справка MGL &help MGL &справка Show help on MGL commands (F1). Показывает справку по текущей команде MGL (F1). &Examples &Примеры Show examples of MGL usage (Shift+F1). Показывает примеры использования MGL (Shift+F1). H&ints С&оветы Show hints of MGL usage. Показывает советы по использованию MGL. &About О &программе untitled - UDAV без имени - UDAV UDAV - save current UDAV - сохранить текущий код Do you want to save the changes to the document? Вы хотите сохранить изменения в коде? UDAV - Open file UDAV - Открыть файл MGL scripts (*.mgl) HDF5 files (*.hdf *.h5) Text files (*.txt) Data files (*.dat) All files (*.*) MGL код (*.mgl) HDF5 файлы (*.hdf *.h5) Текст (*.txt) Файлы данных (*.dat) Все файлы (*.*) Loading aborted Загрузка прервана UDAV - open file UDAV - открыть файл Couldn't open file Не могу открыть файл Loaded document Загружен документ Could not write to %1 Не могу записать в %1 File %1 saved Файл %1 сохранен UDAV - save file UDAV - сохранить файл MGL scripts (*.mgl) HDF5 files (*.hdf *.h5) All files (*.*) MGL код (*.mgl) HDF5 файлы (*.hdf *.h5) Все файлы (*.*) Saving aborted Сохранение прервано untitled* - UDAV без имени* - UDAV UDAV - Insert filename UDAV - Вставить имя файла Messages and warnings Сообщения и предупреждения Ready Готово Printing... Печатаю... Printing completed Печать завершена Printing aborted Печать прервана UDAV - find text UDAV - поиск текста No string occurrence is found Строка не найдена Not recognized Не распознано Loaded document %1 Загружен документ %1 &Data &Данные File Operations Работа с файлами &Load data &Загрузить данные Load data from file. Data will be deleted only at exit but UDAV will not ask to save it. Загрузить данные из файла. Данные будут удалены при выходе, но UDAV не спросит об их сохранении. &Import PNG &Импорт PNG Import data from PNG picture with specified color scheme. Data will be deleted only at exit but UDAV will not ask it saving. Импортировать данные из PNG рисунка с заданной цветовой схемой. Данные будут удалены при выходе, но UDAV не спросит об их сохранении. &Save data Сохранить &данные Save data to tab-separeted file. Сохранить данные в текстовый файл с разделителем табуляцией. &Export PNG &Экспорт PNG Export data to PNG picture. The colors defined by specified color scheme. The same as in 'dens' command. Экспортирует данные в PNG рисунок. Цвета определяются указанной цветовой схемой. Рисунок аналогичен команде 'dens'. Plot &data &Отобразить данные Plot data in new script window. You may select the kind of plot, its style and so on. Отобразить данные в новом окне. Вы можете выбрать тип графика, его стиль и т.д. Resize data Размеры данных &Sizes &Размеры &Create new &Создать новые Recreate the data with new sizes and fill it by zeros (Ctrl+N). Создает заново данные нового размера и заполняет их нулями (Ctrl+N). &Resize &Изменить размер Resize (interpolate) the data to specified sizes (Ctrl+R). Изменяет размер (интерполирует) данных в указанному (Ctrl+R). &Squeeze С&жать Keep only each n-th element of the data array. Сохраняет каждый n-ый элемент массива данных. Cro&p О&брезать Crop the data edges. Useful to cut off the zero-filled area. Обрезает края данных. Полезно для удаления заполненных нулями областей. &Transpose &Транспонировать Transpose data dimensions, like x<->y or x<->z and so on. Транспонирует массив данных, типа x<->y или x<->z и т.д. Re&arrange По&менять размеры Rearrange data sizes without changing data values. Меняет размеры данных без изменения самого массива данных. Modify data Изменить данные &Modify &Изменить By &formula По &формуле Change data values according to formula depended on 'x', 'y' and 'z' variables. A set of special function is availible also. Изменяет данные по формуле, зависяещей от переменных 'x', 'y' и 'z'. Поддерживаются также многие специальные функции. Fill in &range &Распределить Fill data equidistantly from one value to another. Распределить равномерно данные от одного значения до другого. &Normalize &Нормировать Normalize data so that its minimal and maximal values be in specified range. Нормирует данные так, что их максимальное и минимальное значения равны заданным. Norm. s&lices Норм. по &срезам Normalize each data slice perpendicular to some direction so that its minimal and maximal values be in specified range. Нормирует данные по срезам перпендикулярно заданному направлению так, что их максимальное и минимальное значения равны заданным. &Smooth data С&гладить Smooth data by one of 4 methods along specified direction(s). Сглаживает данные одним из 4-х методов вдоль заданного направления(ий). &Operators &Опраторы &Cum. sum &Суммировать Summate data values along specified direction(s). Суммирует данные вдоль указанного направления(ий). &Integrate &Интегрировать Integrate data values along specified direction(s). Интегрирует данные по заданному направлению(ям). &Differentiate &Дифференцировать Differentiate data values along specified direction(s). Дифференцирует данные по заданному направлению(ям). &Laplace &Лаплас Double differentiate data values along specified direction(s). Дважды дифференцирует данные по заданному направлению(ям). &Swap &Поменять местами Swap left and right data part along specified direction(s). This operation is useful for data after Fourier transform. Меняет местами левую и правую часть данных вдоль указанного направления(ий). Операция полезна для данных после Фурье преобразования. &Mirror &Отразить Mirror left and right data part along specified direction(s). This operation do like index change from 'i' to 'n-i'. Отражает данные относительно указанного направления(ий). Действует как замена индекса 'i' на 'n-i'. &Algebraic &Алгебраические &Add &Добавить Add a number to all data values. Добавляет число к элементам массива данных. &Subtract &Вычесть Subtract a number to all data values. Вычитает из элементов массива данных число. &Multiply &Умножить Multiply all data values by a number. Умножает элементы массива данных на число. &Divide &Разделить Divide all data values by a number. Делит элементы массива данных на число. A&nother data &Новые данные &Sum of &Сумма по M&in of М&инимум по M&ax of М&аксимум по Momentum along &x Момент вдоль &x Momentum along &y Момент вдоль &y Momentum along &z Момент вдоль &z &Histogram &Гистограмма Navigate data Переход к срезам &Navigate Пере&ход &First slice &Первый срез Go to the first data slice for 3D data. Перейти к первому срезу 3D данных. &Prev. slice &Предыдущий срез Go to the previous data slice for 3D data. Перейти к предыдущему срезу 3D данных. Go to the specified data slice for 3D data. Перейти к указанному срезу 3D данных. Go to slice Перейти к срезу Next slice Следующий срез Go to the next data slice for 3D data. Перейти к следующему срезу 3D данных. Last slice Последний срез Go to the last data slice for 3D data. Перейти к последнему срезу 3D данных. About Qt О библиотеке Qt About &Qt О библиотеке &Qt Couldn't change to folder Не могу перейти в папку Couldn't open file Не могу открыть файл &Copy text &Копировать текст &Paste text &Вставить текст File name Имя файла SetupDialog UDAV - Setup plot UDAV - Настройка графика X axis Ось X Y axis Ось Y Z axis Ось Z C axis Ось C Minimal Минимум Maximal Максимум Origin Начало осей Label Подпись at position в позиции at minimum минимума at center по центру at maximum максимума Ticks Метки SubTicks Под-метки Start Начало меток Template Шаблон AlphaDef Базовая прозрачность Ambient Фоновый свет BaseWidth Базовая ширина MeshNum Число линий сетки AxialDir Ось вращения Font Стиль текста FontSize Размер текста Alpha on Прозрачность Light on Освещение No text rotation Запрет вращения текста General settings Общие настройки State Состояние Color Цвет Brightness Яркость Light settings Настройки освещения Template name Имя шаблона Save Сохранить Cancel Отмена To script В код UDAV - Save template UDAV - Сохранить шаблон Could not write to file Не могу записать в файл Template saved Шаблон сохранен Light position should be filled. Ignore it. Положение источника должно быть заполнено. Игнорирую. ID X pos Y pos Z pos on вкл StyleDialog UDAV - Insert style/scheme UDAV - Вставить стиль/схему Arrow at start Стрелка в начале Dashing Пунктир Arrow at end Стрелка в конце Color Цвет Marks Маркер Line width Толщина Line style Стиль линии Color order Порядок цветов Saturation Насыщенность Colors along coordinates Цвет вдоль координат Wire or mesh plot Сетчатый график Axial direction Ось вращения Text on contours Текст на контурах none нет under под above над Color scheme Цветовая схема Bold style Жирный Italic style Курсив Wire style Контур Underline Подчеркнутый Overline Надчеркнутый Text color Цвет текста Text align Выравнивание left влево at center по центру right вправо Font style Стиль текста Resulting string Результат Cancel Отмена OK OK TableWindow - UDAV variable - UDAV переменная - UDAV preview - UDAV просмотр UDAV - Import PNG UDAV - Импорт PNG Data files (*.dat) All files (*.*) Файлы данных (*.dat) Все файлы (*.*) UDAV - Export to PNG UDAV - Экспорт в PNG Enter color scheme for picture. Note that data will be normalized in range [0,1]. Введите цветовую схему рисунка. Данные будут нормированы в [0,1]. PNG files (*.png) All files (*.*) PNG файлы (*.png) Все файлы (*.*) Enter color scheme for picture Введите цветовую схему рисунка UDAV - Save data UDAV - Сохранить данные UDAV - Load data UDAV - Загрузить данные UDAV - Fill data UDAV - Заполнить данные Enter formula for data filling. Note that variables x,y,z supposed to be in range [0,1]. Введите формулу для данных. Переменные x,y,z меняются в интервале [0,1]. Enter range for data and direction of filling Введите диапазон и направление заполнения From От To До Direction Направление UDAV - Normalize data UDAV - Нормировать данные Enter range for final data Введите диапазон результата Symmetrical? Симметрично? UDAV - Normalize by slice UDAV - Нормировать по срезам UDAV - Clear data UDAV - Очистить данные Enter new data sizes Введите новые размеры X-size Размер по X Y-size Размер по Y Z-size Размер по Z UDAV - Resize data UDAV - Изменить размер данных UDAV - Squeeze data UDAV - Сжать данные Enter step of saved points. For example, '1' save all, '2' save each 2nd point, '3' save each 3d and so on. Введите шаг сохраняемых точек. Например, '1' сохранить все, '2' каждую вторую точку, '3' каждую третью и т.д. X-direction X направление Y-direction Y направление Z-direction Z направление UDAV - Crop data UDAV - Обрезать данные Enter range of saved date. Введите интервал сохраняемых данных. UDAV - Rearrange data Не знаю хорошего русского термина UDAV - Поменять размеры данных UDAV - Transpose data UDAV - Транспонировать данные Enter new order of dimensions. For example, 'yx' or 'yxz' for transpose x-y, 'zyx' for transposing x-z and so on. Введите новый порядок размерностей. Например, 'yx' или 'yxz' для транспонирования x-y, 'zyx' для транспонирования x-z и т.д. UDAV - Smooth data UDAV - Сгладить данные Enter direction(s) for smoothing. Optionally you may enter the kind of smoothing by 3 or by 5 points. For example 'xy3' - smooth only in x and y directions and use 3-points scheme. Введите направление(я) сглаживания. Можно также ввести тип сглаживания по 3 или по 5 точкам. Например 'xy3' - сгладит только в x и y направлениях по 3-точечной схеме. UDAV - Summarize data UDAV - Суммировать данные Enter direction(s) for cumulative summation. For example 'xy' - summate along x and y directions. Введите направление(я) для суммирования. Например 'xy' - суммировать вдоль x и y направлений. UDAV - Integrate data UDAV - Интегрировать данные Enter direction(s) for integration. For example 'xy' - integrate along x and y directions. Введите направление(я) для инткгрирования. Например 'xy' - интегрировать вдоль x и y направлений. UDAV - Differentiate data UDAV - Дифференцировать данные Enter direction(s) for differentiation. For example 'xy' - differentiate along x and y directions. Введите направление(я) для дифференцирования. Например 'xy' - дифференцировать вдоль x и y направлений. UDAV - Laplace transform UDAV - Преобразование Лапласа Enter direction(s) for laplace transform. For example 'xy' - do transform along x and y directions. Введите направление(я) для преобразования Лапласа. Например 'xy' - преобразовать вдоль x и y направлений. UDAV - Swap data UDAV - Поменять местами Enter direction(s) for swapping (exchange left and right parts). For example 'xy' - swap along x and y directions. Useful for Fourier spectrum. Введите направление(я) для обмена левой и правой частями данных. Например 'xy' - меняет вдоль x и y направлений. Полезно для Фурье спектров. UDAV - Mirror data UDAV - Отразить данные Enter direction(s) for mirroring. For example 'xy' - mirror along x and y directions. Введите направление(я) для отражения. Например 'xy' - отразить по x и y направлениям. UDAV - Sum along ... UDAV - Сумма по ... Specify direction(s) of summation Введите направление(я) суммирования UDAV - Max along ... UDAV - Максимум по ... Specify direction(s) of maximal values Введите направление(я) поиска максимумов UDAV - Min along ... UDAV - Минимум по ... Specify direction(s) of minimal values Введите направление(я) поиска минимумов UDAV - Momentum along 'x' UDAV - Момент по 'x' Specify which momentum evaluate. The momentum is res_i = sum_jk how(x_i,y_j,z_k) a_jk/ sum_jk a_jk. Coordinates x, y, z are data indexes normalized in range [0,1]. Укажите какой момент вычислять. Момент равен res_i = Σ_jk how(x_i,y_j,z_k) a_jk/ Σ_jk a_jk. Координаты x, y, z находятся в диапазоне [0,1]. Specify which momentum evaluate. The momentum is res_j = sum_ik how(x_i,y_j,z_k) a_ik/ sum_ik a_ik. Coordinates x, y, z are data indexes normalized in range [0,1]. Укажите какой момент вычислять. Момент равен res_j = Σ_ik how(x_i,y_j,z_k) a_ik/ Σ_ik a_ik. Координаты x, y, z находятся в диапазоне [0,1]. Specify which momentum evaluate. The momentum is res_k = sum_ij how(x_i,y_j,z_k) a_ij/ sum_ij a_ij. Coordinates x, y, z are data indexes normalized in range [0,1]. Укажите какой момент вычислять. Момент равен res_k = Σ_ij how(x_i,y_j,z_k) a_ij/ Σ_ij a_ij. Координаты x, y, z находятся в диапазоне [0,1]. UDAV - Momentum along 'y' UDAV - Момент по 'y' UDAV - Momentum along 'z' UDAV - Момент по 'z' UDAV - Make histogram UDAV - Найти гистограмму Number of points Число точек Put in variable Поместить в переменную Cancel Отмена OK OK UDAV - Change data UDAV - Изменить данные Enter number for adding to data elements: Введите число для добавления к элементам массива: Enter number for subtraction from data elements: Введите число для вычитания из элементов массива: Enter number for division of data elements: Введите число для деления элементов массива: Enter number for multiplication of data elements: Введите число для умножения элементов массива: UDAV - Go to slice UDAV - Перейти к срезу Enter slice id: Введите номер среза: NOTE: All fields must be filled! Все поля должны быть заполнены! Enter the name for new variable Введите имя новой переменной TextPanel &Edit &Правка UDAV - Insert filename UDAV - Вставить имя файла Printing... Печатаю... Printing completed Печать завершена Printing aborted Печать прервана UDAV - find text UDAV - поиск текста No string occurrence is found Строка не найдена Loaded document %1 Загружен документ %1 Could not write to %1 Не могу записать в %1 File %1 saved Файл %1 сохранен UDAV - open file UDAV - открыть файл Couldn't open file Не могу открыть файл Loaded document Загружен документ &Undo &Отменить Undo editor change (Ctrl+Z). Отменить изменения в редакторе (Ctrl+Z). &Redo &Вернуть Redo editor change (Ctrl+Shift+Z). Вернуть изменения в редакторе (Ctrl+Shift+Z). Clear all Очистить все Cu&t text В&ырезать Cut selected text to clipboard (Ctrl+X). Вырезать выделенный текст в буфер обмена (Ctrl+X). &Copy text &Копировать текст Copy selected text or data to clipboard (Ctrl+C). Копировать выделенный текст в буфер обмена (Ctrl+C). &Paste text &Вставить текст Paste text or data from clipboard (Ctrl+V). Вставить текст или данные из буфера обмена (Ctrl+V). Select &all Выделить вс&е &Find/Replace &Найти/заменить Show dialog for text finding (Ctrl+F). Показать диалог поиска текста (Ctrl+F). Find next Найти текст Insert Вставить New command Новая команда Show dialog for new command and put it into the script. Показать диалог вставки новой команды. Fitted formula Найденная формула Insert last fitted formula with found coefficients. Вставить последнюю найденную формулу в текст. Plot style Стиль графика Show dialog for styles and put it into the script. Styles define the plot view (color scheme, marks, dashing and so on). Показать диалог стиля графика и вставить его в код. Стиль определяет вид графика (цвет, маркеры, пунктир и пр). Command options Опции команды Show dialog for options and put it into the script. Options are used for additional setup the plot. Показать диалог выбора опций команды. Опции используются для дополнительной настройки выбранного графика. Numeric value Численное значение Replace expression by its numerical value. Заменить выделенное выражение его числовым значением. File name Имя файла Select and insert file name. Выбрать и вставить путь файла. Folder path Путь папки Select and insert folder name. Выбрать и вставить путь папки. Graphics setup Настройка графика Show dialog for plot setup and put code into the script. This dialog setup axis, labels, lighting and other general things. Показать диалог настройки графика и вставить ее в код. Диалог позволяет настроить оси, подписи, освещение и пр. mathgl-8.0.1/udav/style_dlg.cpp0000664000175000017500000005463214167366466016250 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- #include "style_dlg.h" #include "mgl2/define.h" void fillColors(QComboBox *cb); void fillArrows(QComboBox *cb); void fillBArrows(QComboBox *cb); void fillDashes(QComboBox *cb); void fillMarkers(QComboBox *cb); void fillMasks(QComboBox *cb); void convertFromGraph(QPixmap &pic, mglGraph *gr, uchar **buf); //----------------------------------------------------------------------------- StyleDialog::StyleDialog(QWidget *parent) : QDialog(parent) { grBuf = 0; setWindowTitle(_("UDAV - Insert style/scheme")); QWidget *p; QHBoxLayout *h; QVBoxLayout *v, *u, *vv; QGridLayout *g; QLabel *l; QPushButton *b; tab = new QTabWidget(this); // line style p = new QWidget(this); v = new QVBoxLayout(p); g = new QGridLayout; g->setAlignment(Qt::AlignTop); v->addLayout(g); // g->setColStretch(0, 1); g->setColStretch(1, 1); g->setColStretch(2, 1); l = new QLabel(_("Arrow at start"), p); g->addWidget(l, 0, 0); l = new QLabel(_("Dashing"), p); g->addWidget(l, 0, 1); l = new QLabel(_("Arrow at end"), p); g->addWidget(l, 0, 2); a1 = new QComboBox(p); g->addWidget(a1, 1, 0); fillArrows(a1); dash = new QComboBox(p); g->addWidget(dash, 1, 1); fillDashes(dash); a2 = new QComboBox(p); g->addWidget(a2, 1, 2); fillBArrows(a2); l = new QLabel(_("Color"), p); g->addWidget(l, 2, 0, Qt::AlignRight); cline=new QComboBox(p); g->addWidget(cline, 2, 1); fillColors(cline); nline = new QSlider(p); g->addWidget(nline, 2, 2); nline->setRange(1, 9); nline->setValue(5); nline->setTickPosition(QSlider::TicksBothSides); nline->setTickInterval(1); nline->setPageStep(2); nline->setOrientation(Qt::Horizontal); l = new QLabel(_("Marks"), p); g->addWidget(l, 3, 0, Qt::AlignRight); mark = new QComboBox(p); g->addWidget(mark, 3, 1); fillMarkers(mark); l = new QLabel(_("Line width"), p); g->addWidget(l, 4, 0, Qt::AlignRight); width = new QSpinBox(p); g->addWidget(width, 4, 1); width->setRange(1,9); width->setValue(1); v->addStretch(1); l = new QLabel(_("Manual dashing"), p); v->addWidget(l); h = new QHBoxLayout; v->addLayout(h); h->setSpacing(1); for(int i=0;i<16;i++) { dash_bit[i] = new QToolButton(this); dash_bit[i]->setCheckable(true); h->addWidget(dash_bit[i]); connect(dash_bit[i],SIGNAL(toggled(bool)), this, SLOT(updatePic())); } connect(a1,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(a2,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(dash,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(mark,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(cline,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(nline,SIGNAL(valueChanged(int)), this, SLOT(updatePic())); connect(width,SIGNAL(valueChanged(int)), this, SLOT(updatePic())); tab->addTab(p, _("Line style")); // color scheme p = new QWidget(this); v = new QVBoxLayout(p); v->setAlignment(Qt::AlignTop); g = new QGridLayout(); v->addLayout(g); // g->setColStretch(0, 1); g->setColStretch(1, 1); l = new QLabel(_("Color order"), p); g->addWidget(l, 0, 0); l = new QLabel(_("Saturation"),p); g->addWidget(l, 0, 1); for(int i=0;i<7;i++) { cc[i] = new QComboBox(p); g->addWidget(cc[i], i+1, 0); fillColors(cc[i]); nn[i] = new QSlider(p); g->addWidget(nn[i], i+1, 1); nn[i]->setRange(1, 9); nn[i]->setValue(5); nn[i]->setTickPosition(QSlider::TicksBothSides); nn[i]->setTickInterval(1); nn[i]->setPageStep(2); nn[i]->setOrientation(Qt::Horizontal); connect(cc[i],SIGNAL(activated(int)), this, SLOT(updatePic())); connect(nn[i],SIGNAL(valueChanged(int)), this, SLOT(updatePic())); } swire = new QCheckBox(_("Wire or mesh plot"),p); v->addWidget(swire); g = new QGridLayout(); v->addLayout(g); l = new QLabel(_("Axial direction"), p); g->addWidget(l, 0, 0, Qt::AlignRight); l = new QLabel(_("Text on contours"), p); g->addWidget(l, 1, 0, Qt::AlignRight); l = new QLabel(_("Mask for bitmap coloring"), p); g->addWidget(l, 2, 0, Qt::AlignRight); l = new QLabel(_("Mask rotation angle"), p); g->addWidget(l, 3, 0, Qt::AlignRight); l = new QLabel(_("Mask size"), p); g->addWidget(l, 4, 0, Qt::AlignRight); axial = new QComboBox(p); g->addWidget(axial, 0, 1); axial->addItem(_("none")); axial->addItem("x"); axial->addItem("y"); axial->addItem("z"); ctext = new QComboBox(p); g->addWidget(ctext, 1, 1); ctext->addItem(_("none")); ctext->addItem(_("under")); ctext->addItem(_("above")); mask = new QComboBox(p); g->addWidget(mask, 2, 1); fillMasks(mask); angle = new QComboBox(p); g->addWidget(angle, 3, 1); angle->addItem(_("none")); angle->addItem(QString::fromWCharArray(L"+45\xb0")); angle->addItem(QString::fromWCharArray(L"-45\xb0")); angle->addItem(QString::fromWCharArray(L"90\xb0")); // \xb0 <-> ° msize = new QSlider(p); g->addWidget(msize, 4, 1); msize->setRange(1, 9); msize->setValue(1); msize->setTickPosition(QSlider::TicksBothSides); msize->setTickInterval(1); msize->setPageStep(2); msize->setOrientation(Qt::Horizontal); connect(axial,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(ctext,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(swire,SIGNAL(toggled(bool)), this, SLOT(updatePic())); connect(mask,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(angle,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(msize,SIGNAL(valueChanged(int)), this, SLOT(updatePic())); tab->addTab(p, _("Color scheme")); // font style p = new QWidget(this); v = new QVBoxLayout(p); v->setAlignment(Qt::AlignTop); h = new QHBoxLayout(); v->addLayout(h); u = new QVBoxLayout(); h->addLayout(u); bold = new QCheckBox(_("Bold style"), p); u->addWidget(bold); ital = new QCheckBox(_("Italic style"), p);u->addWidget(ital); wire = new QCheckBox(_("Wire style"), p); u->addWidget(wire); uline = new QCheckBox(_("Underline"), p); u->addWidget(uline); oline = new QCheckBox(_("Overline"), p); u->addWidget(oline); font_sch = new QCheckBox(_("Use color scheme"), p); u->addWidget(font_sch); u = new QVBoxLayout(); h->addLayout(u); l = new QLabel(_("Text color"), p); u->addWidget(l); cfont = new QComboBox(p); fillColors(cfont); u->addWidget(cfont); u->addSpacing(6); align = new QGroupBox(_("Text align"), p); u->addWidget(align); vv = new QVBoxLayout(align); //vv->addSpacing(11); rbL = new QRadioButton(_("left"), align); vv->addWidget(rbL); rbC = new QRadioButton(_("at center"), align); vv->addWidget(rbC); rbC->setChecked(true); rbR = new QRadioButton(_("right"), align); vv->addWidget(rbR); connect(bold,SIGNAL(toggled(bool)), this, SLOT(updatePic())); connect(ital,SIGNAL(toggled(bool)), this, SLOT(updatePic())); connect(wire,SIGNAL(toggled(bool)), this, SLOT(updatePic())); connect(uline,SIGNAL(toggled(bool)), this, SLOT(updatePic())); connect(oline,SIGNAL(toggled(bool)), this, SLOT(updatePic())); connect(font_sch,SIGNAL(toggled(bool)), this, SLOT(updatePic())); connect(cfont,SIGNAL(activated(int)), this, SLOT(updatePic())); connect(rbL,SIGNAL(toggled(bool)), this, SLOT(updatePic())); connect(rbC,SIGNAL(toggled(bool)), this, SLOT(updatePic())); connect(rbR,SIGNAL(toggled(bool)), this, SLOT(updatePic())); tab->addTab(p, _("Font style")); connect(tab,SIGNAL(currentChanged(int)), this, SLOT(updatePic())); // hex-mask p = new QWidget(this); g = new QGridLayout(p); g->setAlignment(Qt::AlignTop); for(int i=0;i<64;i++) { mask_bit[i] = new QToolButton(this); mask_bit[i]->setCheckable(true); g->addWidget(mask_bit[i],7-i/8,i%8); connect(mask_bit[i],SIGNAL(toggled(bool)), this, SLOT(updatePic())); } tab->addTab(p, _("Manual mask")); // dialog itself v = new QVBoxLayout(this); v->addWidget(tab); h = new QHBoxLayout(); v->addLayout(h); l = new QLabel(_("Resulting string"), this); h->addWidget(l); h->addStretch(1); pic = new QLabel(this); pic->setMinimumSize(QSize(128,30)); h->addWidget(pic); res = new QLineEdit(this); res->setReadOnly(true); v->addWidget(res); h = new QHBoxLayout(); v->addLayout(h); h->addStretch(1); b = new QPushButton(_("Cancel"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(reject())); b = new QPushButton(_("OK"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(accept())); b->setDefault(true); } //----------------------------------------------------------------------------- StyleDialog::~StyleDialog() { if(grBuf) delete []grBuf; grBuf = 0; } //----------------------------------------------------------------------------- #include "xpm/none.xpm" void fillColors(QComboBox *cb) { // string id : "wbgrcmylenuqphkWBGRCMYLENUQPH" QPixmap pic(16,16); cb->addItem(QPixmap(none_xpm), _("none or default")); pic.fill(QColor(255,255,255)); cb->addItem(pic, _("w - white")); pic.fill(QColor(0,0,255)); cb->addItem(pic, _("b - blue")); pic.fill(QColor(0,255,0)); cb->addItem(pic, _("g - lime")); pic.fill(QColor(255,0,0)); cb->addItem(pic, _("r - red")); pic.fill(QColor(0,255,255)); cb->addItem(pic, _("c - cyan")); pic.fill(QColor(255,0,255)); cb->addItem(pic, _("m - magenta")); pic.fill(QColor(255,255,0)); cb->addItem(pic, _("y - yellow")); pic.fill(QColor(0,255,127)); cb->addItem(pic, _("l - springgreen")); pic.fill(QColor(127,255,0)); cb->addItem(pic, _("e - lawngreen")); pic.fill(QColor(0,127,255)); cb->addItem(pic, _("n - skyblue")); pic.fill(QColor(127,0,255)); cb->addItem(pic, _("u - blueviolet")); pic.fill(QColor(255,127,0)); cb->addItem(pic, _("q - orange")); pic.fill(QColor(255,0,127)); cb->addItem(pic, _("p - deeppink")); pic.fill(QColor(127,127,127)); cb->addItem(pic, _("h - gray")); pic.fill(QColor(0,0,0)); cb->addItem(pic, _("k - black")); pic.fill(QColor(179,179,179)); cb->addItem(pic, _("W - lightgray")); pic.fill(QColor(0,0,127)); cb->addItem(pic, _("B - navy")); pic.fill(QColor(0,127,0)); cb->addItem(pic, _("G - green")); pic.fill(QColor(127,0,0)); cb->addItem(pic, _("R - maroon")); pic.fill(QColor(0,127,127)); cb->addItem(pic, _("C - teal")); pic.fill(QColor(127,0,127)); cb->addItem(pic, _("M - purple")); pic.fill(QColor(127,127,0)); cb->addItem(pic, _("Y - olive")); pic.fill(QColor(0,127,77)); cb->addItem(pic, _("L - seagreen")); pic.fill(QColor(77,127,0)); cb->addItem(pic, _("E - darklawn")); pic.fill(QColor(0,77,127)); cb->addItem(pic, _("N - darkskyblue")); pic.fill(QColor(77,0,127)); cb->addItem(pic, _("U - indigo")); pic.fill(QColor(127,77,0)); cb->addItem(pic, _("Q - brown")); pic.fill(QColor(127,0,77)); cb->addItem(pic, _("P - darkpink")); pic.fill(QColor(77,77,77)); cb->addItem(pic, _("H - darkgray")); } //----------------------------------------------------------------------------- #include "xpm/arrow_n.xpm" #include "xpm/arrow_a.xpm" #include "xpm/arrow_v.xpm" #include "xpm/arrow_i.xpm" #include "xpm/arrow_k.xpm" #include "xpm/arrow_t.xpm" #include "xpm/arrow_s.xpm" #include "xpm/arrow_d.xpm" #include "xpm/arrow_o.xpm" void fillArrows(QComboBox *cb) { // "AVIKTSDO" cb->addItem(QPixmap(arrow_n_xpm), _("'_' none")); cb->addItem(QPixmap(arrow_a_xpm), _("'A' arrow")); cb->addItem(QPixmap(arrow_v_xpm), _("'V' back arrow")); cb->addItem(QPixmap(arrow_i_xpm), _("'I' stop")); cb->addItem(QPixmap(arrow_k_xpm), _("'K' size")); cb->addItem(QPixmap(arrow_t_xpm), _("'T' triangle")); cb->addItem(QPixmap(arrow_s_xpm), _("'S' square")); cb->addItem(QPixmap(arrow_d_xpm), _("'D' rhomb")); cb->addItem(QPixmap(arrow_o_xpm), _("'O' circle")); } //----------------------------------------------------------------------------- #include "xpm/barrow_n.xpm" #include "xpm/barrow_a.xpm" #include "xpm/barrow_v.xpm" #include "xpm/barrow_i.xpm" #include "xpm/barrow_k.xpm" #include "xpm/barrow_t.xpm" #include "xpm/barrow_s.xpm" #include "xpm/barrow_d.xpm" #include "xpm/barrow_o.xpm" void fillBArrows(QComboBox *cb) { // "AVIKTSDO" cb->addItem(QPixmap(barrow_n_xpm), _("'_' none")); cb->addItem(QPixmap(barrow_a_xpm), _("'A' arrow")); cb->addItem(QPixmap(barrow_v_xpm), _("'V' back arrow")); cb->addItem(QPixmap(barrow_i_xpm), _("'I' stop")); cb->addItem(QPixmap(barrow_k_xpm), _("'K' size")); cb->addItem(QPixmap(barrow_t_xpm), _("'T' triangle")); cb->addItem(QPixmap(barrow_s_xpm), _("'S' square")); cb->addItem(QPixmap(barrow_d_xpm), _("'D' rhomb")); cb->addItem(QPixmap(barrow_o_xpm), _("'O' circle")); } //----------------------------------------------------------------------------- #include "xpm/dash_e.xpm" #include "xpm/dash_s.xpm" #include "xpm/dash_l.xpm" #include "xpm/dash_m.xpm" #include "xpm/dash_d.xpm" #include "xpm/dash_i.xpm" #include "xpm/dash_j.xpm" #include "xpm/mark_n.xpm" void fillDashes(QComboBox *cb) { // "-|;=ji: " cb->addItem(QPixmap(dash_s_xpm), _("'-' solid")); cb->addItem(QPixmap(dash_l_xpm), _("'|' long dash")); cb->addItem(QPixmap(dash_m_xpm), _("';' dash")); cb->addItem(QPixmap(dash_e_xpm), _("'=' small dash")); cb->addItem(QPixmap(dash_j_xpm), _("'j' dash dot")); cb->addItem(QPixmap(dash_i_xpm), _("'i' small dash dot")); cb->addItem(QPixmap(dash_d_xpm), _("':' dots")); cb->addItem(QPixmap(mark_n_xpm), _("' ' none")); cb->addItem(QPixmap(":/png/tools-wizard.png"), _("manual")); } //----------------------------------------------------------------------------- #include "xpm/mask_a.xpm" #include "xpm/mask_d.xpm" #include "xpm/mask_d_.xpm" #include "xpm/mask_e.xpm" #include "xpm/mask_i.xpm" #include "xpm/mask_j.xpm" #include "xpm/mask_l.xpm" #include "xpm/mask_m.xpm" #include "xpm/mask_o.xpm" #include "xpm/mask_o_.xpm" #include "xpm/mask_p.xpm" #include "xpm/mask_r.xpm" #include "xpm/mask_s.xpm" #include "xpm/mask_s_.xpm" #include "xpm/mask_t.xpm" #include "xpm/mask_u.xpm" void fillMasks(QComboBox *cb) { // "-+=;oOsS~<>jdD*^" cb->addItem(QPixmap(none_xpm), _("none")); cb->addItem(QPixmap(mask_m_xpm), _("'-' lines")); cb->addItem(QPixmap(mask_p_xpm), _("'+' plus")); cb->addItem(QPixmap(mask_e_xpm), _("'=' double lines")); cb->addItem(QPixmap(mask_i_xpm), _("';' dash")); cb->addItem(QPixmap(mask_o_xpm), _("'o' circle")); cb->addItem(QPixmap(mask_O_xpm), _("'O' solid circle")); cb->addItem(QPixmap(mask_s_xpm), _("'s' square")); cb->addItem(QPixmap(mask_S_xpm), _("'S' solid square")); cb->addItem(QPixmap(mask_t_xpm), _("'~' waves")); cb->addItem(QPixmap(mask_l_xpm), _("'<' left sign")); cb->addItem(QPixmap(mask_r_xpm), _("'>' right sign")); cb->addItem(QPixmap(mask_j_xpm), _("'j' dash dot")); cb->addItem(QPixmap(mask_d_xpm), _("'d' rhomb")); cb->addItem(QPixmap(mask_D_xpm), _("'D' solid rhomb")); cb->addItem(QPixmap(mask_a_xpm), _("'*' cross")); cb->addItem(QPixmap(mask_u_xpm), _("'^' hats")); cb->addItem(QPixmap(":/png/tools-wizard.png"), _("manual")); } //----------------------------------------------------------------------------- #include "xpm/mark_.xpm" #include "xpm/mark_cf.xpm" #include "xpm/mark_x.xpm" #include "xpm/mark_p.xpm" #include "xpm/mark_pf.xpm" #include "xpm/mark_o.xpm" #include "xpm/mark_of.xpm" #include "xpm/mark_s.xpm" #include "xpm/mark_sf.xpm" #include "xpm/mark_d.xpm" #include "xpm/mark_df.xpm" #include "xpm/mark_v.xpm" #include "xpm/mark_vf.xpm" #include "xpm/mark_t.xpm" #include "xpm/mark_tf.xpm" #include "xpm/mark_l.xpm" #include "xpm/mark_lf.xpm" #include "xpm/mark_r.xpm" #include "xpm/mark_rf.xpm" #include "xpm/mark_y.xpm" #include "xpm/mark_a.xpm" void fillMarkers(QComboBox *cb) { // ".+x*sdv^<>o.*+xsdv^<>o" : nf = 10 cb->addItem(QPixmap(mark_n_xpm), _("none")); cb->addItem(QPixmap(mark__xpm), _("'.' dot")); cb->addItem(QPixmap(mark_p_xpm), _("'+' plus")); cb->addItem(QPixmap(mark_x_xpm), _("'x' skew cross")); cb->addItem(QPixmap(mark_a_xpm), _("'*' star")); cb->addItem(QPixmap(mark_s_xpm), _("'s' square")); cb->addItem(QPixmap(mark_d_xpm), _("'d' rhomb")); cb->addItem(QPixmap(mark_v_xpm), _("'v' triangle down")); cb->addItem(QPixmap(mark_t_xpm), _("'^' triangle up")); cb->addItem(QPixmap(mark_l_xpm), _("'<' triangle left")); cb->addItem(QPixmap(mark_r_xpm), _("'>' triangle right")); cb->addItem(QPixmap(mark_o_xpm), _("'o' circle")); cb->addItem(QPixmap(mark_cf_xpm), _("'#.' circled dot")); cb->addItem(QPixmap(mark_y_xpm), _("'#*' Y-sign")); cb->addItem(QPixmap(mark_pf_xpm), _("'#+' squared plus")); cb->addItem(QPixmap(none_xpm), _("'#x' squared cross")); cb->addItem(QPixmap(mark_sf_xpm), _("'#s' solid square")); cb->addItem(QPixmap(mark_df_xpm), _("'#d' solid rhomb")); cb->addItem(QPixmap(mark_vf_xpm), _("'#v' solid triangle down")); cb->addItem(QPixmap(mark_tf_xpm), _("'#^' solid triangle up")); cb->addItem(QPixmap(mark_lf_xpm), _("'#<' solid triangle left")); cb->addItem(QPixmap(mark_rf_xpm), _("'#>' solid triangle right")); cb->addItem(QPixmap(mark_of_xpm), _("'#o' solid circle")); } //----------------------------------------------------------------------------- void StyleDialog::updatePic() { static mglGraph gr(0,128,30); static bool f = true; mglData x(3), y(3), a(32,2); x.Fill(-1,1); a.Fill(-1,1); if(!f) gr.Clf(); if(f) { gr.SubPlot(1,1,0,""); gr.SetMarkSize(15); gr.SetArrowSize(20); f = false; } result = ""; int i,j; QString col="wbgrcmylenuqphkWBGRCMYLENUQPH", mrk=".+x*sdv^<>o.*+xsdv^<>o", dsh="|;=ji: ", arw="AVIKTSDO"; QString msk="-+=;oOsS~<>jdD*^", dir="/\\I"; switch(tab->currentIndex()) { case 0: // line style i = a2->currentIndex(); if(i>0) result += arw[i-1]; j = a1->currentIndex(); if(j>0) { if(i==0) result += '_'; result += arw[j-1]; } i = dash->currentIndex(); if(i>0 && i<8) result += dsh[i-1]; else if(i==8) // manual { int d=0; for(int i=0;i<16;i++) if(dash_bit[i]->isChecked()) d += 1<currentIndex(); if(i>0) result += mrk[i-1]; if(i>11) result += '#'; i = cline->currentIndex(); if(i>0) { j = nline->value(); if(j!=5) result += "{"+col[i-1]+char('0'+j)+"}"; else result += col[i-1]; } i = width->value(); if(i>1) result += char('0'+i); gr.Plot(x,y,result.toLocal8Bit().constData()); break; case 1: // color sceheme case 3: // manual mask for(j=0;j<7;j++) { i = cc[j]->currentIndex(); if(i<1) break; QCharRef c = col[i-1]; i = nn[j]->value(); if(i!=5) result += "{"+c+char('0'+i)+"}"; else result += c; } if(swire->isChecked()) result += '#'; i = ctext->currentIndex(); if(i==1) result += 't'; if(i==2) result += 'T'; i = mask->currentIndex(); if(i>0 && i<17) { result += msk[i-1]; i = angle->currentIndex(); if(i>0) result += dir[i-1]; i = msize->value(); if(i>1) result += char('0'+i); } else if(i==17) { uint64_t t=0; for(int j=0;j<64;j++) if(mask_bit[j]->isChecked()) t += uint64_t(1)<currentIndex(); if(i>0) result += dir[i-1]; i = msize->value(); if(i>1) result += char('0'+i); } i = axial->currentIndex(); if(i>0) result = result+':'+char('x'+i-1); gr.Surf(a,result.toLocal8Bit().constData()); break; case 2: // text style if(font_sch->isChecked()) for(j=0;j<7;j++) { i = cc[j]->currentIndex(); if(i<1) break; QCharRef c = col[i-1]; i = nn[j]->value(); if(i!=5) result += "{"+c+char('0'+i)+"}"; else result += c; } else { i = cfont->currentIndex(); if(i>1) result += col[i-1]; } result += ':'; if(bold->isChecked()) result += 'b'; if(ital->isChecked()) result += 'i'; if(wire->isChecked()) result += 'w'; if(uline->isChecked()) result += 'u'; if(oline->isChecked()) result += 'o'; if(rbL->isChecked()) result += 'L'; if(rbC->isChecked()) result += 'C'; if(rbR->isChecked()) result += 'R'; gr.Puts(mglPoint(0,-0.5),"Font test",result.toLocal8Bit().constData(),-10); break; } result = "'" + result + "'"; res->setText(result); QPixmap p; convertFromGraph(p, &gr, &grBuf); pic->setPixmap(p); } //----------------------------------------------------------------------------- void convertFromGraph(QPixmap &pic, mglGraph *gr, uchar **buf) { long w=gr->GetWidth(), h=gr->GetHeight(); if(*buf) delete [](*buf); *buf = new uchar[4*w*h]; gr->GetBGRN(*buf,4*w*h); QImage img(*buf, w, h, QImage::Format_RGB32); pic = QPixmap::fromImage(img); } //----------------------------------------------------------------------------- void StyleDialog::showFontPage() { tab->setCurrentIndex(2); } //----------------------------------------------------------------------------- void StyleDialog::showPenPage() { tab->setCurrentIndex(0); } //----------------------------------------------------------------------------- void StyleDialog::showSchPage() { tab->setCurrentIndex(1); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/plot_pnl.h0000664000175000017500000000664614167366466015560 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef PLOT_PNL_H #define PLOT_PNL_H //----------------------------------------------------------------------------- #include #include //----------------------------------------------------------------------------- class QMenu; class QTimer; class QSpinBox; class QPopupMenu; class QScrollArea; class QBoxLayout; class QTextEdit; class QMathGL; class mglDrawScript; class InfoDialog; class AnimParam; class DatPanel; class StyleDialog; class QPrinter; class NewCmdDialog; class SubplotDialog; //----------------------------------------------------------------------------- class PlotPanel : public QWidget { Q_OBJECT public: QMenu *menu; QMathGL *mgl; mglDrawScript *draw; ///< Class for drawing MGL script QTextEdit *textMGL; ///< Editor with MGL script body NewCmdDialog *newCmdDlg; SubplotDialog *subplotDlg; PlotPanel(QWidget *wp=0); ~PlotPanel(); void setMGLFont(const QString &path); QString getFit(); public slots: void animParseText(const QString &txt); void setCurPos(int pos=-1); void execute(); signals: void save(); void animPutText(const QString &); void setStatus(const QString &); void animSwitch(bool); void giveFocus(); void clearWarn(); private slots: void animText(const QString &); void next(); void nextSlide(); void prevSlide(); void animStart(bool st); void animSetup(); void adjust(); void pressF9(); void stop(); void setStyle(int id); void setSubId(int id); void deleteSelected(); void hideSelected(); void putCmd(const QString &cmd); void insCmd(const QString &cmd); void movePlotUp(); void movePlotDown(); private: bool gifOn, jpgOn; QScrollArea* sv; QSpinBox *tet, *phi; // animation QString animParam; int animPos; int curPos; QTimer *timer; AnimParam *animDialog; QMenu *popup; QPrinter *printer; StyleDialog *stlDialog; int objId; int subId; void toolTop(QBoxLayout *l); void toolLeft(QBoxLayout *l); }; //----------------------------------------------------------------------------- #endif // PLOT_PNL_H mathgl-8.0.1/udav/udav.rc0000664000175000017500000000007314167366466015031 0ustar balakinbalakinIDI_ICON1 ICON DISCARDABLE "udav.ico" mathgl-8.0.1/udav/style_dlg.h0000664000175000017500000000550214167366466015705 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef STYLEDIALOG_H #define STYLEDIALOG_H //----------------------------------------------------------------------------- #include class QComboBox; class QSlider; class QSpinBox; class QGroupBox; class QTabWidget; class QCheckBox; class QLabel; class QLineEdit; class QRadioButton; class QToolButton; //----------------------------------------------------------------------------- /// Selecting styles of command (like line style, color scheme, font style, axis style) class StyleDialog : public QDialog { Q_OBJECT public: QString getStyle() { return result; }; StyleDialog(QWidget *parent = 0); ~StyleDialog(); void showFontPage(); void showPenPage(); void showSchPage(); private slots: void updatePic(); private: QString result; QComboBox *cc[8], *cline, *cfont; QSlider *nn[8], *nline; QComboBox *axial, *ctext, *a1, *a2, *dash, *mark; QCheckBox *swire; QCheckBox *ital, *bold, *wire, *uline, *oline; QSpinBox *width; QGroupBox *align; QTabWidget *tab; QLabel *pic; QLineEdit *res; QRadioButton *rbL, *rbC, *rbR; uchar *grBuf; QCheckBox *font_sch; QComboBox *mask; QComboBox *angle; QSlider *msize; QToolButton *dash_bit[16]; // 8 buttons for dashing QToolButton *mask_bit[64]; // 8*8 buttons for mask }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/open_dlg.cpp0000664000175000017500000001550214167366466016042 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "open_dlg.h" int numDataOpened=0; extern mglParse parser; QStringList dataScr; //----------------------------------------------------------------------------- QWidget *createDataOpenDlg(QWidget *p) { return new DataOpenDialog(p); } QString getOpenDataFile(QWidget *w, QString filename) { DataOpenDialog *d = dynamic_cast(w); if(d) { d->setFile(filename); if(d->exec()) return d->getCode(); } return QString(); } //----------------------------------------------------------------------------- DataOpenDialog::DataOpenDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(_("UDAV - Open data file")); QHBoxLayout *a; QLabel *l; QPushButton *b; QVBoxLayout *o=new QVBoxLayout(this); a = new QHBoxLayout; o->addLayout(a); l = new QLabel(_("Data name")); a->addWidget(l); char buf[32]; snprintf(buf,32,"mgl_%d",numDataOpened); buf[31]=0; name = new QLineEdit(buf,this); a->addWidget(name); rA = new QRadioButton(_("Auto detect data sizes"), this); rA->setChecked(true); o->addWidget(rA); rM = new QRadioButton(_("Set data sizes manually"), this); o->addWidget(rM); a = new QHBoxLayout; o->addLayout(a); l = new QLabel(_("Nx")); a->addWidget(l); nx = new QLineEdit("1",this); a->addWidget(nx); l = new QLabel(_("Ny")); a->addWidget(l); ny = new QLineEdit("1",this); a->addWidget(ny); l = new QLabel(_("Nz")); a->addWidget(l); nz = new QLineEdit("1",this); a->addWidget(nz); r2 = new QRadioButton(_("Matrix with sizes from file"), this); o->addWidget(r2); r3 = new QRadioButton(_("3D data with sizes from file"), this);o->addWidget(r3); QSettings settings("udav","UDAV"); settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); dataScr = settings.value("/dataScr").toStringList().mid(0,10); dataScr.removeDuplicates(); settings.endGroup(); a = new QHBoxLayout; o->addLayout(a); l = new QLabel(_("Template")); a->addWidget(l,0); scr = new QComboBox(this); a->addWidget(scr,1); scr->setEditable(true); scr->lineEdit()->setText(""); scr->addItem(_("default")); scr->addItems(dataScr); b = new QPushButton("...", this); a->addWidget(b,0); connect(b, SIGNAL(clicked()),this, SLOT(selectScr())); a = new QHBoxLayout; o->addLayout(a); a->addStretch(1); b = new QPushButton(_("Cancel"),this); a->addWidget(b); connect(b,SIGNAL(clicked()),this,SLOT(reject())); b = new QPushButton(_("OK"), this); a->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(prepareResult())); b->setDefault(true); } //----------------------------------------------------------------------------- DataOpenDialog::~DataOpenDialog(){} //----------------------------------------------------------------------------- void DataOpenDialog::selectScr() { QString str = QFileDialog::getOpenFileName(this, _("UDAV - Insert filename"), scr->lineEdit()->text(), _("MGL files (*.mgl)")); if(!str.isEmpty()) { scr->lineEdit()->setText(str); scr->insertItem(1,str); dataScr.insert(0,str); dataScr.removeDuplicates(); } } //----------------------------------------------------------------------------- void DataOpenDialog::prepareResult() { code = ""; numDataOpened++; data = name->text(); // prepare unique value of name for next time char buf[32]; snprintf(buf,32,"mgl_%d",numDataOpened); buf[31]=0; name->setText(buf); mglData *v = dynamic_cast(parser.AddVar(data.toLocal8Bit().constData())); if(!v) return; int dd=0; if(rA->isChecked()) // auto sizes { v->Read(file.toLocal8Bit().constData()); if(v->nx==1) { v->nx = v->ny; v->ny = v->nz; } code=QString("#read %1 '%2'\n").arg(data,file); } else if(rM->isChecked()) // manual sizes { int x=nx->text().toInt(), y=ny->text().toInt(), z=nz->text().toInt(); v->Read(file.toLocal8Bit().constData(),x,y,z); code=QString("#read %1 '%2' %3 %4 %5\n").arg(data,file).arg(x).arg(y).arg(z); } else if(r2->isChecked()) // matrix { v->ReadMat(file.toLocal8Bit().constData()); code=QString("#readmat %1 '%2'\n").arg(data,file); dd=1; } else if(r3->isChecked()) // 3d-data { v->ReadMat(file.toLocal8Bit().constData(),3); code=QString("#readmat %1 '%2' 3\n").arg(data,file); dd=2; } if(scr->lineEdit()->text().isEmpty() || scr->lineEdit()->text()==_("default")) { if(v->nz>1 || dd==2) code+=QString("rotate 40 60\ncrange %1:box\nsurf3 %1\n").arg(data); else if(v->ny>1 || dd==1) code+=QString("rotate 40 60\ncrange %1:zrange %1:box\nsurf %1\n").arg(data); else code+=QString("yrange %1:box\nplot %1\n").arg(data); } else { QString str; QFile fp(scr->lineEdit()->text()); if(fp.open(QFile::ReadOnly | QIODevice::Text)) { QTextStream in(&fp); str = in.readAll(); code += str.arg(data); } } QSettings settings("udav","UDAV"); settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); settings.setValue("/dataScr", dataScr); settings.endGroup(); accept(); } //----------------------------------------------------------------------------- void DataOpenDialog::setFile(const QString &fname) { file=fname; mglData d(file.toLocal8Bit().constData()); rA->setText(QString(_("Auto detect data sizes (%1 x %2 x %3)")).arg(d.nx).arg(d.ny).arg(d.nz)); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/udav_wnd.h0000664000175000017500000001005714167366466015527 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef UDAV_WND_H #define UDAV_WND_H //----------------------------------------------------------------------------- #include //----------------------------------------------------------------------------- #ifndef MGL_DOC_DIR #ifdef WIN32 #define MGL_DOC_DIR "" #else #define MGL_DOC_DIR "/usr/local/share/doc/mathgl/" #endif #endif //----------------------------------------------------------------------------- class QSplitter; class QTabWidget; class QMenu; class QDockWidget; class QTextEdit; class TextPanel; class PlotPanel; //----------------------------------------------------------------------------- extern int MaxRecentFiles; extern int animDelay; void udavShowHint(QWidget *); void refreshMemPanel(QWidget *p); void showExMGL(QWidget *hlp); //----------------------------------------------------------------------------- class MainWindow : public QMainWindow { friend void raisePanel(QWidget *w); Q_OBJECT public: QAction *ainfo, *acalc, *asave, *aload, *ahide; TextPanel *edit; PlotPanel *graph; QWidget *info; QWidget *hlp; MainWindow(QWidget *wp=0); void load(const QString &fileName, bool noNewWnd=false); void writeSettings(); public slots: void setEditPos(bool bottom); void editPosChanged(); void refresh() { refreshMemPanel(info); } void addPanel(QWidget *w, QString name); signals: void gotoLine(int n,int i); protected: void closeEvent ( QCloseEvent* ); void dropEvent ( QDropEvent* ); void dragEnterEvent( QDragEnterEvent* ); private slots: void newDoc(); void choose(); void save(); void saveAs(); void about(); void aboutQt(); void openRecentFile(); void showHelp(); void updateHidden(); void hiddenClicked(); void messClicked(); void properties(); void setAsterix(); void warnChanged(); void showHint() { udavShowHint(this); } // void showExamples() { showExMGL(hlp); } void setCurrentFile(const QString &); void setStatus(const QString &txt); // void animParse(const QString &txt); private: static int num_wnd; QTabWidget *ltab, *rtab; QSplitter *split; QTextEdit *mess; ///< messages and warnings QTextEdit *hidden; ///< commented(hidden) lines QString filename; QMenu *fileMenu; QDockWidget *messWnd, *hideWnd, *calcWnd; void makeMenu(); void makeDataMenu(); void readSettings(); QWidget *setupInfo(QWidget *par); void updateRecentFileItems(); void updateRecent(); }; //----------------------------------------------------------------------------- MainWindow *findMain(QWidget *w); void raisePanel(QWidget *w); //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/calc_dlg.h0000664000175000017500000000553014167366466015450 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef CALC_DLG_H #define CALC_DLG_H //----------------------------------------------------------------------------- #include #include #include class QLabel; class QLineEdit; class QTextEdit; class QComboBox; class QListView; class QPushButton; //----------------------------------------------------------------------------- /// Dialog for finding something in text class CalcDialog : public QWidget { Q_OBJECT public: CalcDialog(QWidget *parent = 0); ~CalcDialog(); public slots: void evaluate(); signals: void putNumber(const QString &str); private slots: void keyPut(); void key1(); void key2(); void key3(); void key4(); void key5(); void key6(); void key7(); void key8(); void key9(); void key0(); void keyE(); void keyDot(); void keyMul(); void keyDiv(); void keyAdd(); void keySub(); void keyBrO(); void keyBrC(); void keyFnc(); void keyPi(); void keyX2(); void typeUpdate(int s); void funcUpdate(int s); void foc(); void clear(); void putText(QModelIndex ind); void addResult(); private: QLineEdit *text; QLineEdit *result; QComboBox *type, *func; QLabel *descr; QListView *prev; QStringList names, funcName[10], funcInfo[10]; QStandardItemModel *hist; void fillFuncName(); }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/udav_wnd.cpp0000664000175000017500000007231514167366466016067 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifdef WIN32 #include #include #else #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- #include #include "udav_wnd.h" #include "text_pnl.h" #include "plot_pnl.h" #include "prop_dlg.h" #include "qmglsyntax.h" //----------------------------------------------------------------------------- extern bool mglAutoExecute; PropDialog *propDlg=0; int MainWindow::num_wnd=0; QStringList recentFiles; int MaxRecentFiles=5; bool editPosBottom = false; bool mglAutoSave = false; bool mglHighlight = true; bool mglDotsRefr = true; // bool mglAutoPure = true; bool mglCompleter = true; bool loadInNewWnd = false; bool mglWheelZoom = false; QString pathHelp; extern mglParse parser; extern QColor mglColorScheme[10]; extern QString defFontFamily; extern int defFontSize; extern QString pathFont; extern int defWidth, defHeight; //----------------------------------------------------------------------------- QWidget *createCalcDlg(QWidget *p, QTextEdit *e); QDialog *createArgsDlg(QWidget *p); QWidget *createMemPanel(QWidget *p); QWidget *createHlpPanel(QWidget *p); void showHelpMGL(QWidget *hlp, QString s); void addDataPanel(QWidget *p, QWidget *w, QString name) { MainWindow *wnd = dynamic_cast(p); if(wnd) wnd->addPanel(w, name); } //----------------------------------------------------------------------------- #ifndef UDAV_DIR #ifdef WIN32 #define UDAV_DIR "" #else #define UDAV_DIR "/usr/local/share/udav/" #endif #endif //----------------------------------------------------------------------------- int mgl_cmd_cmp(const void *a, const void *b); void udavLoadDefCommands(); void udavShowHint(QWidget *); void mgl_ask_qt(const wchar_t *quest, wchar_t *res); //----------------------------------------------------------------------------- int main(int argc, char **argv) { QString lang=""; QSettings settings("udav","UDAV"); settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); pathHelp = settings.value("/helpPath", MGL_DOC_DIR).toString(); pathFont = settings.value("/userFont", "").toString(); lang = settings.value("/udavLang", "").toString(); const char *loc=""; if(lang=="en") loc = "C.UTF8"; #if WIN32 if(lang=="ru") loc = "ru_RU.cp1251"; #else if(lang=="ru") loc = "ru_RU.utf8"; #endif if(lang=="es") { loc = "es_ES.utf8"; lang="en"; } // TODO remove lang="en"; then Spanish translation is ready ! mgl_textdomain(argv?argv[0]:NULL,loc); bool showHint = settings.value("/showHint", true).toBool(); mglCompleter = settings.value("/completer", true).toBool(); settings.endGroup(); mgl_suppress_warn(true); // QCoreApplication::setAttribute(Qt::AA_X11InitThreads); #ifdef WIN32 QCoreApplication::addLibraryPath("c:/plugins/"); QCoreApplication::addLibraryPath(QFileInfo(QString::fromLocal8Bit(argv[0])).absolutePath().append("/plugins/")); #endif mgl_ask_func = mgl_ask_qt; QApplication a(argc, argv); QTranslator translator; //QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8")); #if defined(WIN32) if(pathHelp.isEmpty()) pathHelp = a.applicationDirPath()+"\\"; #else if(pathHelp.isEmpty()) pathHelp=MGL_DOC_DIR; #endif if(!lang.isEmpty()) { if(!translator.load("udav_"+lang, UDAV_DIR)) translator.load("udav_"+lang, pathHelp); a.installTranslator(&translator); } udavLoadDefCommands(); parser.AllowSetSize(true); MainWindow *mw = new MainWindow(); if(argc>1) { QTextCodec *codec = QTextCodec::codecForLocale(); mw->load(codec->toUnicode(argv[1]), true); } mw->show(); mw->edit->edit->setFocus(); a.connect(&a, SIGNAL(lastWindowClosed()), &a, SLOT(quit())); if(showHint) udavShowHint(mw); return a.exec(); } //----------------------------------------------------------------------------- // // mgl addon // //----------------------------------------------------------------------------- void udavLoadDefCommands() {} //{ udavAddCommands(udav_base_cmd); } //----------------------------------------------------------------------------- // // Class MainWindow // //----------------------------------------------------------------------------- MainWindow::MainWindow(QWidget *wp) : QMainWindow(wp) { QAction *a; setWindowTitle(_("untitled - UDAV")); setAttribute(Qt::WA_DeleteOnClose); split = new QSplitter(this); ltab = new QTabWidget(split); ltab->setMovable(true); ltab->setTabPosition(QTabWidget::South); // ltab->setTabsClosable(true); rtab = new QTabWidget(split); rtab->setMovable(true); rtab->setTabPosition(QTabWidget::South); messWnd = new QDockWidget(_("Messages and warnings"),this); mess = new QTextEdit(this); messWnd->setWidget(mess); messWnd->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea); addDockWidget(Qt::BottomDockWidgetArea, messWnd); messWnd->resize(size().width(), 0); new MessSyntax(mess); // connect(mess,SIGNAL(cursorPositionChanged()),this,SLOT(messClicked())); connect(mess,SIGNAL(selectionChanged()),this,SLOT(messClicked())); hideWnd = new QDockWidget(_("Hidden plots"),this); hidden = new TextEdit(this); hideWnd->setWidget(hidden); hideWnd->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea); addDockWidget(Qt::BottomDockWidgetArea, hideWnd); hideWnd->resize(size().width(), 0); hidden->setReadOnly(true); connect(hidden,SIGNAL(selectionChanged()),this,SLOT(hiddenClicked())); // TODO // connect(hidden,SIGNAL(cursorPositionChanged()),this,SLOT(hiddenClicked())); calcWnd = new QDockWidget(_("Calculator"),this); aload = a = new QAction(QPixmap(":/png/document-open.png"), _("Open file"), this); connect(a, SIGNAL(triggered()), this, SLOT(choose())); a->setToolTip(_("Open and execute/show script or data from file (Ctrl+O).\nYou may switch off automatic execution in UDAV properties.")); a->setShortcut(Qt::CTRL+Qt::Key_O); asave = a = new QAction(QPixmap(":/png/document-save.png"), _("Save script"), this); connect(a, SIGNAL(triggered()), this, SLOT(save())); a->setToolTip(_("Save script to a file (Ctrl+S)")); a->setShortcut(Qt::CTRL+Qt::Key_S); acalc = a = new QAction(QPixmap(":/png/accessories-calculator.png"), _("Calculator"), this); a->setShortcut(Qt::Key_F4); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), calcWnd, SLOT(setVisible(bool))); connect(calcWnd, SIGNAL(visibilityChanged(bool)), a, SLOT(setChecked(bool))); a->setToolTip(_("Show calculator which evaluate and help to type textual formulas.\nTextual formulas may contain data variables too.")); a->setChecked(false); calcWnd->setVisible(false); ainfo = a = new QAction(_("Show info"), this); a->setShortcut(Qt::Key_F2); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), messWnd, SLOT(setVisible(bool))); connect(messWnd, SIGNAL(visibilityChanged(bool)), a, SLOT(setChecked(bool))); a->setChecked(false); messWnd->setVisible(false); ahide = a = new QAction(QPixmap(":/png/layer-visible-on.png"), _("Show hidden plots"), this); a->setShortcut(Qt::Key_F8); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), hideWnd, SLOT(setVisible(bool))); connect(hideWnd, SIGNAL(visibilityChanged(bool)), a, SLOT(setChecked(bool))); a->setChecked(false); hideWnd->setVisible(false); graph = new PlotPanel(this); rtab->addTab(graph,QPixmap(":/png/office-chart-line.png"),_("Canvas")); // connect(info,SIGNAL(addPanel(QWidget*)),this,SLOT(addPanel(QWidget*))); info = createMemPanel(this); rtab->addTab(info,QPixmap(":/png/system-file-manager.png"),_("Info")); hlp = createHlpPanel(this); rtab->addTab(hlp,QPixmap(":/png/help-contents.png"),_("Help")); edit = new TextPanel(this); edit->graph = graph; graph->textMGL = edit->edit; connect(graph->mgl,SIGNAL(showWarn(QString)),mess,SLOT(setText(QString))); connect(graph->mgl,SIGNAL(showWarn(QString)),edit->edit,SLOT(setErrMessage(QString))); connect(graph,SIGNAL(clearWarn()),mess,SLOT(clear())); ltab->addTab(edit,QPixmap(":/png/text-plain.png"),_("Script")); calcWnd->setWidget(createCalcDlg(this, edit->edit)); calcWnd->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea); addDockWidget(Qt::BottomDockWidgetArea, calcWnd); calcWnd->resize(size().width(), 200); makeMenu(); setCentralWidget(split); setWindowIcon(QIcon(":/udav.png")); readSettings(); if(!propDlg) propDlg = new PropDialog; connect(graph, SIGNAL(save()), this, SLOT(save())); connect(graph, SIGNAL(setStatus(const QString &)), this, SLOT(setStatus(const QString &))); connect(graph, SIGNAL(animPutText(const QString &)), edit, SLOT(animPutText(const QString &))); connect(graph,SIGNAL(giveFocus()),edit->edit,SLOT(setFocus())); connect(graph->mgl, SIGNAL(objChanged(int)), edit, SLOT(setCursorPosition(int))); // connect(graph->mgl, SIGNAL(posChanged(QString)), statusBar(), SLOT(showMessage(QString))); connect(graph->mgl, SIGNAL(refreshData()), this, SLOT(refresh())); connect(graph->mgl, SIGNAL(refreshData()), edit, SLOT(refreshData())); connect(graph->mgl,SIGNAL(doubleClick(int)),edit,SLOT(newCmd(int))); connect(edit->edit,SIGNAL(textChanged()),this,SLOT(updateHidden())); connect(mess, SIGNAL(textChanged()), this, SLOT(warnChanged())); connect(propDlg, SIGNAL(sizeChanged(int,int)), graph->mgl, SLOT(imgSize(int,int))); connect(edit->edit,SIGNAL(textChanged()), this, SLOT(setAsterix())); connect(edit->edit, SIGNAL(cursorPositionChanged()), this, SLOT(editPosChanged())); connect(edit,SIGNAL(setCurrentFile(QString)),this,SLOT(setCurrentFile(QString))); connect(edit,SIGNAL(setStatus(QString)),this,SLOT(setStatus(QString))); setStatus(_("Ready")); num_wnd++; edit->setAcceptDrops(false); // for disabling default action by 'edit' setAcceptDrops(true); } //----------------------------------------------------------------------------- void MainWindow::makeMenu() { QAction *a; QMenu *o; // file menu { o = menuBar()->addMenu(_("File")); a = new QAction(QPixmap(":/png/document-new.png"), _("New script"), this); connect(a, SIGNAL(triggered()), this, SLOT(newDoc())); a->setToolTip(_("Create new empty script window (Ctrl+N).")); a->setShortcut(Qt::CTRL+Qt::Key_N); o->addAction(a); o->addAction(aload); o->addAction(asave); a = new QAction(_("Save as ..."), this); connect(a, SIGNAL(triggered()), this, SLOT(saveAs())); o->addAction(a); o->addSeparator(); o->addAction(_("Print script"), edit, SLOT(printText())); a = new QAction(QPixmap(":/png/document-print.png"), _("Print graphics"), this); connect(a, SIGNAL(triggered()), graph->mgl, SLOT(print())); a->setToolTip(_("Open printer dialog and print graphics (Ctrl+P)")); a->setShortcut(Qt::CTRL+Qt::Key_P); o->addAction(a); o->addSeparator(); fileMenu = o->addMenu(_("Recent files")); o->addSeparator(); o->addAction(_("Quit"), qApp, SLOT(closeAllWindows())); } menuBar()->addMenu(edit->menu); menuBar()->addMenu(graph->menu); // settings menu { o = menuBar()->addMenu(_("Settings")); a = new QAction(QPixmap(":/png/preferences-system.png"), _("Properties"), this); connect(a, SIGNAL(triggered()), this, SLOT(properties())); a->setToolTip(_("Show dialog for UDAV properties.")); o->addAction(a); o->addAction(_("Set arguments"), createArgsDlg(this), SLOT(exec())); o->addAction(acalc); o->addAction(ainfo); o->addAction(ahide); } menuBar()->addSeparator(); o = menuBar()->addMenu(_("Help")); a = new QAction(QPixmap(":/png/help-contents.png"), _("MGL help"), this); connect(a, SIGNAL(triggered()), this, SLOT(showHelp())); a->setToolTip(_("Show help on MGL commands (F1).")); a->setShortcut(Qt::Key_F1); o->addAction(a); a = new QAction(QPixmap(":/png/help-faq.png"), _("Hints"), this); connect(a, SIGNAL(triggered()), this, SLOT(showHint())); a->setToolTip(_("Show hints of MGL usage.")); o->addAction(a); o->addAction(_("About"), this, SLOT(about())); o->addAction(_("About Qt"), this, SLOT(aboutQt())); } //----------------------------------------------------------------------------- void MainWindow::closeEvent(QCloseEvent* ce) { bool ok=true; writeSettings(); if(edit->isModified()) switch(QMessageBox::information(this, _("UDAV"), _("Do you want to save the changes to the document?"), QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel)) { case QMessageBox::Yes: save(); break; case QMessageBox::No: break; default: ok=false; break; } if(ok) { num_wnd--; ce->accept(); if(num_wnd==0) QApplication::quit(); } else ce->ignore(); } //----------------------------------------------------------------------------- void MainWindow::dropEvent(QDropEvent * de) { // Linux Qt send "text/plain" mime data in drop event // Windows version send "text/uri-list" QTextCodec *codec = QTextCodec::codecForLocale(); QString filename; if ( de->mimeData()->hasFormat("text/plain") ) { // Under linux just convert the text from the local encodig to Qt's unicode filename = codec->toUnicode(de->mimeData()->data("text/plain")); if (filename.indexOf("file:") == 0) load(filename.remove("file://").trimmed(), false); }else if ( de->mimeData()->hasUrls() ) { // Under win - parse the dropped data and find the path to local file QList UrlList; QFileInfo finfo; UrlList = de->mimeData()->urls(); if ( UrlList.size() > 0) // if at least one QUrl is present in list { filename = UrlList[0].toLocalFile(); // convert first QUrl to local path finfo.setFile( filename ); if ( finfo.isFile() ) { load(filename, false); } } } } //----------------------------------------------------------------------------- void MainWindow::dragEnterEvent(QDragEnterEvent *event) { QTextCodec *codec = QTextCodec::codecForLocale(); QString filename = codec->toUnicode(event->mimeData()->data("text/plain")); /*if ( event->provides("text/plain") ) { QTextCodec *codec = QTextCodec::codecForLocale(); QString instring = codec->toUnicode(event->mimeData()->data("text/plain")); if ( instring.indexOf("file://") >= 0) { event->acceptProposedAction(); setStatus(instring); } } else */ if(event->mimeData()->hasUrls()) { QList UrlList; QFileInfo finfo; UrlList = event->mimeData()->urls(); if ( UrlList.size() > 0) // if at least one QUrl is present in list { filename = UrlList[0].toLocalFile(); // convert first QUrl to local path finfo.setFile(filename); if ( finfo.isFile() ) { event->acceptProposedAction(); setStatus(filename); } } } } //----------------------------------------------------------------------------- void MainWindow::showHelp() { QString s = edit->selection(), dlm(" #;:\t"); int i, n = s.length(); for(i=0;iselection(), dlm(" #;:\t"); int n = text.length(), i; for(i=0;isetOrientation(bottom ? Qt::Vertical : Qt::Horizontal); } //----------------------------------------------------------------------------- void MainWindow::properties() { propDlg->exec(); } //----------------------------------------------------------------------------- void MainWindow::about() { QString s = "UDAV v. "+QString(MGL_VER_STRING)+ _("
(c) Alexey Balakin, 2007-present

License is GPL v.2 or later."); QMessageBox::about(this, _("UDAV - about"), s); } //----------------------------------------------------------------------------- void MainWindow::aboutQt() { QMessageBox::aboutQt(this, _("About Qt")); } //----------------------------------------------------------------------------- void MainWindow::writeSettings() { QSettings settings("udav","UDAV"); settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); settings.setValue("/animDelay", animDelay); settings.setValue("/geometry/size", size()); // settings.setValue("/geometry/dock", messWnd->size()); settings.setValue("/geometry/split_e/w1", split->sizes().at(0)); settings.setValue("/geometry/split_e/w2", split->sizes().at(1)); settings.setValue("/recentFiles", recentFiles); settings.setValue("/recentFilesMax", MaxRecentFiles); settings.setValue("/helpPath", pathHelp); settings.setValue("/userFont", pathFont); settings.setValue("/colComment",mglColorScheme[0].name()); settings.setValue("/colString", mglColorScheme[1].name()); settings.setValue("/colKeyword",mglColorScheme[2].name()); settings.setValue("/colOption", mglColorScheme[3].name()); settings.setValue("/colSuffix", mglColorScheme[4].name()); settings.setValue("/colNumber", mglColorScheme[5].name()); settings.setValue("/colACKeyword", mglColorScheme[6].name()); settings.setValue("/colFCKeyword", mglColorScheme[7].name()); settings.setValue("/colReserved", mglColorScheme[8].name()); settings.setValue("/colCurrLine", mglColorScheme[9].name()); settings.setValue("/autoExec", mglAutoExecute); settings.setValue("/autoSave", mglAutoSave); settings.setValue("/highlight", mglHighlight); settings.setValue("/dotsRefresh", mglDotsRefr); // settings.setValue("/autoPure", mglAutoPure); settings.setValue("/editAtTop", editPosBottom); settings.setValue("/fontFamily", defFontFamily); settings.setValue("/fontSize", defFontSize); settings.setValue("/loadInNewWnd", loadInNewWnd); settings.setValue("/completer", mglCompleter); settings.setValue("/wheelZoom", mglWheelZoom); settings.endGroup(); } //----------------------------------------------------------------------------- void MainWindow::readSettings() { QSettings settings("udav","UDAV"); settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); pathHelp = settings.value("/helpPath", MGL_DOC_DIR).toString(); if(pathHelp.isEmpty()) pathHelp=MGL_DOC_DIR; MaxRecentFiles = settings.value("/recentFilesMax", 5).toInt(); animDelay = settings.value("/animDelay", 500).toInt(); resize(settings.value("/geometry/size", QSize(880,720)).toSize()); QList le; le.append(settings.value("/geometry/split_e/w1", 230).toInt()); le.append(settings.value("/geometry/split_e/w2", 604).toInt()); split->setSizes(le); pathFont = settings.value("/userFont", "").toString(); mglColorScheme[0] = QColor(settings.value("/colComment","#007F00").toString()); mglColorScheme[1] = QColor(settings.value("/colString", "#FF0000").toString()); mglColorScheme[2] = QColor(settings.value("/colKeyword","#00007F").toString()); mglColorScheme[3] = QColor(settings.value("/colOption", "#7F0000").toString()); mglColorScheme[4] = QColor(settings.value("/colSuffix", "#7F0000").toString()); mglColorScheme[5] = QColor(settings.value("/colNumber", "#0000FF").toString()); mglColorScheme[6] = QColor(settings.value("/colACKeyword","#7F007F").toString()); mglColorScheme[7] = QColor(settings.value("/colFCKeyword","#007F7F").toString()); mglColorScheme[8] = QColor(settings.value("/colReserved", "#0000FF").toString()); mglColorScheme[9] = QColor(settings.value("/colCurrLine", "#FFFFCC").toString()); mglAutoSave = settings.value("/autoSave", false).toBool(); mglHighlight = settings.value("/highlight", true).toBool(); // mglAutoPure = settings.value("/autoPure", true).toBool(); mglAutoExecute = settings.value("/autoExec", true).toBool(); editPosBottom = settings.value("/editAtTop", false).toBool(); mglCompleter = settings.value("/completer", true).toBool(); mglWheelZoom = settings.value("/wheelZoom", false).toBool(); loadInNewWnd = settings.value("/loadInNewWnd", false).toBool(); mglDotsRefr = settings.value("/dotsRefresh", true).toBool(); defFontFamily = settings.value("/fontFamily", "Georgia").toString(); defFontSize = settings.value("/fontSize", 10).toInt(); edit->setEditorFont(); setEditPos(editPosBottom); graph->setMGLFont(pathFont); graph->mgl->enableWheel = mglWheelZoom; defWidth = settings.value("/defWidth", 640).toInt(); defHeight = settings.value("/defHeight", 480).toInt(); graph->mgl->setSize(defWidth, defHeight); recentFiles = settings.value("/recentFiles").toStringList(); settings.endGroup(); updateRecentFileItems(); } //----------------------------------------------------------------------------- void MainWindow::setStatus(const QString &txt) { statusBar()->showMessage(txt, 5000); } //----------------------------------------------------------------------------- void MainWindow::setCurrentFile(const QString &fileName) { filename = fileName; mgl_set_plotid(graph->mgl->getGraph(), fileName.toLocal8Bit().constData()); edit->setModified(false); if(filename.isEmpty()) setWindowTitle(_("untitled - UDAV")); else { setWindowTitle(QFileInfo(filename).fileName()+" - UDAV"); int i = recentFiles.indexOf(filename); if(i>=0) recentFiles.removeAt(i); recentFiles.push_front(filename); updateRecentFileItems(); if(chdir(qPrintable(QFileInfo(filename).path()))) QMessageBox::warning(this, _("UDAV - save current"), _("Couldn't change to folder ")+QFileInfo(filename).path()); } } //----------------------------------------------------------------------------- void MainWindow::openRecentFile() { QAction *a = qobject_cast(sender()); if(!a) return; if(edit->isModified()) switch(QMessageBox::information(this, _("UDAV - save current"), _("Do you want to save the changes to the document?"), QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel)) { case QMessageBox::Yes: save(); break; case QMessageBox::No: break; default: return; } QString fn = recentFiles[a->data().toInt()]; if(!fn.isEmpty()) load(fn); } //----------------------------------------------------------------------------- void MainWindow::updateRecentFileItems() { foreach(QWidget *w, QApplication::topLevelWidgets()) { MainWindow *wnd = qobject_cast(w); if(wnd) wnd->updateRecent(); } } //----------------------------------------------------------------------------- void MainWindow::updateRecent() { QAction *a; fileMenu->clear(); qApp->processEvents(); for(int i=0; iaddAction(text, this, SLOT(openRecentFile())); a->setData(i); } } //----------------------------------------------------------------------------- void MainWindow::newDoc() { MainWindow *ed = new MainWindow; ed->show(); ed->activateWindow(); } //----------------------------------------------------------------------------- void MainWindow::choose() { if(edit->isModified()) switch(QMessageBox::information(this, _("UDAV - save current"), _("Do you want to save the changes to the document?"), QMessageBox::Yes, QMessageBox::No, QMessageBox::Cancel)) { case QMessageBox::Yes: save(); break; case QMessageBox::No: break; default: return; } QSettings settings("udav","UDAV"); settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); QString fn = QFileDialog::getOpenFileName(this, _("UDAV - Open file"), settings.value("/filePath", MGL_DOC_DIR).toString(), _("MGL scripts (*.mgl)\nHDF5 files (*.hdf *.h5)\nText files (*.txt)\nData files (*.dat)\nAll files (*.*)")); settings.endGroup(); if(!fn.isEmpty()) load(fn); else setStatus(_("Loading aborted")); } //----------------------------------------------------------------------------- void MainWindow::load(const QString &fileName, bool noNewWnd) { // save current path QFileInfo fi(fileName); filename = fileName; QSettings settings("udav","UDAV"); settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); settings.setValue("/filePath", fi.absolutePath()); settings.endGroup(); // open new window if it is required if(loadInNewWnd && !noNewWnd) { MainWindow *mw = new MainWindow; mw->edit->load(fileName); mw->show(); //ed->activateWindow(); } else edit->load(fileName); } //----------------------------------------------------------------------------- void MainWindow::save() { if(filename.isEmpty()) saveAs(); else edit->save(filename); } //----------------------------------------------------------------------------- void MainWindow::saveAs() { QString fn; fn = QFileDialog::getSaveFileName(this, _("UDAV - save file"), "", _("MGL scripts (*.mgl)\nHDF5 files (*.hdf *.h5)\nAll files (*.*)")); if(fn.isEmpty()) { setStatus(_("Saving aborted")); return; } else { int nn=fn.length(); if(fn[nn-4]!='.' && fn[nn-3]!='.') fn = fn + ".mgl"; filename = fn; save(); } } //----------------------------------------------------------------------------- void MainWindow::setAsterix() { if(edit->isModified()) { if(filename.isEmpty()) setWindowTitle(_("untitled* - UDAV")); else setWindowTitle(QFileInfo(filename).fileName()+"* - UDAV"); } else { if(filename.isEmpty()) setWindowTitle(_("untitled - UDAV")); else setWindowTitle(QFileInfo(filename).fileName()+" - UDAV"); } } //----------------------------------------------------------------------------- void updateDataItems() { foreach (QWidget *w, QApplication::topLevelWidgets()) if(w->inherits("MainWindow")) ((MainWindow *)w)->refresh(); } //----------------------------------------------------------------------------- void MainWindow::addPanel(QWidget *w, QString name) { ltab->addTab(w,QPixmap(":/png/text-csv.png"),name); ltab->setCurrentWidget(w); } //----------------------------------------------------------------------------- MGL_LOCAL_PURE MainWindow *findMain(QWidget *wnd) { MainWindow *mw=0; QObject *w=wnd; while(w && !mw) { mw = dynamic_cast(w); w = w->parent(); } return mw; } //----------------------------------------------------------------------------- void raisePanel(QWidget *w) { MainWindow *mw=findMain(w); if(mw) mw->rtab->setCurrentWidget(w); } //----------------------------------------------------------------------------- void MainWindow::updateHidden() { QTextCursor tc = edit->edit->textCursor(); long pos = tc.position(), i=0; hidden->clear(); tc.movePosition(QTextCursor::Start); do { i++; if(tc.block().text().startsWith("#h ")) hidden->append("Line "+QString::number(i)+QString::fromWCharArray(L" \u2192 ")+tc.block().text().mid(3)+"\n"); } while(tc.movePosition(QTextCursor::NextBlock)); tc.setPosition(pos); } //----------------------------------------------------------------------------- void MainWindow::hiddenClicked() { QString q = hidden->textCursor().block().text(); if(q.contains("Line ")) { int n = q.section(' ',1,1).toInt()-1; edit->edit->moveCursor(QTextCursor::Start); for(int i=0;iedit->moveCursor(QTextCursor::NextBlock); edit->edit->textCursor().deleteChar(); edit->edit->textCursor().deleteChar(); edit->edit->textCursor().deleteChar(); } graph->execute(); } //----------------------------------------------------------------------------- void MainWindow::messClicked() { QString q = mess->textCursor().block().text(); if(q.contains("in line ")) { int n = q.section(' ',-1).toInt()-1; if(n<0) return; edit->moveCursor(QTextCursor::Start); for(int i=0;imoveCursor(QTextCursor::NextBlock); } edit->setFocus(); } //----------------------------------------------------------------------------- void MainWindow::warnChanged() { if(mess->toPlainText().isEmpty()) { messWnd->hide(); ainfo->setChecked(false); } else { messWnd->show(); ainfo->setChecked(true); } } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/udav.qrc0000664000175000017500000000444514167366466015221 0ustar balakinbalakin udav.png png/document-new.png png/document-open.png png/document-print.png png/document-save.png png/document-properties.png png/document-export.png png/document-import.png png/document-revert.png png/alpha.png png/preferences-system.png png/edit-clear.png png/edit-cut.png png/edit-copy.png png/edit-delete.png png/edit-paste.png png/edit-select-all.png png/edit-find.png png/edit-redo.png png/edit-undo.png png/process-stop.png png/zoom-out.png png/zoom-in.png png/zoom-original.png png/zoom-draw.png png/view-refresh.png png/weather-clear.png png/weather-clouds.png png/help-contents.png png/help-faq.png png/go-first.png png/go-last.png png/go-previous.png png/go-next.png png/go-down.png png/go-up.png png/arrow-down.png png/arrow-up.png png/arrow-left.png png/arrow-right.png png/media-seek-backward.png png/media-seek-forward.png png/media-playback-start.png png/transform-move.png png/accessories-calculator.png png/format-indent-more.png png/text-csv.png png/folder.png png/text-plain.png png/office-chart-line.png png/system-file-manager.png png/view-grid.png png/view-fullscreen.png png/tab-close.png png/layer-visible-off.png png/layer-visible-on.png png/object-order-lower.png png/object-order-raise.png png/object-rotate-up.png png/object-rotate-down.png png/object-rotate-left.png png/object-rotate-right.png png/tools-wizard.png mathgl-8.0.1/udav/tree_pnl.cpp0000664000175000017500000000000014167366466016046 0ustar balakinbalakinmathgl-8.0.1/udav/args_dlg.cpp0000664000175000017500000001030714167366466016033 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include "args_dlg.h" extern mglParse parser; //----------------------------------------------------------------------------- QDialog *createArgsDlg(QWidget *p) { return new ArgsDialog(p); } //----------------------------------------------------------------------------- ArgsDialog::ArgsDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(_("UDAV - Set script arguments")); QHBoxLayout *h; QVBoxLayout *v; QGridLayout *g; QLabel *l; QPushButton *b; v = new QVBoxLayout(this); g = new QGridLayout(); v->addLayout(g); l = new QLabel(_("String for $1"), this); g->addWidget(l, 0, 0); a[1] = new QLineEdit(this); g->addWidget(a[1], 1, 0); l = new QLabel(_("String for $2"), this); g->addWidget(l, 0, 1); a[2] = new QLineEdit(this); g->addWidget(a[2], 1, 1); l = new QLabel(_("String for $3"), this); g->addWidget(l, 2, 0); a[3] = new QLineEdit(this); g->addWidget(a[3], 3, 0); l = new QLabel(_("String for $4"), this); g->addWidget(l, 2, 1); a[4] = new QLineEdit(this); g->addWidget(a[4], 3, 1); l = new QLabel(_("String for $5"), this); g->addWidget(l, 4, 0); a[5] = new QLineEdit(this); g->addWidget(a[5], 5, 0); l = new QLabel(_("String for $6"), this); g->addWidget(l, 4, 1); a[6] = new QLineEdit(this); g->addWidget(a[6], 5, 1); l = new QLabel(_("String for $7"), this); g->addWidget(l, 6, 0); a[7] = new QLineEdit(this); g->addWidget(a[7], 7, 0); l = new QLabel(_("String for $8"), this); g->addWidget(l, 6, 1); a[8] = new QLineEdit(this); g->addWidget(a[8], 7, 1); l = new QLabel(_("String for $9"), this); g->addWidget(l, 8, 0); a[9] = new QLineEdit(this); g->addWidget(a[9], 9, 0); l = new QLabel(_("String for $0"), this); g->addWidget(l, 8, 1); a[0] = new QLineEdit(this); g->addWidget(a[0], 9, 1); h = new QHBoxLayout(); h->addStretch(1); v->addLayout(h); b = new QPushButton(_("Cancel"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(reject())); b = new QPushButton(_("OK"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(putArguments())); b->setDefault(true); } //----------------------------------------------------------------------------- ArgsDialog::~ArgsDialog() {} //----------------------------------------------------------------------------- void ArgsDialog::putArguments() { int len=0; for(int i=0;i<10;i++) if(a[i]->text().length()>len) len = a[i]->text().length(); wchar_t *str = new wchar_t[len+2]; for(int i=0;i<10;i++) { QString s = a[i]->text(); int j, n = s.length(); for(j=0;j #include #include #include #include #include #include #include #include "subplot_dlg.h" #include "style_dlg.h" #undef sprintf //----------------------------------------------------------------------------- void convertFromGraph(QPixmap &pic, mglGraph *gr, uchar **buf); //----------------------------------------------------------------------------- SubplotDialog::SubplotDialog(QWidget *parent) : QDialog(parent) { grBuf = 0; setWindowTitle(_("UDAV - Setup inplot")); QLabel *l; QPushButton *b; QVBoxLayout *v = new QVBoxLayout(this), *u; QGridLayout *g = new QGridLayout; v->addLayout(g); g->setColumnStretch(2, 1); g->setColumnStretch(4, 1); g->setColumnStretch(6, 1); g->setColumnStretch(8, 1); g->setColumnStretch(10, 1); g->setAlignment(Qt::AlignTop); // SubPlot section cb = new QRadioButton("SubPlot",this); g->addWidget(cb,0,0); cb->setToolTip(_("Set drawing area as cell of matrix nx*ny.")); connect(cb,SIGNAL(toggled(bool)),this,SLOT(updatePic())); l = new QLabel("nx",this); g->addWidget(l,0,1); bn = new QSpinBox(this); g->addWidget(bn,0,2); bn->setMinimum(1); bn->setToolTip(_("Horizontal size")); connect(bn,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("ny",this); g->addWidget(l,0,3); bm = new QSpinBox(this); g->addWidget(bm,0,4); bm->setMinimum(1); bm->setToolTip(_("Vertical size")); connect(bm,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("ind",this); g->addWidget(l,0,5); bk = new QSpinBox(this); g->addWidget(bk,0,6); bk->setMinimum(0); bk->setToolTip(_("Cell index")); connect(bk,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); // MultiPlot section cm = new QRadioButton("MultiPlot",this); g->addWidget(cm,1,0); cm->setToolTip(_("Set drawing area as cells of matrix nx*ny.")); connect(cm,SIGNAL(toggled(bool)),this,SLOT(updatePic())); l = new QLabel("nx",this); g->addWidget(l,1,1); mn = new QSpinBox(this); g->addWidget(mn,1,2); mn->setMinimum(1); mn->setToolTip(_("Horizontal size")); connect(mn,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("ny",this); g->addWidget(l,1,3); mm = new QSpinBox(this); g->addWidget(mm,1,4); mm->setMinimum(1); mm->setToolTip(_("Vertical size")); connect(mm,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("ind",this); g->addWidget(l,1,5); mk = new QSpinBox(this); g->addWidget(mk,1,6); mk->setMinimum(0); mk->setToolTip(_("Starting cell index")); connect(mk,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("dx",this); g->addWidget(l,1,7); mx = new QSpinBox(this); g->addWidget(mx,1,8); mx->setMinimum(1); mx->setToolTip(_("Width of selected cells")); connect(mx,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("dy",this); g->addWidget(l,1,9); my = new QSpinBox(this); g->addWidget(my,1,10); my->setMinimum(1); my->setToolTip(_("Height of selected cells")); connect(my,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); // GridPlot section cg = new QRadioButton("GridPlot",this); g->addWidget(cg,2,0); cg->setToolTip(_("Set drawing area as cell of matrix nx*ny.")); connect(cg,SIGNAL(toggled(bool)),this,SLOT(updatePic())); l = new QLabel("nx",this); g->addWidget(l,2,1); gn = new QSpinBox(this); g->addWidget(gn,2,2); gn->setMinimum(1); gn->setToolTip(_("Horizontal size")); connect(gn,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("ny",this); g->addWidget(l,2,3); gm = new QSpinBox(this); g->addWidget(gm,2,4); gm->setMinimum(1); gm->setToolTip(_("Vertical size")); connect(gm,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("ind",this); g->addWidget(l,2,5); gk = new QSpinBox(this); g->addWidget(gk,2,6); gk->setMinimum(0); gk->setToolTip(_("Cell index")); connect(gk,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("d",this); g->addWidget(l,2,7); gd = new QLineEdit(this); g->addWidget(gd,2,8); gd->setToolTip(_("Distance between cells")); connect(gd,SIGNAL(textChanged(QString)),this,SLOT(updatePic())); // ColumnPlot section cc = new QRadioButton("ColumnPlot",this); g->addWidget(cc,3,0); cc->setToolTip(_("Set drawing area as cells of column.")); connect(cc,SIGNAL(toggled(bool)),this,SLOT(updatePic())); l = new QLabel("num",this); g->addWidget(l,3,1); cn = new QSpinBox(this); g->addWidget(cn,3,2); cn->setMinimum(1); cn->setToolTip(_("Size of column")); connect(cn,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("ind",this); g->addWidget(l,3,5); ck = new QSpinBox(this); g->addWidget(ck,3,6); ck->setMinimum(0); ck->setToolTip(_("Cell index")); connect(ck,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("d",this); g->addWidget(l,3,7); cd = new QLineEdit(this); g->addWidget(cd,3,8); cd->setToolTip(_("Distance between cells")); connect(cd,SIGNAL(textChanged(QString)),this,SLOT(updatePic())); // StickPlot section cs = new QRadioButton("StickPlot",this); g->addWidget(cs,4,0); cs->setToolTip(_("Set drawing area as cells of stick.")); connect(cc,SIGNAL(toggled(bool)),this,SLOT(updatePic())); l = new QLabel("num",this); g->addWidget(l,4,1); sn = new QSpinBox(this); g->addWidget(sn,4,2); sn->setMinimum(1); sn->setToolTip(_("Size of stick")); connect(sn,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel("ind",this); g->addWidget(l,4,5); sk = new QSpinBox(this); g->addWidget(sk,4,6); sk->setMinimum(0); sk->setToolTip(_("Cell index")); connect(sk,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); // InPlot section ci = new QRadioButton("InPlot",this); g->addWidget(ci,5,0); ci->setToolTip(_("Set drawing area as cells of matrix nx*ny.")); connect(ci,SIGNAL(toggled(bool)),this,SLOT(updatePic())); l = new QLabel("x1",this); g->addWidget(l,5,1); x1 = new QLineEdit(this); g->addWidget(x1,5,2); x1->setText("0"); x1->setToolTip(_("Left bottom edge")); connect(x1,SIGNAL(textChanged(QString)),this,SLOT(updatePic())); l = new QLabel("x2",this); g->addWidget(l,5,3); x2 = new QLineEdit(this); g->addWidget(x2,5,4); x2->setText("1"); x2->setToolTip(_("Right bottom edge")); connect(x2,SIGNAL(textChanged(QString)),this,SLOT(updatePic())); l = new QLabel("y1",this); g->addWidget(l,5,5); y1 = new QLineEdit(this); g->addWidget(y1,5,6); y1->setText("0"); y1->setToolTip(_("Left top edge")); connect(y1,SIGNAL(textChanged(QString)),this,SLOT(updatePic())); l = new QLabel("y2",this); g->addWidget(l,5,7); y2 = new QLineEdit(this); g->addWidget(y2,5,8); y2->setText("1"); y2->setToolTip(_("Right top edge")); connect(y2,SIGNAL(textChanged(QString)),this,SLOT(updatePic())); QHBoxLayout *h, *H; h = new QHBoxLayout; v->addLayout(h); u = new QVBoxLayout; h->addLayout(u); H = new QHBoxLayout; u->addLayout(H); l = new QLabel(_("Rotate on"),this); H->addWidget(l); l = new QLabel(QString::fromWCharArray(L"\u03b8"),this); H->addWidget(l); tet = new QSpinBox(this); H->addWidget(tet,1); tet->setValue(0); tet->setSingleStep(5); tet->setToolTip(_("Angle around x axis (in degrees)")); connect(tet,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); l = new QLabel(QString::fromWCharArray(L"\u03c6"),this); H->addWidget(l); phi = new QSpinBox(this); H->addWidget(phi,1); phi->setValue(0); phi->setSingleStep(5); phi->setToolTip(_("Angle around z axis (in degrees)")); connect(phi,SIGNAL(valueChanged(QString)),this,SLOT(updatePic())); H = new QHBoxLayout; u->addLayout(H); l = new QLabel(_("Aspect"),this); H->addWidget(l); l = new QLabel(_("X/Z"),this); H->addWidget(l); axz = new QLineEdit(this); H->addWidget(axz); axz->setText("1"); axz->setToolTip(_("Aspect ratio of x-scale to z-scale")); connect(axz,SIGNAL(textChanged(QString)),this,SLOT(updatePic())); l = new QLabel(_("Y/Z"),this); H->addWidget(l); ayz = new QLineEdit(this); H->addWidget(ayz); ayz->setText("1"); ayz->setToolTip(_("Aspect ratio of y-scale to z-scale")); connect(ayz,SIGNAL(textChanged(QString)),this,SLOT(updatePic())); H = new QHBoxLayout; u->addLayout(H); l = new QLabel(_("Reserve at"),this); H->addWidget(l); rl = new QCheckBox(_("left"),this); H->addWidget(rl); rl->setChecked(true); rl->setToolTip(_("Reserve space for labels at left side (style '<')")); rb = new QCheckBox(_("bottom"),this); H->addWidget(rb); rb->setChecked(true); rb->setToolTip(_("Reserve space for labels at bottom side (style '_')")); rt = new QCheckBox(_("top"),this); H->addWidget(rt); rt->setChecked(true); rt->setToolTip(_("Reserve space for labels at top side (style '^')")); rr = new QCheckBox(_("right"),this); H->addWidget(rr); rr->setChecked(true); rr->setToolTip(_("Reserve space for labels at right side (style '>')")); rw = new QCheckBox(_("Whole area"),this); H->addWidget(rw); rw->setToolTip(_("Set to use whole area (style '#')")); connect(rl,SIGNAL(toggled(bool)),this,SLOT(updatePic())); connect(rr,SIGNAL(toggled(bool)),this,SLOT(updatePic())); connect(rt,SIGNAL(toggled(bool)),this,SLOT(updatePic())); connect(rb,SIGNAL(toggled(bool)),this,SLOT(updatePic())); connect(rw,SIGNAL(toggled(bool)),this,SLOT(updatePic())); H = new QHBoxLayout; u->addLayout(H); l = new QLabel(_("Title"),this); H->addWidget(l); title = new QLineEdit(this); H->addWidget(title); title->setToolTip(_("Title for plot. Can be used in SubPlot or MultiPlot only.")); connect(title,SIGNAL(textChanged(QString)),this,SLOT(updatePic())); b = new QPushButton(_("Style"),this); H->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(titleStl())); H = new QHBoxLayout; u->addLayout(H); l = new QLabel(_("Result"),this); H->addWidget(l); res = new QLineEdit(this); H->addWidget(res); res->setReadOnly(true); res->setToolTip(_("Resulting string")); pic = new QLabel(this); h->addWidget(pic,1); h = new QHBoxLayout; v->addLayout(h); h->addStretch(1); b = new QPushButton(_("Cancel"),this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(reject())); b = new QPushButton(_("OK"), this); h->addWidget(b); b->setDefault(true); connect(b, SIGNAL(clicked()),this, SLOT(finish())); stlDialog = new StyleDialog(this); } //----------------------------------------------------------------------------- SubplotDialog::~SubplotDialog() { if(grBuf) delete []grBuf; } //----------------------------------------------------------------------------- void SubplotDialog::finish() { accept(); emit result(cmd); } //----------------------------------------------------------------------------- void SubplotDialog::updatePic() { static mglGraph gr; gr.SetSize(pic->width(),pic->height()); mglParse par; wchar_t *wcmd; setlocale(LC_NUMERIC, "C"); QString stl="'"; // style for subplot if(rb->isChecked()) stl+='_'; if(rl->isChecked()) stl+='<'; if(rr->isChecked()) stl+='>'; if(rt->isChecked()) stl+='^'; if(rw->isChecked()) stl+='#'; stl += '\''; if(stl=="'_<>^'") stl=""; int Tet = tet->value(), Phi = phi->value(); int Ax = 1, Ay = 1; if(!axz->text().isEmpty()) Ax = axz->text().toDouble(); if(!ayz->text().isEmpty()) Ay = ayz->text().toDouble(); if(cb->isChecked()) // subplot { int n=bn->value(), m=bm->value(), k=bk->value(); for(int i=0;itext().isEmpty()) { cmd += ":title '"+title->text()+"'"; if(!fmt.isEmpty()) cmd += fmt; } if(Tet || Phi) cmd += ":rotate "+QString::number(Tet)+" "+QString::number(Phi); if(Ax!=1 || Ay!=1) cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay); wcmd = new wchar_t[cmd.size()+1]; cmd.toWCharArray(wcmd); wcmd[cmd.size()] = 0; par.Execute(&gr, wcmd); gr.Box(); delete[] wcmd; res->setText(cmd); } else if(cm->isChecked()) // multiplot { int n=mn->value(), m=mm->value(), k=mk->value(), dx=mx->value(), dy=my->value(); for(int i=0;itext().isEmpty()) { cmd += ":title '"+title->text()+"'"; if(!fmt.isEmpty()) cmd += fmt; } if(Tet || Phi) cmd += ":rotate "+QString::number(Tet)+" "+QString::number(Phi); if(Ax!=1 || Ay!=1) cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay); wcmd = new wchar_t[cmd.size() + 1]; cmd.toWCharArray(wcmd); wcmd[cmd.size()] = 0; par.Execute(&gr, wcmd); gr.Box(); delete[] wcmd; res->setText(cmd); } else if(cg->isChecked()) // gridplot { int n=gn->value(), m=gm->value(), k=gk->value(); double d = gd->text().isEmpty()?0:gd->text().toDouble(); for(int i=0;isetText(cmd); } else if(cs->isChecked()) // stickplot { int n=sn->value(), k=sk->value(); for(int i=0;isetText(cmd); } else if(cc->isChecked()) // columnplot // TODO add angles { int n=cn->value(), k=ck->value(); double d = cd->text().isEmpty()?0:cd->text().toDouble(); for(int i=0;isetText(cmd); } else if(ci->isChecked()) // inplot { { gr.SubPlot(1,1,0); gr.Box("h"); } cmd = "inplot "+x1->text()+" "+x2->text()+" "+y1->text()+" "+y2->text(); if(!title->text().isEmpty()) { cmd += ":title '"+title->text()+"'"; if(!fmt.isEmpty()) cmd += fmt; } if(Tet || Phi) cmd += ":rotate "+QString::number(Tet)+" "+QString::number(Phi); if(Ax!=1 || Ay!=1) cmd += ":aspect "+QString::number(Ax)+" "+QString::number(Ay); wcmd = new wchar_t[cmd.size() + 1]; cmd.toWCharArray(wcmd); wcmd[cmd.size()] = 0; par.Execute(&gr, wcmd); gr.Box(); delete[] wcmd; res->setText(cmd); } setlocale(LC_NUMERIC, ""); QPixmap p; convertFromGraph(p, &gr, &grBuf); pic->setPixmap(p); } //----------------------------------------------------------------------------- void SubplotDialog::titleStl() { stlDialog->showFontPage(); if(stlDialog->exec()) { fmt = " "+stlDialog->getStyle(); updatePic(); } } //----------------------------------------------------------------------------- void SubplotDialog::parseCmd(const QString& txt, bool final) { } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/opt_dlg.cpp0000664000175000017500000001430514167366466015703 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include "opt_dlg.h" #include "mgl2/define.h" //----------------------------------------------------------------------------- OptionDialog::OptionDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(_("UDAV - Add options")); QHBoxLayout *a; QGridLayout *g; QLabel *lbl; QPushButton *b; QVBoxLayout *o = new QVBoxLayout(this); //o->setSpacing(6); g = new QGridLayout(); o->addLayout(g); lbl = new QLabel(_("X-range"),this); g->addWidget(lbl,0,0); x1 = new QLineEdit(this); g->addWidget(x1,0,1); x2 = new QLineEdit(this); g->addWidget(x2,0,2); lbl = new QLabel(_("Y-range"),this); g->addWidget(lbl,0,3); y1 = new QLineEdit(this); g->addWidget(y1,0,4); y2 = new QLineEdit(this); g->addWidget(y2,0,5); lbl = new QLabel(_("Z-range"),this); g->addWidget(lbl,1,0); z1 = new QLineEdit(this); g->addWidget(z1,1,1); z2 = new QLineEdit(this); g->addWidget(z2,1,2); lbl = new QLabel(_("C-range"),this); g->addWidget(lbl,1,3); c1 = new QLineEdit(this); g->addWidget(c1,1,4); c2 = new QLineEdit(this); g->addWidget(c2,1,5); lbl = new QLabel(_("Alpha"),this); g->addWidget(lbl,2,0); alpha = new QLineEdit(this); g->addWidget(alpha,2,1); lbl = new QLabel(_("Mesh num"),this); g->addWidget(lbl,2,3); mn = new QLineEdit(this); g->addWidget(mn,2,4); lbl = new QLabel(_("Ambient"),this); g->addWidget(lbl,3,0); amb = new QLineEdit(this); g->addWidget(amb,3,1); lbl = new QLabel(_("Diffuse"),this); g->addWidget(lbl,3,3); dif = new QLineEdit(this); g->addWidget(dif,3,4); lbl = new QLabel(_("Cutting"),this); g->addWidget(lbl,4,0); cut = new QComboBox(this); g->addWidget(cut,4,1); cut->insertItem(0,_("default")); cut->insertItem(1,_("on")); cut->insertItem(2,_("off")); lbl = new QLabel(_("Light"),this); g->addWidget(lbl,4,3); lig = new QComboBox(this); g->addWidget(lig,4,4); lig->insertItem(0,_("default")); lig->insertItem(1,_("on")); lig->insertItem(2,_("off")); lbl = new QLabel(_("Value"),this); g->addWidget(lbl,5,0); val = new QLineEdit(this); g->addWidget(val,5,1); lbl = new QLabel(_("Size"),this); g->addWidget(lbl,5,3); fs = new QLineEdit(this); g->addWidget(fs,5,4); a = new QHBoxLayout(); o->addLayout(a); lbl = new QLabel(_("Legend"),this); a->addWidget(lbl); leg = new QLineEdit(this); a->addWidget(leg); a = new QHBoxLayout(); o->addLayout(a); a->addStretch(1); b = new QPushButton(_("Cancel"), this); a->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(reject())); b = new QPushButton(_("OK"), this); a->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(prepareResult())); b->setDefault(true); } //----------------------------------------------------------------------------- OptionDialog::~OptionDialog() {} //----------------------------------------------------------------------------- void OptionDialog::prepareResult() { result = ""; if(!x1->text().isEmpty() && !x2->text().isEmpty()) result = result + "; xrange "+x1->text()+" "+x2->text(); if((x1->text().isEmpty()) ^ (x2->text().isEmpty())) { QMessageBox::warning(this,_("UDAV - command options"), _("Both fields in xrange must be filled")); return; } if(!y1->text().isEmpty() && !y2->text().isEmpty()) result = result + "; yrange "+y1->text()+" "+y2->text(); if((y1->text().isEmpty()) ^ (y2->text().isEmpty())) { QMessageBox::warning(this,_("UDAV - command options"), _("Both fields in yrange must be filled")); return; } if(!z1->text().isEmpty() && !z2->text().isEmpty()) result = result + "; zrange "+z1->text()+" "+z2->text(); if((z1->text().isEmpty()) ^ (z2->text().isEmpty())) { QMessageBox::warning(this,_("UDAV - command options"), _("Both fields in zrange must be filled")); return; } if(!c1->text().isEmpty() && !c2->text().isEmpty()) result = result + "; crange "+c1->text()+" "+c2->text(); if((c1->text().isEmpty()) ^ (c2->text().isEmpty())) { QMessageBox::warning(this,_("UDAV - command options"), _("Both fields in crange must be filled")); return; } if(!val->text().isEmpty()) result = result+"; value "+val->text(); if(!alpha->text().isEmpty())result = result+"; alpha "+alpha->text(); if(!amb->text().isEmpty()) result = result+"; ambient "+amb->text(); if(!dif->text().isEmpty()) result = result+"; diffuse "+dif->text(); if(!mn->text().isEmpty()) result = result+"; meshnum "+mn->text(); if(!fs->text().isEmpty()) result = result+"; size "+fs->text(); if(cut->currentIndex()==1) result = result+"; cut on"; if(cut->currentIndex()==2) result = result+"; cut off"; if(lig->currentIndex()==1) result = result+"; light on"; if(lig->currentIndex()==2) result = result+"; light off"; if(!leg->text().isEmpty()) result = result+"; legend '"+leg->text()+"'"; accept(); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/tree_pnl.h0000664000175000017500000000512614167366466015531 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TREE_PNL_H #define TREE_PNL_H //----------------------------------------------------------------------------- #include #include //----------------------------------------------------------------------------- class QMenu; class QBoxLayout; class OptionDialog; class NewCmdDialog; class PlotPanel; class TextEdit; //----------------------------------------------------------------------------- class TreePanel : public QWidget { Q_OBJECT public: // NOTE: these 3 pointers have to be filled!!! TextEdit *edit; ///< script itself PlotPanel *graph; NewCmdDialog *newCmdDlg; TreePanel(QWidget *parent = 0); ~TreePanel(); public slots: void refresh(); ///< refresh tree according new script void setPosition(int); ///< select item for given line number void hidePlot(int); ///< hide plot for given item void annotatePlot(int); ///< add annotation for given item void newCmd(); ///< add new command + refresh tree private: void toolTop(QBoxLayout *l); }; //----------------------------------------------------------------------------- #endif // TREE_PNL_H //----------------------------------------------------------------------------- mathgl-8.0.1/udav/text_pnl.h0000664000175000017500000000732714167366466015563 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef TEXT_PNL_H #define TEXT_PNL_H //----------------------------------------------------------------------------- #include #include #include "textedit.h" //----------------------------------------------------------------------------- class QMenu; class QPrinter; class QBoxLayout; class FindDialog; class OptionDialog; class StyleDialog; class SetupDialog; class NewCmdDialog; class PlotPanel; class SubplotDialog; //----------------------------------------------------------------------------- class TextPanel : public QWidget { Q_OBJECT public: QMenu *menu; TextEdit *edit; ///< script itself PlotPanel *graph; ///< NOTE: have to be filled!!! NewCmdDialog *newCmdDlg; SubplotDialog *subplotDlg; TextPanel(QWidget *parent = 0); ~TextPanel(); void load(const QString &fileName); void save(const QString &fileName); inline bool isModified() { return edit->document()->isModified(); } inline void setModified(bool m) { edit->document()->setModified(m); } inline void moveCursor(QTextCursor::MoveOperation c) { edit->moveCursor(c); } void setCompleter(bool en); QString selection(); signals: void setCurrentFile(const QString &s); void setStatus(const QString &s); public slots: void setEditorFont(QFont *f=0); // void setEditPos(bool bottom); void animPutText(const QString &); // void putText(const QString &txt); void putLine(const QString &txt, bool replace=false); void setCursorPosition(int); void addOptions(); void addStyle(); void insNVal(); void insFile(); void insPath(); void insFitF(); void insPrim(); void newCmd(int n=-1); void addSetup(); void refreshData(); void printText(); void find(); bool findText(const QString &str="", bool cs=false, bool fw=true); void replText(const QString &str, const QString &txt, bool cs=false, bool fw=true); private: QStringList words, vars; QPrinter *printer; FindDialog *findDialog; OptionDialog *optDialog; StyleDialog *stlDialog; QWidget *dataOpenDlg; SetupDialog *setupDlg; void toolTop(QBoxLayout *l); // void toolLeft(QBoxLayout *l); void saveHDF5(const QString &fileName); void loadHDF5(const QString &fileName); }; //----------------------------------------------------------------------------- #endif // TEXT_PNL_H //----------------------------------------------------------------------------- mathgl-8.0.1/udav/find_dlg.h0000664000175000017500000000474614167366466015476 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FIND_DLG_H #define FIND_DLG_H //----------------------------------------------------------------------------- #include class QCheckBox; class QLineEdit; class QPushButton; #if defined(_MSC_VER) #include #endif //----------------------------------------------------------------------------- /// Dialog for finding something in text class FindDialog : public QDialog { Q_OBJECT public: FindDialog(QWidget *parent = 0); ~FindDialog(); signals: void findText(const QString &str, bool cs, bool fw); void replText(const QString &str, const QString &txt, bool cs, bool fw); protected: void closeEvent(QCloseEvent *event); private slots: void findClicked(); void replClicked(); void enableFind(const QString &text); private: QLineEdit *line; QLineEdit *text; QCheckBox *caseUse; QCheckBox *backward; QPushButton *find; QPushButton *repl; QPushButton *cancel; }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/text_pnl.cpp0000664000175000017500000005361314167366466016115 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include "mgl2/qmathgl.h" //----------------------------------------------------------------------------- #include "udav_wnd.h" #include "qmglsyntax.h" #include "find_dlg.h" #include "opt_dlg.h" #include "style_dlg.h" #include "files_dlg.h" #include "newcmd_dlg.h" #include "setup_dlg.h" #include "text_pnl.h" #include "plot_pnl.h" #include "subplot_dlg.h" //----------------------------------------------------------------------------- FilesDialog *files_dlg=0; QString defFontFamily; int defFontSize; bool mglAutoExecute = true; extern mglParse parser; extern bool mglCompleter; QWidget *createDataOpenDlg(QWidget *p); QString getOpenDataFile(QWidget *w, QString filename); //----------------------------------------------------------------------------- TextPanel::TextPanel(QWidget *parent) : QWidget(parent) { printer = new QPrinter; findDialog = new FindDialog(this); optDialog = new OptionDialog(this); stlDialog = new StyleDialog(this); newCmdDlg = new NewCmdDialog(this); subplotDlg = new SubplotDialog(this); setupDlg = new SetupDialog(this); dataOpenDlg = createDataOpenDlg(this); if(!files_dlg) files_dlg= new FilesDialog; int n=parser.GetCmdNum(); for(int i=0;isetAcceptRichText(false); new QMGLSyntax(edit); defFontFamily = edit->fontFamily(); defFontSize = int(edit->fontPointSize()); edit->setLineWrapMode(QTextEdit::NoWrap); setCompleter(mglCompleter); QFontMetrics metrics(edit->currentFont()); edit->setTabStopDistance(4 * metrics.horizontalAdvance(' ')); menu = new QMenu(_("Edit"),this); QBoxLayout *v = new QVBoxLayout(this); toolTop(v); v->addWidget(edit); } //----------------------------------------------------------------------------- TextPanel::~TextPanel() { delete printer; } //----------------------------------------------------------------------------- void TextPanel::setCompleter(bool en) { if(en) { QCompleter *completer = new QCompleter(vars, this); completer->setCaseSensitivity(Qt::CaseInsensitive); completer->setCompletionMode(QCompleter::PopupCompletion); edit->setCompleter(completer); } else edit->setCompleter(0); // completer->setCompletionMode(en ? QCompleter::PopupCompletion : QCompleter::InlineCompletion); } //----------------------------------------------------------------------------- void TextPanel::insNVal() { QString sel=edit->textCursor().selectedText(); if(sel.isEmpty()) { QMessageBox::warning(this,_("UDAV"),_("There is no selection to evaluate.")); return; } wchar_t *txt=new wchar_t[sel.length()+1]; sel.toWCharArray(txt); txt[sel.length()]=0; mglData res=parser.Calc(txt); delete []txt; edit->textCursor().insertText(QString::number(res.GetVal(0))); } //----------------------------------------------------------------------------- void TextPanel::insPrim() { QString str(graph->mgl->primitives); if(str.isEmpty()) { QMessageBox::warning(this,_("UDAV"),_("There is manual primitives.")); return; } edit->moveCursor(QTextCursor::Start); edit->insertPlainText("subplot 1 1 0 '#'\n"+str+"subplot 1 1 0\n#----------\n"); graph->mgl->primitives = ""; } //----------------------------------------------------------------------------- void TextPanel::insFitF() { QString str(graph->getFit()); if(str.isEmpty()) { QMessageBox::warning(this,_("UDAV"),_("There is no fitted formula.")); return; } edit->textCursor().insertText("'"+str+"'"); } //----------------------------------------------------------------------------- void TextPanel::insFile() { QString str = QFileDialog::getOpenFileName(this, _("UDAV - Insert filename")); if(str.isEmpty()) return; edit->textCursor().insertText("'"+str+"'"); } //----------------------------------------------------------------------------- void TextPanel::insPath() { QString str = QFileDialog::getExistingDirectory(this, _("UDAV - Insert path")); if(str.isEmpty()) return; edit->textCursor().insertText("'"+str+"'"); } //----------------------------------------------------------------------------- void TextPanel::refreshData() { vars=words; long i,n=parser.GetNumVar(); for(i=0;iName())>2) vars<Name()); } setCompleter(mglCompleter); } //----------------------------------------------------------------------------- void TextPanel::printText() { QPrintDialog printDlg(printer, this); if (printDlg.exec() == QDialog::Accepted) { setStatus(_("Printing...")); edit->print(printer); setStatus(_("Printing completed")); } else setStatus(_("Printing aborted")); } //----------------------------------------------------------------------------- void TextPanel::find() { findDialog->show(); findDialog->raise(); findDialog->activateWindow(); } //----------------------------------------------------------------------------- bool TextPanel::findText(const QString &str, bool cs, bool fw) { // static int para=0, index=0; static QTextDocument::FindFlags f; static QString stri=""; if(!str.isEmpty()) { stri = str; f = QTextDocument::FindFlags(); if(fw) f = f|QTextDocument::FindBackward; if(cs) f = f|QTextDocument::FindCaseSensitively; } bool res = edit->find(stri, f); if(!res) QMessageBox::information(this, _("UDAV - find text"), _("No string occurrence is found")); return res; } //----------------------------------------------------------------------------- void TextPanel::replText(const QString &str, const QString &txt, bool cs, bool fw) { static bool res=false; if(str.isEmpty()) { res = false; return; } if(res) edit->textCursor().insertText(txt); res = findText(str, cs, fw); } //----------------------------------------------------------------------------- void TextPanel::addOptions() { if(optDialog->exec()==QDialog::Accepted) { edit->moveCursor(QTextCursor::EndOfLine); edit->insertPlainText(optDialog->getOption()); } } //----------------------------------------------------------------------------- void TextPanel::animPutText(const QString &s) { edit->moveCursor(QTextCursor::Start); edit->insertPlainText(s); } //----------------------------------------------------------------------------- //void TextPanel::putText(const QString &txt) { edit->insertPlainText(txt); } //----------------------------------------------------------------------------- void TextPanel::putLine(const QString &txt, bool replace) { edit->moveCursor(QTextCursor::StartOfLine); if(replace) { QTextCursor c = edit->textCursor(); c.select(QTextCursor::BlockUnderCursor); c.removeSelectedText(); edit->setTextCursor(c); if(c.atStart()) edit->insertPlainText(txt); else edit->insertPlainText("\n"+txt); } else edit->insertPlainText(txt+"\n"); } //----------------------------------------------------------------------------- void TextPanel::addStyle() { if(stlDialog->exec()==QDialog::Accepted) { QString s = edit->textCursor().block().text(); int i = s.indexOf(';'); if(i<0) edit->moveCursor(QTextCursor::EndOfLine); else { edit->moveCursor(QTextCursor::StartOfBlock); // foolish way :( for(;i>0;i--) edit->moveCursor(QTextCursor::Left); } edit->insertPlainText(stlDialog->getStyle()); } } //----------------------------------------------------------------------------- void TextPanel::setEditorFont(QFont *f) { QFont d(defFontFamily, defFontSize); edit->setFont(f ? *f : d); QFontMetrics metrics(f ? *f : d); edit->setTabStopDistance(4*metrics.horizontalAdvance(' ')); } //----------------------------------------------------------------------------- QString TextPanel::selection() { return edit->textCursor().block().text(); } //----------------------------------------------------------------------------- void TextPanel::setCursorPosition(int n) { if(n<0) return; edit->moveCursor(QTextCursor::Start); for(int i=0;imoveCursor(QTextCursor::NextBlock); edit->setFocus(); } //----------------------------------------------------------------------------- void TextPanel::newCmd(int n) { if(n>0) setCursorPosition(n-1); else if(n==0) return; newCmdDlg->parseCmd(edit->textCursor().block().text()); newCmdDlg->show(); } //----------------------------------------------------------------------------- #if MGL_HAVE_HDF5 // #define H5_USE_16_API #include void TextPanel::loadHDF5(const QString &fileName) { // H5T_C_S1 - C string hid_t hf,hg,hd,hs,ht; hsize_t dims[3]; long rank; hf = H5Fopen(fileName.toLocal8Bit().constData(), H5F_ACC_RDONLY, H5P_DEFAULT); if(!hf) return; hg = H5Gopen(hf, "/", H5P_DEFAULT); hsize_t num, nx, ny, nz, i; char name[256]; H5Gget_num_objs(hg, &num); for(i=0;imgl->primitives = str.section("subplot 1 1 0\n#----- End of QMathGL block -----\n",0,0).section("subplot 1 1 0 '#'\n",1); str = str.section("subplot 1 1 0\n#----- End of QMathGL block -----\n",1); } edit->setText(str); graph->animParseText(edit->toPlainText()); setCurrentFile(fileName); delete []buf; setStatus(QString(_("Loaded document %1")).arg(fileName)); if(mglAutoExecute) graph->execute(); } else if(H5Tget_class(ht)==H5T_FLOAT || H5Tget_class(ht)==H5T_INTEGER) { for(int j=0;name[j];j++) if(!isalnum(name[j])) name[j]='_'; mglData *v = (mglData*) parser.AddVar(name); nx = ny = nz = 1; if(rank>0 && rank<=3) { H5Sget_simple_extent_dims(hs,dims,0); switch(rank) { case 1: nx=dims[0]; break; case 2: nx=dims[1]; ny=dims[0]; break; case 3: nx=dims[2]; ny=dims[1]; nz=dims[0]; break; } v->Create(nx, ny, nz); #if MGL_USE_DOUBLE H5Dread(hd, H5T_NATIVE_DOUBLE, H5S_ALL, H5S_ALL, H5P_DEFAULT, v->a); #else H5Dread(hd, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, v->a); #endif } } H5Dclose(hd); H5Sclose(hs); H5Tclose(ht); } H5Gclose(hg); H5Fclose(hf); } //----------------------------------------------------------------------------- void TextPanel::saveHDF5(const QString &fileName) { hid_t hf,hd,hs; hsize_t dims[3]; long rank = 3; H5Eset_auto(0,0,0); hf = H5Fcreate(fileName.toLocal8Bit().constData(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if(hf<0) { setStatus(QString(_("Could not write to %1")).arg(fileName)); return; } { // save script QString txt; if(!graph->mgl->primitives.isEmpty()) txt += "subplot 1 1 0 '#'\n"+graph->mgl->primitives + "subplot 1 1 0\n#----- End of QMathGL block -----\n"; txt += edit->toPlainText(); dims[0] = txt.length()+1; char *buf = new char[dims[0]+1]; memcpy(buf, txt.toLocal8Bit().constData(), dims[0]); buf[dims[0]]=0; hs = H5Screate_simple(1, dims, 0); hd = H5Dcreate(hf, "mgl_script", H5T_C_S1, hs, H5P_DEFAULT,H5P_DEFAULT,H5P_DEFAULT); H5Dwrite(hd, H5T_C_S1, hs, hs, H5P_DEFAULT, buf); H5Dclose(hd); H5Sclose(hs); delete []buf; } long n = parser.GetNumVar(); char name[256]; for(long i=0;i(parser.GetVar(i)); mglData tmp; if(!v) { tmp.Set(parser.GetVar(i)); v = &tmp; } wcstombs(name,v->Name(),wcslen(v->Name())+1); if(v->nz==1 && v->ny == 1) { rank = 1; dims[0] = v->nx; } else if(v->nz==1) { rank = 2; dims[0] = v->ny; dims[1] = v->nx; } else { rank = 3; dims[0] = v->nz; dims[1] = v->ny; dims[2] = v->nx; } hs = H5Screate_simple(rank, dims, 0); hd = H5Dcreate(hf, name, H5T_IEEE_F32LE, hs, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); H5Dwrite(hd, H5T_NATIVE_FLOAT, hs, hs, H5P_DEFAULT, v->a); H5Dclose(hd); H5Sclose(hs); } H5Fclose(hf); setCurrentFile(fileName); setStatus(QString(_("File %1 saved")).arg(fileName)); return; } #else void TextPanel::saveHDF5(const QString &fileName){} void TextPanel::loadHDF5(const QString &fileName){} #endif //----------------------------------------------------------------------------- void TextPanel::load(const QString &fileName) { if(fileName.right(4).toLower()==".dat") { QString code = getOpenDataFile(dataOpenDlg, fileName); if(!code.isEmpty()) { setCurrentFile(fileName.left(fileName.length()-3)+"mgl"); edit->setText(code); } } else if(fileName.right(4).toLower()==".hdf" || fileName.right(3).toLower()==".h5") loadHDF5(fileName); else { QFile f(fileName); if(!f.open(QIODevice::ReadOnly)) { QMessageBox::warning(this,_("UDAV - open file"), _("Couldn't open file ") + QString("'") + fileName+"'", QMessageBox::Ok,0,0); return; } QTextStream ts(&f); ts.setAutoDetectUnicode(true); // ts.setCodec(QTextCodec::codecForLocale()); QString str=ts.readAll(); int narg=0,i=-1; if(str.contains('%')) { while((i = str.indexOf('%',i+1))>0) { char ch = str.at(i+1).toLatin1(); if(ch>='1' && ch<='9' && ch-'0'>narg) narg = ch-'0'; } if(narg>0) { files_dlg->setNumFiles(narg); if(!files_dlg->exec()) return; // nothing to do str = files_dlg->putFiles(str); } } if(str.contains("#----- End of QMathGL block -----\n")) { graph->mgl->primitives = str.section("#----- End of QMathGL block -----\n",0,0); str = str.section("#----- End of QMathGL block -----\n",1); } if(narg>0) setCurrentFile(fileName.left(fileName.length()-3)+"mgl"); edit->setText(str); graph->animParseText(edit->toPlainText()); if(narg==0) setCurrentFile(fileName); } setStatus(_("Loaded document ")+fileName); if(mglAutoExecute) graph->execute(); } //----------------------------------------------------------------------------- void TextPanel::save(const QString &fileName) { if(fileName.right(4)==".hdf" || fileName.right(3)==".h5") { saveHDF5(fileName); return; } QString text; if(!graph->mgl->primitives.isEmpty()) text += graph->mgl->primitives + "#----- End of QMathGL block -----\n"; text += edit->toPlainText(); QFile f(fileName); if(!f.open(QIODevice::WriteOnly)) { setStatus(QString(_("Could not write to %1")).arg(fileName)); return; } QTextStream t(&f); t.setAutoDetectUnicode(true); t << text; f.close(); setCurrentFile(fileName); setStatus(QString(_("File %1 saved")).arg(fileName)); } //----------------------------------------------------------------------------- void TextPanel::addSetup() { setupDlg->exec(); } //----------------------------------------------------------------------------- #include "xpm/option.xpm" #include "xpm/style.xpm" #include "xpm/curve.xpm" #include "xpm/box.xpm" //----------------------------------------------------------------------------- void TextPanel::toolTop(QBoxLayout *v) { QToolBar *t = new QToolBar(this); v->addWidget(t); t->setMovable(false); QAction *a, *aa; QMenu *o=menu, *oo; const MainWindow *mw=findMain(this); // general buttons if(mw) { t->addAction(mw->aload); t->addAction(mw->asave); t->addAction(mw->acalc); } QToolButton *bb = new QToolButton(this); bb->setPopupMode(QToolButton::MenuButtonPopup); t->addWidget(bb); // edit menu a = new QAction(QPixmap(":/png/edit-undo.png"), _("Undo"), this); connect(a, SIGNAL(triggered()), edit, SLOT(undo())); a->setToolTip(_("Undo editor change (Ctrl+Z).")); a->setShortcut(Qt::CTRL+Qt::Key_Z); o->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/edit-redo.png"), _("Redo"), this); connect(a, SIGNAL(triggered()), edit, SLOT(redo())); a->setToolTip(_("Redo editor change (Ctrl+Shift+Z).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_Z); o->addAction(a); t->addAction(a); o->addSeparator(); o->addAction(_("Clear all"), edit, SLOT(clear())); a = new QAction(QPixmap(":/png/edit-cut.png"), _("Cut text"), this); connect(a, SIGNAL(triggered()), edit, SLOT(cut())); a->setToolTip(_("Cut selected text to clipboard (Ctrl+X).")); a->setShortcut(Qt::CTRL+Qt::Key_X); o->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/edit-copy.png"), _("Copy text"), this); connect(a, SIGNAL(triggered()), edit, SLOT(copy())); a->setToolTip(_("Copy selected text or data to clipboard (Ctrl+C).")); a->setShortcut(Qt::CTRL+Qt::Key_C); o->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/edit-paste.png"), _("Paste text"), this); connect(a, SIGNAL(triggered()), edit, SLOT(paste())); a->setToolTip(_("Paste text or data from clipboard (Ctrl+V).")); a->setShortcut(Qt::CTRL+Qt::Key_V); o->addAction(a); t->addAction(a); o->addAction(QPixmap(":/png/edit-select-all.png"), _("Select all"), edit, SLOT(selectAll()), Qt::CTRL+Qt::Key_A); o->addSeparator(); a = new QAction(QPixmap(":/png/edit-find.png"), _("Find/Replace"), this); connect(a, SIGNAL(triggered()), this, SLOT(find())); a->setToolTip(_("Show dialog for text finding (Ctrl+F).")); a->setShortcut(Qt::CTRL+Qt::Key_F); o->addAction(a); t->addAction(a); a = new QAction(_("Find next"), this); connect(a, SIGNAL(triggered()), this, SLOT(findText())); a->setShortcut(Qt::Key_F3); o->addAction(a); o->addSeparator(); // insert menu oo = o->addMenu(_("Insert")); aa=a = new QAction(QPixmap(":/png/format-indent-more.png"), _("New command"), this); a->setShortcut(Qt::META+Qt::Key_C); connect(a, SIGNAL(triggered()), this, SLOT(newCmd())); a->setToolTip(_("Show dialog for new command or edit arguments of existed one.")); oo->addAction(a); a = new QAction(QPixmap(box_xpm), _("New inplot"), this); a->setShortcut(Qt::META+Qt::Key_C); connect(a, SIGNAL(triggered()), subplotDlg, SLOT(show())); a->setToolTip(_("Show dialog for new inplot and put it into the script.")); oo->addAction(a); a = new QAction(_("Fitted formula"), this); a->setShortcut(Qt::META+Qt::Key_F); connect(a, SIGNAL(triggered()), this, SLOT(insFitF())); a->setToolTip(_("Insert last fitted formula with found coefficients.")); oo->addAction(a); a = new QAction(QPixmap(style_xpm), _("Plot style"), this); a->setShortcut(Qt::META+Qt::Key_S); connect(a, SIGNAL(triggered()), this, SLOT(addStyle())); a->setToolTip(_("Show dialog for styles and put it into the script.\nStyles define the plot view (color scheme, marks, dashing and so on).")); oo->addAction(a); a = new QAction(QPixmap(option_xpm), _("Command options"), this); a->setShortcut(Qt::META+Qt::Key_O); connect(a, SIGNAL(triggered()), this, SLOT(addOptions())); a->setToolTip(_("Show dialog for options and put it into the script.\nOptions are used for additional setup the plot.")); oo->addAction(a); a = new QAction(_("Numeric value"), this); a->setShortcut(Qt::META+Qt::Key_N); connect(a, SIGNAL(triggered()), this, SLOT(insNVal())); a->setToolTip(_("Replace expression by its numerical value.")); oo->addAction(a); a = new QAction(QPixmap(":/png/text-csv.png"), _("File name"), this); a->setShortcut(Qt::META+Qt::Key_P); connect(a, SIGNAL(triggered()), this, SLOT(insFile())); a->setToolTip(_("Select and insert file name.")); oo->addAction(a); a = new QAction(QPixmap(":/png/folder.png"), _("Folder path"), this); connect(a, SIGNAL(triggered()), this, SLOT(insPath())); a->setToolTip(_("Select and insert folder name.")); oo->addAction(a); a = new QAction(QPixmap(curve_xpm), _("Manual primitives"), this); a->setShortcut(Qt::META+Qt::Key_P); connect(a, SIGNAL(triggered()), this, SLOT(insPrim())); a->setToolTip(_("Move mouse-handled primitives to script.")); oo->addAction(a); bb->setMenu(oo); bb->setDefaultAction(aa); a = new QAction(QPixmap(":/png/document-properties.png"), _("Graphics setup"), this); a->setShortcut(Qt::META+Qt::Key_G); connect(a, SIGNAL(triggered()), this, SLOT(addSetup())); a->setToolTip(_("Show dialog for plot setup and put code into the script.\nThis dialog setup axis, labels, lighting and other general things.")); o->addAction(a); t->addAction(a); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/mem_pnl.h0000664000175000017500000000433714167366466015353 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef MEM_PNL_H #define MEM_PNL_H #include class InfoDialog; class QTableWidget; //----------------------------------------------------------------------------- class MemPanel : public QWidget { Q_OBJECT public: QWidget *wnd; MemPanel(QWidget *parent = 0); public slots: void refresh(); ///< refresh list of variables private slots: void newTable(); void editData(int n=-1); void infoData(); void delAllData(); void delData(); void tableClicked(int row, int col); void tableDClicked(int row, int col); private: InfoDialog *infoDlg; ///< Data preview and information QTableWidget *tab; int colSort; }; //----------------------------------------------------------------------------- #endif // MEM_PNL_H //----------------------------------------------------------------------------- mathgl-8.0.1/udav/newcmd_dlg.cpp0000664000175000017500000003434614167366466016365 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include "newcmd_dlg.h" #include "opt_dlg.h" #include "style_dlg.h" #include "data_dlg.h" extern mglParse parser; extern QString pathHelp; //----------------------------------------------------------------------------- NewCmdDialog::NewCmdDialog(QWidget *p) : QDialog(p,Qt::WindowStaysOnTopHint) { replace = false; QPushButton *b; QToolButton *t; QHBoxLayout *m = new QHBoxLayout(this), *a; QVBoxLayout *o = new QVBoxLayout; m->addLayout(o); optDialog = new OptionDialog(this); stlDialog = new StyleDialog(this); datDialog = new DataDialog(this); type = new QComboBox(this); o->addWidget(type); type->setToolTip(_("Groups of MGL commands")); fillList(); name = new QComboBox(this); o->addWidget(name); name->setToolTip(_("MGL commands for selected group")); name->addItems(argn[0]); info = new QLabel(this); o->addWidget(info); info->setToolTip(_("Short description of selected command")); kind= new QComboBox(this); o->addWidget(kind); kind->addItem(""); kind->setToolTip(_("Kind of command argument order. The notation is:\n" " * Capital arguments are data (like, Ydat);\n" " * Argument in '' are strings (like, 'fmt');\n" " * Other arguments are numbers (like, zval);\n" " * Arguments in [] are optional arguments.")); args = new QTableWidget(this); o->addWidget(args); args->setToolTip(_("Command arguments. Bold ones are required arguments.\n" "Other are optional arguments but its order is required.\n" "You can use '' for default format. See help at right\nfor default values.")); QStringList sl; sl<<_("Argument")<<_("Value"); args->setHorizontalHeaderLabels(sl); connect(args,SIGNAL(cellDoubleClicked(int,int)), this, SLOT(insertData())); a = new QHBoxLayout; o->addLayout(a); b = new QPushButton(_("Options"),this); a->addWidget(b); b->setToolTip(_("Here you can specify command options.\nOptions are used for additional plot tunning.")); connect(b, SIGNAL(clicked()),this,SLOT(insertOpt())); opt = new QLineEdit(this); a->addWidget(opt); a = new QHBoxLayout; o->addLayout(a); b = new QPushButton(_("Cancel"),this); a->addWidget(b); connect(b, SIGNAL(clicked()), this, SLOT(reject())); b = new QPushButton(_("OK"),this); a->addWidget(b); connect(b, SIGNAL(clicked()), this, SLOT(finish())); o = new QVBoxLayout; m->addLayout(o,1); a = new QHBoxLayout; o->addLayout(a); help = new QTextBrowser(this); help->setMinimumWidth(500); help->setOpenExternalLinks(false); o->addWidget(help); t = new QToolButton(p); t->setIcon(QPixmap(":/png/go-previous.png")); connect(t, SIGNAL(clicked()), help, SLOT(backward())); a->addWidget(t); t = new QToolButton(p); t->setIcon(QPixmap(":/png/go-next.png")); connect(t, SIGNAL(clicked()), help, SLOT(forward())); a->addWidget(t); a->addStretch(1); t = new QToolButton(p); t->setIcon(QPixmap(":/png/zoom-in.png")); connect(t, SIGNAL(clicked()), this, SLOT(zoomIn())); a->addWidget(t); t = new QToolButton(p); t->setIcon(QPixmap(":/png/zoom-out.png")); connect(t, SIGNAL(clicked()), this, SLOT(zoomOut())); a->addWidget(t); connect(type, SIGNAL(currentIndexChanged(int)),this,SLOT(typeChanged(int))); connect(name, SIGNAL(currentIndexChanged(int)),this,SLOT(nameChanged(int))); connect(kind, SIGNAL(currentIndexChanged(int)),this,SLOT(kindChanged(int))); type->setCurrentIndex(0); typeChanged(0); setWindowTitle(_("New command")); } //----------------------------------------------------------------------------- void NewCmdDialog::zoomIn() { QFont f(help->font()); f.setPointSize(f.pointSize()+1); help->setFont(f); } //----------------------------------------------------------------------------- void NewCmdDialog::zoomOut() { QFont f(help->font()); f.setPointSize(f.pointSize()-1); help->setFont(f); } //----------------------------------------------------------------------------- void NewCmdDialog::parseCmd(const QString &txt) { QString str = txt.trimmed().section(':',0,0); QRegExp sep("[ \t]"); QString cmd = str.section(sep,0,0),a,b; bool opt,var,chr; replace = false; for(int i=0;i<17;i++) { if(cmds[i].contains(cmd)) // find command first { typeChanged(i); name->setCurrentIndex(cmds[i].indexOf(cmd)); int j0=-1,k0=-1,k; for(int j=0;jk0)) { j0=j; k0=k; } } if(j0>=0) // best choice { kind->setCurrentIndex(j0); for(int k=0;kitem(k,1)->setText(str.section(sep,k+1,k+1).trimmed()); } replace = true; return; // selection is done } } } //----------------------------------------------------------------------------- #include "xpm/preview.xpm" #include "xpm/text.xpm" #include "xpm/table.xpm" #include "xpm/oper_dir.xpm" #include "xpm/axis.xpm" #include "xpm/axis_sh.xpm" #include "xpm/plot.xpm" #include "xpm/box.xpm" #include "xpm/curve.xpm" #include "xpm/other.xpm" #include "xpm/vect.xpm" #include "xpm/tiles.xpm" //----------------------------------------------------------------------------- void NewCmdDialog::fillList() { type->addItem(QPixmap(plot_xpm), _("1D plots")); type->addItem(QPixmap(preview_xpm), _("2D plots")); type->addItem(QPixmap(":/png/weather-clouds.png"), _("3D plots")); type->addItem(QPixmap(tiles_xpm), _("Dual plots")); type->addItem(QPixmap(vect_xpm), _("Vector plots")); type->addItem(QPixmap(other_xpm), _("Other plots")); type->addItem(QPixmap(text_xpm), _("Text and legend")); type->addItem(QPixmap(table_xpm), _("Create data and I/O")); type->addItem(QPixmap(oper_dir_xpm), _("Data transform")); type->addItem(QPixmap(oper_dir_xpm), _("Data handling")); type->addItem(QPixmap(axis_xpm), _("Axis and colorbar")); type->addItem(QPixmap(axis_sh_xpm), _("Axis setup")); type->addItem(QPixmap(":/png/preferences-system.png"), _("General setup")); type->addItem(QPixmap(box_xpm), _("Scale and rotate")); type->addItem(QPixmap(":/png/media-playback-start.png"), _("Program flow")); type->addItem(QPixmap(curve_xpm), _("Primitives")); // now fill it automatically from parser for all categories long i, n = parser.GetCmdNum(); for(i=0;i16) return; name->clear(); name->addItems(cmds[s]); name->setCurrentIndex(0); } //----------------------------------------------------------------------------- void parse(QStringList &sl, const QString &s) { sl.clear(); int i, ex=0, i1=0; bool op=false, sp=true; for(i=0;iitemText(s), par, a; int k; if(n.isEmpty()) return; QStringList ss; ss<<(pathHelp); help->setSearchPaths(ss); help->setSource(_("mgl_en")+QString(".html#")+n); // clear old kind->clear(); kinds.clear(); for(k=0;ksetText(parser.CmdDesc(cmd)); par = parser.CmdFormat(cmd); int i0 = par.indexOf(' '); // first space if present if(i0<0) { kind->addItem(par); return; } // no arguments // parse kind of arguments par = par.mid(i0); for(k=0;kaddItems(kinds); kind->setCurrentIndex(0); replace = false; } //----------------------------------------------------------------------------- void NewCmdDialog::kindChanged(int s) { if(s<0 || s>NUM_CH-1) return; cmd=""; int nn = argn[s].count(); QStringList lst; for(int i=0;irowCount();i++) lst<item(i,0)->text()+"~ "+args->item(i,1)->text(); //return; args->setRowCount(nn); args->setColumnCount(2); QTableWidgetItem *it; QFont f; for(int i=0;isetItem(i,0,it); it = new QTableWidgetItem; args->setItem(i,1,it); QString a = argn[s].at(i); bool optional = (a[0]=='_' || a[0]=='+'); if(optional) a=a.mid(1); f.setItalic(a[0].isUpper()); f.setBold(!optional); args->item(i,0)->setText(a); args->item(i,0)->setFont(f); args->item(i,0)->setFlags(Qt::ItemIsEnabled); args->item(i,1)->setFlags(Qt::ItemIsEditable|Qt::ItemIsEnabled); for(int j=0;jitem(i,1)->setText(lst[j].section('~',1).trimmed()); } } //----------------------------------------------------------------------------- void NewCmdDialog::insertOpt() { if(optDialog->exec()) opt->setText(optDialog->getOption()); } //----------------------------------------------------------------------------- void NewCmdDialog::insertData() { int row = args->currentRow(); if(row<0) { QMessageBox::warning(this,_("New command"), _("No argument is selected")); return; } QString a = args->item(row,0)->text(); if(a[0].isUpper()) { if(datDialog->exec()) args->item(row,1)->setText(datDialog->getData()); } else if(a=="'fmt'" || a=="_'fmt'") { if(stlDialog->exec()) args->item(row,1)->setText(stlDialog->getStyle()); } else if(a=="'file'") { QString str = QFileDialog::getOpenFileName(this, _("UDAV - Insert filename")); if(!str.isEmpty()) args->item(row,1)->setText(str); } else if(a=="'path'") { QString str = QFileDialog::getExistingDirectory(this, _("UDAV - Insert path")); if(!str.isEmpty()) args->item(row,1)->setText(str); } } //----------------------------------------------------------------------------- void NewCmdDialog::insertStl() { int s=kind->currentIndex(); if(s<0 || s>4) { QMessageBox::warning(this,_("New command"), _("Select first the proper kind of arguments")); return; } if(!argn[s].contains("'fmt'") && !argn[s].contains("_'fmt'")) { QMessageBox::warning(this,_("New command"), _("There is no 'fmt' argument for this command")); return; } int i; i = argn[s].indexOf("'fmt'"); if(i<0) i = argn[s].indexOf("_'fmt'"); if(!stlDialog->exec()) args->item(i,1)->setText(stlDialog->getStyle()); } //----------------------------------------------------------------------------- void NewCmdDialog::finish() { QString txt,cur; int s = kind->currentIndex(); if(s<0 || s>4) { QMessageBox::warning(this,_("New command"), _("Select first the proper kind of arguments")); cmd=""; return; } cmd = name->currentText(); int n = argn[s].count(), i; bool op=false; for(i=0;iitem(i,1)->text(); if(txt.isEmpty()) { if(cur[0]!='_' && cur[0]!='+') { QMessageBox::warning(this,_("New command"), _("You should specify required argument ")+cur); cmd=""; return; } if(argn[s].at(i)[0]=='_') op = true; } else { if(cur[0]=='\'' && txt[0]!='\'') { QMessageBox::warning(this,_("New command"), _("You should put text inside ' ' for argument ")+cur); cmd=""; return; } if(cur[1]=='\'' && txt[0]!='\'') { QMessageBox::warning(this,_("New command"), _("You should put text inside ' ' for argument ")+cur.mid(1)); cmd=""; return; } if(cur[0]=='_' && op) { QMessageBox::warning(this,_("New command"), _("You should specify all optional arguments before ")+cur.mid(1)); cmd=""; return; } cmd = cmd + ' ' + txt; } } cmd = cmd + opt->text(); accept(); emit result(cmd, replace); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/data_dlg.h0000664000175000017500000000467414167366466015467 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef DATADIALOG_H #define DATADIALOG_H //----------------------------------------------------------------------------- #include class QComboBox; class QLineEdit; class QSpinBox; class QLabel; class QShowEvent; //----------------------------------------------------------------------------- /// Selecting styles of command (like line style, color scheme, font style, axis style) class DataDialog : public QDialog { Q_OBJECT public: QString getData() { return result; }; void updateNames(); DataDialog(QWidget *parent = 0); ~DataDialog(){}; protected: virtual void showEvent(QShowEvent *ev) { updateNames(); QDialog::showEvent(ev); } private slots: void nameChanged(); void updateRes(); void userRes(); private: QString result; QComboBox *name, *oper, *dirs; QLineEdit *res; QSpinBox *x1, *y1, *z1, *x2, *y2, *z2; QLabel *sizes; }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/textedit.cpp0000664000175000017500000003242614167366466016111 0ustar balakinbalakin/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor ** the names of its contributors may be used to endorse or promote ** products derived from this software without specific prior written ** permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** $QT_END_LICENSE$ ** ****************************************************************************/ #include "textedit.h" #include #include #include #include #include #include #include #include #include #include #include #include extern QColor mglColorScheme[10]; //----------------------------------------------------------------------------- TextEdit::TextEdit(QWidget *parent) : QTextEdit(parent) { c=0; connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(highlight())); // Line numbers lineNumberArea = new LineNumberArea(this); connect(document(), SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberAreaWidth(int))); connect(document(), SIGNAL(blockCountChanged(int)), this, SLOT(updateLineNumberArea(int))); connect(verticalScrollBar(), SIGNAL(valueChanged(int)), this, SLOT(updateLineNumberArea(int))); connect(this, SIGNAL(textChanged()), this, SLOT(updateLineNumberArea())); connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(updateLineNumberArea())); updateLineNumberAreaWidth(0); } //----------------------------------------------------------------------------- void TextEdit::highlight() { QList extraSelections; if (!isReadOnly()) { QTextEdit::ExtraSelection selection; selection.format.setBackground(mglColorScheme[9]); selection.format.setProperty(QTextFormat::FullWidthSelection, true); selection.cursor = textCursor(); selection.cursor.clearSelection(); extraSelections.append(selection); } setExtraSelections(extraSelections); } //----------------------------------------------------------------------------- void TextEdit::setCompleter(QCompleter *completer) { if(c && c!=completer) { QObject::disconnect(c); c->setWidget(0); delete c; c=0; } if(!completer) return; c = completer; c->setWidget(this); c->setCompletionMode(QCompleter::PopupCompletion); c->setCaseSensitivity(Qt::CaseInsensitive); QObject::connect(c, SIGNAL(activated(QString)), this, SLOT(insertCompletion(QString))); } //----------------------------------------------------------------------------- void TextEdit::insertCompletion(const QString& completion) { if (!c || c->widget() != this) return; QTextCursor tc = textCursor(); int extra = completion.length() - c->completionPrefix().length(); tc.movePosition(QTextCursor::Left); tc.movePosition(QTextCursor::EndOfWord); tc.insertText(completion.right(extra)); setTextCursor(tc); } //----------------------------------------------------------------------------- QString TextEdit::textUnderCursor() const { QTextCursor tc = textCursor(); tc.select(QTextCursor::WordUnderCursor); return tc.selectedText(); } //----------------------------------------------------------------------------- void TextEdit::focusInEvent(QFocusEvent *e) { if (c) c->setWidget(this); QTextEdit::focusInEvent(e); } //----------------------------------------------------------------------------- void TextEdit::keyPressEvent(QKeyEvent *e) { if (c && c->popup()->isVisible()) { // The following keys are forwarded by the completer to the widget switch (e->key()) { case Qt::Key_Enter: case Qt::Key_Return: case Qt::Key_Escape: case Qt::Key_Tab: case Qt::Key_Backtab: e->ignore(); return; // let the completer do default behavior default: break; } } bool isShortcut = ((e->modifiers() & Qt::ControlModifier) && e->key() == Qt::Key_E); // CTRL+E if (!c || !isShortcut) // do not process the shortcut when we have a completer QTextEdit::keyPressEvent(e); const bool ctrlOrShift = e->modifiers() & (Qt::ControlModifier | Qt::ShiftModifier); if (!c || (ctrlOrShift && e->text().isEmpty())) return; static QString eow("~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word bool hasModifier = (e->modifiers() != Qt::NoModifier) && !ctrlOrShift; QString completionPrefix = textUnderCursor(); if (!isShortcut && (hasModifier || e->text().isEmpty()|| completionPrefix.length() < 3 || eow.contains(e->text().right(1)))) { c->popup()->hide(); return; } if (completionPrefix != c->completionPrefix()) { c->setCompletionPrefix(completionPrefix); c->popup()->setCurrentIndex(c->completionModel()->index(0, 0)); } QRect cr = cursorRect(); cr.setWidth(c->popup()->sizeHintForColumn(0) + c->popup()->verticalScrollBar()->sizeHint().width()); c->complete(cr); // popup it up! } //----------------------------------------------------------------------------- // // Line numbering (slightly modified code of Gauthier Boaglio) // Original: https://stackoverflow.com/questions/2443358/how-to-add-lines-numbers-to-qtextedit/ // //----------------------------------------------------------------------------- int TextEdit::lineNumberAreaWidth() { int digits = 1; int max = qMax(1, document()->blockCount()); while (max >= 10) { max /= 10; ++digits; } int space = 13 + fontMetrics().horizontalAdvance(QLatin1Char('9'))*digits; return space; } //----------------------------------------------------------------------------- void TextEdit::updateLineNumberAreaWidth(int /* newBlockCount */) { setViewportMargins(lineNumberAreaWidth(), 0, 0, 0); } //----------------------------------------------------------------------------- void TextEdit::updateLineNumberArea(QRectF /*rect_f*/) { TextEdit::updateLineNumberArea(); } //----------------------------------------------------------------------------- void TextEdit::updateLineNumberArea(int /*slider_pos*/) { TextEdit::updateLineNumberArea(); } //----------------------------------------------------------------------------- void TextEdit::updateLineNumberArea() { /* When the signal is emitted, the sliderPosition has been adjusted according to the action, * but the value has not yet been propagated (meaning the valueChanged() signal was not yet emitted), * and the visual display has not been updated. In slots connected to this signal you can thus safely * adjust any action by calling setSliderPosition() yourself, based on both the action and the * slider's value. */ // Make sure the sliderPosition triggers one last time the valueChanged() signal with the actual value !!!! verticalScrollBar()->setSliderPosition(verticalScrollBar()->sliderPosition()); // Since "QTextEdit" does not have an "updateRequest(...)" signal, we chose // to grab the imformations from "sliderPosition()" and "contentsRect()". // See the necessary connections used (Class constructor implementation part). QRect rect = contentsRect(); lineNumberArea->update(0, rect.y(), lineNumberArea->width(), rect.height()); updateLineNumberAreaWidth(0); //---------- int dy = verticalScrollBar()->sliderPosition(); if (dy > -1) { lineNumberArea->scroll(0, dy); } // Addjust slider to alway see the number of the currently being edited line... int first_block_id = getFirstVisibleBlockId(); if (first_block_id == 0 || textCursor().block().blockNumber() == first_block_id-1) verticalScrollBar()->setSliderPosition(dy-document()->documentMargin()); } //----------------------------------------------------------------------------- void TextEdit::resizeEvent(QResizeEvent *e) { QTextEdit::resizeEvent(e); QRect cr = contentsRect(); lineNumberArea->setGeometry(QRect(cr.left(), cr.top(), lineNumberAreaWidth(), cr.height())); } //----------------------------------------------------------------------------- int TextEdit::getFirstVisibleBlockId() { // Detect the first block for which bounding rect - once translated // in absolute coordinated - is contained by the editor's text area // Costly way of doing but since "blockBoundingGeometry(...)" doesn't // exists for "QTextEdit"... QTextCursor curs = QTextCursor(document()); curs.movePosition(QTextCursor::Start); for(int i=0; i < document()->blockCount(); ++i) { QTextBlock block = curs.block(); QRect r1 = viewport()->geometry(); QRect r2 = document()->documentLayout()->blockBoundingRect(block).translated( viewport()->geometry().x(), viewport()->geometry().y() - ( verticalScrollBar()->sliderPosition() ) ).toRect(); if (r1.contains(r2, true)) { return i; } curs.movePosition(QTextCursor::NextBlock); } return 0; } //----------------------------------------------------------------------------- void TextEdit::lineNumberAreaPaintEvent(QPaintEvent *event) { verticalScrollBar()->setSliderPosition(verticalScrollBar()->sliderPosition()); QPainter painter(lineNumberArea); painter.fillRect(event->rect(), Qt::lightGray); int blockNumber = getFirstVisibleBlockId(); QTextBlock block = document()->findBlockByNumber(blockNumber); QTextBlock prev_block = (blockNumber > 0) ? document()->findBlockByNumber(blockNumber-1) : block; int translate_y = (blockNumber > 0) ? -verticalScrollBar()->sliderPosition() : 0; int top = viewport()->geometry().top(); // Adjust text position according to the previous "non entirely visible" block // if applicable. Also takes in consideration the document's margin offset. int additional_margin; if (blockNumber == 0) // Simply adjust to document's margin additional_margin = (int) document()->documentMargin() -1 - verticalScrollBar()->sliderPosition(); else // Getting the height of the visible part of the previous "non entirely visible" block additional_margin = (int) document()->documentLayout()->blockBoundingRect(prev_block) .translated(0, translate_y).intersected(viewport()->geometry()).height(); top += additional_margin; // Shift the starting point int bottom = top + (int) document()->documentLayout()->blockBoundingRect(block).height(); QColor colErr(255, 0, 0); // Error line QColor colCur(0, 128, 255); // Current line QColor colDef(0,0,0); // Other lines // Draw the numbers (displaying the current line number in green) while (block.isValid() && top <= event->rect().bottom()) { if (block.isVisible() && bottom >= event->rect().top()) { QString number = QString::number(blockNumber + 1); painter.setPen(QColor(120, 120, 120)); painter.setPen((textCursor().blockNumber() == blockNumber) ? colCur : (isErrLine(blockNumber+1)?colErr:colDef) ); painter.drawText(-5, top, lineNumberArea->width(), fontMetrics().height(), Qt::AlignRight, number); } block = block.next(); top = bottom; bottom = top + (int) document()->documentLayout()->blockBoundingRect(block).height(); blockNumber++; } } //----------------------------------------------------------------------------- bool TextEdit::isErrLine(int line) const { for(size_t i=0;ilineNumberAreaWidth(), 0); } //----------------------------------------------------------------------------- void LineNumberArea::paintEvent(QPaintEvent *event) { codeEditor->lineNumberAreaPaintEvent(event); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/udav.png0000664000175000017500000001005314167366466015210 0ustar balakinbalakinPNG  IHDR@@iqIDATxky̜3{k1^6 ń YF %TJBܴJR`{%A UBH-@ Ji┛0 B_v˹s;0眝}wTGz4sn3#A rxͼ* f¸kfs-d\glPy>¸s- ArFZŸ`^Iay!n\Μ /]>"&! !RJT!QK]oB!<;tSj59g^d^n\i\˝ 8@eG6 H^1w۶mr X":|ᕽ)(@8 l,)c 1?Iϖ-Wpp%P(@uq˶' KUFB@0Tg0P@&VC1wG0g7"`nz9 ( RUODU)].^H2L! 4-S7"J "c!lPJ*-c[߈5!;\PyPA0RMя)4w78OU2f݂ `Pt_e0P a͎21|z ڋ):dR JH}wcu.a Q0+28;_ OeBIըQM0fXD.$Bv&;=ɛoc8;^nm,j˜W(9j툰hhhI07lxO.>o84~'`0oe\ADE㟥RIǡT:Cp]σ+@Be5"jvD`"Td  D"/y^ HnW_}5= Yry6LO9r=*/]֍l4G5a|;?_.0_DU= ҮAI9,+):t_|[mmc'\}× E8oN󟇡!L  /V5ޮӱ,Q}UXn["[ 2~!"H ]EWWfid?qdTV͸'?R>}oq\E6JI2kۤzfҝU3d߿24\t:C:&r]qb8:إZQ*)(򌍍S,un21 DayB]Q NgYx*]]r9\.G.;:ttI!dRnd+p]TЇ£3rpQ՛ + "UaN6腴Ue:lL&K&!NL& r0 b1x$L:: ^X:xN<4'I&Z3mza`D~(=˗wNg0M!UgjJRT4^+u ʼnMR$Ll6COO>_bx. ~;x")* Rz}_nرcntz@XUha٠ZJe3G2DxϠ-m뺸y4]0x4d2;vla`Ϟy」 JctW<^}U<ٳ_[%*I,BŅ $rGuwwёEujlj>>."C:= 4 ]׹;پkw_ѣGIJ9]}Ua^޽{9p+L2P"ܨZo4Md <([) KB˲zXljdf;馻, (J02r᷽9>qիWuVnjO> !{=FF15Uƶ-]>V\ڵ38C?p>ӧ9qrΜchȿ޺uw>C.cժwT\daX $ZWJRitڥRI1>>xF\|񊖯7M'2~X[A> 'NLpqΝ;8SSe0 :ccYjRDP`|RΞ]͂AXnAk胓'OR}SaPK \?SضE8dT*(bd2ي )}ƛ>?| <JEij*m7o;|5lӾH\murz CCll )-{"-~i-Vo~i~=BCeu,R#۶U{!4mM +Z.u]qj8N/CC͆ PV2jx*){ӆqt `YuU4Mk6ɖa!/Hzzcs]X繁k`D^6l5k`rr=R'g";!l ّM!LYT]lf[07/ހ 8}_7K䚶_ֶ*1\%HӬ^K§? ]]בɤoro"e %oTUeBBpcu)w}PVqf7l\s3CIz{J,bFȓm0+6uv)3i8ί+fvȐTu B3gNё%]I{-iI19ø\ x9! G_,6A2^zzzZa{^gr28㌌#0*vP226(,m}jNX ͣ=0(N<0 АRwVz²,jo% ϚkBzQx!jya4,дGbZ;b žΙS[ۆb)aQjw$}b`$=2E2)m߫kn7,lf#ˇҵ{`BTm} Kp<0.fVYc32.5HpB R d(Q}gT0M#bOFG%` mDDŊ pGgU9^x{}b_ '0#DIENDB`IENDB`mathgl-8.0.1/udav/qmglsyntax.h0000664000175000017500000000447414167366466016135 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef QMGLSYNTAX_H #define QMGLSYNTAX_H //----------------------------------------------------------------------------- #include #include #include #include //----------------------------------------------------------------------------- ///Syntax highlighter for MGL script language. class QMGLSyntax : public QSyntaxHighlighter { public: QMGLSyntax(QTextEdit *textEdit); void highlightBlock(const QString &text); }; //----------------------------------------------------------------------------- ///Syntax highlighter for messages window. class MessSyntax : public QSyntaxHighlighter { public: MessSyntax(QTextEdit *textEdit); void highlightBlock(const QString &text); }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/udav.ico0000664000175000017500000004107614167366466015207 0ustar balakinbalakin@@ (B(@         "$&&''((&%#"    #&(+.0012220/-+*&"   $)-/258;;<===;98640,($!  $(-27:=@CFGGHIHGECA>:62.*$   "(-27<AEHKORSSTUTRPNMID@<82,'!    WZ]_``a`^\ZXTOKFB;5/)$33FFTTWWPP>>** lmmmkigd_[VRLE>8 66__rrAA zywusokfa\UOH ++QQ?? {vrmg` %%DDttRR   } ##AAllFF  %%++006677886633--&&   &&AAkkTT""  AAHHQQZZffrrggTTCC00""  **IIss\\&& --77KK``rrmmKK22  66VV^^&&   ##77KK\\eeddZZII88((**@@dd[[88 --FFjjUU!!   ++==KKKK==%% %%rrVV00 ,,AAbbEE.% ))88<<11 LLss>> hh.. =3)   #!!//22** kkDD ~~BBWLA6," '1$$--..++**++,,,,**((%%""  ##''--44@@AA?? DDsg[PD9/& )3>##..55::??DDGGIIIIHHHHFFGGGGJJLLRRXXbbnn{{??pp//ll::wk_SH=3)   !+5@L ,,99EEQQ\\eellssxx||^^LL{ocWLA6,#  #-8CNZf **<>vi]QE:/%  #-8CNZfr>>66sg[PD9.$  !+5@LXdp|Ń SS{ocWLA6,#  )3>IU`lw ==yy99wk_SH=3)  '1;EP[fr}88LLqq**~sg[PD:/& #-6@KValx &&wmbWLA6,"   (2<FQ\gr|--GG|qf\QG=3)  $-7ALWakt~ YYuj`UKA7.%  )2<FPYcmwhh''wndZOE;2)!  %.6?HR\eox]]++wne\SI?5,$   (08AKT^fnwyyxof]TKC90'  ")2:DMU]emu|{tnf]TLC;3+"  #+4=DLT\dlqw}}xqjc\ULC;3+$  %-4<CKRZaflrx{~wrmg`YRKD<4,%   &,3:BIPV\aglorkfb]VOHB;4,%  %+29@FKQV\`cf  _[VRLE?82,%  #*16;AFLQTW[$$55CCKKII??//TPKGB<5/*$  "(-27<AEHLOBBmmUU,,IE@<83-'!   $)-27:=@C JJff((A>:62.*$   $)-0368;ii<<8640,(%!  !#&)+.011,,IIAA/-,*&#  "$&&'((('%#"         ????mathgl-8.0.1/udav/files_dlg.cpp0000664000175000017500000001103614167366466016201 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include "files_dlg.h" #include "mgl2/define.h" //----------------------------------------------------------------------------- FilesDialog::FilesDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(_("UDAV - Set template parameters")); QHBoxLayout *h; QVBoxLayout *v; QGridLayout *g; QLabel *l; QPushButton *b; v = new QVBoxLayout(this); g = new QGridLayout(); v->addLayout(g); l = new QLabel(_("String for %1"), this); g->addWidget(l, 0, 0); a[0] = new QLineEdit(this); g->addWidget(a[0], 1, 0); l = new QLabel(_("String for %2"), this); g->addWidget(l, 0, 1); a[1] = new QLineEdit(this); g->addWidget(a[1], 1, 1); l = new QLabel(_("String for %3"), this); g->addWidget(l, 2, 0); a[2] = new QLineEdit(this); g->addWidget(a[2], 3, 0); l = new QLabel(_("String for %4"), this); g->addWidget(l, 2, 1); a[3] = new QLineEdit(this); g->addWidget(a[3], 3, 1); l = new QLabel(_("String for %5"), this); g->addWidget(l, 4, 0); a[4] = new QLineEdit(this); g->addWidget(a[4], 5, 0); l = new QLabel(_("String for %6"), this); g->addWidget(l, 4, 1); a[5] = new QLineEdit(this); g->addWidget(a[5], 5, 1); l = new QLabel(_("String for %7"), this); g->addWidget(l, 6, 0); a[6] = new QLineEdit(this); g->addWidget(a[6], 7, 0); l = new QLabel(_("String for %8"), this); g->addWidget(l, 6, 1); a[7] = new QLineEdit(this); g->addWidget(a[7], 7, 1); l = new QLabel(_("String for %9"), this); g->addWidget(l, 8, 0); a[8] = new QLineEdit(this); g->addWidget(a[8], 9, 0); h = new QHBoxLayout(); h->addStretch(1); v->addLayout(h); b = new QPushButton(_("Cancel"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(reject())); b = new QPushButton(_("OK"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(putArguments())); b->setDefault(true); narg=0; } //----------------------------------------------------------------------------- FilesDialog::~FilesDialog() {} //----------------------------------------------------------------------------- void FilesDialog::putArguments() { for(int i=0;i<9;i++) s[i] = a[i]->text(); accept(); } //----------------------------------------------------------------------------- void FilesDialog::setNumFiles(int n) { for(int i=0;i<9;i++) a[i]->setEnabled(i9) narg=9; } //----------------------------------------------------------------------------- QString FilesDialog::putFiles(const QString &str) { QString res=str; switch(narg) { case 1: res = str.arg(s[0]); break; case 2: res = str.arg(s[0],s[1]); break; case 3: res = str.arg(s[0],s[1],s[2]); break; case 4: res = str.arg(s[0],s[1],s[2],s[3]); break; case 5: res = str.arg(s[0],s[1],s[2],s[3],s[4]); break; case 6: res = str.arg(s[0],s[1],s[2],s[3],s[4],s[5]); break; case 7: res = str.arg(s[0],s[1],s[2],s[3],s[4],s[5],s[6]); break; case 8: res = str.arg(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7]); break; case 9: res = str.arg(s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7],s[8]); break; } return res; } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/hint_dlg.h0000664000175000017500000000445014167366466015510 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef HINT_DLG_H #define HINT_DLG_H //----------------------------------------------------------------------------- #include #include class QCheckBox; //----------------------------------------------------------------------------- /// Dialog for showing hints class HintDialog : public QDialog { Q_OBJECT public: HintDialog(QWidget *parent = 0); ~HintDialog() {} protected: void closeEvent(QCloseEvent *event); private slots: void nextClicked() { cur = (cur+1)%numHints; text->setText(hints[cur]); } void prevClicked() { cur = (cur+numHints-1)%numHints; text->setText(hints[cur]); } private: int cur; int numHints; QVector hints; QTextEdit *text; QCheckBox *start; }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/plot_pnl.cpp0000664000175000017500000006517714167366466016117 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "udav_wnd.h" #include "mgl2/qmathgl.h" #include "plot_pnl.h" #include "anim_dlg.h" #include "style_dlg.h" #include "newcmd_dlg.h" #include "subplot_dlg.h" #undef sprintf extern bool mglAutoSave; extern bool mglHighlight; extern bool mglDotsRefr; extern mglParse parser; int animDelay=500; void raisePanel(QWidget *w); //----------------------------------------------------------------------------- PlotPanel::PlotPanel(QWidget *parent) : QWidget(parent) { gifOn = jpgOn = false; animDialog = new AnimParam(this); animPos = -1; stlDialog = new StyleDialog(this); newCmdDlg = new NewCmdDialog(this); subplotDlg = new SubplotDialog(this); printer = new QPrinter; curPos = subId = -1; timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(next())); connect(animDialog, SIGNAL(putText(const QString &)), this, SLOT(animText(const QString &))); connect(newCmdDlg, SIGNAL(result(const QString&, bool)), this, SLOT(putCmd(const QString&))); connect(subplotDlg, SIGNAL(result(const QString&)), this, SLOT(insCmd(const QString&))); menu = new QMenu(_("Graphics"),this); popup = new QMenu(this); mgl = new QMathGL(this); draw = new mglDrawScript(parser.Self()); mgl_set_flag(mgl->getGraph(),1,MGL_SHOW_POS); mgl->setDraw(draw); connect(mgl,SIGNAL(askStyle(int)),this,SLOT(setStyle(int))); connect(mgl,SIGNAL(objChanged(int)),this,SLOT(setCurPos(int))); QBoxLayout *v = new QVBoxLayout(this); toolTop(v); QBoxLayout *h = new QHBoxLayout(); v->addLayout(h); toolLeft(h); mgl->setPopup(popup); sv = new QScrollArea(this); h->addWidget(sv); sv->setWidget(mgl); emit giveFocus(); } //----------------------------------------------------------------------------- PlotPanel::~PlotPanel() { delete printer; } //----------------------------------------------------------------------------- void PlotPanel::setStyle(int id) { if(stlDialog->exec()) mgl->setStyle(id, stlDialog->getStyle()); } //----------------------------------------------------------------------------- void PlotPanel::setSubId(int id) { subId = id; } //----------------------------------------------------------------------------- void PlotPanel::animText(const QString &txt) { animPutText(txt); } //----------------------------------------------------------------------------- void PlotPanel::setCurPos(int pos) { if(!mglHighlight) pos = -1; if(curPos!=pos) { curPos = pos; execute(); } } //----------------------------------------------------------------------------- void PlotPanel::stop() { parser.Stop(); mgl->stop(); } //----------------------------------------------------------------------------- void PlotPanel::execute() { if(mglAutoSave) save(); mgl->setDotsPreview(mglDotsRefr); raisePanel(this); objId = subId = -1; emit clearWarn(); QElapsedTimer t; t.start(); mgl_set_facenum(mgl->getGraph(),0); draw->text=textMGL->toPlainText(); draw->line=curPos; mgl->update(); setStatus(QString(_("Drawing time %1 ms")).arg(t.elapsed()*1e-3)); emit giveFocus(); } //----------------------------------------------------------------------------- void PlotPanel::pressF9() { int l=animParam.length(), i; wchar_t *str = new wchar_t[l+2]; animPos = 0; curPos = -1; QString cur = animParam.section('\n',animPos,animPos); for(i=0;itext=textMGL->toPlainText(); draw->line=curPos; mgl->update(); setStatus(QString(_("Drawing time %1 ms")).arg(t.elapsed()*1e-3)); emit giveFocus(); } //----------------------------------------------------------------------------- void PlotPanel::animStart(bool st) { if(!st) { timer->stop(); if(gifOn) mgl_close_gif(mgl->getGraph()); return; } if(animParam.isEmpty()) { if(animDialog->exec()) { animParam = animDialog->getResult(); gifOn = animDialog->gifOn; jpgOn = animDialog->jpgOn; } else return; } timer->start(animDelay); if(gifOn) { mglGraph gr(mgl->getGraph()); gr.StartGIF("", animDelay); gr.ResetFrames(); } raisePanel(this); } //----------------------------------------------------------------------------- void PlotPanel::nextSlide() { animSwitch(false); next(); emit giveFocus(); } //----------------------------------------------------------------------------- void PlotPanel::next() { if(animParam.isEmpty()) { if(animDialog->exec()) { animParam = animDialog->getResult(); gifOn = animDialog->gifOn; jpgOn = animDialog->jpgOn; } else return; } int l=animParam.length(), n=animParam.count('\n') + (animParam[l-1]=='\n' ? 0:1), i; wchar_t *str = new wchar_t[l+2]; animPos = (animPos+1)%n; QString cur = animParam.section('\n',animPos,animPos); for(i=0;igetGraph()); if(gr.GetNumFrame() >= n) execute(); else { gr.NewFrame(); execute(); gr.EndFrame(); if(jpgOn) gr.WriteFrame(); QString s; s.asprintf(_("%d - %d of %d"),gr.GetNumFrame(),animPos,n); setStatus(QString(_("Frame %1 of %2")).arg(animPos).arg(n)); } } //----------------------------------------------------------------------------- void PlotPanel::prevSlide() { if(animParam.isEmpty()) { if(animDialog->exec()) { animParam = animDialog->getResult(); gifOn = animDialog->gifOn; jpgOn = animDialog->jpgOn; } else return; } animSwitch(false); int l=animParam.length(), n=animParam.count('\n') + (animParam[l-1]=='\n' ? 0:1), i; wchar_t *str = new wchar_t[l+2]; animPos = (animPos-1+n)%n; QString cur = animParam.section('\n',animPos,animPos); for(i=0;iexec()) { animParam = animDialog->getResult(); gifOn = animDialog->gifOn; jpgOn = animDialog->jpgOn; animPos = -1; } } //----------------------------------------------------------------------------- void PlotPanel::adjust() { mgl->setSize(sv->width()-5, sv->height()-5); raisePanel(this); emit giveFocus(); } //----------------------------------------------------------------------------- void PlotPanel::setMGLFont(const QString &path) { mgl->setMGLFont(path); } //----------------------------------------------------------------------------- void PlotPanel::animParseText(const QString &txt) { int i, n = txt.count('\n')+1; double a1=0,a2=0,da=0; QString s, all; for(i=0;isetResult(a1,a2,da); } } if(!all.isEmpty()) { animDialog->setResult(all); animParam = all; } else if(a1!=a2 && da!=0) { for(double a=a1;a<=a2;a+=da) all = all + QString::number(a)+"\n"; animParam = all; } } //----------------------------------------------------------------------------- //#include "xpm/wire.xpm" #include "xpm/text.xpm" #include "xpm/line.xpm" #include "xpm/curve.xpm" #include "xpm/mark_o.xpm" #include "xpm/mark_s.xpm" #include "xpm/mark_a.xpm" #include "xpm/mark_d.xpm" #include "xpm/arc.xpm" #include "xpm/polygon.xpm" #include "xpm/box.xpm" //----------------------------------------------------------------------------- void PlotPanel::toolTop(QBoxLayout *v) { QAction *a, *aa; QMenu *o=menu, *oo; QToolBar *t = new QToolBar(this); v->addWidget(t); t->setMovable(false); // graphics menu a = new QAction(QPixmap(":/png/alpha.png"), _("Alpha"), this); a->setShortcut(Qt::CTRL+Qt::Key_T); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setAlpha(bool))); connect(mgl, SIGNAL(alphaChanged(bool)), a, SLOT(setChecked(bool))); a->setToolTip(_("Switch on/off transparency for the graphics (Ctrl+T).")); o->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/weather-clear.png"), _("Light"), this); a->setShortcut(Qt::CTRL+Qt::Key_L); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setLight(bool))); connect(mgl, SIGNAL(lightChanged(bool)), a, SLOT(setChecked(bool))); a->setToolTip(_("Switch on/off lightning for the graphics (Ctrl+L).")); o->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/view-grid.png"), _("Grid"), this); a->setShortcut(Qt::CTRL+Qt::Key_G); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setGrid(bool))); a->setToolTip(_("Switch on/off grid of absolute coordinates (Ctrl+G).")); o->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/transform-move.png"), _("Rotate by mouse"), this); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setRotate(bool))); connect(mgl, SIGNAL(rotateChanged(bool)), a, SLOT(setChecked(bool))); a->setToolTip(_("Switch on/off mouse handling of the graphics\n(rotation, shifting, zooming and perspective).")); t->addAction(a); /* a = new QAction(QPixmap(":/png/zoom-fit-best.png"), _("Zoom by mouse"), this); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), mgl, SLOT(setZoom(bool))); connect(mgl, SIGNAL(zoomChanged(bool)), a, SLOT(setChecked(bool))); a->setToolTip(_("Switch on/off mouse zoom of selected region.")); t->addAction(a);*/ o->addSeparator(); a = new QAction(QPixmap(":/png/zoom-original.png"), _("Restore"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(restore())); a->setToolTip(_("Restore default graphics rotation, zoom and perspective (Ctrl+Space).")); a->setShortcut(Qt::CTRL+Qt::Key_Space); o->addAction(a); popup->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/view-refresh.png"), _("Redraw"), this); connect(a, SIGNAL(triggered()), this, SLOT(execute())); a->setToolTip(_("Execute script and redraw graphics (F5).")); a->setShortcut(Qt::Key_F5); o->addAction(a); popup->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/view-fullscreen.png"), _("Adjust size"), this); connect(a, SIGNAL(triggered()), this, SLOT(adjust())); a->setToolTip(_("Change canvas size to fill whole region (F6).")); a->setShortcut(Qt::Key_F6); o->addAction(a); a = new QAction(QPixmap(":/png/document-revert.png"), _("Reload"), this); connect(a, SIGNAL(triggered()), this, SLOT(pressF9())); a->setToolTip(_("Restore status for 'once' command and reload data (F9).")); a->setShortcut(Qt::Key_F9); o->addAction(a); popup->addAction(a); a = new QAction(QPixmap(":/png/process-stop.png"), _("Stop"), this); connect(a, SIGNAL(triggered()), this, SLOT(stop())); a->setToolTip(_("Stop script execution (F7).")); a->setShortcut(Qt::Key_F7); o->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/edit-copy.png"), _("Copy plot"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(copy())); a->setToolTip(_("Copy graphics to clipboard (Ctrl+Shift+G).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_G); o->addAction(a); popup->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/edit-copy.png"), _("Copy click coor."), this); connect(a, SIGNAL(triggered()), mgl, SLOT(copyClickCoor())); a->setToolTip(_("Copy coordinates of last mouse click to clipboard.")); o->addAction(a); popup->addAction(a); // l->addStretch(1); { oo = new QMenu(_("Primitives ..."),this); aa=a = new QAction(QPixmap(line_xpm), _("Add line"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(addLine())); connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); a->setToolTip(_("Add line which properties can be changed later by mouse.")); oo->addAction(a); a = new QAction(QPixmap(arc_xpm), _("Add arc"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(addArc())); connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); a->setToolTip(_("Add arc which properties can be changed later by mouse.")); oo->addAction(a); a = new QAction(QPixmap(curve_xpm), _("Add curve"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(addCurve())); connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); a->setToolTip(_("Add curve which properties can be changed later by mouse.")); oo->addAction(a); a = new QAction(QPixmap(mark_s_xpm), _("Add rect"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(addRect())); connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); a->setToolTip(_("Add rectangle which properties can be changed later by mouse.")); oo->addAction(a); a = new QAction(QPixmap(mark_d_xpm), _("Add rhombus"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(addRhomb())); connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); a->setToolTip(_("Add rhombus which properties can be changed later by mouse.")); oo->addAction(a); a = new QAction(QPixmap(mark_o_xpm), _("Add ellipse"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(addEllipse())); connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); a->setToolTip(_("Add ellipse which properties can be changed later by mouse.")); oo->addAction(a); a = new QAction(QPixmap(polygon_xpm), _("Add polygon"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(addPolygon())); connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); a->setToolTip(_("Add ellipse which properties can be changed later by mouse.")); oo->addAction(a); a = new QAction(QPixmap(mark_a_xpm), _("Add mark"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(addMark())); connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); a->setToolTip(_("Add marker which properties can be changed later by mouse.")); oo->addAction(a); a = new QAction(QPixmap(text_xpm), _("Add text"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(addText())); connect(mgl, SIGNAL(usePrimChanged(bool)), a, SLOT(setVisible(bool))); a->setToolTip(_("Add text which properties can be changed later by mouse.")); oo->addAction(a); QToolButton *bb = new QToolButton(this); bb->setDefaultAction(aa); bb->setMenu(oo); bb->setPopupMode(QToolButton::MenuButtonPopup); t->addWidget(bb); } a = new QAction(QPixmap(":/png/edit-delete.png"), _("Delete selected"), this); connect(a, SIGNAL(triggered()), this, SLOT(deleteSelected())); a->setToolTip(_("Delete selected plot.")); o->addAction(a); popup->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/layer-visible-off.png"), _("Hide selected"), this); connect(a, SIGNAL(triggered()), this, SLOT(hideSelected())); a->setToolTip(_("Hide selected plots.")); o->addAction(a); popup->addAction(a); t->addAction(a); const MainWindow *mw=findMain(this); if(mw) t->addAction(mw->ahide); a = new QAction(QPixmap(":/png/format-indent-more.png"), _("New command"), this); connect(a, SIGNAL(triggered()), newCmdDlg, SLOT(show())); a->setToolTip(_("Show dialog for new command or edit arguments of existed one.")); o->addAction(a); popup->addAction(a); t->addAction(a); a = new QAction(QPixmap(box_xpm), _("New inplot"), this); connect(a, SIGNAL(triggered()), subplotDlg, SLOT(show())); a->setToolTip(_("Show dialog for new inplot and put it into the script.")); o->addAction(a); popup->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/object-order-lower.png"), _("Move plot up"), this); connect(a, SIGNAL(triggered()), this, SLOT(movePlotUp())); a->setToolTip(_("Move selected plot up to previous subplot.")); o->addAction(a); popup->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/object-order-raise.png"), _("Move plot down"), this); connect(a, SIGNAL(triggered()), this, SLOT(movePlotDown())); a->setToolTip(_("Move selected plot down to next subplot.")); o->addAction(a); popup->addAction(a); t->addAction(a); o->addMenu(oo); //t->addSeparator(); tet = new QSpinBox(this); tet->setWrapping(true); t->addWidget(tet); tet->setRange(-180, 180); tet->setSingleStep(10); connect(tet, SIGNAL(valueChanged(int)), mgl, SLOT(setTet(int))); connect(mgl, SIGNAL(tetChanged(int)), tet, SLOT(setValue(int))); tet->setToolTip(_("Set value of \\theta angle.\nYou can use keys (Shift+Meta+Up or Shift+Meta+Down).")); phi = new QSpinBox(this); phi->setWrapping(true); t->addWidget(phi); phi->setRange(-180, 180); phi->setSingleStep(10); connect(phi, SIGNAL(valueChanged(int)), mgl, SLOT(setPhi(int))); connect(mgl, SIGNAL(phiChanged(int)), phi, SLOT(setValue(int))); phi->setToolTip(_("Set value of \\phi angle.\nYou can use keys (Shift+Meta+Left or Shift+Meta+Right).")); oo = new QMenu(_("Export as 2D ..."),this); oo->addAction(_("PNG"), mgl, SLOT(exportPNG()),Qt::ALT+Qt::Key_P); oo->addAction(_("solid PNG"), mgl, SLOT(exportPNGs()),Qt::ALT+Qt::Key_F); oo->addAction(_("JPEG"), mgl, SLOT(exportJPG()),Qt::ALT+Qt::Key_J); oo->addAction(_("bitmap EPS"), mgl, SLOT(exportBPS())); oo->addAction(_("vector EPS"), mgl, SLOT(exportEPS()),Qt::ALT+Qt::Key_E); oo->addAction(_("SVG"), mgl, SLOT(exportSVG()),Qt::ALT+Qt::Key_S); oo->addAction(_("LaTeX"), mgl, SLOT(exportTEX()),Qt::ALT+Qt::Key_L); o->addMenu(oo); popup->addMenu(oo); oo = new QMenu(_("Export as 3D ..."),this); oo->addAction(_("MGLD"), mgl, SLOT(exportMGLD()),Qt::ALT+Qt::Key_M); oo->addAction(_("PRC"), mgl, SLOT(exportPRC()),Qt::ALT+Qt::Key_D); oo->addAction(_("OBJ"), mgl, SLOT(exportOBJ()),Qt::ALT+Qt::Key_O); oo->addAction(_("STL"), mgl, SLOT(exportSTL())); oo->addAction(_("XYZ"), mgl, SLOT(exportXYZ())); // oo->addAction(_("X3D"), QMGL, SLOT(exportX3D()),Qt::ALT+Qt::Key_X); // TODO: Add later o->addMenu(oo); popup->addMenu(oo); } //----------------------------------------------------------------------------- void PlotPanel::toolLeft(QBoxLayout *h) { QAction *a; QMenu *o=menu, *oo; QToolBar *t = new QToolBar(this); h->addWidget(t); t->setMovable(false); t->setAllowedAreas(Qt::LeftToolBarArea); t->setOrientation(Qt::Vertical); // zooming menu oo = o->addMenu(_("Zoom/move")); a = new QAction(QPixmap(":/png/arrow-left.png"), _("Move left"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(shiftLeft())); a->setShortcut(Qt::ALT+Qt::Key_Left); a->setToolTip(_("Move graphics left by 1/3 of its width.")); oo->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/arrow-up.png"), _("Move up"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(shiftUp())); a->setShortcut(Qt::ALT+Qt::Key_Up); a->setToolTip(_("Move graphics up by 1/3 of its height.")); oo->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/zoom-in.png"), _("Zoom in"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(zoomIn())); a->setShortcut(Qt::ALT+Qt::Key_Equal); a->setToolTip(_("Zoom in graphics.")); oo->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/zoom-out.png"), _("Zoom out"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(zoomOut())); a->setShortcut(Qt::ALT+Qt::Key_Minus); a->setToolTip(_("Zoom out graphics.")); oo->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/arrow-down.png"), _("Move down"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(shiftDown())); a->setShortcut(Qt::ALT+Qt::Key_Down); a->setToolTip(_("Move graphics down 1/3 of its height.")); oo->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/arrow-right.png"), _("Move right"), this); connect(a, SIGNAL(triggered()), mgl, SLOT(shiftRight())); a->setShortcut(Qt::ALT+Qt::Key_Right); a->setToolTip(_("Move graphics right by 1/3 of its width.")); oo->addAction(a); t->addAction(a); // rotate menu oo = o->addMenu(_("Rotate")); a = new QAction(QPixmap(":/png/object-rotate-up.png"), _("Rotate up"), this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Up); connect(a, SIGNAL(triggered()), tet, SLOT(stepUp())); oo->addAction(a); a->setToolTip(_("Increase \\theta angle by 10 degrees.")); a = new QAction(QPixmap(":/png/object-rotate-down.png"), _("Rotate down"), this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Down); connect(a, SIGNAL(triggered()), tet, SLOT(stepDown())); oo->addAction(a); a->setToolTip(_("Decrease \\theta angle by 10 degrees.")); a = new QAction(QPixmap(":/png/object-rotate-left.png"), _("Rotate left"), this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Right); connect(a, SIGNAL(triggered()), phi, SLOT(stepUp())); oo->addAction(a); a->setToolTip(_("Increase \\phi angle by 10 degrees.")); a = new QAction(QPixmap(":/png/object-rotate-right.png"), _("Rotate right"), this); a->setShortcut(Qt::SHIFT+Qt::META+Qt::Key_Left); connect(a, SIGNAL(triggered()), phi, SLOT(stepDown())); oo->addAction(a); a->setToolTip(_("Decrease \\phi angle by 10 degrees.")); // animation menu oo = o->addMenu(_("Animation")); a = new QAction(QPixmap(":/png/media-seek-forward.png"), _("Next slide"), this); connect(a, SIGNAL(triggered()), this, SLOT(nextSlide())); a->setShortcut(Qt::CTRL+Qt::Key_Period); a->setToolTip(_("Show next slide (Ctrl+.).")); oo->addAction(a); t->addAction(a); a = new QAction(QPixmap(":/png/media-playback-start.png"), _("Slideshow"), this); a->setCheckable(true); connect(a, SIGNAL(toggled(bool)), this, SLOT(animStart(bool))); connect(this, SIGNAL(animSwitch(bool)),a,SLOT(setChecked(bool))); a->setToolTip(_("Run slideshow (Ctrl+F5). If no parameter specified\nthen the dialog with slideshow options will appear.")); a->setShortcut(Qt::CTRL+Qt::Key_F5); oo->addAction(a); t->addAction(a); oo->addAction(_("Setup show"), this, SLOT(animSetup()), Qt::CTRL+Qt::Key_W); a = new QAction(QPixmap(":/png/media-seek-backward.png"), _("Prev slide"), this); connect(a, SIGNAL(triggered()), this, SLOT(prevSlide())); a->setShortcut(Qt::CTRL+Qt::Key_Comma); a->setToolTip(_("Show previous slide (Ctrl+,).")); oo->addAction(a); t->addAction(a); } //----------------------------------------------------------------------------- QString PlotPanel::getFit() { return QString(mgl_get_fit(mgl->getGraph())); } //----------------------------------------------------------------------------- void PlotPanel::deleteSelected() { if(curPos>=0) { textMGL->moveCursor(QTextCursor::Start); for(int i=0;imoveCursor(QTextCursor::NextBlock); QTextCursor tc= textMGL->textCursor(); tc.select(QTextCursor::LineUnderCursor); tc.removeSelectedText(); tc.deleteChar(); curPos = -1; execute(); } else emit setStatus("No selection."); } //----------------------------------------------------------------------------- void PlotPanel::hideSelected() { if(curPos>=0) { textMGL->moveCursor(QTextCursor::Start); for(int i=0;imoveCursor(QTextCursor::NextBlock); textMGL->insertPlainText("#h "); curPos = -1; execute(); } else emit setStatus("No selection."); } //----------------------------------------------------------------------------- void PlotPanel::putCmd(const QString &cmd) { textMGL->moveCursor(QTextCursor::Start); if(curPos>=0) for(int i=0;imoveCursor(QTextCursor::NextBlock); textMGL->insertPlainText(cmd+"\n"); curPos = -1; execute(); } //----------------------------------------------------------------------------- void PlotPanel::insCmd(const QString &cmd) { textMGL->moveCursor(QTextCursor::EndOfBlock); textMGL->insertPlainText("\n"+cmd); curPos = -1; execute(); } //----------------------------------------------------------------------------- void PlotPanel::movePlotUp() { if(curPos>0) { QTextCursor tc = textMGL->textCursor(); tc.movePosition(QTextCursor::Start); tc.movePosition(QTextCursor::NextBlock,QTextCursor::MoveAnchor,curPos); tc.select(QTextCursor::BlockUnderCursor); QString s = tc.selectedText(); tc.deleteChar(); bool ins=true; while(tc.movePosition(QTextCursor::PreviousBlock)) { QString q = tc.block().text(); if(q.startsWith("subplot ") || q.startsWith("inplot ") || q.startsWith("multiplot ") || q.startsWith("gridplot ") || q.startsWith("columnplot ") || q.startsWith("stickplot ")) { tc.movePosition(QTextCursor::EndOfBlock); tc.insertText(s); ins=false; break; } } if(ins) { tc.movePosition(QTextCursor::Start); tc.insertText(s+"\n"); tc.movePosition(QTextCursor::Start); tc.deleteChar(); } curPos = tc.block().blockNumber(); execute(); } else if(curPos<0) emit setStatus("No selection."); } //----------------------------------------------------------------------------- void PlotPanel::movePlotDown() { if(curPos>=0) { QTextCursor tc = textMGL->textCursor(); tc.movePosition(QTextCursor::Start); tc.movePosition(QTextCursor::NextBlock,QTextCursor::MoveAnchor,curPos); tc.select(QTextCursor::BlockUnderCursor); QString s = tc.selectedText(); if(curPos==0) s = "\n"+s; tc.deleteChar(); bool ins=true; while(tc.movePosition(QTextCursor::NextBlock)) { QString q = tc.block().text(); if(q.startsWith("subplot ") || q.startsWith("inplot ") || q.startsWith("multiplot ") || q.startsWith("gridplot ") || q.startsWith("columnplot ") || q.startsWith("stickplot ")) { tc.movePosition(QTextCursor::EndOfBlock); tc.insertText(s); ins=false; break; } } if(ins) { tc.movePosition(QTextCursor::End); tc.insertText(s); } curPos = tc.block().blockNumber(); execute(); } else emit setStatus("No selection."); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/CMakeLists.txt0000664000175000017500000000433114167366466016305 0ustar balakinbalakinif(QT_ENABLED) configure_file(${MathGL2_SOURCE_DIR}/udav/mgl.xml.in ${MathGL2_BINARY_DIR}/udav/mgl.xml) #set(mgl_wnd_src window.cpp) set(udav_src anim_dlg.cpp find_dlg.cpp mem_pnl.cpp prop_dlg.cpp textedit.cpp args_dlg.cpp help_pnl.cpp newcmd_dlg.cpp text_pnl.cpp calc_dlg.cpp hint_dlg.cpp open_dlg.cpp qmglsyntax.cpp udav_wnd.cpp dat_pnl.cpp info_dlg.cpp opt_dlg.cpp setup_dlg.cpp files_dlg.cpp plot_pnl.cpp style_dlg.cpp data_dlg.cpp subplot_dlg.cpp ) set(udav_moc_hdr anim_dlg.h files_dlg.h info_dlg.h opt_dlg.h text_pnl.h args_dlg.h find_dlg.h mem_pnl.h plot_pnl.h setup_dlg.h udav_wnd.h calc_dlg.h help_pnl.h newcmd_dlg.h prop_dlg.h style_dlg.h dat_pnl.h open_dlg.h textedit.h hint_dlg.h data_dlg.h subplot_dlg.h ) set(udav_rc udav.qrc) if(WIN32) set(udav_src ${udav_src} udav.rc) endif(WIN32) if(enable-qt5) include(../scripts/qt5.cmake) qt5_add_resources(udav_rc_src ${udav_rc} ) else(enable-qt5) include(../scripts/qt4.cmake) qt4_add_resources(udav_rc_src ${udav_rc} ) endif(enable-qt5) add_executable(udav ${udav_src} ${udav_moc_hdr} ${udav_rc_src}) #set_target_properties(udav PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS} -pthread") if(enable-qt5) target_link_libraries(udav mgl-qt5 ${MGL_QT5_LIBS}) else(enable-qt5) target_link_libraries(udav mgl-qt4 ${MGL_QT4_LIBS}) endif(enable-qt5) mgl_po_src(${udav_src} ${udav_hdr}) if(MGL_HAVE_PTHREAD) target_link_libraries(udav ${CMAKE_THREAD_LIBS_INIT}) endif(MGL_HAVE_PTHREAD) install( TARGETS udav EXPORT MathGLTargets RUNTIME DESTINATION ${MathGL_INSTALL_BIN_DIR} ) install(FILES udav.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps/) install(FILES udav_ru.qm DESTINATION ${CMAKE_INSTALL_PREFIX}/share/udav/) find_program(findupddb update-desktop-database) if(findupddb) install(FILES udav.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications/) install(CODE "execute_process(COMMAND \"${findupddb}\" \"${CMAKE_INSTALL_PREFIX}/share/applications\")") endif(findupddb) find_program(findupmdb update-mime-database) if(findupmdb) install(FILES ${CMAKE_BINARY_DIR}/udav/mgl.xml DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mime/packages/) install(CODE "execute_process(COMMAND \"${findupmdb}\" \"${CMAKE_INSTALL_PREFIX}/share/mime\")") endif(findupmdb) endif(QT_ENABLED) mathgl-8.0.1/udav/help_pnl.cpp0000664000175000017500000001043014167366466016047 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include //----------------------------------------------------------------------------- #include "mgl2/define.h" #include "help_pnl.h" extern QString pathHelp; void raisePanel(QWidget *w); //----------------------------------------------------------------------------- QWidget *createHlpPanel(QWidget *p) { return new HelpPanel(p); } void showHelpMGL(QWidget *p,QString s) { HelpPanel *hlp = dynamic_cast(p); if(hlp) hlp->showHelp(s); } //void showExMGL(QWidget *hlp) { ((HelpPanel *)hlp)->showExamples(); } //----------------------------------------------------------------------------- HelpPanel::HelpPanel(QWidget *parent) : QWidget(parent) { QToolBar *t = new QToolBar(this); t->setMovable(false); QVBoxLayout *v = new QVBoxLayout(this); v->addWidget(t); help = new QTextBrowser(this); v->addWidget(help); help->setOpenExternalLinks(false); t->addAction(QPixmap(":/png/go-previous.png"), _("Backward"), help, SLOT(backward())); entry = new QLineEdit(this); t->addWidget(entry); connect(entry, SIGNAL(textChanged(const QString &)), this, SLOT(showHelp(const QString &))); connect(entry, SIGNAL(returnPressed()), this, SLOT(showHelp())); t->addAction(QPixmap(":/png/go-next.png"), _("Forward"), help, SLOT(forward())); t->addSeparator(); // t->addAction(QPixmap(":/png/help-faq.png"), _("Examples"), this, SLOT(showExamples())); t->addAction(QPixmap(":/png/zoom-in.png"), _("Zoom in text"), this, SLOT(zoomIn())); t->addAction(QPixmap(":/png/zoom-out.png"), _("Zoom out text"), this, SLOT(zoomOut())); setWindowTitle(_("Help")); } //----------------------------------------------------------------------------- // void HelpPanel::showExamples() // { // QStringList s; s<<(pathHelp); // help->setSearchPaths(s); // setWindowTitle("Examples"); raisePanel(this); // help->setSource("mgl_en"+"_2.html"); // } //----------------------------------------------------------------------------- void HelpPanel::showHelp(const QString &txt) { QString cmd=txt; raisePanel(this); QStringList s; s<<(pathHelp); help->setSearchPaths(s); if(cmd.isEmpty()) cmd = entry->text().trimmed(); // NOTE disable other translations for help files due to Qt bug if(cmd.isEmpty()) help->setSource("mgl_en"+QString(".html")); else help->setSource("mgl_en"+QString(".html#")+cmd); setWindowTitle("Help"); } //----------------------------------------------------------------------------- void HelpPanel::zoomIn() { QFont f(help->font()); f.setPointSize(f.pointSize()+1); help->setFont(f); } //----------------------------------------------------------------------------- void HelpPanel::zoomOut() { QFont f(help->font()); f.setPointSize(f.pointSize()-1); help->setFont(f); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/opt_dlg.h0000664000175000017500000000445014167366466015350 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef OPTION_DLG_H #define OPTION_DLG_H //----------------------------------------------------------------------------- #include #if defined(_MSC_VER) #include #endif class QLineEdit; class QComboBox; class QRadioButton; //----------------------------------------------------------------------------- /// Dialog for selecting command options class OptionDialog : public QDialog { Q_OBJECT public: OptionDialog(QWidget *parent=0); ~OptionDialog(); QString getOption() { return result; } private slots: void prepareResult(); private: QString result; QLineEdit *x1, *x2, *y1, *y2, *z1, *z2, *c1, *c2; QLineEdit *alpha, *amb, *dif, *val, *mn, *fs, *leg; QComboBox *cut, *lig; }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/newcmd_dlg.h0000664000175000017500000000546014167366466016025 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef NEWCMDDIALOG_H #define NEWCMDDIALOG_H //----------------------------------------------------------------------------- #include #include #define NUM_CH 16 // number of argument sets for a command class QComboBox; class QLabel; class QLineEdit; class QTableWidget; class QTextBrowser; class OptionDialog; class StyleDialog; class DataDialog; //----------------------------------------------------------------------------- class NewCmdDialog : public QDialog { Q_OBJECT public: NewCmdDialog(QWidget *p); const QString &getCommand() { return cmd; } private slots: void typeChanged(int); void nameChanged(int); void kindChanged(int); void insertData(); void insertOpt(); void insertStl(); void finish(); void zoomIn(); void zoomOut(); public slots: void parseCmd(const QString &txt); signals: void result(const QString &txt, bool replace); private: QTextBrowser *help; QComboBox *type, *name, *kind; QLineEdit *opt; QLabel *info; QTableWidget *args; QString cmd; QStringList types, cmds[17], argn[NUM_CH], kinds; OptionDialog *optDialog; StyleDialog *stlDialog; DataDialog *datDialog; bool replace; // flag to be used in result() signal void fillList(); }; //----------------------------------------------------------------------------- #endif // NEWCMDDIALOG_H //----------------------------------------------------------------------------- mathgl-8.0.1/udav/mem_pnl.cpp0000664000175000017500000002005514167366466015701 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include //----------------------------------------------------------------------------- #include "mem_pnl.h" #include "info_dlg.h" #undef sprintf // fix libintl bug of defining sprintf //----------------------------------------------------------------------------- #include "xpm/table.xpm" #include "xpm/preview.xpm" //----------------------------------------------------------------------------- extern bool mglAutoSave; extern mglParse parser; QWidget *newDataWnd(InfoDialog *inf, QWidget *wnd, mglDataA *v); void refreshData(QWidget *w); //----------------------------------------------------------------------------- QWidget *createMemPanel(QWidget *p) // NOTE: parent should be MainWindow { MemPanel *m = new MemPanel(p); m->wnd = p; return m; } //----------------------------------------------------------------------------- void refreshMemPanel(QWidget *p) { MemPanel *m = dynamic_cast(p); if(m) m->refresh(); } //----------------------------------------------------------------------------- MemPanel::MemPanel(QWidget *parent) : QWidget(parent) { infoDlg = new InfoDialog(this); infoDlg->setModal(true); infoDlg->allowRefresh=false; QToolBar *t = new QToolBar(this); t->setMovable(false); QVBoxLayout *v = new QVBoxLayout(this); v->addWidget(t); t->addAction(QPixmap(":/png/document-new.png"), _("Create new data array"), this, SLOT(newTable())); t->addAction(QPixmap(table_xpm), _("Edit selected data array"), this, SLOT(editData())); t->addAction(QPixmap(":/png/edit-delete.png"), _("Delete selected data array"), this, SLOT(delData())); t->addAction(QPixmap(preview_xpm), _("Properties of selected data array"), this, SLOT(infoData())); t->addAction(QPixmap(":/png/view-refresh.png"), _("Update list of data arrays"), this, SLOT(refresh())); t->addSeparator(); t->addAction(QPixmap(":/png/edit-clear.png"), _("Delete ALL data arrays"), this, SLOT(delAllData())); colSort = 0; tab = new QTableWidget(this); tab->setColumnCount(3); v->addWidget(tab); QStringList sl; sl<<_("Name")<<_("Sizes")<<_("Memory"); tab->setHorizontalHeaderLabels(sl); connect(tab, SIGNAL(cellClicked(int,int)), this, SLOT(tableClicked(int,int))); connect(tab, SIGNAL(cellDoubleClicked(int,int)), this, SLOT(tableDClicked(int,int))); setWindowTitle(_("Memory")); } //----------------------------------------------------------------------------- void MemPanel::tableClicked(int, int col) { colSort = col; tab->sortItems(col); } //----------------------------------------------------------------------------- void MemPanel::tableDClicked(int row, int) { editData(row); } //----------------------------------------------------------------------------- void MemPanel::newTable() { bool ok; QString name = QInputDialog::getText(this, _("UDAV - New variable"), _("Enter name for new variable"), QLineEdit::Normal, "", &ok); if(!ok || name.isEmpty()) return; mglDataA *v = parser.AddVar(name.toLocal8Bit().constData()); QWidget *t; if(v->o) t = (QWidget *)v->o; else t = newDataWnd(infoDlg,wnd,v); t->showMaximized(); t->activateWindow(); refresh(); } //----------------------------------------------------------------------------- void MemPanel::editData(int n) { if(tab->rowCount()<1) return; if(n<0) n = tab->currentRow(); if(n<0) n = 0; mglDataA *v = parser.FindVar(tab->item(n,0)->text().toLocal8Bit().constData()); if(!v) return; QWidget *t; if(v->o) t = (QWidget *)v->o; else t = newDataWnd(infoDlg,wnd,v); t->showMaximized(); t->activateWindow(); } //----------------------------------------------------------------------------- void MemPanel::delData() { if(tab->rowCount()<1) return; int n = tab->currentRow(); if(n<0) n = 0; mglDataA *v = parser.FindVar(tab->item(n,0)->text().toLocal8Bit().constData()); if(v && v->o) ((QWidget *)v->o)->close(); parser.DeleteVar(tab->item(n,0)->text().toLocal8Bit().constData()); refresh(); } //----------------------------------------------------------------------------- void MemPanel::delAllData() { if(QMessageBox::information(this, _("UDAV - delete all data"), _("Do you want to delete all data?"), QMessageBox::No, QMessageBox::Yes)!=QMessageBox::Yes) return; parser.DeleteAll(); refresh(); } //----------------------------------------------------------------------------- void MemPanel::infoData() { if(tab->rowCount()<1) return; int n = tab->currentRow(); if(n<0) n = 0; mglDataA *v = parser.FindVar(tab->item(n,0)->text().toLocal8Bit().constData()); if(!v) return; infoDlg->setVar(v); QString s = QString::fromWCharArray(v->Name()); infoDlg->setWindowTitle(s + _(" - UDAV preview")); infoDlg->refresh(); infoDlg->show(); } //----------------------------------------------------------------------------- void MemPanel::refresh() { long n = parser.GetNumVar(), m=0; for(long i=0;isetRowCount(m); QString s; QTableWidgetItem *it; Qt::ItemFlags flags=Qt::ItemIsSelectable|Qt::ItemIsEnabled; for(long i=m=0;iName()); it = new QTableWidgetItem(s); tab->setItem(m,0,it); it->setFlags(flags); s.asprintf("%ld * %ld * %ld", v->GetNx(), v->GetNy(), v->GetNz()); it = new QTableWidgetItem(s); tab->setItem(m,1,it); it->setFlags(flags); it->setTextAlignment(Qt::AlignHCenter|Qt::AlignVCenter); long sv = 0; if(dynamic_cast(v)) sv = v->GetNN()*sizeof(mreal)+sizeof(mglData); else if(dynamic_cast(v)) sv = v->GetNN()*sizeof(dual)+sizeof(mglDataC); else if(dynamic_cast(v)) sv = sizeof(mglDataV); else if(dynamic_cast(v)) sv = sizeof(mglDataW); else if(dynamic_cast(v)) sv = sizeof(mglDataF); else if(dynamic_cast(v)) sv = sizeof(mglDataR); else if(dynamic_cast(v)) sv = sizeof(mglDataT); if(sv==0) s = _("unknown"); #if MGL_SIZEOF_LONG>4 // else if((sv>>80L)>0) s.asprintf("%ld Yb",sv>>80L); // else if((sv>>70L)>0) s.asprintf("%ld Zb",sv>>70L); else if((sv>>60L)>0) s.asprintf("%ld Eb",sv>>60L); else if((sv>>50L)>0) s.asprintf("%ld Pb",sv>>50L); else if((sv>>40L)>0) s.asprintf("%ld Tb",sv>>40L); #endif else if((sv>>30L)>0) s.asprintf("%ld Gb",sv>>30L); else if((sv>>20L)>0) s.asprintf("%ld Mb",sv>>20L); else if((sv>>10L)>0) s.asprintf("%ld Kb",sv>>10L); else s.asprintf("%ld b",sv); it = new QTableWidgetItem(s); tab->setItem(m,2,it); it->setFlags(flags); it->setTextAlignment(Qt::AlignRight|Qt::AlignVCenter); if(v->o) refreshData((QWidget *)v->o); m++; } tab->sortItems(colSort); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/udav_ru.qm0000664000175000017500000021403514167366466015555 0ustar balakinbalakinsppx2x$zb|JU}Z414B4M4W6== nB ѵ /2'Yu2GX2WY3Wi88%1@FE$P.Gf[NIz-nRN>`Ge.YohpG Gp`==@ASq,C C2L+n*[~]y`1<hw 5~l=%%Xh tSE6  uqs66jJijkf@ϣjcL _P%D~UT)(1Q`.)*ҡL,%_/{>-F.GN0@u*0~3j0'C?urNTYIoe1eS5n3ܥn^6,t@D>4P_Y`eĞdy*[c(8~}>~.7, u~n!s\,"%j,-%S/xՕ0;U<+>>n@$B90V`V1YbC\/x\iA[|eP#f|mDgOgpoot zR*,yqn#>:)qӟII IIa IdII,I IaI\tvb@ۛ&5 ՚)Fϔ1 j~ed e t vƪ(#sA+D$^×TUE,ge)A.CEnEuHM#ScUYa_*Mc.\gsTlXnq]ti+jw5'w5w5z{*{}57}ce<~*~juOEFa~?&@DHY22%}^W /QWls(֣|(/ s.R ^/z^MN)*m=خ>%j>%@NEjdoV%Up$xe͖x z"A `0eATϗmd adj8S3ٌrJnčO;k, 7~_s]& Z H'B48T85@)WDSWeXanF]c\Ek@per~rc_sBt%|}5$6Cw mC\h+^kRmCˮ2Y%%h;;Q;A*Д|{y ^^ ^^^_@K 0 3ǡ Z [ / 03 6e 6 Zn _V h>m lat m7c# gz6 ع (ݴ ʟ.m ҇ 2nڹ d V * <  $o $ /^ 0AT 7a> ; D& M \TD _# dRc fd k, % r\ t Ec h  .o yw   >8  υ ^ ^l [ G} P  8Y Tdb 5 BtQ t ˰_ |U فp 댑S * ~ d֡ # $b Vz ( 3k? >1 @B A8 EN H> \xS ]^ a^V bWf c f"} g|ȡ z . (4 % w   u  ^T v PUg I c+ 5> ^ P < zEr j.  3) 4P ;.y <@k G-cT G- H MXT N0 X\2 YG ]s b^> eco t! ~ _Yp0 1 8 b - FAd FBeC FCe FDe FEf FFf_ FGf FHf FIg4 Fb F F F4 Fz F F FL F F " p e^ L ~ Ϯ6k X^ e ss +% C cټ 4r ?- /O ~ i ~k T m O " #!0 6 :VO$ ?> H H `08 g i3_ ijI jjV n Ж ruŊ b )Y 3 / ќ A} 0,s u  S ,%a zQS46,wK.>:Y:??R HIjN0j^2jy{q>s{tXiXqTA*";\Gz˛4Ԗg{.nt)%CDE_{oiW.}& &kj6ʎ LCVbjbfD~MiJi΃j#.!nžvϏ|^}4dM|.BlW%Gz^ @&23Pnȧ98cbgzOn99tIATAd~FX:i1 B<5=0Cancel AnimParam"045@6:0 (2 <A5:) Delay (in ms) AnimParam-:A?>@B 2 GIF Export to GIF AnimParamOKOK AnimParamAB028BL 2 :>4 Put to script AnimParam65@5@8A>20BL 4;O $0 @02=>3>Redraw picture for $0 equal to AnimParam,!>E@0=8BL :04@K 2 JPEGSave JPEG frames AnimParam2UDAV - 0@0<5B@K 0=8<0F88UDAV - Animation setup AnimParamUDAV - 0=8<0F8OUDAV - animation AnimParamDK 4>;6=K 2K1@0BL AB@>:8 8;8 G8A;0You should select one of case AnimParam>Bfrom AnimParamAB@>:0<strings AnimParam4>to AnimParam G8A;0<values AnimParamA H03>< with step AnimParam B<5=0Cancel ArgsDialogOKOK ArgsDialog!B@>:0 4;O $0 String for $0 ArgsDialog!B@>:0 4;O $1 String for $1 ArgsDialog!B@>:0 4;O $2 String for $2 ArgsDialog!B@>:0 4;O $3 String for $3 ArgsDialog!B@>:0 4;O $4 String for $4 ArgsDialog!B@>:0 4;O $5 String for $5 ArgsDialog!B@>:0 4;O $6 String for $6 ArgsDialog!B@>:0 4;O $7 String for $7 ArgsDialog!B@>:0 4;O $8 String for $8 ArgsDialog!B@>:0 4;O $9 String for $9 ArgsDialog4UDAV - @3C<5=BK ?@>3@0<<KUDAV - Set script arguments ArgsDialogAiry 8 GammaAiry and Gamma CalcDialog07>2K5Basic CalcDialog5AA5;OBessel CalcDialogG8AB8BLClear CalcDialog-;;8?B8G5A:85Elliptic CalcDialogExp 8 log Exp and log CalcDialogExp-8=B53@0;K Exp-integrals CalcDialog8?5@1>;8G5A:85 Hyperbolic CalcDialog /:>18Jacobi CalcDialog AB028BL DC=:F8N Put function CalcDialog 57C;LB0BResult CalcDialog!?5F80;L=K5Special CalcDialog  :>4 To script CalcDialog$"@83>=><5B@8G5A:85 Trigonometric CalcDialog - UDAV ?@>A<>B@ - UDAV previewDatPanel$ - UDAV ?5@5<5==0O - UDAV variableDatPanel&>1028BL&AddDatPanel&;351@08G5A:85 &AlgebraicDatPanel&!>740BL =>2K5 &Create newDatPanel&!C<<8@>20BL &Cum. sumDatPanel&0==K5&DataDatPanel"&8DD5@5=F8@>20BL&DifferentiateDatPanel& 0745;8BL&DivideDatPanel&-:A?>@B PNG &Export PNGDatPanel &$09;&FileDatPanel&5@2K9 A@57 &First sliceDatPanel&8AB>3@0<<0 &HistogramDatPanel&<?>@B PNG &Import PNGDatPanel&=B53@8@>20BL &IntegrateDatPanel&0?;0A&LaplaceDatPanel"&03@C78BL 40==K5 &Load dataDatPanel&B@078BL&MirrorDatPanel&7<5=8BL&ModifyDatPanel&#<=>68BL &MultiplyDatPanel5@5&E>4 &NavigateDatPanel&>@<8@>20BL &NormalizeDatPanel&?@0B>@K &OperatorsDatPanel &@54K4CI89 A@57 &Prev. sliceDatPanel &7<5=8BL @07<5@&ResizeDatPanel"!>E@0=8BL &40==K5 &Save dataDatPanel& 07<5@K&SizesDatPanel!&3;048BL &Smooth dataDatPanel !&60BL&SqueezeDatPanel&KG5ABL &SubtractDatPanel&!C<<0 ?>&Sum ofDatPanel"&><5=OBL <5AB0<8&SwapDatPanel &"@0=A?>=8@>20BL &TransposeDatPanel&>2K5 40==K5 A¬her dataDatPanelV>102;O5B G8A;> : M;5<5=B0< <0AA820 40==KE. Add a number to all data values.DatPanel> &D>@<C;5 By &formulaDatPanel B<5=0CancelDatPanel7<5=O5B 40==K5 ?> D>@<C;5, 7028AO5I59 >B ?5@5<5==KE 'x', 'y' 8 'z'. >445@6820NBAO B0:65 <=>385 A?5F80;L=K5 DC=:F88.|Change data values according to formula depended on 'x', 'y' and 'z' variables. A set of special function is availible also.DatPanel$>?8@>20BL &40==K5 Copy &dataDatPanelR>?8@>20BL 480?07>= G8A5; 2 1CD5@ >1<5=0.#Copy range of numbers to clipboard.DatPanel&1@570BLCro&pDatPanel1@5705B :@0O 40==KE. >;57=> 4;O C40;5=8O 70?>;=5==KE =C;O<8 >1;0AB59. 7040==><C =0?@02;5=8N(O<).7Differentiate data values along specified direction(s).DatPanel0?@02;5=85 DirectionDatPanelN5;8B M;5<5=BK <0AA820 40==KE =0 G8A;>.#Divide all data values by a number.DatPanelt2064K 48DD5@5=F8@C5B 40==K5 ?> 7040==><C =0?@02;5=8N(O<).>Double differentiate data values along specified direction(s).DatPanel<2548B5 F25B>2CN AE5<C @8AC=:0Enter color scheme for pictureDatPanel2548B5 F25B>2CN AE5<C @8AC=:0. 0==K5 1C4CB =>@<8@>20=K 2 [0,1].QEnter color scheme for picture. Note that data will be normalized in range [0,1].DatPanel2548B5 =0?@02;5=85(O) 4;O AC<<8@>20=8O. 0?@8<5@ 'xy' - AC<<8@>20BL 24>;L x 8 y =0?@02;5=89.aEnter direction(s) for cumulative summation. For example 'xy' - summate along x and y directions.DatPanel2548B5 =0?@02;5=85(O) 4;O 48DD5@5=F8@>20=8O. 0?@8<5@ 'xy' - 48DD5@5=F8@>20BL 24>;L x 8 y =0?@02;5=89.bEnter direction(s) for differentiation. For example 'xy' - differentiate along x and y directions.DatPanel2548B5 =0?@02;5=85(O) 4;O 8=B:3@8@>20=8O. 0?@8<5@ 'xy' - 8=B53@8@>20BL 24>;L x 8 y =0?@02;5=89.ZEnter direction(s) for integration. For example 'xy' - integrate along x and y directions.DatPanel2548B5 =0?@02;5=85(O) 4;O ?@5>1@07>20=8O 0?;0A0. 0?@8<5@ 'xy' - ?@5>1@07>20BL 24>;L x 8 y =0?@02;5=89.cEnter direction(s) for laplace transform. For example 'xy' - do transform along x and y directions.DatPanel2548B5 =0?@02;5=85(O) 4;O >B@065=8O. 0?@8<5@ 'xy' - >B@078BL ?> x 8 y =0?@02;5=8O<.UEnter direction(s) for mirroring. For example 'xy' - mirror along x and y directions.DatPanelL2548B5 =0?@02;5=85(O) A3;06820=8O. >6=> B0:65 225AB8 B8? A3;06820=8O ?> 3 8;8 ?> 5 B>G:0<. 0?@8<5@ 'xy3' - A3;048B B>;L:> 2 x 8 y =0?@02;5=8OE ?> 3-B>G5G=>9 AE5<5.Enter direction(s) for smoothing. Optionally you may enter the kind of smoothing by 3 or by 5 points. For example 'xy3' - smooth only in x and y directions and use 3-points scheme.DatPanel2548B5 =0?@02;5=85(O) 4;O >1<5=0 ;52>9 8 ?@02>9 G0ABO<8 40==KE. 0?@8<5@ 'xy' - <5=O5B 24>;L x 8 y =0?@02;5=89. >;57=> 4;O $C@L5 A?5:B@>2.Enter direction(s) for swapping (exchange left and right parts). For example 'xy' - swap along x and y directions. Useful for Fourier spectrum.DatPanel2548B5 D>@<C;C 4;O 40==KE. 5@5<5==K5 x,y,z <5=ONBAO 2 8=B5@20;5 [0,1].XEnter formula for data filling. Note that variables x,y,z supposed to be in range [0,1].DatPanel*2548B5 =>2K5 @07<5@KEnter new data sizesDatPanel2548B5 =>2K9 ?>@O4>: @07<5@=>AB59. 0?@8<5@, 'yx' 8;8 'yxz' 4;O B@0=A?>=8@>20=8O x-y, 'zyx' 4;O B@0=A?>=8@>20=8O x-z 8 B.4.qEnter new order of dimensions. For example, 'yx' or 'yxz' for transpose x-y, 'zyx' for transposing x-z and so on.DatPanelb2548B5 G8A;> 4;O 4>102;5=8O : M;5<5=B0< <0AA820:)Enter number for adding to data elements:DatPanelX2548B5 G8A;> 4;O 45;5=8O M;5<5=B>2 <0AA820:+Enter number for division of data elements:DatPanel\2548B5 G8A;> 4;O C<=>65=8O M;5<5=B>2 <0AA820:1Enter number for multiplication of data elements:DatPanelb2548B5 G8A;> 4;O 2KG8B0=8O 87 M;5<5=B>2 <0AA820:0Enter number for subtraction from data elements:DatPanelR2548B5 480?07>= 8 =0?@02;5=85 70?>;=5=8O-Enter range for data and direction of fillingDatPanel62548B5 480?07>= @57C;LB0B0Enter range for final dataDatPanelH2548B5 8=B5@20; A>E@0=O5<KE 40==KE.Enter range of saved date.DatPanel(2548B5 =><5@ A@570:Enter slice id:DatPanel2548B5 H03 A>E@0=O5<KE B>G5:. 0?@8<5@, '1' A>E@0=8BL 2A5, '2' :064CN 2B>@CN B>G:C, '3' :064CN B@5BLN 8 B.4.kEnter step of saved points. For example, '1' save all, '2' save each 2nd point, '3' save each 3d and so on.DatPanel82548B5 8<O =>2>9 ?5@5<5==>9Enter the name for new variableDatPanel-:A?>@B8@C5B 40==K5 2 PNG @8AC=>:. &25B0 >?@545;ONBAO C:070==>9 F25B>2>9 AE5<>9.  8AC=>: 0=0;>38G5= :><0=45 'dens'.iExport data to PNG picture. The colors defined by specified color scheme. The same as in 'dens' command.DatPanelz 0A?@545;8BL @02=><5@=> 40==K5 >B >4=>3> 7=0G5=8O 4> 4@C3>3>.2Fill data equidistantly from one value to another.DatPanel& 0A?@545;8BLFill in &rangeDatPanelBFromDatPanel5@59B8 : A@57C Go to sliceDatPanelD5@59B8 : ?5@2><C A@57C 3D 40==KE.'Go to the first data slice for 3D data.DatPanelJ5@59B8 : ?>A;54=5<C A@57C 3D 40==KE.&Go to the last data slice for 3D data.DatPanelJ5@59B8 : A;54CNI5<C A@57C 3D 40==KE.&Go to the next data slice for 3D data.DatPanelL5@59B8 : ?@54K4CI5<C A@57C 3D 40==KE.*Go to the previous data slice for 3D data.DatPanelJ5@59B8 : C:070==><C A@57C 3D 40==KE.+Go to the specified data slice for 3D data.DatPanel <?>@B8@>20BL 40==K5 87 PNG @8AC=:0 A 7040==>9 F25B>2>9 AE5<>9. 0==K5 1C4CB C40;5=K ?@8 2KE>45, => UDAV =5 A?@>A8B >1 8E A>E@0=5=88.|Import data from PNG picture with specified color scheme. Data will be deleted only at exit but UDAV will not ask it saving.DatPanel`=B53@8@C5B 40==K5 ?> 7040==><C =0?@02;5=8N(O<).3Integrate data values along specified direction(s).DatPanelZ!>E@0=O5B :064K9 n-K9 M;5<5=B <0AA820 40==KE..Keep only each n-th element of the data array.DatPanel>A;54=89 A@57 Last sliceDatPanel03@C78BL 40==K5 87 D09;0. 0==K5 1C4CB C40;5=K ?@8 2KE>45, => UDAV =5 A?@>A8B >1 8E A>E@0=5=88.XLoad data from file. Data will be deleted only at exit but UDAV will not ask to save it.DatPanel&0:A8<C< ?>M&ax ofDatPanel&8=8<C< ?>M&in ofDatPanelB@0605B 40==K5 >B=>A8B5;L=> C:070==>3> =0?@02;5=8O(89). 59AB2C5B :0: 70<5=0 8=45:A0 'i' =0 'n-i'.tMirror left and right data part along specified direction(s). This operation do like index change from 'i' to 'n-i'.DatPanel><5=B 24>;L &xMomentum along &xDatPanel><5=B 24>;L &yMomentum along &yDatPanel><5=B 24>;L &zMomentum along &zDatPanelT#<=>605B M;5<5=BK <0AA820 40==KE =0 G8A;>.%Multiply all data values by a number.DatPanel>A5 ?>;O 4>;6=K 1KBL 70?>;=5=K! NOTE: All fields must be filled!DatPanel!;54CNI89 A@57 Next sliceDatPanel >@<. ?> &A@570< Norm. s&licesDatPanel>@<8@C5B 40==K5 B0:, GB> 8E <0:A8<0;L=>5 8 <8=8<0;L=>5 7=0G5=8O @02=K 7040==K<.LNormalize data so that its minimal and maximal values be in specified range.DatPanel>@<8@C5B 40==K5 ?> A@570< ?5@?5=48:C;O@=> 7040==><C =0?@02;5=8N B0:, GB> 8E <0:A8<0;L=>5 8 <8=8<0;L=>5 7=0G5=8O @02=K 7040==K<.wNormalize each data slice perpendicular to some direction so that its minimal and maximal values be in specified range.DatPanel'8A;> B>G5:Number of pointsDatPanelOKOKDatPanelBPNG D09;K (*.png) A5 D09;K (*.*)!PNG files (*.png) All files (*.*)DatPanel AB028BL &40==K5 Paste &dataDatPanelRAB028BL 480?07>= G8A5; 87 1CD5@0 >1<5=0.&Paste range of numbers from clipboard.DatPanel$&B>1@078BL 40==K5 Plot &dataDatPanelB>1@078BL 40==K5 2 =>2>< >:=5. K <>65B5 2K1@0BL B8? 3@0D8:0, 53> AB8;L 8 B.4.UPlot data in new script window. You may select the kind of plot, its style and so on.DatPanel,><5AB8BL 2 ?5@5<5==CNPut in variableDatPanel">&<5=OBL @07<5@K Re&arrangeDatPanelt5=O5B @07<5@K 40==KE 157 87<5=5=8O A0<>3> <0AA820 40==KE.2Rearrange data sizes without changing data values.DatPanel!>7405B 70=>2> 40==K5 =>2>3> @07<5@0 8 70?>;=O5B 8E =C;O<8 (Ctrl+N).?Recreate the data with new sizes and fill it by zeros (Ctrl+N).DatPanelz7<5=O5B @07<5@ (8=B5@?>;8@C5B) 40==KE 2 C:070==><C (Ctrl+R).:Resize (interpolate) the data to specified sizes (Ctrl+R).DatPanelx!>E@0=8BL 40==K5 2 B5:AB>2K9 D09; A @0745;8B5;5< B01C;OF859. Save data to tab-separeted file.DatPanel!3;068205B 40==K5 >4=8< 87 4-E <5B>4>2 24>;L 7040==>3> =0?@02;5=8O(89).=Smooth data by one of 4 methods along specified direction(s).DatPanelP2548B5 =0?@02;5=85(O) ?>8A:0 <0:A8<C<>2&Specify direction(s) of maximal valuesDatPanelN2548B5 =0?@02;5=85(O) ?>8A:0 <8=8<C<>2&Specify direction(s) of minimal valuesDatPanelF2548B5 =0?@02;5=85(O) AC<<8@>20=8O!Specify direction(s) of summationDatPanel#:068B5 :0:>9 <><5=B 2KG8A;OBL. ><5=B @025= res_i = _jk how(x_i,y_j,z_k) a_jk/ _jk a_jk. >>@48=0BK x, y, z =0E>4OBAO 2 480?07>=5 [0,1].Specify which momentum evaluate. The momentum is res_i = sum_jk how(x_i,y_j,z_k) a_jk/ sum_jk a_jk. Coordinates x, y, z are data indexes normalized in range [0,1].DatPanel#:068B5 :0:>9 <><5=B 2KG8A;OBL. ><5=B @025= res_j = _ik how(x_i,y_j,z_k) a_ik/ _ik a_ik. >>@48=0BK x, y, z =0E>4OBAO 2 480?07>=5 [0,1].Specify which momentum evaluate. The momentum is res_j = sum_ik how(x_i,y_j,z_k) a_ik/ sum_ik a_ik. Coordinates x, y, z are data indexes normalized in range [0,1].DatPanel#:068B5 :0:>9 <><5=B 2KG8A;OBL. ><5=B @025= res_k = _ij how(x_i,y_j,z_k) a_ij/ _ij a_ij. >>@48=0BK x, y, z =0E>4OBAO 2 480?07>=5 [0,1].Specify which momentum evaluate. The momentum is res_k = sum_ij how(x_i,y_j,z_k) a_ij/ sum_ij a_ij. Coordinates x, y, z are data indexes normalized in range [0,1].DatPanelVKG8B05B 87 M;5<5=B>2 <0AA820 40==KE G8A;>.%Subtract a number to all data values.DatPaneld!C<<8@C5B 40==K5 24>;L C:070==>3> =0?@02;5=8O(89).1Summate data values along specified direction(s).DatPanel5=O5B <5AB0<8 ;52CN 8 ?@02CN G0ABL 40==KE 24>;L C:070==>3> =0?@02;5=8O(89). ?5@0F8O ?>;57=0 4;O 40==KE ?>A;5 $C@L5 ?@5>1@07>20=8O.vSwap left and right data part along specified direction(s). This operation is useful for data after Fourier transform.DatPanel!8<<5B@8G=>? Symmetrical?DatPanel>ToDatPanelp"@0=A?>=8@C5B <0AA82 40==KE, B8?0 x<->y 8;8 x<->z 8 B.4.9Transpose data dimensions, like x<->y or x<->z and so on.DatPanel,UDAV - 7<5=8BL 40==K5UDAV - Change dataDatPanel,UDAV - G8AB8BL 40==K5UDAV - Clear dataDatPanel,UDAV - 1@570BL 40==K5UDAV - Crop dataDatPanel<UDAV - 8DD5@5=F8@>20BL 40==K5UDAV - Differentiate dataDatPanel(UDAV - -:A?>@B 2 PNGUDAV - Export to PNGDatPanel.UDAV - 0?>;=8BL 40==K5UDAV - Fill dataDatPanel,UDAV - 5@59B8 : A@57CUDAV - Go to sliceDatPanel"UDAV - <?>@B PNGUDAV - Import PNGDatPanel6UDAV - =B53@8@>20BL 40==K5UDAV - Integrate dataDatPanel:UDAV - @5>1@07>20=85 0?;0A0UDAV - Laplace transformDatPanel.UDAV - 03@C78BL 40==K5UDAV - Load dataDatPanel0UDAV - 09B8 38AB>3@0<<CUDAV - Make histogramDatPanel,UDAV - 0:A8<C< ?> ...UDAV - Max along ...DatPanel*UDAV - 8=8<C< ?> ...UDAV - Min along ...DatPanel,UDAV - B@078BL 40==K5UDAV - Mirror dataDatPanel(UDAV - ><5=B ?> 'x'UDAV - Momentum along 'x'DatPanel(UDAV - ><5=B ?> 'y'UDAV - Momentum along 'y'DatPanel(UDAV - ><5=B ?> 'z'UDAV - Momentum along 'z'DatPanel8UDAV - >@<8@>20BL ?> A@570<UDAV - Normalize by sliceDatPanel2UDAV - >@<8@>20BL 40==K5UDAV - Normalize dataDatPanel<UDAV - ><5=OBL @07<5@K 40==KEUDAV - Rearrange dataDatPanel:UDAV - 7<5=8BL @07<5@ 40==KEUDAV - Resize dataDatPanel.UDAV - !>E@0=8BL 40==K5UDAV - Save dataDatPanel,UDAV - !3;048BL 40==K5UDAV - Smooth dataDatPanel&UDAV - !60BL 40==K5UDAV - Squeeze dataDatPanel&UDAV - !C<<0 ?> ...UDAV - Sum along ...DatPanel2UDAV - !C<<8@>20BL 40==K5UDAV - Summarize dataDatPanel.UDAV - ><5=OBL <5AB0<8UDAV - Swap dataDatPanel:UDAV - "@0=A?>=8@>20BL 40==K5UDAV - Transpose dataDatPanelX =0?@02;5=85 X-directionDatPanel 07<5@ ?> XX-sizeDatPanelY =0?@02;5=85 Y-directionDatPanel 07<5@ ?> YY-sizeDatPanelZ =0?@02;5=85 Z-directionDatPanel 07<5@ ?> ZZ-sizeDatPanel<3D 40==K5 A @07<5@0<8 87 D09;03D data with sizes from fileDataOpenDialog62B><. >?@545;5=85 @07<5@>2Auto detect data sizesDataOpenDialog\?@545;8BL @07<5@ 02B><0B8G5A:8 (%1 x %2 x %3)%Auto detect data sizes (%1 x %2 x %3)DataOpenDialog B<5=0CancelDataOpenDialog<O 40==KE Data nameDataOpenDialog"$09;K MGL (*.mgl)MGL files (*.mgl)DataOpenDialog80B@8F0 A @07<5@0<8 87 D09;0Matrix with sizes from fileDataOpenDialogNxNxDataOpenDialogNyNyDataOpenDialogNzNzDataOpenDialogOKOKDataOpenDialog,040BL @07<5@K 2@CG=CNSet data sizes manuallyDataOpenDialog (01;>=TemplateDataOpenDialog2UDAV - AB028BL 8<O D09;0UDAV - Insert filenameDataOpenDialog4UDAV - B:@KBL D09; 40==KEUDAV - Open data fileDataOpenDialog?> C<>;G0=8NdefaultDataOpenDialog B<5=0Cancel FilesDialogOKOK FilesDialog!B@>:0 4;O %1 String for %1 FilesDialog!B@>:0 4;O %2 String for %2 FilesDialog!B@>:0 4;O %3 String for %3 FilesDialog!B@>:0 4;O %4 String for %4 FilesDialog!B@>:0 4;O %5 String for %5 FilesDialog!B@>:0 4;O %6 String for %6 FilesDialog!B@>:0 4;O %7 String for %7 FilesDialog!B@>:0 4;O %8 String for %8 FilesDialog!B@>:0 4;O %9 String for %9 FilesDialog0UDAV - 0@0<5B@K H01;>=0UDAV - Set template parameters FilesDialog &09B8&Find FindDialog&0<5=8BL&Replace FindDialog0:@KBLClose FindDialog&'B> =09B8: Find &what: FindDialog$#G8BK20BL &@538AB@ Match &case FindDialog&0<5=8BL =0: Replace &by: FindDialogA:0BL =0&704Search &backward FindDialogUDAV - 09B8 UDAV - Find FindDialog&@8<5@K &Examples HelpPanel 0704Backward HelpPanel ?5@54Forward HelpPanel ><>ILHelp HelpPanel mgl_rumgl_en HelpPanel&0:@KBL&Close HintDialog&!;54CNI89&Next HintDialog&@54K4CI89&Prev HintDialog.>:07K20BL ?@8 7&0?CA:5&Show at startup HintDialogUDAV - !>25BK UDAV - Hint HintDialog1D 3@0D8:1D plot InfoDialog2D 3@0D8:2D plot InfoDialog8@>A<>B@ 4;O B5:CI53> A@570.Data preview for current slice. InfoDialog=D>@<0F8O Information InfoDialogf"8? 3@0D8:0: ;8=88 4;O 1D, 3@0D8: ?;>B=>AB8 4;O 2D.,Kind of plots: lines for 1D, density for 2D. InfoDialog@>A<>B@Preview InfoDialog(K15@8B5 B8? 3@0D8:0Select kind of plot InfoDialog8@0B:0O 8=D>@<0F8O > 40==KE.!Short information about the data. InfoDialog8 -- AB@>:0 A;8H:>< 4;8==0O:  -- string too long:  MGLThread& -- =5 E20B05B ' :  -- unbalanced ' :  MGLThread< -- =5?@028;L=K9 0@3C<5=B(K):  -- wrong argument(s):  MGLThread4 -- =5?@028;L=0O :><0=40:  -- wrong command:  MGLThread ;8=88 In line  MGLThread\ (c) ;5:A59 0;0:8=, 2008 http://udav.sf.net/- (c) Alexey Balakin, 2008 http://udav.sf.net/ MainWindow &?@>3@0<<5&About MainWindow&@8<5@K &Examples MainWindow &$09;&File MainWindow&!?@02:0&Help MainWindow&>2K9 :>4 &New script MainWindow&B:@KBL D09; &Open file MainWindow5G0B0BL &:>4 &Print script MainWindow &KE>4&Quit MainWindow&!>E@0=8BL :>4 &Save script MainWindow&0AB@>9:8 &Settings MainWindow  181;8>B5:5 &Qt About &Qt MainWindow 181;8>B5:5 QtAbout Qt MainWindow0;L:C;OB>@ Calculator MainWindow @0D8:Canvas MainWindow05 <>3C ?5@59B8 2 ?0?:C Couldn't change to folder  MainWindowX!>740BL =>2>5 ?CAB>5 >:=> 4;O :>40 (Ctrl+N).(Create new empty script window (Ctrl+N). MainWindowJK E>B8B5 A>E@0=8BL 87<5=5=8O 2 :>45?0Do you want to save the changes to the document? MainWindow!&>25BKH&ints MainWindow ><>ILHelp MainWindow=D>@<0F8OInfo MainWindow"03@C7:0 ?@5@20=0Loading aborted MainWindowMGL &A?@02:0 MGL &help MainWindownMGL :>4 (*.mgl) HDF5 D09;K (*.hdf *.h5) A5 D09;K (*.*);MGL scripts (*.mgl) HDF5 files (*.hdf *.h5) All files (*.*) MainWindowMGL :>4 (*.mgl) HDF5 D09;K (*.hdf *.h5) "5:AB (*.txt) $09;K 40==KE (*.dat) A5 D09;K (*.*)aMGL scripts (*.mgl) HDF5 files (*.hdf *.h5) Text files (*.txt) Data files (*.dat) All files (*.*) MainWindow4!>>1I5=8O 8 ?@54C?@5645=8OMessages and warnings MainWindow5 @0A?>7=0=>Not recognized MainWindowB:@KBL 8 2K?>;=8BL/?>:070BL :>4 8;8 40==K5 87 D09;0 (Ctrl+O). K <>65B5 2K:;NG8BL 02B><0B8G5A:>5 2K?>;=5=85 2 =0AB@>9:0E UDAV.rOpen and execute/show script or data from file (Ctrl+O). You may switch off automatic exection in UDAV properties. MainWindowhB:@KBL 480;>3 ?@8=B5@0 8 =0?5G0B0BL 3@0D8: (Ctrl+P)/Open printer dialog and print graphics (Ctrl+P) MainWindow &5G0B0BL 3@0D8:Print &graphics MainWindow0AB@>9:8 UDAV Properties MainWindow >B>2>Ready MainWindow>A;54=85 D09;K Recent files MainWindow$!>E@0=8BL &:0: ... Save &As ... MainWindow:!>E@0=8BL :>4 2 D09; (Ctrl+S)Save script to a file (Ctrl+S) MainWindow&!>E@0=5=85 ?@5@20=>Saving aborted MainWindow>4Script MainWindow&@3C<5=BK :>40Set ar&guments MainWindow*>:07K205B :0;L:C;OB>@, :>B>@K9 2KG8A;O5B 8 ?><>305B =01@0BL B5:AB>2K5 D>@<C;K. "5:AB>2K5 D>@<C;K <>3CB A>45@60BL B0:65 8 >?@545;5==K5 2 :>45 40==K5.rShow calculator which evaluate and help to type textual formulas. Textual formulas may contain data variables too. MainWindowP>:070BL 480;>3 =0AB@>5: ?@>3@0<<K UDAV. Show dialog for UDAV properties. MainWindow`>:07K205B ?@8<5@K 8A?>;L7>20=8O MGL (Shift+F1).&Show examples of MGL usage (Shift+F1). MainWindow^>:07K205B A?@02:C ?> B5:CI59 :><0=45 MGL (F1).Show help on MGL commands (F1). MainWindowN>:07K205B A>25BK ?> 8A?>;L7>20=8N MGL.Show hints of MGL usage. MainWindow:=> A>>1I5=89 Show info MainWindow&UDAV - B:@KBL D09;UDAV - Open file MainWindow$UDAV - > ?@>3@0<<5 UDAV - about MainWindow8UDAV - A>E@0=8BL B5:CI89 :>4UDAV - save current MainWindow*UDAV - A>E@0=8BL D09;UDAV - save file MainWindow 157 8<5=8 - UDAVuntitled - UDAV MainWindow"157 8<5=8* - UDAVuntitled* - UDAV MainWindow - UDAV ?@>A<>B@ - UDAV previewMemPanel6!>740BL =>2K9 <0AA82 40==KECreate new data arrayMemPanel4#40;8BL ! <0AA82K 40==KEDelete ALL data arraysMemPanel>#40;8BL 2K1@0==K9 <0AA82 40==KEDelete selected data arrayMemPanel:K E>B8B5 C40;8BL 2A5 40==K5?Do you want to delete all data?MemPanelJ 540:B8@>20BL 2K1@0==K9 <0AA82 40==KEEdit selected data arrayMemPanel@2548B5 8<O 4;O =>2>9 ?5@5<5==>9Enter name for new variableMemPanel 0<OBLMemoryMemPanel<ONameMemPanelD!2>9AB20 2K1@0==>3> <0AA820 40==KE!Properties of selected data arrayMemPanel 07<5@KSizesMemPanel.UDAV - >20O ?5@5<5==0OUDAV - New variableMemPanel2UDAV - #40;8BL 2A5 40==K5UDAV - delete all dataMemPanel>1=>28BL A?8A>: <0AA82>2 40==KEUpdate list of data arraysMemPanel1D 3@0D8:81D plots NewCmdDialog2D 3@0D8:82D plots NewCmdDialog3D 3@0D8:83D plots NewCmdDialog>1028BL 40==K5Add data NewCmdDialog>1028BL AB8;L Add style NewCmdDialog@3C<5=BArgument NewCmdDialogA8 :>>@48=0BAxis and colorbar NewCmdDialog0AB@>9:0 >A59 Axis setup NewCmdDialog B<5=0Cancel NewCmdDialog@3C<5=BK :><0=4K. 8@=K< >1>7=0G5=K >1O70B5;L=K5 0@3C<5=BK. A5 ?@>G85 0@3C<5=BK >?F8>=0;L=K, => 8E ?>@O4>: 4>;65= A>1;N40BLAO. >6=> 8A?>;L7>20BL '' 4;O D>@<0B0 ?> C<>;G0=8N. !?@02:0 A?@020 405B ?>4@>1=>5 >?8A0=85 :><0=4K 8 7=0G5=8O 0@3C<5=B>2 ?> C<>;G0=8N.Command arguments. Bold ones are required arguments. Other are optional arguments but its order is required. You can use '' for default format. See help at right for default values. NewCmdDialog*!>740=85 40==KE 8 I/OCreate data and I/O NewCmdDialog K45;5=85 40==KEData extraction NewCmdDialog 1@01>B:0 40==KE Data handling NewCmdDialog0@=K5 3@0D8:8 Dual plots NewCmdDialog"0AB@>9:0 3@0D8:0 General setup NewCmdDialog"@C??K :><0=4 MGLGroups of MGL commands NewCmdDialog45AL <>6=> 2K1@0BL AB8;L 3@0D8:0.  57C;LB0B 1C45B ?><5I5= 2 0@3C<5=B 'fmt'.PHere you can select the plot style. The result will be placed in 'fmt' argument. NewCmdDialog45AL <>6=> 2K1@0BL >?F88 :><0=4. ?F88 8A?>;L7CNBAO 4;O 4>?>;=8B5;L=>9 =0AB@>9:8 2840 3@0D8:0.SHere you can specify command options. Options are used for additional plot tunning. NewCmdDialog"8? 0@3C<5=B>2 :><0=4K. A?>;L7CNBAO >1>7=0G5=8O: * 03;02=K<8 >1>7=0G5=K 40==K5 (=0?@8<5@, Ydat); * @3C<5=BK 2 '' >7=0G0NB AB@>:8 (=0?@8<5@, 'fmt'); * @>G85 0@3C<5=BK -- G8A;0 (=0?@8<5@, zval); * @3C<5=BK 2 [] >?F8>=0;L=K (<>3CB =5 C:07K20BLAO).Kind of command argument order. The notation is: * Capital arguments are data (like, Ydat); * Argument in '' are strings (like, 'fmt'); * Other arguments are numbers (like, zval); * Arguments in [] are optional arguments. NewCmdDialog@><0=4K MGL 4;O 2K1@0==>9 3@C??KMGL commands for selected group NewCmdDialog>20O :><0=40 New command NewCmdDialog>41>@ DC=:F88Nonlinear fitting NewCmdDialogOKOK NewCmdDialog ?F88Options NewCmdDialog@>G85 3@0D8:8 Other plots NewCmdDialog@8<8B82K Primitives NewCmdDialog#A;>28O 8 F8:;K Program flow NewCmdDialog&>;>65=85 8 ?>2>@>BScale and rotate NewCmdDialog>!=0G0;0 2K15@8B5 B8? 0@3C<5=B>2)Select first the proper kind of arguments NewCmdDialogD@0B:>5 >?8A0=85 2K1@0==>9 :><0=4K%Short description of selected command NewCmdDialog"5:AB 8 ;535=40Text and legend NewCmdDialogL5B 0@3C<5=B0 'fmt' 4;O 40==>9 :><0=4K+There is no 'fmt' argument for this command NewCmdDialog=0G5=85Value NewCmdDialog"5:B>@=K5 3@0D8:8 Vector plots NewCmdDialogDK 4>;6=K 22>48BL B5:AB 2=CB@8 ' ',You should put text inside ' ' for argument  NewCmdDialogdK 4>;6=K 225AB8 2A5 >?F8>=0;L=K5 0@3C<5=BK ?5@54 1You should specify all optional arguments before  NewCmdDialogVK 4>;6=K 225AB8 2A5 >1O70B5;L=K5 0@3C<5=BK%You should specify required argument  NewCmdDialog mgl_rumgl_en NewCmdDialog@>7@0G=>ABLAlpha OptionDialog"$>=>2>5 >A25I5=85Ambient OptionDialogN10 ?>;O 2 crange 4>;6=K 1KBL 70?>;=5=K$Both fields in crange must be filled OptionDialogN10 ?>;O 2 xrange 4>;6=K 1KBL 70?>;=5=K$Both fields in xrange must be filled OptionDialogN10 ?>;O 2 yrange 4>;6=K 1KBL 70?>;=5=K$Both fields in yrange must be filled OptionDialogN10 ?>;O 2 zrange 4>;6=K 1KBL 70?>;=5=K$Both fields in zrange must be filled OptionDialog80?07>= ?> CC-range OptionDialog B<5=0Cancel OptionDialog1@570=85Cutting OptionDialog 07<5@ H@8DB0 Font size OptionDialog535=40Legend OptionDialog"'8A;> ;8=89 A5B:8Mesh num OptionDialogOKOK OptionDialog*UDAV - >1028BL >?F8NUDAV - Add options OptionDialog&UDAV - >?F88 :><0=4UDAV - command options OptionDialog80?07>= ?> XX-range OptionDialog80?07>= ?> YY-range OptionDialog80?07>= ?> ZZ-range OptionDialog2K:;off OptionDialog2:;on OptionDialog"&>4>1@0BL @07<5@ &Adjust size PlotPanel&@>7@0G=>ABL&Alpha PlotPanel&=8<0F8O &Animation PlotPanel"&>?8@>20BL :>>@.&Copy click coor. PlotPanel$&>?8@>20BL 3@0D8: &Copy plot PlotPanel&-:A?>@B 2 ...&Export as ... PlotPanel&@0D8: &Graphics PlotPanel &!5B:0&Grid PlotPanel&A25I5=85&Light PlotPanel&!;54CNI89 :04@ &Next slide PlotPanel &@54K4CI89 :04@ &Prev slide PlotPanel&@0I0BL <KH:>9&Rotate by mouse PlotPanel&0?CAB8BL &Slideshow PlotPanel&AB0=>28BL&Stop PlotPanel$&@81;865=85 <KHLN&Zoom by mouse PlotPanel7<5=8BL @07<5@ @8AC=:0 B0:, GB>1K >= 70?>;=O; 2AN >1;0ABL (F6).-Change canvas size to fill whole region (F6). PlotPanelx>?8@>20BL 2 1CD5@ >1<5=0 :>>@48=0BK ?>A;54=53> I5;G:0 <KH8.2Copy coordinates of last mouse click to clipboard. PlotPanel`>?8@>20BL 3@0D8: 2 1CD5@ >1<5=0 (Ctrl+Shift+C).*Copy graphics to clipboard (Ctrl+Shift+C). PlotPanelF#<5=LH8BL C3>; \phi =0 10 3@04CA>2."Decrease \phi angle by 10 degrees. PlotPanelJ#<5=LH8BL C3>; \theta =0 10 3@04CA>2.$Decrease \theta angle by 10 degrees. PlotPanel.@5<O @8A>20=8O %1 <A5:Drawing time %1 ms PlotPanelRK?>;=8BL :>4 8 ?5@5@8A>20BL 3@0D8: (F5).(Execute script and redraw graphics (F5). PlotPanel04@ %1 87 %2Frame %1 of %2 PlotPanelF#25;8G8BL C3>; \phi =0 10 3@04CA>2."Increase \phi angle by 10 degrees. PlotPanelJ#25;8G8BL C3>; \theta =0 10 3@04CA>2.$Increase \theta angle by 10 degrees. PlotPanel!4283 2&=87 Move &down PlotPanel!4283 2&;52> Move &left PlotPanel!4283 2?&@02> Move &right PlotPanel!4283 &225@EMove &up PlotPanelL!4283 3@0D8:0 2;52> =0 1/3 53> H8@8=K.'Move graphics left by 1/3 of its width. PlotPanelN!4283 3@0D8:0 2?@02> =0 1/3 53> H8@8=K.(Move graphics right by 1/3 of its width. PlotPanelL!4283 3@0D8:0 225@E =0 1/3 53> 2KA>BK.&Move graphics up by 1/3 of its height. PlotPanelJ!4283 3@0D8:0 2=87 =0 1/3 53> 2KA>BK.(Move graphics up down 1/3 of its height. PlotPanel5G0BL ?@5@20=0Printing aborted PlotPanel 5G0BL 7025@H5=0Printing completed PlotPanel5G0B0N... Printing... PlotPanel5&@5@8A>20BLRe&draw PlotPanel5@5&3@C78BLRe&load PlotPanel&>AAB0=>28BLRes&tore PlotPanel>AAB0=>28BL 2@0I5=85, <0AHB01 8 ?5@A?5:B82C ?> C<>;G0=8N (Ctrl+Space).ERestore default graphics rotation, zoom and perspective (Ctrl+Space). PlotPanelz>AAB0=>28BL AB0BCA :><0=4K 'once' 8 ?5@53@C78BL 40==K5 (F9).7Restore status for 'once' command and reload data (F9). PlotPanel@0I0BLRotate PlotPanel@0I0BL 2=87 Rotate down PlotPanel@0I0BL 2;52> Rotate left PlotPanel@0I0BL 2?@02> Rotate right PlotPanel@0I0BL 225@E Rotate up PlotPanel0?CAB8BL 0=8<0F8N (Ctrl+F5). A;8 ?0@0<5B@K =5 1K;8 C:070=K, B> ?>:07K205BAO 480;>3 A ?0@0<5B@0<8 0=8<0F88.fRun slideshow (Ctrl+F5). If no parameter specified then the dialog with slideshow options will appear. PlotPanel&&0AB@>8BL 0=8<0F8N Se&tup show PlotPanel7<5=8BL 7=0G5=85 C3;0 \phi. >6=> 8A?>;L7>20BL :;028H8 (Shift+Meta+Left 8;8 Shift+Meta+Right).PSet value of \phi angle. You can use keys (Shift+Meta+Left or Shift+Meta+Right). PlotPanel7<5=8BL 7=0G5=85 C3;0 \theta. >6=> 8A?>;L7>20BL :;028H8 (Shift+Meta+Up 8;8 Shift+Meta+Down).OSet value of \theta angle. You can use keys (Shift+Meta+Up or Shift+Meta+Down). PlotPanelJ>:070BL A;54CNI89 :04@ (Meta+Right).Show next slide (Meta+Right). PlotPanelJ>:070BL ?@54K4CI89 :04@ (Meta+Left). Show previous slide (Meta+Left). PlotPanelBAB0=>28BL 2K?>;5=5=85 :>40 (F7).Stop script execution (F7). PlotPanel:;NG8BL/2K:;NG8BL @8A>20=85 A5B:8 01A>;NB=KE :>>@48=0B (Ctrl+G).=Switch on/off grid drawing for absolute coordinates (Ctrl+G). PlotPanel\:;NG8BL/2K:;NG8BL >A25I5=85 3@0D8:0 (Ctrl+L).2Switch on/off lightning for the graphics (Ctrl+L). PlotPanel:;NG8BL/2K:;NG8BL 87<5=5=85 3@0D8:0 <KHLN (2@0I5=85, A4283, ?@81;865=85 8 ?5@A?5:B820).[Switch on/off mouse handling of the graphics (rotation, shifting, zooming and perspective). PlotPaneld:;NG8BL/2K:;NG8BL ?@81;865=85 2K1@0==>3> @538>=0.,Switch on/off mouse zoom of selected region. PlotPanelb:;NG8BL/2K:;NG8BL ?@>7@0G=>ABL 3@0D8:0 (Ctrl+T).5Switch on/off transparency for the graphics (Ctrl+T). PlotPanel&@81;878BLZoom &in PlotPanel&B40;8BL Zoom &out PlotPanel$@81;878BL 3@0D8:.Zoom in graphics. PlotPanel B40;8BL 3@0D8:.Zoom out graphics. PlotPanel0AHB01/A4283 Zoom/move PlotPanel@0AB@>2K9 EPS bitmap EPS PlotPanel25:B>@=K9 EPS vector EPS PlotPanel!>74.40==KEAutoKey PropDialogL2B><0B8G5A:8 2K?>;=OBL ?>A;5 703@C7:8*Automatically execute script after loading PropDialog^2B><0B8G5A:8 A>E@0=OBL ?5@54 ?5@5@8A>2:>9 (F5)(Automatically save before redrawing (F5) PropDialog B<5=0Cancel PropDialog7<5=8BL H@8DB Change font PropDialog><5=B0@88Comments PropDialog"5:CI89 H@8DB Current font PropDialog^5 @8A>20BL 3@0=8 (1KAB@55) ?@8 2@0I5=88 <KHLN.?>;=5=85 :;NG52KE A;>2Enable keywords completition PropDialogEnglish PropDialog#?@.:><0=4KFlowKey PropDialog*$09;K H@8DB>2 (*.vfm)Font files (*.vfm) PropDialog 07<5@ @8AC=:0 Image size PropDialog><0=4KKeywords PropDialog/7K: 4;O UDAVLanguage for UDAV PropDialog:03@C60BL A:@8?B 2 =>2>5 >:=>Load script to new window PropDialog '8A;0Numbers PropDialogOKOK PropDialog ?F88Options PropDialog*CBL : D09;0< A?@02:8Path for help files PropDialog*CBL : H@8DB0< MathGLPath for user MathGL font files PropDialog2><5AB8BL @540:B>@ A25@ECPlace editor at top PropDialog CAA:89Russian PropDialog(0AB@>8BL F25B0 4;O:Setup colors for: PropDialog !B@>:8Strings PropDialog!CDD8:AKSuffixes PropDialog2UDAV - AB028BL 8<O D09;0UDAV - Insert filename PropDialog UDAV - 0AB@>9:8UDAV - Properties PropDialoglK 4>;6=K ?5@570?CAB8BL UDAV 4;O ?@8<5=5=8O 87<5=5=89.2You have to restart UDAV for applying the cahnges. PropDialogN5B 8<5=8 D09;0. !>E@0=8B5 A=0G0;0 :>4.&No filename. Please save script first. QMGLCanvas(5 8=8F80;878@>20=>!Not initialized! QMGLCanvasUDAV QMGLCanvasB - B5<=> A8=89B - navyQObject"C - B5<=> 3>;C1>9C - tealQObject.E - B5<=> 65;B>-75;5=K9 E - darklawnQObjectG - 75;5=K9 G - greenQObjectH - B5<=> A5@K9 H - darkgrayQObject,L - B5<=> A8=5-75;5=K9 L - seagreenQObjectM - ?C@?C@=K9 M - purpleQObject2N - B5<=> =515A=>-3>;C1>9N - darkskyblueQObject(P - B5<=> D8>;5B>2K9 P - darkpinkQObjectQ - :>@8G=52K9 Q - brownQObject"R - B5<=> :@0A=K9 R - maroonQObjectU - 8=483> U - indigoQObject W - A25B;>-A5@K9 W - lightgrayQObjectY - >;82:>2K9 Y - oliveQObject 7=0: YY-signQObjectAB@5;:0arrowQObject72574>G:0asterixQObjectb - A8=89b - blueQObject >1@0B=0O AB@5;:0 back arrowQObjectc - 3>;C1>9c - cyanQObject>:@C6=>ABLcircleQObject$B>G:0 2 >:@C6=>AB8 circled dotQObject?C=:B8@dashQObject?C=:B8@-B>G:0dash dotQObject B>G:0dotQObject B>G:8dotsQObject"e - 65;B>-75;5=K9 e - lawngreenQObject g - O@:>-75;5=K9g - limeQObjecth - A5@K9h - grayQObjectk - G5@=K9 k - blackQObject l - A8=5-75;5=K9l - springgreenQObject4;8==K9 ?C=:B8@ long dashQObjectm - <0;8=>2K9 m - magentaQObject&n - =515A=>-3>;C1>9 n - skyblueQObject=5BnoneQObject(=5B 8;8 ?>-C<>;G0=8Nnone or defaultQObjectp - D8>;5B>2K9 p - deeppinkQObject?;NAplusQObjectq - >@0=652K9 q - orangeQObjectr - :@0A=K9r - redQObject@><1rhombQObject @07<5@sizeQObject:>A>9 :@5AB skew crossQObject<5;:89 ?C=:B8@ small dashQObject(<5;:89 ?C=:B8@-B>G:0small dash dotQObjectA?;>H=0OsolidQObject:@C3 solid circleQObject 70:@0H5==K9 @><1 solid rhombQObject&70:@0H5==K9 :204@0B solid squareQObject870:@0H5==K9 B@5C3>;L=8: 2=87solid triangle downQObject:70:@0H5==K9 B@5C3>;L=8: 2;52>solid triangle leftQObject<70:@0H5==K9 B@5C3>;L=8: 2?@02>solid triangle rightQObject:70:@0H5==K9 B@5C3>;L=8: 225@Esolid triangle upQObject:204@0BsquareQObject,:>A>9 :@5AB 2 :204@0B5 squared crossQObject?;NA 2 :204@0B5 squared plusQObjectAB>?stopQObjectB@5C3>;L=8:triangleQObject B@5C3>;L=8: 2=87 triangle downQObject"B@5C3>;L=8: 2;52> triangle leftQObject$B@5C3>;L=8: 2?@02>triangle rightQObject"B@5C3>;L=8: 225@E triangle upQObject&u - A8=5-D8>;5B>2K9u - bluevioletQObjectw - 15;K9 w - whiteQObjecty - 65;BK9 y - yellowQObject@>7@0G=>ABLAlpha on SetupDialog(07>20O ?@>7@0G=>ABLAlphaDef SetupDialog$>=>2K9 A25BAmbient SetupDialogAL 2@0I5=8OAxialDir SetupDialog07>20O H8@8=0 BaseWidth SetupDialog/@:>ABL Brightness SetupDialog AL CC axis SetupDialog B<5=0Cancel SetupDialog&25BColor SetupDialog.5 <>3C 70?8A0BL 2 D09;Could not write to file SetupDialog!B8;L B5:AB0Font SetupDialog 07<5@ B5:AB0FontSize SetupDialog1I85 =0AB@>9:8General settings SetupDialogID SetupDialog>4?8ALLabel SetupDialogA25I5=85Light on SetupDialogj>;>65=85 8AB>G=8:0 4>;6=> 1KBL 70?>;=5=>. 3=>@8@CN.+Light position should be filled. Ignore it. SetupDialog&0AB@>9:8 >A25I5=8OLight settings SetupDialog0:A8<C<Maximal SetupDialog"'8A;> ;8=89 A5B:8MeshNum SetupDialog8=8<C<Minimal SetupDialog,0?@5B 2@0I5=8O B5:AB0No text rotation SetupDialog0G0;> >A59Origin SetupDialog!>E@0=8BLSave SetupDialog0G0;> <5B>:Start SetupDialog!>AB>O=85State SetupDialog>4-<5B:8SubTicks SetupDialog (01;>=Template SetupDialog<O H01;>=0 Template name SetupDialog(01;>= A>E@0=5=Template saved SetupDialog 5B:8Ticks SetupDialog  :>4 To script SetupDialog.UDAV - !>E@0=8BL H01;>=UDAV - Save template SetupDialog0UDAV - 0AB@>9:0 3@0D8:0UDAV - Setup plot SetupDialog AL XX axis SetupDialogX pos SetupDialog AL YY axis SetupDialogY pos SetupDialog AL ZZ axis SetupDialogZ pos SetupDialog?> F5=B@C at center SetupDialog<0:A8<C<0 at maximum SetupDialog<8=8<C<0 at minimum SetupDialog2 ?>78F88 at position SetupDialog2:;on SetupDialog!B@5;:0 2 :>=F5 Arrow at end StyleDialog !B@5;:0 2 =0G0;5Arrow at start StyleDialogAL 2@0I5=8OAxial direction StyleDialog 8@=K9 Bold style StyleDialog B<5=0Cancel StyleDialog&25BColor StyleDialog>@O4>: F25B>2 Color order StyleDialog&25B>20O AE5<0 Color scheme StyleDialog(&25B 24>;L :>>@48=0BColors along coordinates StyleDialogC=:B8@Dashing StyleDialog!B8;L B5:AB0 Font style StyleDialog C@A82 Italic style StyleDialog!B8;L ;8=88 Line style StyleDialog">;I8=0 Line width StyleDialog 0@:5@Marks StyleDialogOKOK StyleDialog04G5@:=CBK9Overline StyleDialog 57C;LB0BResulting string StyleDialog0AKI5==>ABL Saturation StyleDialogK@02=820=85 Text align StyleDialog&25B B5:AB0 Text color StyleDialog""5:AB =0 :>=BC@0EText on contours StyleDialog6UDAV - AB028BL AB8;L/AE5<CUDAV - Insert style/scheme StyleDialog>4G5@:=CBK9 Underline StyleDialog!5BG0BK9 3@0D8:Wire or mesh plot StyleDialog >=BC@ Wire style StyleDialog=04above StyleDialog?> F5=B@C at center StyleDialog 2;52>left StyleDialog=5Bnone StyleDialog 2?@02>right StyleDialog?>4under StyleDialog"&>?8@>20BL B5:AB &Copy text TextPanel&@02:0&Edit TextPanel&09B8/70<5=8BL &Find/Replace TextPanel&AB028BL B5:AB &Paste text TextPanel&5@=CBL&Redo TextPanel&B<5=8BL&Undo TextPanelG8AB8BL 2A5 Clear all TextPanel?F88 :><0=4KCommand options TextPanelh>?8@>20BL 2K45;5==K9 B5:AB 2 1CD5@ >1<5=0 (Ctrl+C).1Copy selected text or data to clipboard (Ctrl+C). TextPanel*5 <>3C 70?8A0BL 2 %1Could not write to %1 TextPanel*5 <>3C >B:@KBL D09; Couldn't open file  TextPanel&K@570BL Cu&t text TextPaneldK@570BL 2K45;5==K9 B5:AB 2 1CD5@ >1<5=0 (Ctrl+X).(Cut selected text to clipboard (Ctrl+X). TextPanel $09; %1 A>E@0=5= File %1 saved TextPanel<O D09;0 File name TextPanel09B8 B5:AB Find next TextPanel"0945==0O D>@<C;0Fitted formula TextPanelCBL ?0?:8 Folder path TextPanel"0AB@>9:0 3@0D8:0Graphics setup TextPanelAB028BLInsert TextPanelZAB028BL ?>A;54=NN =0945==CN D>@<C;C 2 B5:AB.3Insert last fitted formula with found coefficients. TextPanel$03@C65= 4>:C<5=B Loaded document  TextPanel(03@C65= 4>:C<5=B %1Loaded document %1 TextPanel>20O :><0=40 New command TextPanel"!B@>:0 =5 =0945=0No string occurrence is found TextPanel$'8A;5==>5 7=0G5=85 Numeric value TextPanelhAB028BL B5:AB 8;8 40==K5 87 1CD5@0 >1<5=0 (Ctrl+V).+Paste text or data from clipboard (Ctrl+V). TextPanel!B8;L 3@0D8:0 Plot style TextPanel5G0BL ?@5@20=0Printing aborted TextPanel 5G0BL 7025@H5=0Printing completed TextPanel5G0B0N... Printing... TextPanelZ5@=CBL 87<5=5=8O 2 @540:B>@5 (Ctrl+Shift+Z)."Redo editor change (Ctrl+Shift+Z). TextPanelj0<5=8BL 2K45;5==>5 2K@065=85 53> G8A;>2K< 7=0G5=85<.*Replace expression by its numerical value. TextPanelK45;8BL 2A&5 Select &all TextPanel<K1@0BL 8 2AB028BL ?CBL D09;0.Select and insert file name. TextPanel<K1@0BL 8 2AB028BL ?CBL ?0?:8.Select and insert folder name. TextPanelL>:070BL 480;>3 2AB02:8 =>2>9 :><0=4K.7Show dialog for new command and put it into the script. TextPanel>:070BL 480;>3 2K1>@0 >?F89 :><0=4K. ?F88 8A?>;L7CNBAO 4;O 4>?>;=8B5;L=>9 =0AB@>9:8 2K1@0==>3> 3@0D8:0.cShow dialog for options and put it into the script. Options are used for additional setup the plot. TextPanel>:070BL 480;>3 =0AB@>9:8 3@0D8:0 8 2AB028BL 55 2 :>4. 80;>3 ?>72>;O5B =0AB@>8BL >A8, ?>4?8A8, >A25I5=85 8 ?@.{Show dialog for plot setup and put code into the script. This dialog setup axis, labels, lighting and other general things. TextPanel>:070BL 480;>3 AB8;O 3@0D8:0 8 2AB028BL 53> 2 :>4. !B8;L >?@545;O5B 284 3@0D8:0 (F25B, <0@:5@K, ?C=:B8@ 8 ?@).xShow dialog for styles and put it into the script. Styles define the plot view (color scheme, marks, dashing and so on). TextPanelN>:070BL 480;>3 ?>8A:0 B5:AB0 (Ctrl+F).&Show dialog for text finding (Ctrl+F). TextPanel2UDAV - AB028BL 8<O D09;0UDAV - Insert filename TextPanel&UDAV - ?>8A: B5:AB0UDAV - find text TextPanel&UDAV - >B:@KBL D09;UDAV - open file TextPanelPB<5=8BL 87<5=5=8O 2 @540:B>@5 (Ctrl+Z).Undo editor change (Ctrl+Z). TextPanel ) , mathgl-8.0.1/udav/setup_dlg.h0000664000175000017500000000523214167366466015705 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SETUPDIALOG_H #define SETUPDIALOG_H //----------------------------------------------------------------------------- #include #if defined(_MSC_VER) #include #endif class QLineEdit; class QCheckBox; class QComboBox; //----------------------------------------------------------------------------- /// Add setup code to script or save it to file (template) class SetupDialog : public QDialog { Q_OBJECT public: SetupDialog(QWidget *parent = 0); ~SetupDialog(); signals: void putText(const QString &par); private slots: void saveTmpl(); void toScript(); private: QString res; QLineEdit *xmin, *xmax, *xorg, *xlbl, *xtck, *xsub, *xort, *xtt; QLineEdit *ymin, *ymax, *yorg, *ylbl, *ytck, *ysub, *yort, *ytt; QLineEdit *zmin, *zmax, *zorg, *zlbl, *ztck, *zsub, *zort, *ztt; QLineEdit *cmin, *cmax, *aldef,*amb, *basew,*mesh, *font, *fsize, *fname, *ctt; QLineEdit *xlight[10], *ylight[10], *zlight[10], *blight[10]; QCheckBox *slight[10], *alpha, *light, *rotate; QComboBox *clight[10], *xpos, *ypos, *zpos, *axial; bool convert(); }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/find_dlg.cpp0000664000175000017500000000770314167366466016025 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include "mgl2/define.h" #include "find_dlg.h" //----------------------------------------------------------------------------- FindDialog::FindDialog(QWidget *parent) : QDialog(parent) { QLabel *lbl; QHBoxLayout *a; setWindowTitle(_("UDAV - Find")); QVBoxLayout *o = new QVBoxLayout; a = new QHBoxLayout; o->addLayout(a); lbl = new QLabel(_("Find what:"), this); a->addWidget(lbl); line = new QLineEdit(this); lbl->setBuddy(line); a->addWidget(line); a = new QHBoxLayout; o->addLayout(a); lbl = new QLabel(_("Replace by:"), this); a->addWidget(lbl); text = new QLineEdit(this); lbl->setBuddy(text); a->addWidget(text); caseUse = new QCheckBox(_("Match case"), this); o->addWidget(caseUse); backward = new QCheckBox(_("Search backward"), this); o->addWidget(backward); a = new QHBoxLayout(this); a->setMargin(11); a->setSpacing(6); a->addLayout(o); o = new QVBoxLayout; a->addLayout(o); find = new QPushButton(_("Find"), this); o->addWidget(find); find->setDefault(true); find->setEnabled(false); repl= new QPushButton(_("Replace"), this); o->addWidget(repl); repl->setEnabled(false); cancel = new QPushButton(_("Close"), this); o->addWidget(cancel); o->addStretch(1); connect(line, SIGNAL(textChanged(const QString &)), this, SLOT(enableFind(const QString &))); connect(find, SIGNAL(clicked()), this, SLOT(findClicked())); connect(repl, SIGNAL(clicked()), this, SLOT(replClicked())); connect(cancel, SIGNAL(clicked()),this, SLOT(close())); } //----------------------------------------------------------------------------- FindDialog::~FindDialog() {} //----------------------------------------------------------------------------- void FindDialog::findClicked() { emit findText(line->text(), caseUse->isChecked(), backward->isChecked()); } //----------------------------------------------------------------------------- void FindDialog::replClicked() { emit replText(line->text(), text->text(), caseUse->isChecked(), backward->isChecked()); } //----------------------------------------------------------------------------- void FindDialog::enableFind(const QString &txt) { find->setEnabled(!txt.isEmpty()); repl->setEnabled(!txt.isEmpty()); } //----------------------------------------------------------------------------- void FindDialog::closeEvent(QCloseEvent *event) { emit replText("", "", false, false); event->accept(); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/dat_pnl.h0000664000175000017500000000707114167366466015343 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef DAT_PNL_H #define DAT_PNL_H //----------------------------------------------------------------------------- #include //----------------------------------------------------------------------------- class mglDataA; class QMenu; class QBoxLayout; class QTableWidget; class QSpinBox; class InfoDialog; //----------------------------------------------------------------------------- /// Window for viewing, handling and editing the data array class DatPanel : public QWidget { Q_OBJECT public: QMenu *menu; InfoDialog *infoDlg; ///< Reference to dialog !!! DatPanel(InfoDialog *inf, QWidget *parent = 0); ~DatPanel(); void setVar(mglDataA *v); inline long GetNz() { return nz; } ///< Get number of slices QString dataName(); public slots: QString dataOper() { return opers; } void refresh(); ///< Refresh table with new data values signals: void sliceChanged(int); void nzChanged(int); private slots: void setSlice(int k); void putValue(int r, int c); // menu genereal void load(); void save(); void copy(); void paste(); void plot(); void list(); // menu fill void inrange(); void norm(); void normsl(); // menu resize void create(); void reSize(); void squize(); void crop(); void rearrange(); // menu change void oper(); // menu another void newdat(); void hist(); // menu navigation void first(); void last(); void next(); void prev(); void gosl(); void setNz(int nz); private: int nx,ny,nz; ///< Data sizes QString id; QString opers; ///< MGL script of all operations done on data QTableWidget *tab; ///< Table itself int kz; ///< Current z-slice mglDataA *var; ///< Variable with data // QSpinBox *sb; ///< SpinBox for selecting slice bool ready; ///< Data is refreshed QSpinBox *sb; bool sizesDialog(const QString &cap, const QString &lab, const QString &desc1, const QString &desc2, const QString &desc3, QString &val1, QString &val2, QString &val3); void toolTop(QBoxLayout *l); void toolLeft(QBoxLayout *l); }; //----------------------------------------------------------------------------- #endif // DAT_PNL_H //----------------------------------------------------------------------------- mathgl-8.0.1/udav/textedit.h0000664000175000017500000000724214167366466015554 0ustar balakinbalakin/**************************************************************************** ** ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). ** All rights reserved. ** Contact: Nokia Corporation (qt-info@nokia.com) ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** You may use this file under the terms of the BSD license as follows: ** ** "Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are ** met: ** * Redistributions of source code must retain the above copyright ** notice, this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright ** notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the ** distribution. ** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor ** the names of its contributors may be used to endorse or promote ** products derived from this software without specific prior written ** permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." ** $QT_END_LICENSE$ ** ****************************************************************************/ #ifndef TEXTEDIT_H #define TEXTEDIT_H //----------------------------------------------------------------------------- #include #if defined(_MSC_VER) #include #endif //----------------------------------------------------------------------------- class QCompleter; class Numb; //----------------------------------------------------------------------------- class TextEdit : public QTextEdit { Q_OBJECT public: TextEdit(QWidget *parent = 0); void setCompleter(QCompleter *c); QCompleter *completer() const { return c; } int getFirstVisibleBlockId(); void lineNumberAreaPaintEvent(QPaintEvent *event); int lineNumberAreaWidth(); public slots: void resizeEvent(QResizeEvent *e); void setErrMessage(const QString &s); protected: void keyPressEvent(QKeyEvent *e); void focusInEvent(QFocusEvent *e); bool isErrLine(int line) const; private slots: void insertCompletion(const QString &completion); void highlight(); void updateLineNumberAreaWidth(int newBlockCount); void updateLineNumberArea(QRectF /*rect_f*/); void updateLineNumberArea(int /*slider_pos*/); void updateLineNumberArea(); private: QString textUnderCursor() const; QCompleter *c; QWidget *lineNumberArea; std::vector err; }; //----------------------------------------------------------------------------- class LineNumberArea : public QWidget { Q_OBJECT public: LineNumberArea(TextEdit *editor); QSize sizeHint() const; protected: void paintEvent(QPaintEvent *event); private: TextEdit *codeEditor; }; //----------------------------------------------------------------------------- #endif // TEXTEDIT_H //----------------------------------------------------------------------------- mathgl-8.0.1/udav/hint_dlg.cpp0000664000175000017500000000626314167366466016047 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include "hint_dlg.h" #include "mgl2/data_cf.h" #include "mgl2/wnd.h" //----------------------------------------------------------------------------- // // Hint dialog // //----------------------------------------------------------------------------- HintDialog::HintDialog(QWidget *parent) : QDialog(parent) { for(int i=0;mgl_hints[i];i++) hints.append(mgl_hints[i]); numHints=hints.size(); cur = int(mgl_rnd()*numHints); setWindowTitle(_("UDAV - Hint")); QHBoxLayout *a; QPushButton *b; QVBoxLayout *o = new QVBoxLayout(this); text = new QTextEdit(this); o->addWidget(text); text->setReadOnly(true); text->setText(hints[cur]); start = new QCheckBox(_("Show at startup"), this); o->addWidget(start); start->setChecked(true); a = new QHBoxLayout; o->addLayout(a); b = new QPushButton(_("Prev"), this); a->addWidget(b); connect(b, SIGNAL(clicked()), this, SLOT(prevClicked())); b = new QPushButton(_("Next"), this); a->addWidget(b); connect(b, SIGNAL(clicked()), this, SLOT(nextClicked())); b = new QPushButton(_("Close"), this); a->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(close())); } //----------------------------------------------------------------------------- void HintDialog::closeEvent(QCloseEvent *) { QSettings settings("udav","UDAV"); settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); settings.setValue("/showHint", start->isChecked()); settings.endGroup(); } //----------------------------------------------------------------------------- void udavShowHint(QWidget *p) { HintDialog *hd = new HintDialog(p); hd->exec(); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/prop_dlg.cpp0000664000175000017500000003000214167366466016051 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- #include #include "prop_dlg.h" #include "udav_wnd.h" #include "plot_pnl.h" #include "text_pnl.h" //----------------------------------------------------------------------------- extern QColor mglColorScheme[10]; extern QString defFontFamily; extern int defFontSize; extern QString pathHelp; extern bool mglAutoExecute; extern bool mglAutoSave; // extern bool mglAutoPure; extern bool mglCompleter; extern bool editPosBottom; extern bool loadInNewWnd; extern bool mglHighlight; extern bool mglDotsRefr; extern bool mglWheelZoom; int defWidth, defHeight; QString pathFont; QString lang[]={"en","ru","es"}; //----------------------------------------------------------------------------- PropDialog::PropDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(_("UDAV - Properties")); QHBoxLayout *h; QVBoxLayout *v; QLabel *l; QPushButton *b; v = new QVBoxLayout(this); h = new QHBoxLayout(); v->addLayout(h); lbl = new QLabel(_("Current font"), this); h->addWidget(lbl); lbl->setFont(QFont(defFontFamily, defFontSize)); h->addStretch(1); defFont = QFont(defFontFamily, defFontSize); b = new QPushButton(_("Change font"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(setF())); cc[0]=mglColorScheme[0]; cc[1]=mglColorScheme[1]; cc[2]=mglColorScheme[2]; cc[3]=mglColorScheme[3]; cc[4]=mglColorScheme[4]; cc[5]=mglColorScheme[5]; cc[6]=mglColorScheme[6]; cc[7]=mglColorScheme[7]; cc[8]=mglColorScheme[8]; cc[9]=mglColorScheme[9]; QPixmap pic(16,16); l = new QLabel(_("Setup colors for:"), this); v->addWidget(l, Qt::AlignHCenter); QGridLayout *g = new QGridLayout(); v->addLayout(g); pic.fill(cc[0]); cb[0] = new QPushButton(pic, _("Comments"), this); connect(cb[0], SIGNAL(clicked()),this, SLOT(setC0())); g->addWidget(cb[0], 0, 0); pic.fill(cc[1]); cb[1] = new QPushButton(pic, _("Strings"), this); connect(cb[1], SIGNAL(clicked()),this, SLOT(setC1())); g->addWidget(cb[1], 0, 1); pic.fill(cc[2]); cb[2] = new QPushButton(pic, _("Keywords"), this); connect(cb[2], SIGNAL(clicked()),this, SLOT(setC2())); g->addWidget(cb[2], 0, 2); pic.fill(cc[3]); cb[3] = new QPushButton(pic, _("Options"), this); connect(cb[3], SIGNAL(clicked()),this, SLOT(setC3())); g->addWidget(cb[3], 1, 0); pic.fill(cc[4]); cb[4] = new QPushButton(pic, _("Suffixes"), this); connect(cb[4], SIGNAL(clicked()),this, SLOT(setC4())); g->addWidget(cb[4], 1, 1); pic.fill(cc[5]); cb[5] = new QPushButton(pic, _("Numbers"), this); connect(cb[5], SIGNAL(clicked()),this, SLOT(setC5())); g->addWidget(cb[5], 1, 2); pic.fill(cc[6]); cb[6] = new QPushButton(pic, _("AutoKey"), this); connect(cb[6], SIGNAL(clicked()),this, SLOT(setC6())); g->addWidget(cb[6], 2, 0); pic.fill(cc[7]); cb[7] = new QPushButton(pic, _("FlowKey"), this); connect(cb[7], SIGNAL(clicked()),this, SLOT(setC7())); g->addWidget(cb[7], 2, 1); pic.fill(cc[9]); cb[9] = new QPushButton(pic, _("CurrLine"), this); connect(cb[9], SIGNAL(clicked()),this, SLOT(setC9())); g->addWidget(cb[9], 2, 2); l = new QLabel(_("Path for help files"), this); v->addWidget(l); h = new QHBoxLayout(); v->addLayout(h); hlp = new QLineEdit(pathHelp, this); h->addWidget(hlp,1); b = new QPushButton("...", this); h->addWidget(b,0); connect(b,SIGNAL(clicked()),this,SLOT(getPathH())); QStringList paths, files, filter; paths << "." << QDir::homePath() << QDir::rootPath() << QCoreApplication::applicationDirPath()+"/fonts"; filter << "*.vfm"; #ifndef WIN32 paths << "/usr/local/share/mathgl/fonts/" << "/usr/local/mathgl/fonts/"; #endif QFileInfoList info; for(int i=0;iaddWidget(l); h = new QHBoxLayout(); v->addLayout(h); fnt = new QComboBox(this); h->addWidget(fnt,1); fnt->addItems(files); fnt->setEditable(true); fnt->lineEdit()->setText(pathFont); b = new QPushButton("...", this); h->addWidget(b,0); connect(b,SIGNAL(clicked()),this,SLOT(getPathF())); h = new QHBoxLayout(); v->addLayout(h); l = new QLabel(_("Language for UDAV"), this); h->addWidget(l,0); lng = new QComboBox(this); h->addWidget(lng,1); lng->addItem(_("English")); lng->addItem(_("Russian")); lng->addItem(_("Spanish")); QSettings settings("udav","UDAV"); settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); QString prev = settings.value("/udavLang", "").toString(); if(prev==lang[1]) lng->setCurrentIndex(1); if(prev==lang[2]) lng->setCurrentIndex(2); defWidth = settings.value("/defWidth", 640).toInt(); defHeight = settings.value("/defHeight", 480).toInt(); settings.endGroup(); h = new QHBoxLayout(); v->addLayout(h); l = new QLabel(_("Image size"), this); h->addWidget(l,0); defW = new QLineEdit(QString::number(defWidth),this); h->addWidget(defW,1); l = new QLabel("x", this); h->addWidget(l,0); defH = new QLineEdit(QString::number(defHeight),this); h->addWidget(defH,1); run = new QCheckBox(_("Automatically execute script after loading"), this); run->setChecked(mglAutoExecute); v->addWidget(run); edt = new QCheckBox(_("Place editor at top"), this); edt->setChecked(editPosBottom); v->addWidget(edt); load = new QCheckBox(_("Load script to new window"), this); load->setChecked(loadInNewWnd); v->addWidget(load); save = new QCheckBox(_("Automatically save before redrawing (F5)"), this); save->setChecked(mglAutoSave); v->addWidget(save); // pure = new QCheckBox(_("Disable face drawing (faster) for mouse rotation/shift/zoom."), this); // pure->setChecked(mglAutoPure); v->addWidget(pure); pure->setEnabled(false); wheel = new QCheckBox(_("Enable mouse wheel for zooming"), this); wheel->setChecked(mglWheelZoom); v->addWidget(wheel); cmpl = new QCheckBox(_("Enable keywords completion"), this); cmpl->setChecked(mglCompleter); v->addWidget(cmpl); high = new QCheckBox(_("Highlight current object(s)"), this); high->setChecked(mglHighlight); v->addWidget(high); dots = new QCheckBox(_("Use dots plot for preview"), this); dots->setChecked(mglDotsRefr); v->addWidget(dots); h = new QHBoxLayout(); v->addLayout(h); h->addStretch(1); b = new QPushButton(_("Cancel"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(reject())); b = new QPushButton(_("OK"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(applyChanges())); b->setDefault(true); } //----------------------------------------------------------------------------- PropDialog::~PropDialog() {} //----------------------------------------------------------------------------- void PropDialog::getPathH() { QString str = QFileDialog::getExistingDirectory(this, _("UDAV - Insert filename"), hlp->text()); if(!str.isEmpty()) hlp->setText(str+'/'); } //----------------------------------------------------------------------------- void PropDialog::getPathF() { QString str = QFileDialog::getOpenFileName(this, _("UDAV - Insert filename"), fnt->lineEdit()->text(), _("Font files (*.vfm)")); if(!str.isEmpty()) { str = str.mid(0,str.lastIndexOf(".vfm")); fnt->lineEdit()->setText(str); } } //----------------------------------------------------------------------------- void PropDialog::setC(int k) { if(k<0 || k>9) return; QColor c = QColorDialog::getColor(cc[k], this); if(c.isValid()) { QPixmap p(16,16); p.fill(c); cb[k]->setIcon(p); cc[k] = c; } } //----------------------------------------------------------------------------- void PropDialog::setF() { bool ok; QFont f = QFontDialog::getFont(&ok, defFont, this); if(ok) { defFont = f; lbl->setFont(f); } } //----------------------------------------------------------------------------- void PropDialog::applyChanges() { // defFont editPosBottom pathFont mglColorScheme[0]=cc[0]; mglColorScheme[1]=cc[1]; mglColorScheme[2]=cc[2]; mglColorScheme[3]=cc[3]; mglColorScheme[4]=cc[4]; mglColorScheme[5]=cc[5]; mglColorScheme[6]=cc[6]; mglColorScheme[7]=cc[7]; mglColorScheme[8]=cc[8]; mglColorScheme[9]=cc[9]; mglAutoExecute = run->isChecked(); editPosBottom = edt->isChecked(); pathHelp = hlp->text(); pathFont = fnt->lineEdit()->text(); if(pathHelp.isEmpty()) pathHelp=MGL_DOC_DIR; defFontFamily = defFont.family(); defFontSize = defFont.pointSize(); loadInNewWnd = load->isChecked(); mglAutoSave = save->isChecked(); mglHighlight = high->isChecked(); // mglAutoPure = pure->isChecked(); mglCompleter = cmpl->isChecked(); mglDotsRefr = dots->isChecked(); mglWheelZoom = wheel->isChecked(); // apply changes for all windows #ifdef WIN32 pathFont = pathFont.replace('/','\\'); #endif bool ok=true; foreach(QWidget *w, QApplication::topLevelWidgets()) { if(w->inherits("MainWindow")) { MainWindow *s = (MainWindow *)w; if(ok) { s->writeSettings(); ok = false; } s->edit->setEditorFont(); s->graph->setMGLFont(pathFont); s->graph->mgl->enableWheel = mglWheelZoom; s->setEditPos(editPosBottom); s->edit->setCompleter(mglCompleter); s->update(); } } if(defWidth!=defW->text().toInt() || defHeight!=defH->text().toInt()) { defWidth = defW->text().toInt(); defHeight = defH->text().toInt(); sizeChanged(defWidth, defHeight); } QSettings settings("udav","UDAV"); settings.setPath(QSettings::IniFormat, QSettings::UserScope, "UDAV"); settings.beginGroup("/UDAV"); QString prev = settings.value("/udavLang", "").toString(); int cur=lng->currentIndex(); if(cur>=0 && prev!=lang[cur]) { settings.setValue("/udavLang", lang[lng->currentIndex()]); #if WIN32 const char *loc[]={"C.UTF8", "ru_RU.cp1251", "es_ES.utf8", ""}; #else const char *loc[]={"C.UTF8", "ru_RU.utf8", "es_ES.utf8", ""}; #endif mgl_textdomain(NULL,loc[cur]); QMessageBox::critical(this,_("UDAV - Properties"),_("You need to restart UDAV for applying the changes.")); } settings.setValue("/defWidth", defWidth); settings.setValue("/defHeight", defHeight); settings.endGroup(); accept(); emit propUpdated(); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/subplot_dlg.h0000664000175000017500000000556614167366466016247 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef SUBPLOTDIALOG_H #define SUBPLOTDIALOG_H //----------------------------------------------------------------------------- #include class QRadioButton; class QSpinBox; class QCheckBox; class QLabel; class QLineEdit; class StyleDialog; //----------------------------------------------------------------------------- class SubplotDialog : public QDialog { Q_OBJECT public: SubplotDialog(QWidget *p); ~SubplotDialog(); const QString &getCommand() { return cmd; } public slots: void parseCmd(const QString &txt, bool final=true); void finish(); signals: void result(const QString &txt); private slots: void updatePic(); void titleStl(); private: QRadioButton *cb, *ci, *cm, *cg, *cc, *cs; QSpinBox *tet, *phi; QLineEdit *axz, *ayz; QLineEdit *title, *res; QSpinBox *bn,*bm,*bk; // subplot QLineEdit *x1,*x2,*y1,*y2; // inplot QSpinBox *sn,*sk; // stickplot QSpinBox *mn,*mm,*mk,*mx,*my; // multiplot QSpinBox *gm,*gn,*gk; // gridplot QSpinBox *cn,*ck; // columnplot QLineEdit *cd, *gd; QCheckBox *rb,*rr,*rl,*rt,*rw; // style (where reserve) QString cmd; // resulting command QString fmt; // format for title QLabel *pic; // resulting image // bool replace; // flag to be used in result() signal uchar *grBuf; StyleDialog *stlDialog; }; //----------------------------------------------------------------------------- #endif // SUBPLOTDIALOG_H //----------------------------------------------------------------------------- mathgl-8.0.1/udav/files_dlg.h0000664000175000017500000000433614167366466015653 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef FILES_DLG_H #define FILES_DLG_H //----------------------------------------------------------------------------- #include #if defined(_MSC_VER) #include #endif class QLineEdit; class QComboBox; class QRadioButton; //----------------------------------------------------------------------------- /// Dialog for enetring script arguments $0...$9 class FilesDialog : public QDialog { Q_OBJECT public: FilesDialog(QWidget *parent=0); ~FilesDialog(); QString putFiles(const QString &str); void setNumFiles(int n); private slots: void putArguments(); private: QLineEdit *a[9]; QString s[9]; int narg; }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/info_dlg.h0000664000175000017500000000473314167366466015505 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef INFODIALOG_H #define INFODIALOG_H //----------------------------------------------------------------------------- #include #include //----------------------------------------------------------------------------- class QMathGL; class mglDrawScript; class mglDataA; class QComboBox; class QTextEdit; //----------------------------------------------------------------------------- /// Display picture and short information about variable class InfoDialog : public QDialog { Q_OBJECT public: InfoDialog(QWidget *parent = 0); virtual ~InfoDialog(); void setVar(mglDataA *v); void setSlice(int k) { kz=k; refresh(); } bool allowRefresh; // void setName(QString &name); void showEvent(QShowEvent *ev); public slots: void refresh(bool force=false); private: int kz; mglDataA *var; QMathGL *mgl; QTextEdit *info; QComboBox *kind; mglDrawScript *draw; }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/help_pnl.h0000664000175000017500000000423714167366466015524 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef HELP_PNL_H #define HELP_PNL_H //----------------------------------------------------------------------------- #include #if defined(_MSC_VER) #include #endif class QTextBrowser; class QLineEdit; //----------------------------------------------------------------------------- class HelpPanel : public QWidget { Q_OBJECT public: HelpPanel(QWidget *parent = 0); public slots: // void showExamples(); void showHelp(const QString &cmd=QString()); void zoomIn(); void zoomOut(); private: QTextBrowser *help; QLineEdit *entry; }; //----------------------------------------------------------------------------- #endif // HELP_PNL_H //----------------------------------------------------------------------------- mathgl-8.0.1/udav/mgl.xml.in0000664000175000017500000000053014167366466015450 0ustar balakinbalakin MGL script mathgl-8.0.1/udav/data_dlg.cpp0000664000175000017500000001520014167366466016005 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include //----------------------------------------------------------------------------- #include extern mglParse parser; #include "data_dlg.h" //----------------------------------------------------------------------------- DataDialog::DataDialog(QWidget* parent): QDialog(parent) { setWindowTitle(_("UDAV - Insert style/scheme")); QHBoxLayout *h; QVBoxLayout *v; QGridLayout *g; QLabel *l; QPushButton *b; v = new QVBoxLayout(this); h = new QHBoxLayout(); v->addLayout(h); l = new QLabel(_("Data name"), this); h->addWidget(l); name = new QComboBox(this); h->addWidget(name); g = new QGridLayout(); v->addLayout(g); l = new QLabel("x1", this); g->addWidget(l, 0, 0); x1 = new QSpinBox(this); x1->setMinimum(-1); g->addWidget(x1, 0, 1); l = new QLabel("x2", this); g->addWidget(l, 0, 2); x2 = new QSpinBox(this); x2->setMinimum(-1); g->addWidget(x2, 0, 3); l = new QLabel("y1", this); g->addWidget(l, 1, 0); y1 = new QSpinBox(this); y1->setMinimum(-1); g->addWidget(y1, 1, 1); l = new QLabel("y2", this); g->addWidget(l, 1, 2); y2 = new QSpinBox(this); y2->setMinimum(-1); g->addWidget(y2, 1, 3); l = new QLabel("z1", this); g->addWidget(l, 2, 0); z1 = new QSpinBox(this); z1->setMinimum(-1); g->addWidget(z1, 2, 1); l = new QLabel("z2", this); g->addWidget(l, 2, 2); z2 = new QSpinBox(this); z2->setMinimum(-1); g->addWidget(z2, 2, 3); x1->setValue(-1); y1->setValue(-1); z1->setValue(-1); x2->setValue(-1); y2->setValue(-1); z2->setValue(-1); l = new QLabel(_("Operation")); g->addWidget(l, 3, 0); oper = new QComboBox(this); g->addWidget(oper, 3, 1); oper->addItem(_("none")); oper->addItem(_("sum")); oper->addItem(_("min")); oper->addItem(_("max")); l = new QLabel("along", this); g->addWidget(l, 3, 2); dirs = new QComboBox(this); g->addWidget(dirs, 3, 3); dirs->addItem("xyz"); dirs->addItem("x"); dirs->addItem("y"); dirs->addItem("z"); dirs->addItem("xy"); dirs->addItem("xz"); dirs->addItem("yz"); connect(name, SIGNAL(currentIndexChanged(int)), this, SLOT(nameChanged())); connect(x1, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); connect(x2, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); connect(y1, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); connect(y2, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); connect(z1, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); connect(z2, SIGNAL(valueChanged(int)), this, SLOT(updateRes())); connect(oper, SIGNAL(currentIndexChanged(int)), this, SLOT(updateRes())); connect(dirs, SIGNAL(currentIndexChanged(int)), this, SLOT(updateRes())); sizes = new QLabel(_("Result")); v->addWidget(sizes); res = new QLineEdit(this); v->addWidget(res); connect(res, SIGNAL(textChanged(QString)), this, SLOT(userRes())); h = new QHBoxLayout(); v->addLayout(h); h->addStretch(1); b = new QPushButton(_("Cancel"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(reject())); b = new QPushButton(_("OK"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(accept())); b->setDefault(true); } //----------------------------------------------------------------------------- void DataDialog::nameChanged() { QString var = name->currentText(); wchar_t *txt=new wchar_t[var.length()+1]; var.toWCharArray(txt); txt[var.length()]=0; mglData dat=parser.Calc(txt); delete []txt; x1->setMaximum(dat.nx-1); x1->setValue(-1); x2->setMaximum(dat.nx-1); x2->setValue(-1); y1->setMaximum(dat.ny-1); y1->setValue(-1); y2->setMaximum(dat.ny-1); y2->setValue(-1); z1->setMaximum(dat.nz-1); z1->setValue(-1); z2->setMaximum(dat.nz-1); z2->setValue(-1); } //----------------------------------------------------------------------------- void DataDialog::updateRes() { result = name->currentText(); int nx1 = x1->value(), nx2 = x2->value(), ny1 = y1->value(), ny2 = y2->value(), nz1 = z1->value(), nz2 = z2->value(); if(nx1>=0 || ny1>=0 || nz1>=0 || nx2>=0 || ny2>=0 || nz2>=0) result += "(" + (nx1<0?"":QString::number(nx1)) + ":" + (nx2<0?"":QString::number(nx2)) + "," + (ny1<0?"":QString::number(ny1)) + ":" + (ny2<0?"":QString::number(ny2)) + "," + (nz1<0?"":QString::number(nz1)) + ":" + (nz2<0?"":QString::number(nz2)) + ")"; if(oper->currentIndex()>0) result = "{" + oper->currentText() + " " + result + " '" + dirs->currentText() + "'}"; wchar_t *txt=new wchar_t[result.length()+1]; result.toWCharArray(txt); txt[result.length()]=0; mglData dat=parser.Calc(txt); delete []txt; sizes->setText(_("Result (will have sizes ") + QString::number(dat.nx)+"*"+QString::number(dat.ny)+"*"+QString::number(dat.nz)+")" ); res->setText(result); } //----------------------------------------------------------------------------- void DataDialog::updateNames() { name->clear(); long i, n = parser.GetNumVar(); for(i=0;iaddItem(QString::fromWCharArray(v->Name())); } } //----------------------------------------------------------------------------- void DataDialog::userRes() { QString txt = res->text(); if(txt != result) { result = txt; sizes->setText(_("Result")); } } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/args_dlg.h0000664000175000017500000000404414167366466015501 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef ARGS_DLG_H #define ARGS_DLG_H //----------------------------------------------------------------------------- #include class QLineEdit; //----------------------------------------------------------------------------- /// Dialog for enetring script arguments $0...$9 class ArgsDialog : public QDialog { Q_OBJECT public: ArgsDialog(QWidget *parent=0); ~ArgsDialog(); private slots: void putArguments(); private: QLineEdit *a[10]; }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/dat_pnl.cpp0000664000175000017500000007750214167366466015704 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- #include "dat_pnl.h" #include "info_dlg.h" #include "xpm/table.xpm" #undef sprintf // fix libintl bug of defining sprintf //----------------------------------------------------------------------------- extern mglParse parser; void updateDataItems(); void addDataPanel(QWidget *wnd, QWidget *w, QString name); void deleteDat(void *o) { if(o) delete ((DatPanel *)o); } void refreshData(QWidget *w) { ((DatPanel *)w)->refresh(); } //----------------------------------------------------------------------------- QWidget *newDataWnd(InfoDialog *inf, QWidget *wnd, mglDataA *v) { DatPanel *t = new DatPanel(inf); if(v) t->setVar(v); addDataPanel(wnd,t,t->dataName()); return t; } //----------------------------------------------------------------------------- DatPanel::DatPanel(InfoDialog *inf, QWidget *parent) : QWidget(parent) { setAttribute(Qt::WA_DeleteOnClose); kz = nx = ny = nz = 0; var = 0; ready = false; infoDlg = inf; QBoxLayout *v,*h,*m; menu = new QMenu(_("Data"),this); v = new QVBoxLayout(this); h = new QHBoxLayout(); v->addLayout(h); toolTop(h); h = new QHBoxLayout(); v->addLayout(h); m = new QVBoxLayout(); h->addLayout(m); toolLeft(m); tab = new QTableWidget(this); h->addWidget(tab); connect(tab, SIGNAL(cellChanged(int,int)), this, SLOT(putValue(int, int))); setWindowIcon(QPixmap(table_xpm)); } //----------------------------------------------------------------------------- DatPanel::~DatPanel() { if(var && var->o==this) var->o = 0; } //----------------------------------------------------------------------------- void DatPanel::refresh() { bool rc = false; if(!var) return; infoDlg->allowRefresh=false; if(nx!=var->GetNx()) { nx = var->GetNx(); tab->setColumnCount(nx); rc=true; } if(ny!=var->GetNy()) { ny = var->GetNy(); tab->setRowCount(ny); rc=true; } if(kz>=var->GetNz()) { kz = 0; emit sliceChanged(0); } if(nz!=var->GetNz()) { nz = var->GetNz(); emit nzChanged(nz); } id = QString(var->GetColumnId()); if(nz==1 && ny>1 && !id.isEmpty()) { QStringList head; QString s; for(int i=0;i='a' && id[i]<='z') s=s+" ("+id[i]+")"; head<setHorizontalHeaderLabels(head); } QString s,d; if(rc) { QStringList sh,sv; for(long i=0;isetHorizontalHeaderLabels(sh); for(long i=0;isetVerticalHeaderLabels(sv); for(long i=0;isetItem(j,i,new QTableWidgetItem); } mglDataC *cc = dynamic_cast(var); if(cc) for(long i=0;ia[i+nx*(j+ny*kz)]; if(mgl_isnan(f)) s = "nan"; else if(mgl_isbad(f)) s="inf"; else if(imag(f)>0) s.asprintf("%.15g+%.15gi",real(f),imag(f)); else if(imag(f)<0) s.asprintf("%.15g-%.15gi",real(f),-imag(f)); else s.asprintf("%15g",real(f)); tab->item(j,i)->setText(s); } else for(long i=0;iv(i,j,kz); if(mgl_isnan(f)) s = "nan"; else if(mgl_isbad(f)) s=f>0?"inf":"-inf"; else s.asprintf("%.15g",f); tab->item(j,i)->setText(s); } infoDlg->allowRefresh=true; infoDlg->refresh(); const wchar_t *vs = var->Name(); long m=wcslen(vs); QChar *ss = new QChar[m+1]; for(long i=0;io = 0; var = v; infoDlg->setVar(v); nx = ny = nz = kz = 0; if(v) { QString s = QString::fromWCharArray(v->Name()); v->o = this; v->func = deleteDat; refresh(); setWindowTitle(s + _(" - UDAV variable")); infoDlg->setWindowTitle(s + _(" - UDAV preview")); } else { tab->setColumnCount(0); tab->setRowCount(0); emit nzChanged(nz); } emit sliceChanged(0); } //----------------------------------------------------------------------------- void DatPanel::setSlice(int k) { if(k>=nz) k=nz-1; if(k<0) k=0; if(k!=kz) { infoDlg->setSlice(k); emit sliceChanged(k); kz = k; refresh(); } } //----------------------------------------------------------------------------- dual mgl_str2dual(const char *s) { setlocale(LC_NUMERIC, "C"); double re=0,im=0; size_t ll=strlen(s); while(s[ll]<=' ') ll--; if(*s=='(') sscanf(s,"(%lg,%lg)",&re,&im); else if(*s=='i') { re=0; im=atof(s+1); } else if(*s=='[') sscanf(s,"[%lg,%lg]",&re,&im); else if(*s=='{') sscanf(s,"{%lg,%lg}",&re,&im); else if(s[ll]=='i') { double a,b; int s1=sscanf(s,"%lg+%lgi",&re,&im); int s2=sscanf(s,"%lg-%lgi",&a,&b); if(s1<2) { if(s2==2) { re=a; im=-b; } else { im=atof(s); re=0; } } } else { double a,b; int s1=sscanf(s,"%lg+i%lg",&re,&im); int s2=sscanf(s,"%lg-i%lg",&a,&b); if(s1<2) { if(s2==2) { re=a; im=-b; } else { re=atof(s); im=0; } } } setlocale(LC_NUMERIC, ""); return dual(re,im); } //----------------------------------------------------------------------------- void DatPanel::putValue(int r, int c) { if(!var || r<0 || c<0 || r>=ny || c>=nx || !ready) return; QString s = tab->item(r,c)->text().toLower(); mreal f; dual g; if(s=="nan") f=NAN; else if(s=="inf") f=INFINITY; else if(s=="-inf") f=-INFINITY; else { g = mgl_str2dual(s.toLocal8Bit().constData()); f = real(g); } mglDataC *cc = dynamic_cast(var); if(cc) { if(g!=cc->a[c+nx*(r+ny*kz)]) { if(mgl_isnan(g)) s="nan"; else if(mgl_isbad(g)) s="inf"; else if(imag(g)>0) s.asprintf("%g+%gi",real(g),imag(g)); else if(imag(g)<0) s.asprintf("%g-%gi",real(g),-imag(g)); else s.asprintf("%g",real(g)); tab->item(r,c)->setText(s); } cc->a[c+nx*(r+ny*kz)] = g; } else { if(f!=var->v(c,r,kz)) { if(mgl_isnan(f)) s="nan"; else if(mgl_isbad(f)) s=f>0?"inf":"-inf"; else s.asprintf("%g", f); tab->item(r,c)->setText(s); } var->set_v(f,c,r,kz); } infoDlg->refresh(); } //----------------------------------------------------------------------------- void DatPanel::save() { QString fn = QFileDialog::getSaveFileName(this, _("UDAV - Save/export data"), "", _("Data files (*.dat)\nHDF5 files (*.h5 *.hdf)\nPNG files (*.png)\nAll files (*.*)")); if(fn.isEmpty()) return; QString ext = fn.section(".",-1); if(ext=="png") { bool ok; QString s = QInputDialog::getText(this, _("UDAV - Export to PNG"), _("Enter color scheme"), QLineEdit::Normal, MGL_DEF_SCH, &ok); if(ok) var->Export(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData()); } else if(ext=="h5" || ext=="hdf") { bool ok; QString s = QInputDialog::getText(this, _("UDAV - Save to HDF"), _("Enter data name"), QLineEdit::Normal, QString::fromWCharArray(var->Name()), &ok); if(ok) var->SaveHDF(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData()); } else var->Save(fn.toLocal8Bit().constData()); } //----------------------------------------------------------------------------- void DatPanel::load() { mglData *d = dynamic_cast(var); if(!d) return; QString fn = QFileDialog::getOpenFileName(this, _("UDAV - Load data"), "", _("Data files (*.dat)\nHDF5 files (*.h5 *.hdf)\nPNG files (*.png)\nAll files (*.*)")); if(fn.isEmpty()) return; QString ext = fn.section(".",-1); if(ext=="png") { bool ok; QString s = QInputDialog::getText(this, _("UDAV - Import PNG"), _("Enter color scheme"), QLineEdit::Normal, MGL_DEF_SCH, &ok); if(ok) d->Import(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData()); } else if(ext=="h5" || ext=="hdf") { bool ok; QString s = QInputDialog::getText(this, _("UDAV - Read from HDF"), _("Enter data name"), QLineEdit::Normal, QString::fromWCharArray(var->Name()), &ok); if(ok) d->ReadHDF(fn.toLocal8Bit().constData(), s.toLocal8Bit().constData()); } else d->Read(fn.toLocal8Bit().constData()); refresh(); } //----------------------------------------------------------------------------- void DatPanel::copy() { QTableWidgetSelectionRange ts = tab->selectedRanges().first(); QString res; for(long j=ts.topRow();j<=ts.bottomRow();j++) { for(long i=ts.leftColumn();i<=ts.rightColumn();i++) { res = res + tab->item(j,i)->text(); if(isetText(res, QClipboard::Clipboard); } //----------------------------------------------------------------------------- void DatPanel::paste() { QString txt = QApplication::clipboard()->text(QClipboard::Clipboard); QString s, t; int r = tab->currentRow(), c = tab->currentColumn(), i, j; for(i=0;iset_v(t.toDouble(),j+c,i+r,kz); } } refresh(); } //----------------------------------------------------------------------------- void DatPanel::plot() // TODO: plot dialog { } //----------------------------------------------------------------------------- void DatPanel::list() // TODO: in which script insert ??? { /* if(nx*ny+ny > 1020) { QMessageBox::warning(this, _("UDAV - To list conversion"), _("Too many numbers (>1000) on slice"), QMessageBox::Ok, 0, 0); return; } if(nz > 1) QMessageBox::information(this, _("UDAV - To list conversion"), _("Only current slice will be inserted"), QMessageBox::Ok, 0, 0); QString res = "list\t", s; for(long j=0;ja[i+nx*(j+kz*ny)]); res += s; } if(j(var); if(d) d->Fill(v1.toDouble(), v2.toDouble(), dir[0].toLatin1()); mglDataC *dc = dynamic_cast(var); if(dc) dc->Fill(v1.toDouble(), v2.toDouble(), dir[0].toLatin1()); mglDataV *dv = dynamic_cast(var); if(dv) dv->Fill(v1.toDouble(), v2.toDouble(), dir[0].toLatin1()); refresh(); } } //----------------------------------------------------------------------------- void DatPanel::norm() { QString v1("0"), v2("1"), how; if(sizesDialog(_("UDAV - Normalize data"), _("Enter range for final data"), _("From"), _("To"), _("Symmetrical?"), v1, v2, how)) { mglData *d = dynamic_cast(var); if(d) d->Norm(v1.toDouble(), v2.toDouble(), (how=="on" || how.contains('s'))); refresh(); } } //----------------------------------------------------------------------------- void DatPanel::normsl() { QString v1("0"), v2("1"), dir("z"); if(sizesDialog(_("UDAV - Normalize by slice"), _("Enter range for final data"), _("From"), _("To"), _("Direction"), v1, v2, dir)) { mglData *d = dynamic_cast(var); if(d) d->NormSl(v1.toDouble(), v2.toDouble(), dir[0].toLatin1()); refresh(); } } //----------------------------------------------------------------------------- void DatPanel::create() { QString mx, my("1"), mz("1"); if(sizesDialog(_("UDAV - Clear data"), _("Enter new data sizes"), _("X-size"), _("Y-size"), _("Z-size"), mx, my, mz)) { mglData *d = dynamic_cast(var); if(d) d->Create(mx.toInt(), my.toInt(), mz.toInt()); mglDataC *c = dynamic_cast(var); if(c) c->Create(mx.toInt(), my.toInt(), mz.toInt()); refresh(); updateDataItems(); } } //----------------------------------------------------------------------------- void DatPanel::reSize() { QString mx, my, mz; mx.asprintf("%d",nx); my.asprintf("%d",ny); mz.asprintf("%d",nz); if(sizesDialog(_("UDAV - Resize data"), _("Enter new data sizes"), _("X-size"), _("Y-size"), _("Z-size"), mx, my, mz)) { mglData *d = dynamic_cast(var); if(d) d->Set(d->Resize(mx.toInt(), my.toInt(), mz.toInt())); refresh(); updateDataItems(); } } //----------------------------------------------------------------------------- void DatPanel::squize() { QString mx("1"), my("1"), mz("1"); if(sizesDialog(_("UDAV - Squeeze data"), _("Enter step of saved points. For example, '1' save all, '2' save each 2nd point, '3' save each 3rd and so on."), _("X-direction"), _("Y-direction"), _("Z-direction"), mx, my, mz)) { mglData *d = dynamic_cast(var); if(d) d->Squeeze(mx.toInt(), my.toInt(), mz.toInt()); refresh(); updateDataItems(); } } //----------------------------------------------------------------------------- void DatPanel::crop() { QString n1("1"), n2("1"), dir; if(sizesDialog(_("UDAV - Crop data"), _("Enter range of saved date."), _("From"), _("To"), _("Direction"), n1, n2, dir)) { mglData *d = dynamic_cast(var); if(d) d->Squeeze(n1.toInt(), n2.toInt(), dir[0].toLatin1()); refresh(); updateDataItems(); } } //----------------------------------------------------------------------------- void DatPanel::rearrange() { QString mx, my, mz; mx.asprintf("%d",nx); my.asprintf("%d",ny); mz.asprintf("%d",nz); if(sizesDialog(_("UDAV - Rearrange data"), _("Enter new data sizes"), _("X-size"), _("Y-size"), _("Z-size"), mx, my, mz)) { mglData *d = dynamic_cast(var); if(d) d->Rearrange(mx.toInt(), my.toInt(), mz.toInt()); refresh(); updateDataItems(); } } //----------------------------------------------------------------------------- void DatPanel::hist() { QLabel *l; QLineEdit *id, *v1, *v2; QSpinBox *nm; QPushButton *b; QDialog *d = new QDialog(this); d->setWindowTitle(_("UDAV - Make histogram")); QGridLayout *g = new QGridLayout(d); l = new QLabel(_("From"), d); g->addWidget(l,0,0); l = new QLabel(_("To"), d); g->addWidget(l,0,1); v1 = new QLineEdit(d); g->addWidget(v1,1,0); v2 = new QLineEdit(d); g->addWidget(v2,1,1); l = new QLabel(_("Number of points"), d); g->addWidget(l,2,0); l = new QLabel(_("Put in variable"), d); g->addWidget(l,2,1); nm = new QSpinBox(d); nm->setRange(2,8192); g->addWidget(nm,3,0); id = new QLineEdit(d); nm->setSingleStep(10); g->addWidget(id,3,1); b = new QPushButton(_("Cancel"), d); g->addWidget(b,4,0); connect(b, SIGNAL(clicked()), d, SLOT(reject())); b = new QPushButton(_("OK"), d); g->addWidget(b,4,1); connect(b, SIGNAL(clicked()), d, SLOT(accept())); b->setDefault(true); // now execute dialog and get values bool res = d->exec(); if(res && !v1->text().isEmpty() && !v2->text().isEmpty() && !id->text().isEmpty()) { mglData *vv = dynamic_cast(parser.AddVar(id->text().toLocal8Bit().constData())); if(vv) vv->Set(mgl_data_hist(var, nm->value(), v1->text().toDouble(), v2->text().toDouble(),0)); updateDataItems(); } } //----------------------------------------------------------------------------- void DatPanel::first() { setSlice(0); } //----------------------------------------------------------------------------- void DatPanel::last() { setSlice(nz-1); } //----------------------------------------------------------------------------- void DatPanel::next() { setSlice(kz+1); } //----------------------------------------------------------------------------- void DatPanel::prev() { setSlice(kz-1); } //----------------------------------------------------------------------------- void DatPanel::gosl() { bool ok; QString s = QInputDialog::getText(this, _("UDAV - Go to slice"), _("Enter slice id:"), QLineEdit::Normal, "0", &ok); if(ok) setSlice(s.toInt()); } //----------------------------------------------------------------------------- void DatPanel::setNz(int nz) { sb->setMaximum(nz-1); } //----------------------------------------------------------------------------- bool DatPanel::sizesDialog(const QString &cap, const QString &lab, const QString &desc1, const QString &desc2, const QString &desc3, QString &val1, QString &val2, QString &val3) { QLabel *l; QLineEdit *f1, *f2, *f3; QPushButton *b; QDialog *d = new QDialog(this); d->setWindowTitle(cap); QVBoxLayout *v = new QVBoxLayout(d); l = new QLabel(lab, d); v->addWidget(l); l = new QLabel(_("NOTE: All fields must be filled!"), d); v->addWidget(l); QGridLayout *g = new QGridLayout(); v->addLayout(g); l = new QLabel(desc1, d); g->addWidget(l, 0, 0); l = new QLabel(desc2, d); g->addWidget(l, 0, 1); l = new QLabel(desc3, d); g->addWidget(l, 0, 2); f1 = new QLineEdit(val1, d); g->addWidget(f1, 1, 0); f2 = new QLineEdit(val2, d); g->addWidget(f2, 1, 1); f3 = new QLineEdit(val3, d); g->addWidget(f3, 1, 2); QHBoxLayout *h = new QHBoxLayout(); v->addLayout(h); h->addStretch(1); b = new QPushButton(_("Cancel"), d); h->addWidget(b); connect(b, SIGNAL(clicked()), d, SLOT(reject())); b = new QPushButton(_("OK"), d); h->addWidget(b); connect(b, SIGNAL(clicked()), d, SLOT(accept())); b->setDefault(true); // now execute dialog and get values bool res = d->exec(); val1 = f1->text(); val2 = f2->text(); val3 = f3->text(); if(val1.isEmpty() || val2.isEmpty() || val3.isEmpty()) res = false; delete d; return res; } //----------------------------------------------------------------------------- #include "xpm/size.xpm" #include "xpm/crop.xpm" #include "xpm/squize.xpm" #include "xpm/hist.xpm" #include "xpm/oper_dir.xpm" #include "xpm/oper_of.xpm" //----------------------------------------------------------------------------- void DatPanel::newdat() { QLabel *l; QLineEdit *f1, *f2; QPushButton *b; QDialog *d = new QDialog(this); d->setWindowTitle(_("UDAV - make new data")); QVBoxLayout *v = new QVBoxLayout(d); QComboBox *c = new QComboBox(d); v->addWidget(c); c->addItem(_("Sum along direction(s)")); c->addItem(_("Min along direction(s)")); c->addItem(_("Max along direction(s)")); c->addItem(_("Momentum along 'x' for function")); c->addItem(_("Momentum along 'y' for function")); c->addItem(_("Momentum along 'z' for function")); c->setCurrentIndex(0); f1 = new QLineEdit("z",d); v->addWidget(f1); QCheckBox *cb = new QCheckBox(_("Put into this data array"), d); v->addWidget(cb); l = new QLabel(_("or enter name for new variable"), d); v->addWidget(l); f2 = new QLineEdit(d); v->addWidget(f2); QHBoxLayout *h = new QHBoxLayout(); v->addLayout(h); h->addStretch(1); b = new QPushButton(_("Cancel"), d); h->addWidget(b); connect(b, SIGNAL(clicked()), d, SLOT(reject())); b = new QPushButton(_("OK"), d); h->addWidget(b); connect(b, SIGNAL(clicked()), d, SLOT(accept())); b->setDefault(true); // now execute dialog and get values bool res = d->exec(); QString val = f1->text(), mgl; int k = c->currentIndex(); QString self = QString::fromWCharArray(var->Name()); if(res) { if(k<0) { QMessageBox::warning(d, _("UDAV - make new data"), _("No action is selected. Do nothing.")); return; } if(val.isEmpty()) { QMessageBox::warning(d, _("UDAV - make new data"), _("No direction/formula is entered. Do nothing.")); return; } if(cb->isChecked()) k += 6; QString name = f2->text(); switch(k) { case 0: mgl = "sum "+name+" "+self+" '"+val+"'"; break; case 1: mgl = "min "+name+" "+self+" '"+val+"'"; break; case 2: mgl = "max "+name+" "+self+" '"+val+"'"; break; case 3: mgl = "momentum "+name+" "+self+" 'x' '"+val+"'"; break; case 4: mgl = "momentum "+name+" "+self+" 'y' '"+val+"'"; break; case 5: mgl = "momentum "+name+" "+self+" 'z' '"+val+"'"; break; case 6: mgl = "copy "+self+" {sum "+self+" '"+val+"'}"; break; case 7: mgl = "copy "+self+" {min "+self+" '"+val+"'}"; break; case 8: mgl = "copy "+self+" {max "+self+" '"+val+"'}"; break; case 9: mgl = "copy "+self+" {momentum "+self+" 'x' '"+val+"'}"; break; case 10: mgl = "copy "+self+" {momentum "+self+" 'y' '"+val+"'}"; break; case 11: mgl = "copy "+self+" {momentum "+self+" 'z' '"+val+"'}"; break; } } if(!mgl.isEmpty()) { mglGraph gr; parser.Execute(&gr,mgl.toLocal8Bit().constData()); if(k>=6) opers += mgl+"\n"; updateDataItems(); } } //----------------------------------------------------------------------------- void DatPanel::oper() { QLineEdit *f1; QPushButton *b; QDialog *d = new QDialog(this); d->setWindowTitle(_("UDAV - change data")); QVBoxLayout *v = new QVBoxLayout(d); QComboBox *c = new QComboBox(d); v->addWidget(c); c->addItem(_("Fill data by formula")); c->addItem(_("Transpose data with new dimensions")); c->addItem(_("Smooth data along direction(s)")); c->addItem(_("Summarize data along direction(s)")); c->addItem(_("Integrate data along direction(s)")); c->addItem(_("Differentiate data along direction(s)")); c->addItem(_("Laplace transform along direction(s)")); c->addItem(_("Swap data along direction(s)")); c->addItem(_("Mirror data along direction(s)")); c->addItem(_("Sin-Fourier transform along direction(s)")); c->addItem(_("Cos-Fourier transform along direction(s)")); c->addItem(_("Hankel transform along direction(s)")); c->addItem(_("Sew data along direction(s)")); c->addItem(_("Find envelope along direction(s)")); c->setCurrentIndex(0); f1 = new QLineEdit("z",d); v->addWidget(f1); QHBoxLayout *h = new QHBoxLayout(); v->addLayout(h); h->addStretch(1); b = new QPushButton(_("Cancel"), d); h->addWidget(b); connect(b, SIGNAL(clicked()), d, SLOT(reject())); b = new QPushButton(_("OK"), d); h->addWidget(b); connect(b, SIGNAL(clicked()), d, SLOT(accept())); b->setDefault(true); // now execute dialog and get values bool res = d->exec(); QString val = f1->text(), mgl; int k = c->currentIndex(); QString self = QString::fromWCharArray(var->Name()); if(res) { if(k<0) { QMessageBox::warning(d, _("UDAV - make new data"), _("No action is selected. Do nothing.")); return; } switch(k) { case 0: mgl = "modify "+self+" '"+val+"'"; break; case 1: mgl = "transpose "+self+" '"+val+"'"; break; case 2: mgl = "smooth "+self+" '"+val+"'"; break; case 3: mgl = "cumsum "+self+" '"+val+"'"; break; case 4: mgl = "integrate "+self+" '"+val+"'"; break; case 5: mgl = "diff "+self+" '"+val+"'"; break; case 6: mgl = "diff2 "+self+" '"+val+"'"; break; case 7: mgl = "swap "+self+" '"+val+"'"; break; case 8: mgl = "mirror "+self+" '"+val+"'"; break; case 9: mgl = "sinfft "+self+" '"+val+"'"; break; case 10: mgl = "cosfft "+self+" '"+val+"'"; break; case 11: mgl = "hankel "+self+" '"+val+"'"; break; case 12: mgl = "sew "+self+" '"+val+"'"; break; case 13: mgl = "envelop "+self+" '"+val+"'"; break; } } if(!mgl.isEmpty()) { mglGraph gr; parser.Execute(&gr,mgl.toLocal8Bit().constData()); opers += mgl+"\n"; updateDataItems(); } } //----------------------------------------------------------------------------- void DatPanel::toolTop(QBoxLayout *l) { QAction *a; QMenu *o; QToolButton *bb; // file menu o = menu->addMenu(_("File")); a = new QAction(QPixmap(":/png/document-open.png"), _("Load data"), this); connect(a, SIGNAL(triggered()), this, SLOT(load())); a->setToolTip(_("Load data from file. Data will be deleted only\nat exit but UDAV will not ask to save it (Ctrl+Shift+O).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_O); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(":/png/document-save.png"), _("Save data"), this); connect(a, SIGNAL(triggered()), this, SLOT(save())); a->setToolTip(_("Save data to a file (Ctrl+Shift+S).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_S); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); // o->addSeparator(); bb->addSeparator(); // a = new QAction(QPixmap(insert_xpm), _("Insert as list"), this); // connect(a, SIGNAL(triggered()), this, SLOT(list())); // o->addAction(a); // bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(":/png/office-chart-line.png"), _("Plot data"), this); connect(a, SIGNAL(triggered()), this, SLOT(plot())); a->setToolTip(_("Plot data in new script window. You may select the kind\nof plot, its style and so on.")); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(":/png/edit-copy.png"), _("Copy data"), this); connect(a, SIGNAL(triggered()), this, SLOT(copy())); a->setToolTip(_("Copy range of numbers to clipboard (Ctrl+Shift+C).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_C); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(":/png/edit-paste.png"), _("Paste data"), this); connect(a, SIGNAL(triggered()), this, SLOT(copy())); a->setToolTip(_("Paste range of numbers from clipboard (Ctrl+Shift+P).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_V); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); // navigation menu o = menu->addMenu(_("Navigation")); a = new QAction(QPixmap(":/png/go-first.png"), _("First slice"), this); connect(a, SIGNAL(triggered()), this, SLOT(first())); a->setToolTip(_("Go to first slice for 3D data (Ctrl-F1).")); a->setShortcut(Qt::CTRL+Qt::Key_F1); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(":/png/go-previous.png"), _("Prev slice"), this); connect(a, SIGNAL(triggered()), this, SLOT(prev())); a->setToolTip(_("Go to the previous slice for 3D data.")); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); sb = new QSpinBox(this); l->addWidget(sb); sb->setRange(0,0); sb->setToolTip(_("Go to the specified slice for 3D data.")); connect(sb, SIGNAL(valueChanged(int)), this, SLOT(setSlice(int))); connect(this, SIGNAL(sliceChanged(int)), sb, SLOT(setValue(int))); connect(this, SIGNAL(nzChanged(int)), this, SLOT(setNz(int))); a = new QAction(_("Go to slice"), this); connect(a, SIGNAL(triggered()), this, SLOT(gosl())); a->setToolTip(_("Go to the specified slice for 3D data.")); o->addAction(a); a = new QAction(QPixmap(":/png/go-next.png"), _("Next slice"), this); connect(a, SIGNAL(triggered()), this, SLOT(next())); a->setToolTip(_("Go to the next slice for 3D data.")); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(":/png/go-last.png"), _("Last slice"), this); connect(a, SIGNAL(triggered()), this, SLOT(last())); a->setToolTip(_("Go to last slice for 3D data (Ctrl-F4).")); a->setShortcut(Qt::CTRL+Qt::Key_F4); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); } //----------------------------------------------------------------------------- void DatPanel::toolLeft(QBoxLayout *l) { QAction *a; QMenu *o; QToolButton *bb; // size menu o = menu->addMenu(_("Sizes")); a = new QAction(QPixmap(":/png/document-new.png"), _("Create new"), this); connect(a, SIGNAL(triggered()), this, SLOT(create())); a->setToolTip(_("Recreate the data with new sizes and fill it by zeros (Ctrl+Shift+N).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_N); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(size_xpm), _("Resize"), this); connect(a, SIGNAL(triggered()), this, SLOT(reSize())); a->setToolTip(_("Resize (interpolate) the data to specified sizes (Ctrl+Shift+R).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_R); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(squize_xpm), _("Squeeze"), this); connect(a, SIGNAL(triggered()), this, SLOT(squize())); a->setToolTip(_("Keep only each n-th element of the data array.")); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(crop_xpm), _("Crop"), this); connect(a, SIGNAL(triggered()), this, SLOT(crop())); a->setToolTip(_("Crop the data edges. Useful to cut off the zero-filled area.")); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(oper_of_xpm), _("Transform"), this); connect(a, SIGNAL(triggered()), this, SLOT(newdat())); a->setToolTip(_("Transform data along dimension(s) (Ctrl+Shift+T).")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_T); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(oper_dir_xpm), _("Make new (Ctrl+Shift+M)"), this); connect(a, SIGNAL(triggered()), this, SLOT(oper())); a->setToolTip(_("Make another data.")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_M); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); a = new QAction(QPixmap(hist_xpm), _("Histogram (Ctrl+Shift+H)"), this); connect(a, SIGNAL(triggered()), this, SLOT(hist())); a->setToolTip(_("Find histogram of data.")); a->setShortcut(Qt::CTRL+Qt::SHIFT+Qt::Key_H); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); /* a = new QAction(QPixmap(":/png/view-refresh.png"), _("Refresh"), this); connect(a, SIGNAL(triggered()), this, SLOT(refresh())); a->setToolTip(_("Refresh data values.")); o->addAction(a); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a);*/ /* a = new QAction(_("Rearrange"), this); // TODO: move in generalized dialog connect(a, SIGNAL(triggered()), this, SLOT(rearrange())); a->setToolTip(_("Rearrange data sizes without changing data values.")); o->addAction(a); a = new QAction(_("Fill in range"), this); connect(a, SIGNAL(triggered()), this, SLOT(inrange())); a->setToolTip(_("Fill data equidistantly from one value to another.")); o->addAction(a); a = new QAction(_("Normalize"), this); connect(a, SIGNAL(triggered()), this, SLOT(norm())); a->setToolTip(_("Normalize data so that its minimal\nand maximal values be in specified range.")); o->addAction(a); a = new QAction(_("Norm. slices"), this); connect(a, SIGNAL(triggered()), this, SLOT(normsl())); a->setToolTip(_("Normalize each data slice perpendicular to some direction\nso that its minimal and maximal values be in specified range.")); o->addAction(a);*/ l->addStretch(1); a = new QAction(QPixmap(":/png/tab-close.png"), _("Close tab"), this); connect(a, SIGNAL(triggered()), this, SLOT(close())); a->setToolTip(_("Close this data tab.")); bb = new QToolButton(this); l->addWidget(bb); bb->setDefaultAction(a); } //----------------------------------------------------------------------------- QString DatPanel::dataName() { return QString::fromWCharArray(var->Name()); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/open_dlg.h0000664000175000017500000000450314167366466015506 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #ifndef OPEN_DLG_H #define OPEN_DLG_H //----------------------------------------------------------------------------- #include class QLineEdit; class QComboBox; class QRadioButton; //----------------------------------------------------------------------------- /// Dialog for selecting command options class DataOpenDialog : public QDialog { Q_OBJECT public: DataOpenDialog(QWidget *parent=0); ~DataOpenDialog(); inline const QString getCode() { return code; } inline const QString getName() { return data; } void setFile(const QString &fname); private slots: void prepareResult(); void selectScr(); private: QString code, data, file; QLineEdit *nx, *ny, *nz, *name; QRadioButton *rA, *rM, *r2, *r3; QComboBox *scr; }; //----------------------------------------------------------------------------- #endif //----------------------------------------------------------------------------- mathgl-8.0.1/udav/qmglsyntax.cpp0000664000175000017500000001207714167366466016466 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include "qmglsyntax.h" #include mglParse parser; int mgl_cmd_cmp(const void *a, const void *b); // comment string keyword option suffix number QColor mglColorScheme[10] = {QColor(0,127,0), QColor(255,0,0), QColor(0,0,127), QColor(127,0,0), QColor(127,0,0), QColor(0,0,255), QColor(127,0,127), QColor(0,127,127), QColor(0,0,127), QColor(255,255,204)}; //----------------------------------------------------------------------------- QMGLSyntax::QMGLSyntax(QTextEdit *textEdit) : QSyntaxHighlighter(textEdit) {} //----------------------------------------------------------------------------- void QMGLSyntax::highlightBlock(const QString &text) { int i, j, m = text.length(),s=0; bool arg = false, nl = true; QString num("+-.0123456789:"); i=0; setCurrentBlockState(-1); if(previousBlockState()==1) { bool cont=false; j=i; i++; for(;i' ') cont=false; if(text[i]=='\\') cont=true; } setFormat(j,i-j+1,mglColorScheme[1]); if(cont && i==m) setCurrentBlockState(1); } for(;i' ') cont=false; if(text[i]=='\\') cont=true; } setFormat(j,i-j+1,mglColorScheme[1]); if(cont && i==m) setCurrentBlockState(1); } else if(nl) // keyword { char *s = new char[m+1]; for(j=i;j #include #include #include #include #include #include #include //----------------------------------------------------------------------------- #include "anim_dlg.h" #undef sprintf // fix libintl bug of defining sprintf extern int animDelay; //----------------------------------------------------------------------------- AnimParam::AnimParam(QWidget *parent) : QDialog(parent) { setWindowTitle(_("UDAV - Animation setup")); QHBoxLayout *a; QVBoxLayout *o, *g; QLabel *lbl; QPushButton *b; o = new QVBoxLayout(this); lbl = new QLabel(_("Redraw picture for $0 equal to"),this); o->addWidget(lbl); a = new QHBoxLayout(); o->addLayout(a); g = new QVBoxLayout(); a->addLayout(g); rbt = new QRadioButton(_("strings"),this); connect(rbt, SIGNAL(clicked()),this, SLOT(setRBT())); g->addWidget(rbt); text = new QTextEdit(this); g->addWidget(text); connect(text,SIGNAL(textChanged()),this,SLOT(setRBT())); g = new QVBoxLayout(); a->addLayout(g); rbf = new QRadioButton(_("values"),this); connect(rbf, SIGNAL(clicked()),this, SLOT(setRBF())); g->addWidget(rbf); lbl = new QLabel(_("from"),this); g->addWidget(lbl, Qt::AlignLeft); p1 = new QLineEdit(this); g->addWidget(p1); connect(p1,SIGNAL(textChanged(QString)),this,SLOT(setRBF())); lbl = new QLabel(_("to"),this); g->addWidget(lbl, Qt::AlignLeft); p2 = new QLineEdit(this); g->addWidget(p2); connect(p2,SIGNAL(textChanged(QString)),this,SLOT(setRBF())); lbl = new QLabel(_("with step"),this); g->addWidget(lbl, Qt::AlignLeft); dp = new QLineEdit(this); g->addWidget(dp); dp->setText("1"); connect(dp,SIGNAL(textChanged(QString)),this,SLOT(setRBF())); b = new QPushButton(_("Cancel"), this); g->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(reject())); b = new QPushButton(_("OK"), this); g->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(fillRes())); b->setDefault(true); // general a = new QHBoxLayout(); o->addLayout(a); b = new QPushButton(_("Put to script"), this); a->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(putTxt())); lbl = new QLabel(_("Delay (in ms)"),this); a->addWidget(lbl); delay = new QLineEdit(this); a->addWidget(delay); QString s; s.asprintf("%d",animDelay); delay->setText(s); // export to gif/jpeg a = new QHBoxLayout(); o->addLayout(a); // fname = new QLineEdit(this); a->addWidget(fname); gif = new QCheckBox(_("Export to GIF"), this); a->addWidget(gif); jpg = new QCheckBox(_("Save JPEG frames"), this); a->addWidget(jpg); gifOn = jpgOn = false; } //----------------------------------------------------------------------------- AnimParam::~AnimParam() {} //----------------------------------------------------------------------------- void AnimParam::fillRes() { // gifName = fname->text(); gifOn = gif->isChecked(); jpgOn = jpg->isChecked(); animDelay = delay->text().toInt(); if(rbt->isChecked()) { res = text->toPlainText(); accept(); } else if(rbf->isChecked()) { res = ""; double x, x2=p2->text().toDouble(), dx=dp->text().toDouble(); for(x=p1->text().toDouble();xtext().isEmpty() && !p2->text().isEmpty() && !dp->text().isEmpty()) { s = "##c "+p1->text()+" "+p2->text()+" "+dp->text()+"\n"; emit putText(s); } if(text->toPlainText().isEmpty()) return; int i, n = text->toPlainText().count('\n')+1; for(i=0;itoPlainText().section('\n',i,i); if(!t.isEmpty()) s = s+"##a "+t+"\n"; } emit putText(s); } //----------------------------------------------------------------------------- void AnimParam::setRBF() { rbt->setChecked(false); rbf->setChecked(true); } //----------------------------------------------------------------------------- void AnimParam::setRBT() { rbf->setChecked(false); rbt->setChecked(true); } //----------------------------------------------------------------------------- void AnimParam::setResult(const QString &s) { text->setText(s); rbf->setChecked(false); rbt->setChecked(true); } //----------------------------------------------------------------------------- void AnimParam::setResult(double a1, double a2, double da) { p1->setText(QString::number(a1)); p2->setText(QString::number(a2)); dp->setText(QString::number(da)); rbt->setChecked(false); rbf->setChecked(true); } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/setup_dlg.cpp0000664000175000017500000003140414167366466016240 0ustar balakinbalakin/*************************************************************************** * Copyright (C) 2008 by Alexey Balakin * * mathgl.abalakin@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- #include "setup_dlg.h" #include "mgl2/define.h" #undef sprintf // fix libintl bug of defining sprintf void fillColors(QComboBox *cb); //----------------------------------------------------------------------------- SetupDialog::SetupDialog(QWidget *parent) : QDialog(parent) { setWindowTitle(_("UDAV - Setup plot")); QWidget *p; QGridLayout *g; QLabel *l; QPushButton *b; QTabWidget *tab = new QTabWidget(this); // line style p = new QWidget(this); g = new QGridLayout(p); g->setAlignment(Qt::AlignTop); l = new QLabel(_("X axis"), p); g->addWidget(l,0,1); l = new QLabel(_("Y axis"), p); g->addWidget(l,0,2); l = new QLabel(_("Z axis"), p); g->addWidget(l,0,3); l = new QLabel(_("C axis"), p); g->addWidget(l,0,4); l = new QLabel(_("Minimal"), p); g->addWidget(l,1,0); xmin = new QLineEdit(p); g->addWidget(xmin,1,1); ymin = new QLineEdit(p); g->addWidget(ymin,1,2); zmin = new QLineEdit(p); g->addWidget(zmin,1,3); cmin = new QLineEdit(p); g->addWidget(cmin,1,4); l = new QLabel(_("Maximal"), p); g->addWidget(l,2,0); xmax = new QLineEdit(p); g->addWidget(xmax,2,1); ymax = new QLineEdit(p); g->addWidget(ymax,2,2); zmax = new QLineEdit(p); g->addWidget(zmax,2,3); cmax = new QLineEdit(p); g->addWidget(cmax,2,4); l = new QLabel(_("Origin"), p); g->addWidget(l,3,0); xorg = new QLineEdit(p); g->addWidget(xorg,3,1); yorg = new QLineEdit(p); g->addWidget(yorg,3,2); zorg = new QLineEdit(p); g->addWidget(zorg,3,3); l = new QLabel(_("Label"), p); g->addWidget(l,4,0); xlbl = new QLineEdit(p); g->addWidget(xlbl,4,1); ylbl = new QLineEdit(p); g->addWidget(ylbl,4,2); zlbl = new QLineEdit(p); g->addWidget(zlbl,4,3); l = new QLabel(_("at position"), p); g->addWidget(l,5,0); QStringList lpos; lpos.append(_("at minimum")); lpos += _("at center"); lpos += _("at maximum"); xpos = new QComboBox(p); g->addWidget(xpos,5,1); xpos->addItems(lpos); ypos = new QComboBox(p); g->addWidget(ypos,5,2); ypos->addItems(lpos); zpos = new QComboBox(p); g->addWidget(zpos,5,3); zpos->addItems(lpos); l = new QLabel(_("Ticks"), p); g->addWidget(l,6,0); xtck = new QLineEdit(p); g->addWidget(xtck,6,1); ytck = new QLineEdit(p); g->addWidget(ytck,6,2); ztck = new QLineEdit(p); g->addWidget(ztck,6,3); l = new QLabel(_("SubTicks"), p); g->addWidget(l,7,0); xsub = new QLineEdit(p); g->addWidget(xsub,7,1); ysub = new QLineEdit(p); g->addWidget(ysub,7,2); zsub = new QLineEdit(p); g->addWidget(zsub,7,3); l = new QLabel(_("Start"), p); g->addWidget(l,8,0); xort = new QLineEdit(p); g->addWidget(xort,8,1); yort = new QLineEdit(p); g->addWidget(yort,8,2); zort = new QLineEdit(p); g->addWidget(zort,8,3); l = new QLabel(_("Template"), p); g->addWidget(l,9,0); xtt = new QLineEdit(p); g->addWidget(xtt,9,1); ytt = new QLineEdit(p); g->addWidget(ytt,9,2); ztt = new QLineEdit(p); g->addWidget(ztt,9,3); ctt = new QLineEdit(p); g->addWidget(ctt,9,4); l = new QLabel(_("AlphaDef"), p); g->addWidget(l,10,0); aldef = new QLineEdit(p); g->addWidget(aldef,11,0); l = new QLabel(_("Ambient"), p); g->addWidget(l,10,1); amb = new QLineEdit(p); g->addWidget(amb,11,1); l = new QLabel(_("BaseWidth"), p); g->addWidget(l,10,2); basew = new QLineEdit(p); g->addWidget(basew,11,2); l = new QLabel(_("MeshNum"), p); g->addWidget(l,10,3); mesh = new QLineEdit(p); g->addWidget(mesh,11,3); l = new QLabel(_("AxialDir"), p); g->addWidget(l,10,4); axial = new QComboBox(p); g->addWidget(axial,11,4); axial->addItem("none"); axial->addItem("x"); axial->addItem("y"); axial->addItem("z"); l = new QLabel(_("Font"), p); g->addWidget(l,12,0); font = new QLineEdit(p); g->addWidget(font,13,0); l = new QLabel(_("FontSize"), p); g->addWidget(l,12,1); fsize = new QLineEdit(p); g->addWidget(fsize,13,1); alpha = new QCheckBox(_("Alpha"),p); g->addWidget(alpha, 13,2); light = new QCheckBox(_("Light"),p); g->addWidget(light, 13,3); rotate = new QCheckBox(_("No text rotation"),p); g->addWidget(rotate, 13,4); tab->addTab(p, _("General setup")); p = new QWidget(this); g = new QGridLayout(p); g->setAlignment(Qt::AlignTop); l = new QLabel(_("ID"), p); g->addWidget(l,0,0); l = new QLabel(_("State"), p); g->addWidget(l,0,1); l = new QLabel(_("X pos"), p); g->addWidget(l,0,2); l = new QLabel(_("Y pos"), p); g->addWidget(l,0,3); l = new QLabel(_("Z pos"), p); g->addWidget(l,0,4); l = new QLabel(_("Color"), p); g->addWidget(l,0,5); l = new QLabel(_("Brightness"), p); g->addWidget(l,0,6); char s[3] = "0:"; for(int i=0;i<10;i++) { s[0] = char(i+'0'); l = new QLabel(s, p); g->addWidget(l,i+1,0); slight[i] = new QCheckBox(_("on"),p); g->addWidget(slight[i], i+1, 1); xlight[i] = new QLineEdit(p); g->addWidget(xlight[i], i+1, 2); ylight[i] = new QLineEdit(p); g->addWidget(ylight[i], i+1, 3); zlight[i] = new QLineEdit(p); g->addWidget(zlight[i], i+1, 4); clight[i] = new QComboBox(p); g->addWidget(clight[i], i+1, 5); fillColors(clight[i]); blight[i] = new QLineEdit(p); g->addWidget(blight[i], i+1, 6); } tab->addTab(p, _("Light settings")); QVBoxLayout *v = new QVBoxLayout(this); v->addWidget(tab); QHBoxLayout *h = new QHBoxLayout(); v->addLayout(h); l = new QLabel(_("Template name"), this); h->addWidget(l); fname = new QLineEdit("template.mgl", this); h->addWidget(fname); h->addStretch(1); b = new QPushButton(_("Save"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(saveTmpl())); b = new QPushButton(_("Cancel"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(reject())); b = new QPushButton(_("To script"), this); h->addWidget(b); connect(b, SIGNAL(clicked()),this, SLOT(toScript())); b->setDefault(true); } //----------------------------------------------------------------------------- SetupDialog::~SetupDialog() {} //----------------------------------------------------------------------------- void SetupDialog::saveTmpl() { if(!convert()) return; QFile f(fname->text()); if(!f.open(QIODevice::WriteOnly)) QMessageBox::warning(this, _("UDAV - Save template"), _("Could not write to file"), QMessageBox::Ok, 0); else { QTextStream t(&f); t << res; f.close(); QMessageBox::information(this, _("UDAV - Save template"), _("Template saved"), QMessageBox::Ok); emit putText(QString("#call %1").arg(fname->text())); } } //----------------------------------------------------------------------------- void SetupDialog::toScript() { if(!convert()) return; emit putText(res); accept(); } //----------------------------------------------------------------------------- bool SetupDialog::convert() { // TODO: add error (missing values) parsing int i,j; double x1=0,y1=0,z1=0,x2=0,y2=0,z2=0; bool u1,v1,w1,u2,v2,w2; QString s, col="wwbgrcmylenuqphkWBGRCMYLENUQPH"; res = ""; for(i=0;i<10;i++) // set light sources { if(!slight[i]->isChecked()) continue; if(xlight[i]->text().isEmpty() || ylight[i]->text().isEmpty() || zlight[i]->text().isEmpty()) { QMessageBox::information(this, _("UDAV - Setup plot"), _("Light position should be filled. Ignore it."), QMessageBox::Ok); continue; } x1=xlight[i]->text().toDouble(); y1=ylight[i]->text().toDouble(); z1=zlight[i]->text().toDouble(); j = clight[i]->currentIndex(); if(blight[i]->text().isEmpty()) s.asprintf("light %d %g %g %g '%c'\n", i,x1,y1,z1, col[j].toLatin1()); else s.asprintf("light %d %g %g %g '%c' %g\n", i,x1,y1,z1, col[j].toLatin1(), blight[i]->text().toDouble()); res += s; } u1 = !xmin->text().isEmpty(); if(u1) x1 = xmin->text().toDouble(); u2 = !xmax->text().isEmpty(); if(u2) x2 = xmax->text().toDouble(); v1 = !ymin->text().isEmpty(); if(v1) y1 = ymin->text().toDouble(); v2 = !ymin->text().isEmpty(); if(v2) y2 = ymax->text().toDouble(); w1 = !zmin->text().isEmpty(); if(w1) z1 = zmin->text().toDouble(); w2 = !zmin->text().isEmpty(); if(w2) z2 = zmax->text().toDouble(); if(u1&&v1&&w1&&u2&&v2&&w2) { s.asprintf("axis %g %g %g %g %g %g\n",x1,y1,z1,x2,y2,z2); res += s; } else { if(u1 && u2) {s.asprintf("xrange %g %g\n",x1,x2); res += s;} if(v1 && v2) {s.asprintf("yrange %g %g\n",y1,y2); res += s;} if(w1 && w2) {s.asprintf("zrange %g %g\n",z1,z2); res += s;} } u1 = !cmin->text().isEmpty(); if(u1) x1 = cmin->text().toDouble(); u2 = !cmax->text().isEmpty(); if(u2) x2 = cmax->text().toDouble(); if(u1&&u2) {s.asprintf("crange %g %g\n",x1,x2); res += s;} u1 = !xmin->text().isEmpty(); if(u1) x1 = xorg->text().toDouble(); v1 = !yorg->text().isEmpty(); if(v1) y1 = yorg->text().toDouble(); w1 = !zorg->text().isEmpty(); if(w1) z1 = zorg->text().toDouble(); if(u1&&v1&&w1) {s.asprintf("origin %g %g %g\n",x1,y1,z1); res += s;} u1 = !xtck->text().isEmpty(); if(u1) x1 = xtck->text().toDouble(); u2 = !xsub->text().isEmpty(); if(u2) x2 = xsub->text().toDouble(); v1 = !ytck->text().isEmpty(); if(v1) y1 = ytck->text().toDouble(); v2 = !ysub->text().isEmpty(); if(v2) y2 = ysub->text().toDouble(); w1 = !ztck->text().isEmpty(); if(w1) z1 = ztck->text().toDouble(); w2 = !zsub->text().isEmpty(); if(w2) z2 = zsub->text().toDouble(); if(u1 && u2) { if(xort->text().isEmpty()) s.asprintf("xtick %g %g\n",x1,x2); else s.asprintf("xtick %g %g %g\n",x1,x2,xort->text().toDouble()); res += s; } if(v1 && v2) { if(yort->text().isEmpty()) s.asprintf("ytick %g %g\n",y1,y2); else s.asprintf("ytick %g %g %g\n",y1,y2,yort->text().toDouble()); res += s; } if(w1 && w2) { if(zort->text().isEmpty()) s.asprintf("ztick %g %g\n",z1,z2); else s.asprintf("ztick %g %g %g\n",z1,z2,zort->text().toDouble()); res += s; } if(u1 && !u2) {s.asprintf("xtick %g\n",x1); res += s;} if(v1 && !v2) {s.asprintf("ytick %g\n",y1); res += s;} if(w1 && !w2) {s.asprintf("ztick %g\n",z1); res += s;} if(!xtt->text().isEmpty()) res = res + "xtick '" + xtt->text() + "'\n"; if(!ytt->text().isEmpty()) res = res + "ytick '" + ytt->text() + "'\n"; if(!ztt->text().isEmpty()) res = res + "ztick '" + ztt->text() + "'\n"; if(!ctt->text().isEmpty()) res = res + "ctick '" + ctt->text() + "'\n"; if(!xlbl->text().isEmpty()) { s.asprintf("' %d\n", xpos->currentIndex()-1); res = res + "xlabel '"+ xlbl->text() + s; } if(!ylbl->text().isEmpty()) { s.asprintf("' %d\n", ypos->currentIndex()-1); res = res + "ylabel '"+ ylbl->text() + s; } if(!zlbl->text().isEmpty()) { s.asprintf("' %d\n", zpos->currentIndex()-1); res = res + "zlabel '"+ zlbl->text() + s; } if(!aldef->text().isEmpty()) { s.asprintf("alphadef %g\n",aldef->text().toDouble()); res += s; } if(!amb->text().isEmpty()) { s.asprintf("ambient %g\n",amb->text().toDouble()); res += s; } if(!basew->text().isEmpty()) { s.asprintf("baselinewidth %g\n",basew->text().toDouble()); res += s; } if(!mesh->text().isEmpty()) { s.asprintf("meshnum %d\n",mesh->text().toInt()); res += s; } if(axial->currentIndex()>0) { s.asprintf("axialdir '%c'\n",char('x'+axial->currentIndex()-1)); res += s; } if(!font->text().isEmpty()) { res = res + "font '" + font->text(); if(!fsize->text().isEmpty()) s.asprintf("' %g\n",fsize->text().toDouble()); else s.asprintf("'\n"); res += s; } if(rotate->isChecked()) res = res + "rotatetext off\n"; if(alpha->isChecked()) res = res + "alpha on\n"; if(light->isChecked()) res = res + "light on\n"; return true; } //----------------------------------------------------------------------------- mathgl-8.0.1/udav/udav.desktop0000775000175000017500000000052514167366466016103 0ustar balakinbalakin[Desktop Entry] Version=1.0 Type=Application Terminal=false Icon=udav Name=UDAV Exec=udav %f MimeType=text/mgl; Comment=Data handling and plotting tool Comment[en_US]=Data handling and plotting tool Comment[ru_RU]=Обработка и отображение данных Categories=Education;Science;Math; Keywords=Visualization;Data;Array;mathgl-8.0.1/utils/0000775000175000017500000000000014167366473013743 5ustar balakinbalakinmathgl-8.0.1/utils/mgltask.cpp0000664000175000017500000000744314167366473016121 0ustar balakinbalakin#include #include #include #include #if ((defined(_MSC_VER) || defined(__BORLANDC__)) && !defined(M_PI)) //_MSC_VER needs this before math.h #define _USE_MATH_DEFINES #endif #include #include #include "mgl2/addon.h" #include "mgl2/data.h" //----------------------------------------------------------------------------- int main(int argc, char *argv[]) { const char *args_opt="a:b:c:d:e:f:g:h:i:j:k:l:m:n:o:p:q:r:s:t:u:v:w:x:y:z:"; std::string eqs[26]; while(1) { int ch = getopt(argc, argv, args_opt); if(ch>='a' && ch<='z') eqs[ch-'a'] = optarg; if(ch<0) break; } double x1[3]={0,0,0},x2[3]={0,0,0},dx[3]={1,1,1}; bool e[3]={false,false,false}; int n=argc-optind-2; // number of counters if(n<1) // if incorrect number of arguments then print the help { printf("mgltask make output file with a set of copies of mask-file with repeatedly replaced $# by loop values. It useful for making set of initial conditions with a few parameters varied in specified range.\n"); printf("Usage:\tmgltask [options] maskfile outputfile [min1:step1:max1 [min2:step2:max2 [min3:step3:max3]]]\n\n"); printf("\tmask file -- mask file in which all '$#' will be replaced by counter # value.\n"); printf("\t\tHere # = 0 is random number in [0,1]; # = 1,2,3 are counters;\n"); printf("\t\t# = a,b,...,z are formulas defined by options.\n"); printf("\toutputfile -- file where result will be saved, the '-' will print in stdout;\n"); printf("\tmin#:step#:max# -- is minimum, step increment and maximum values of counter #;\n"); printf("\t'e'min#:step#:max# -- the same but in exponential form 10^#.\n"); printf("\tOptions -a, -b, ..., -z define formulas for arguments $a,$b,...,$z,\n"); printf("\t\twhich can depended on counters v0=$0,v1=$1,v2=$2,v3=$3.\n"); // system("PAUSE"); return 0; } FILE *fm = fopen(argv[optind],"r"); FILE *fo = strcmp(argv[optind+1],"-") ? fopen(argv[optind+1],"w"):stdout; printf("mask = %s, out = %s\n",argv[optind],argv[optind+1]); // read parameters of loops for(int i=0;ia[0]; mgl_delete_data(d); } fseek(fm,0,0); while(!feof(fm)) { int i; char str[1024],*buf=str; char *r=fgets(str,1024,fm); // for each string if(!r) break; while((i=mgl_chrpos(buf,'$'))!=-1) // find '$' { char k=buf[i+1]; buf[i]=0; if(k=='0') fprintf(fo,"%s%g",buf,d0.a[0]); else if(k=='1') fprintf(fo,"%s%g",buf,e[0] ? exp(M_LN10*v1):(fabs(v1)<1e-10?0:v1)); else if(k=='2') fprintf(fo,"%s%g",buf,e[1] ? exp(M_LN10*v2):(fabs(v2)<1e-10?0:v2)); else if(k=='3') fprintf(fo,"%s%g",buf,e[2] ? exp(M_LN10*v3):(fabs(v3)<1e-10?0:v3)); else if(k>='a' && k<='z') fprintf(fo,"%s%g",buf,vals[k-'a']); buf = &(buf[i+2]); // handle the last part } fprintf(fo,"%s",buf); // write it } fprintf(fo,"\n"); } fclose(fm); fclose(fo); return 0; } //----------------------------------------------------------------------------- mathgl-8.0.1/utils/mglview.cpp0000664000175000017500000001172614167366473016130 0ustar balakinbalakin/*************************************************************************** * mglview.cpp is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include #include "mgl2/mgl.h" #if USE_FLTK #include "mgl2/fltk.h" #include #include #else #include "mgl2/qt.h" #endif //----------------------------------------------------------------------------- std::wstring str, opt; std::vector anim; mglParse p(true); void prop_func(char id, const char *val, void *) { p.AddParam(id<='9' ? id-'0' : id-'a'+10, val); } //----------------------------------------------------------------------------- int show(mglGraph *gr) { if(anim.size()>0) { for(size_t i=0;iNewFrame(); p.AddParam(0,anim[i].c_str()); p.Execute(gr,str.c_str()); gr->EndFrame(); } return gr->GetNumFrame(); } p.Execute(gr,str.c_str()); printf("%s\n",gr->Message()); return 0; } //----------------------------------------------------------------------------- int main(int argc, char **argv) { mgl_textdomain(argv?argv[0]:NULL,""); char iname[256]=""; mgl_suppress_warn(true); bool gray = false; while(1) { int ch = getopt(argc, argv, "1:2:3:4:5:6:7:8:9:hL:s:g:v:"); if(ch>='1' && ch<='9') p.AddParam(ch-'0', optarg); else if(ch=='s') { FILE *fp = fopen(optarg,"r"); if(fp) { wchar_t ch; while(!feof(fp) && size_t(ch=fgetwc(fp))!=WEOF) opt.push_back(ch); fclose(fp); } } else if(ch=='v') p.SetVariant(atoi(optarg)); else if(ch=='g') gray= atoi(optarg); else if(ch=='L') { setlocale(LC_ALL, optarg); setlocale(LC_NUMERIC, "C"); } else if(ch=='h' || (ch==-1 && optind>=argc)) { printf(_("mglview show plot from MGL script or MGLD file.\nCurrent version is %s\n"),MGL_VER_STRING); printf(_("Usage:\tmglview [parameter(s)] scriptfile\n")); printf( _("\t-1 str set str as argument $1 for script\n" "\t... ...\n" "\t-9 str set str as argument $9 for script\n" "\t-g val set gray-scale mode (val=0|1)\n" "\t-v val set variant of arguments\n" "\t-s opt set MGL script for setting up the plot\n" "\t-L loc set locale to loc\n" "\t- get script from standard input\n" "\t-h print this message\n") ); return 0; } else if(ch==-1 && optind par; bool mgld=(*iname && iname[strlen(iname)-1]=='d'); if(!mgld) { str = opt + L"\n"; FILE *fp = *iname?fopen(iname,"r"):stdin; if(fp) { wchar_t ch; std::string text; while(!feof(fp) && size_t(ch=fgetwc(fp))!=WEOF) { str.push_back(ch); text.push_back(ch); } fclose(fp); double a1, a2, da; mgl_parse_comments(text.c_str(), a1, a2, da, anim, ids, par); // if(!ids.empty()) dr->gr->dialog(ids,par); } else { printf("No file for MGL script\n"); return 0; } } #if USE_FLTK mgl_ask_func = mgl_ask_fltk; mgl_progress_func = mgl_progress_fltk; mglFLTK gr(mgld?NULL:show, *iname?iname:"mglview"); #else mgl_ask_func = mgl_ask_qt; mglQT gr(mgld?NULL:show, *iname?iname:"mglview"); #endif gr.SetPropFunc(prop_func,NULL); gr.MakeDialog(ids, par); if(gray) gr.Gray(gray); if(mgld) { gr.Setup(false); gr.NewFrame(); const std::string loc = setlocale(LC_NUMERIC, "C"); if(!opt.empty()) { p.Execute(&gr,opt.c_str()); printf("Setup script: %s\n",gr.Message()); gr.ImportMGLD(iname,true); } else gr.ImportMGLD(iname); setlocale(LC_NUMERIC, loc.c_str()); gr.EndFrame(); gr.Update(); } printf("%s",mgl_get_global_warn()); return gr.Run(); } //----------------------------------------------------------------------------- mathgl-8.0.1/utils/make_pas.cpp0000664000175000017500000004257714167366473016246 0ustar balakinbalakin#include #include #include const char *files[] = { "../../include/mgl2/abstract.h", "../../include/mgl2/base_cf.h", "../../include/mgl2/data_cf.h", "../../include/mgl2/datac_cf.h", "../../include/mgl2/cont.h", "../../include/mgl2/fit.h", "../../include/mgl2/plot.h", "../../include/mgl2/surf.h", "../../include/mgl2/volume.h", "../../include/mgl2/vect.h", "../../include/mgl2/prim.h", "../../include/mgl2/other.h", "../../include/mgl2/canvas_cf.h", "../../include/mgl2/addon.h", "" }; const char *head = "//**************************************************************************\n\ // mgl_pas.pas is part of Math Graphic Library *\n\ // Copyright (C) 2008-2013 Mikhail Barg, Alexey Balakin *\n\ // *\n\ // This program is free software; you can redistribute it and/or modify *\n\ // it under the terms of the GNU Lesser General Public License as *\n\ // published by the Free Software Foundation; either version 2 of the *\n\ // License, or (at your option) any later version. *\n\ // *\n\ // This program is distributed in the hope that it will be useful, *\n\ // but WITHOUT ANY WARRANTY; without even the implied warranty of *\n\ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *\n\ // GNU General Public License for more details. *\n\ // *\n\ // You should have received a copy of the GNU Lesser General Public *\n\ // License along with this program; if not, write to the *\n\ // Free Software Foundation, Inc., *\n\ // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *\n\ //**************************************************************************\n\n\ unit mgl_pas;\n\n\ {$IFDEF FPC}\n\ {$MODE DELPHI }\n\ {$PACKENUM 4} (* use 4-byte enums *)\n\ {$PACKRECORDS C} (* C/C++-compatible record packing *)\n\ {$ELSE}\n\ {$MINENUMSIZE 4} (* use 4-byte enums *)\n\ {$ENDIF}\n\n\ {$IFDEF DARWIN}\n\ {$linklib libmgl}\n\ {$ENDIF}\n\n\ interface\n\n\ uses\n\ {$IFDEF MSWINDOWS}\n\ Windows, Graphics,\n\ {$ENDIF}\n\ Math;\n\n\ //* This define enables double precision in MathGL */\n\ MGL_USE_DOUBLE = 1;\n\n\ const\n\ {$IFDEF MSWINDOWS}\n\ //win - .dll\n\ libmgl = 'libmgl.dll';\n\ libmglglut = 'libmgl-glut.dll';\n\ libmglfltk = 'libmgl-fltk.dll';\n\ libmglqt = 'libmgl-qt.dll';\n\ {$ELSE}\n\ {$IFDEF LINUX}\n\ //linux - .so\n\ libmgl = 'libmgl.so';\n\ libmglglut = 'libmgl-glut.so';\n\ libmglfltk = 'libmgl-fltk.so';\n\ libmglqt = 'libmgl-qt.so';\n\ {$ELSE}\n\ {$IFDEF DARWIN}\n\ //darwin - .dylib\n\ libmgl = 'libmgl.dylib';\n\ libmglglut = 'libmgl-glut.dylib';\n\ libmglfltk = 'libmgl-fltk.dylib';\n\ libmglqt = 'libmgl-qt.dylib';\n\ {$ELSE}\n\ // other platforms?\n\n\ {$ENDIF}\n\ {$ENDIF}\n\ {$ENDIF}\n\n\ {$IF (MGL_USE_DOUBLE = 0)}\n\ type mreal = double;\n\ {$ELSE}\n\ type mreal = real;\n\ {$IFEND}\n\ {$IFDEF FPC}\n\ {$ELSE}\n\ type QWord = Int64;\n\ {$ENDIF}\n\n\ Pmreal = ^mreal;\n\n\ type TNGLDraw = record\n\ end;\n\ type TMGLGraph = record\n\ end;\n\ type TMGLData = record\n\ end;\n\ type TMGLParse = record\n\ end;\n\ type TMGLFormula = record\n\ end;\n\ type TMGLFormulaC = record\n\ end;\n\ type TMGLDataC = record\n\ end;\n\ type HMDR = ^TNGLDraw;\n\ type HMGL = ^TMGLGraph;\n\ type HMDT = ^TMGLData;\n\ type HMPR = ^TMGLParse;\n\ type PPChar = ^PChar;\n\ type HMEX = ^TMGLFormula;\n\ type HAEX = ^TMGLFormulaC;\n\ type HADT = ^TMGLDataC;\n\n\ type Preal = ^single;\n\ type Pdouble = ^double;\n\ type Pint = ^integer;\n\ type dual = record\n\ re, im: mreal;\n\ end;\n\ type Pdual = ^dual;\n\ type TGSLVector = record\n\ end;\n\ type TGSLMatrix = record\n\ end;\n\ type PGSLVector = ^TGSLVector;\n\ type PGSLMatrix = ^TGSLMatrix;\n\n\ type TMglDrawFunction = function (gr: HMGL; p: pointer): integer; cdecl;\n\ function mgl_create_graph_gl(): HMGL; cdecl; external libmgl;\n\ function mgl_create_graph_glut(draw: TMglDrawFunction; const title: PChar; par: pointer): HMGL; cdecl; external libmglglut;\n\ function mgl_create_graph_fltk(draw: TMglDrawFunction; const title: PChar; par: pointer): HMGL; cdecl; external libmglfltk;\n\ procedure mgl_fltk_run(); cdecl; external libmglfltk;\n\ function mgl_create_graph_qt(draw: TMglDrawFunction; const title: PChar; par: pointer): HMGL; cdecl; external libmglqt;\n\ procedure mgl_qt_run(); cdecl; external libmglqt;\n"; const char *footer = "\n\ \n\ {$IFDEF MSWINDOWS}\n\ //*****************************************************************************/\n\ // Delphi - specific\n\ //*****************************************************************************/\n\ procedure mgl_begin();\n\ procedure mgl_end();\n\ \n\ procedure mgl_draw_on_canvas(gr: HMGL; width, height: integer; canvas: TCanvas; switchXY: boolean = false);\n\ \n\ implementation\n\ \n\ var _FPUCW: word;\n\ \n\ procedure mgl_begin();\n\ begin\n\ _FPUCW := Get8087CW(); // backup current FPU CW\n\ Set8087CW(_FPUCW or $3F); // masking all FPU exceptions\n\ end;\n\ \n\ procedure mgl_end();\n\ begin\n\ Set8087CW(_FPUCW); // restore old FPU CW\n\ end;\n\ \n\ procedure mgl_draw_on_canvas(gr: HMGL; width, height: integer; canvas: TCanvas; switchXY: boolean = false);\n\ var i, j: integer;\n\ bytes: PByte;\n\ col: TColor;\n\ begin\n\ bytes := mgl_get_rgb(gr);\n\ \n\ if (not switchXY) then\n\ for j := 0 to height - 1 do\n\ for i := 0 to width - 1 do\n\ begin\n\ col := 0;\n\ col := col or (bytes^);\n\ inc(bytes);\n\ col := col or (bytes^) shl 8;\n\ inc(bytes);\n\ col := col or (bytes^) shl 16;\n\ inc(bytes);\n\ canvas.Pixels[i, j] := col;\n\ end\n\ else\n\ for j := height - 1 downto 0 do\n\ for i := 0 to width - 1 do\n\ begin\n\ col := 0;\n\ col := col or (bytes^);\n\ inc(bytes);\n\ col := col or (bytes^) shl 8;\n\ inc(bytes);\n\ col := col or (bytes^) shl 16;\n\ inc(bytes);\n\ canvas.Pixels[j, i] := col;\n\ end;\n\ end;\n\ \n\ {$ENDIF}\n\ end.\n"; bool processArgument(char *dest, const char *arg, const char *prefix, const char *format) { const int prefixLen = strlen(prefix); if ( strncmp(arg, prefix, prefixLen) == 0 ) { char argname[32]; strcpy(argname, arg + prefixLen); if (strcmp(argname, "to") == 0) { int argNameLen = strlen(argname); argname[argNameLen] = '_'; argname[argNameLen + 1] = 0; } sprintf(dest, format, argname); return true; } return false; } const char *parse_name(char *name, bool &needOverload) { const int MAX_ARG = 20; // TODO check if 20 arguments is enough static char res[1024]; char *ptr, *arg[MAX_ARG], nul = 0; unsigned i, j; needOverload = false; for ( i = 0; name[i] != '('; ++i ) { res[i] = name[i]; } // res[i] = 0; // printf("'%s'\n", res); //TODO: special case, invent some general way to handle overloads, i.e. functions with same names. Still would require re-doing whole parser.. if (strncmp(res, " mgl_expi", i - 1) == 0) { needOverload = true; } res[i] = '('; res[i + 1] = 0; ++i; while ( name[i] <= ' ' ) { ++i; } for ( j = 0; j < MAX_ARG; ++j ) { arg[j] = &nul; } for ( j = 0; j < MAX_ARG; ++j ) { arg[j] = (name[i] <= ' ' ? name + i + 1 : name + i); ptr = strchr(name + i, ','); if ( !ptr ) { break; } *ptr = 0; i = ptr - name + 1; } ptr = strchr(name + i, ')'); if ( ptr ) { *ptr = 0; } if ( arg[0][0] == 0 ) { strcat(res, " "); } for ( j = 0; j < MAX_ARG; ++j ) { if ( arg[j][0] == 0 ) { break; } ptr = res + strlen(res); if ( processArgument(ptr, arg[j], "HMGL ", "%s: HMGL;") || processArgument(ptr, arg[j], "HCDT ", "const %s: HMDT;") || processArgument(ptr, arg[j], "HMDT ", "%s: HMDT;") || processArgument(ptr, arg[j], "mglDataA *", "%s: HMDT;") || processArgument(ptr, arg[j], "HADT ", "%s: HADT;") || processArgument(ptr, arg[j], "HAEX ", "%s: HAEX;") || processArgument(ptr, arg[j], "HMPR ", "%s: HMPR;") || processArgument(ptr, arg[j], "HMEX ", "%s: HMEX;") || processArgument(ptr, arg[j], "const float *", "const %s: Preal;") || processArgument(ptr, arg[j], "const double *", "const %s: Pdouble;") || processArgument(ptr, arg[j], "mreal *", "%s: Pmreal;") || processArgument(ptr, arg[j], "double *", "%s: Pdouble;") || processArgument(ptr, arg[j], "char *", "%s: PChar;") || processArgument(ptr, arg[j], "unsigned char *", "%s: PByte;") || processArgument(ptr, arg[j], "int *", "%s: Pint;") || processArgument(ptr, arg[j], "long *", "%s: Pint;") || processArgument(ptr, arg[j], "const char *", "const %s: PChar;") || processArgument(ptr, arg[j], "const unsigned char *", "const %s: PByte;") || processArgument(ptr, arg[j], "const wchar_t *", "const %s: PWideChar;") || processArgument(ptr, arg[j], "char ", "%s: char;") || processArgument(ptr, arg[j], "long ", "%s: integer;") || processArgument(ptr, arg[j], "uint32_t ", "%s: LongWord;") || processArgument(ptr, arg[j], "uint64_t ", "%s: QWord;") || processArgument(ptr, arg[j], "int ", "%s: integer;") || processArgument(ptr, arg[j], "mreal ", "%s: mreal;") || processArgument(ptr, arg[j], "const dual *", "const %s: Pdual;") || processArgument(ptr, arg[j], "dual *", "%s: Pdual;") || processArgument(ptr, arg[j], "dual ", "%s: dual;") || processArgument(ptr, arg[j], "double ", "%s: double;") || processArgument(ptr, arg[j], "gsl_vector *", "%s: PGSLVector;") || processArgument(ptr, arg[j], "gsl_matrix *", "%s: PGSLMatrix;") ) { //already procedded in processArgument } else { sprintf(ptr, " !!! %s;", arg[j]); } } i = strlen(res); res[i - 1] = ')'; return res; } bool processDeclaration(FILE *out, char *declaration, const char *prefix, const char *format) { const int prefixLen = strlen(prefix); if ( strncmp(declaration, prefix, prefixLen) == 0 ) { bool needOverload = false; fprintf(out, format, parse_name(declaration + prefixLen, needOverload)); if (needOverload) { fprintf(out, "overload;\n"); } return true; } return false; } bool parse_file(const char *fname, FILE *out) { if ( !fname || fname[0] == 0 ) { return false; } FILE *fp = fopen(fname, "rt"); if ( !fp ) { return false; } fprintf(out, "{== %s ==}\n", fname); char buf[1024], *ptr; while ( !feof(fp) ) { if(!fgets(buf, 1024, fp)) break; // first filter unwanted strings if ( buf[0] == 0 || buf[0] == '\n' || buf[1] == '\n' ) { continue; } if ( buf[0] == '#' || buf[0] == '}' ) { continue; } if ( !strncmp(buf, "extern", 6) ) { continue; } if ( !strncmp(buf, "class", 5) ) { continue; } if ( !strncmp(buf, "struct", 6) ) { continue; } if ( !strncmp(buf, "typedef", 7) ) { continue; } if ( strstr(buf, "void *") ) { continue; } if ( strstr(buf, "_(") ) { continue; } if ( strstr(buf, "FILE") ) { continue; } if ( strstr(buf, "TODO") ) { continue; } if ( strstr(buf, "...)") ) { continue; } // TODO enable later if ( strstr(buf, "* const *") ) { continue; } // now filter comments if ( buf[0] == '/' && buf[1] == '*' ) { do { if(!fgets(buf, 1024, fp)) break; } while ( !strstr(buf, "*/") ); continue; } ptr = strchr(buf, ';'); if ( ptr ) { *ptr = ' '; } for ( unsigned i = strlen(buf) - 1; buf[i] <= ' '; i-- ) { buf[i] = 0; } if ( buf[0] == '/' && buf[1] == '/' ) { fprintf(out, "%s\n", buf); } else if ( processDeclaration(out, buf, "void MGL_EXPORT_PURE", "procedure %s; cdecl; external libmgl;\n") || processDeclaration(out, buf, "int MGL_EXPORT_PURE", "function %s: integer; cdecl; external libmgl;\n") || processDeclaration(out, buf, "double MGL_EXPORT_PURE", "function %s: double; cdecl; external libmgl;\n") || processDeclaration(out, buf, "mreal MGL_EXPORT_PURE", "function %s: mreal; cdecl; external libmgl;\n") || processDeclaration(out, buf, "long MGL_EXPORT_PURE", "function %s: integer; cdecl; external libmgl;\n") || processDeclaration(out, buf, "mdual MGL_EXPORT_PURE", "function %s: dual; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT_PURE dual *", "function %s: PDual; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMDT MGL_EXPORT_PURE", "function %s: HMDT; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMGL MGL_EXPORT_PURE", "function %s: HMGL; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT_PURE const char *", "function %s: PChar; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT_PURE mreal *", "function %s: Pmreal; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT_PURE const unsigned char *", "function %s: PByte; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMPR MGL_EXPORT_PURE", "function %s: HMPR; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMEX MGL_EXPORT_PURE", "function %s: HMEX; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HADT MGL_EXPORT_PURE", "function %s: HADT; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HAEX MGL_EXPORT_PURE", "function %s: HAEX; cdecl; external libmgl;\n") || processDeclaration(out, buf, "void MGL_EXPORT_CONST", "procedure %s; cdecl; external libmgl;\n") || processDeclaration(out, buf, "int MGL_EXPORT_CONST", "function %s: integer; cdecl; external libmgl;\n") || processDeclaration(out, buf, "double MGL_EXPORT_CONST", "function %s: double; cdecl; external libmgl;\n") || processDeclaration(out, buf, "mreal MGL_EXPORT_CONST", "function %s: mreal; cdecl; external libmgl;\n") || processDeclaration(out, buf, "long MGL_EXPORT_CONST", "function %s: integer; cdecl; external libmgl;\n") || processDeclaration(out, buf, "mdual MGL_EXPORT_CONST", "function %s: dual; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT_CONST dual *", "function %s: PDual; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMDT MGL_EXPORT_CONST", "function %s: HMDT; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMGL MGL_EXPORT_CONST", "function %s: HMGL; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT_CONST const char *", "function %s: PChar; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT_CONST mreal *", "function %s: Pmreal; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT_CONST const unsigned char *", "function %s: PByte; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMPR MGL_EXPORT_CONST", "function %s: HMPR; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMEX MGL_EXPORT_CONST", "function %s: HMEX; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HADT MGL_EXPORT_CONST", "function %s: HADT; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HAEX MGL_EXPORT_CONST", "function %s: HAEX; cdecl; external libmgl;\n") || processDeclaration(out, buf, "void MGL_EXPORT", "procedure %s; cdecl; external libmgl;\n") || processDeclaration(out, buf, "int MGL_EXPORT", "function %s: integer; cdecl; external libmgl;\n") || processDeclaration(out, buf, "double MGL_EXPORT", "function %s: double; cdecl; external libmgl;\n") || processDeclaration(out, buf, "mreal MGL_EXPORT", "function %s: mreal; cdecl; external libmgl;\n") || processDeclaration(out, buf, "long MGL_EXPORT", "function %s: integer; cdecl; external libmgl;\n") || processDeclaration(out, buf, "mdual MGL_EXPORT", "function %s: dual; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT dual *", "function %s: PDual; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMDT MGL_EXPORT", "function %s: HMDT; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMGL MGL_EXPORT", "function %s: HMGL; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT const char *", "function %s: PChar; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT mreal *", "function %s: Pmreal; cdecl; external libmgl;\n") || processDeclaration(out, buf, "MGL_EXPORT const unsigned char *", "function %s: PByte; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMPR MGL_EXPORT", "function %s: HMPR; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HMEX MGL_EXPORT", "function %s: HMEX; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HADT MGL_EXPORT", "function %s: HADT; cdecl; external libmgl;\n") || processDeclaration(out, buf, "HAEX MGL_EXPORT", "function %s: HAEX; cdecl; external libmgl;\n") ) { //already processed by processDeclaration } /* else // comment this -- it looks as it hangs on classes only, which should be omitted by anyway { fprintf(out, "{!!!!\t%s}\n", buf); // NOTE should be never here! }*/ } fclose(fp); return true; } int main() { FILE *fout = fopen("../../include/mgl2/mgl_pas.pas", "wt"); fprintf(fout, "%s\n", head); for ( int i = 0; parse_file(files[i], fout); i++ ) {} fprintf(fout, "%s\n", footer); fclose(fout); return 0; } mathgl-8.0.1/utils/make_forth.cpp0000664000175000017500000001572114167366473016574 0ustar balakinbalakin#include #include const char *files[]={"../include/mgl2/base_cf.h","../include/mgl2/data_cf.h", "../include/mgl2/datac_cf.h", "../include/mgl2/cont.h", "../include/mgl2/fit.h", "../include/mgl2/plot.h", "../include/mgl2/surf.h", "../include/mgl2/volume.h", "../include/mgl2/vect.h", "../include/mgl2/prim.h", "../include/mgl2/other.h", "../include/mgl2/canvas_cf.h", "../include/mgl2/addon.h", ""}; const char *head="\\ Mathgl library wrapper\n\ \\ Copyright (C) 2008-2013, Sergey Plis, Alexey Balakin\n\\\n\ \\ This program is free software; you can redistribute it and/or modify\n\ \\ it under the terms of the GNU General Public License as published by\n\ \\ the Free Software Foundation; either version 2 of the License, or\n\ \\ (at your option) any later version.\n\\\n\ \\ This program is distributed in the hope that it will be useful,\n\ \\ but WITHOUT ANY WARRANTY; without even the implied warranty of\n\ \\ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\ \\ GNU General Public License for more details.\n\n\ Module mathgl\n\ library libmgl libmgl.so\n\ library libmgl-glut libmgl-glut.so\n\ library libmgl-fltk libmgl-fltk.so\n\ library libmgl-qt libmgl-qt.so\n\ library libmgl-wx libmgl-wx.so\n\ legacy off\n\n\ libmgl mgl_create_graph_gl\t\t(ptr)\tmgl_create_graph_gl\n\ libmgl-glut mgl_create_graph_glut\tptr ptr ptr\t(ptr)\tmgl_create_graph_glut\n\ libmgl-fltk mgl_create_graph_fltk\tptr ptr ptr\t(ptr)\tmgl_create_graph_fltk\n\ libmgl-fltk mgl_fltk_run\t\t(void)\tmgl_fltk_run\n\ libmgl-qt mgl_create_graph_qt\tptr ptr ptr\t(ptr)\tmgl_create_graph_qt\n\ libmgl-qt mgl_qt_run\t\t\t(void)\tmgl_qt_run\n"; const char *parse_name(char *name, char *fnc) { static char res[1024]; memset(res,0,1024); char *ptr,*arg[20],nul=0; // TODO check if 20 arguments is enough unsigned i; for(i=0;name[i]!='(';i++) res[i]=name[i]; memcpy(fnc,res,i); fnc[i]=0; // copy name for later res[i]='\t'; i++; for(int j=1;j<=(25-i)/4;j++) res[i+j-1]='\t'; /* static char res[1024]; char *ptr,*arg[20],nul=0; // TODO check if 20 arguments is enough unsigned i; for(i=0;name[i]!='(';i++) res[i]=name[i]; memcpy(fnc,res,i); fnc[i]=0; // copy name for later res[i]='\t'; res[i+1]=0; i++;*/ while(name[i]<=' ') i++; for(int j=0;j<20;j++) arg[j]=&nul; for(int j=0;j<20;j++) { arg[j]= name[i]<=' ' ? name+i+1 : name+i; ptr=strchr(name+i,','); if(!ptr) break; *ptr=0; i=ptr-name+1; } ptr=strchr(name+i,')'); if(ptr) *ptr=0; for(int j=19;j>=0;j--) { if(arg[j][0]==0) continue; if(!strncmp(arg[j],"HMGL ",5)) strcat(res, "ptr "); else if(!strncmp(arg[j],"HADT ",5)) strcat(res, "ptr "); else if(!strncmp(arg[j],"HCDT ",5)) strcat(res, "ptr "); else if(!strncmp(arg[j],"HMDT ",5)) strcat(res, "ptr "); else if(!strncmp(arg[j],"HMPR ",5)) strcat(res, "ptr "); else if(!strncmp(arg[j],"HMEX ",5)) strcat(res, "ptr "); else if(!strncmp(arg[j],"const float *",13)) strcat(res, "ptr "); else if(!strncmp(arg[j],"const double *",14)) strcat(res, "ptr "); else if(!strncmp(arg[j],"mreal *",7)) strcat(res, "ptr "); else if(!strncmp(arg[j],"double *",8)) strcat(res, "ptr "); else if(!strncmp(arg[j],"char *",6)) strcat(res, "ptr "); else if(!strncmp(arg[j],"int *",5)) strcat(res, "ptr "); else if(!strncmp(arg[j],"long *",6)) strcat(res, "ptr "); else if(!strncmp(arg[j],"const char *",12)) strcat(res, "ptr "); else if(!strncmp(arg[j],"const wchar_t *",15)) strcat(res, "ptr "); else if(!strncmp(arg[j],"char ",5)) strcat(res, "char "); else if(!strncmp(arg[j],"long ",5)) strcat(res, "int "); else if(!strncmp(arg[j],"uint32_t ",9)) strcat(res, "int "); else if(!strncmp(arg[j],"int ",4)) strcat(res, "int "); else if(!strncmp(arg[j],"mreal ",6)) strcat(res, "sf "); else if(!strncmp(arg[j],"double ",7)) strcat(res, "double "); else if(!strncmp(arg[j],"gsl_vector *",12)) strcat(res, "ptr "); else if(!strncmp(arg[j],"gsl_matrix *",12)) strcat(res, "ptr "); else sprintf(res, " !!! %s;", arg[j]); // NOTE should be never here } return res; } bool parse_file(const char *fname, FILE *out) { if(!fname || fname[0]==0) return false; FILE *fp=fopen(fname,"rt"); if(!fp) return false; char buf[1024], *ptr, fnc[128]=""; while(!feof(fp)) { fgets(buf,1024,fp); // first filter unwanted strings if(buf[0]==0 || buf[0]=='\n' || buf[1]=='\n') continue; if(buf[0]=='#' || buf[0]=='}') continue; if(!strncmp(buf, "extern",6)) continue; if(!strncmp(buf, "class",5)) continue; if(!strncmp(buf, "struct",6)) continue; if(!strncmp(buf, "typedef",7)) continue; if(strstr(buf, "void *")) continue; if(strstr(buf, "_(")) continue; if(strstr(buf, "FILE")) continue; if(strstr(buf, "TODO")) continue; if(strstr(buf, "//")) continue; if(strstr(buf, "...)")) continue; // TODO following 5 lines enable later if(strstr(buf, "* const *")) continue; if(strstr(buf, "uint64_t")) continue; if(strstr(buf, "dual")) continue; if(strstr(buf, "HADT")) continue; if(strstr(buf, "HAEX")) continue; // now filter comments if(buf[0]=='/' && buf[1]=='*') { do fgets(buf,1024,fp); while(!strstr(buf,"*/")); continue; } ptr = strchr(buf,';'); if(ptr) *ptr=' '; for(unsigned i=strlen(buf)-1;buf[i]<=' ';i--) buf[i]=0; if(buf[0]=='/' && buf[1]=='/') fprintf(out,"%s\n",buf); else if(!strncmp(buf,"void MGL_EXPORT",15)) fprintf(out,"libmgl %s\t(void)\t%s\n",parse_name(buf+16,fnc),fnc); else if(!strncmp(buf,"int MGL_EXPORT",14)) fprintf(out,"libmgl %s\t(int)\t%s\n",parse_name(buf+15,fnc),fnc); else if(!strncmp(buf,"double MGL_EXPORT",17)) fprintf(out,"libmgl %s\t(double)\t%s\n",parse_name(buf+18,fnc),fnc); else if(!strncmp(buf,"mreal MGL_EXPORT",16)) fprintf(out,"libmgl %s\t(sf)\t%s\n",parse_name(buf+17,fnc),fnc); else if(!strncmp(buf,"long MGL_EXPORT",15)) fprintf(out,"libmgl %s\t(int)\t%s\n",parse_name(buf+16,fnc),fnc); else if(!strncmp(buf,"HMDT MGL_EXPORT",15)) fprintf(out,"libmgl %s\t(ptr)\t%s\n",parse_name(buf+16,fnc),fnc); else if(!strncmp(buf,"HMGL MGL_EXPORT",15)) fprintf(out,"libmgl %s\t(ptr)\t%s\n",parse_name(buf+16,fnc),fnc); else if(!strncmp(buf,"MGL_EXPORT const char *",23)) fprintf(out,"libmgl %s\t(ptr)\t%s\n",parse_name(buf+24,fnc),fnc); else if(!strncmp(buf,"MGL_EXPORT mreal *",18)) fprintf(out,"libmgl %s\t(ptr)\t%s\n",parse_name(buf+19,fnc),fnc); else if(!strncmp(buf,"MGL_EXPORT const unsigned char *",32)) fprintf(out,"libmgl %s\t(ptr)\t%s\n",parse_name(buf+33,fnc),fnc); else if(!strncmp(buf,"HMPR MGL_EXPORT",15)) fprintf(out,"libmgl %s\t(ptr)\t%s\n",parse_name(buf+16,fnc),fnc); else if(!strncmp(buf,"HMEX MGL_EXPORT",15)) fprintf(out,"libmgl %s\t(ptr)\t%s\n",parse_name(buf+16,fnc),fnc); else if(!strncmp(buf,"HADT MGL_EXPORT",15)) fprintf(out,"libmgl %s\t(ptr)\t%s\n",parse_name(buf+16,fnc),fnc); else fprintf(out,"!!!!\t%s\n",buf); // NOTE should be never here! } fclose(fp); return true; } int main() { FILE *fout = fopen("../include/mgl2/mgl.fs","wt"); fprintf(fout,"%s\n",head); for(int i=0;parse_file(files[i],fout);i++); fclose(fout); return 0; } mathgl-8.0.1/utils/mglcgi.cpp0000664000175000017500000000716214167366473015717 0ustar balakinbalakin/*************************************************************************** * mglcgi.cpp is part of Math Graphic Library * Copyright (C) 2007-2016 Alexey Balakin * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include #include "mgl2/mgl.h" //----------------------------------------------------------------------------- int MGL_LOCAL_CONST mgl_hex(char ch) { int res=-1; if(ch>='0' && ch<='9') res = ch-'0'; if(ch>='a' && ch<='f') res = ch-'a'+10; if(ch>='A' && ch<='F') res = ch-'A'+10; return res; } //----------------------------------------------------------------------------- /// Parse CGI string buf and return usual string as val for given name. /// The size of val should be the same as size of buf. void mgl_get_value(const char *buf, const char *name, char *val) { const char *pos = strstr(buf,name); memset(val,0,strlen(buf)+1); if(pos && (pos==buf || pos[-1]=='&')) { pos+=4; // shift for "mgl=" size_t l=strlen(pos); for(size_t i=0, j=0;i\n"); printf("\n"); printf("MathGL - library for scientific graphics\n"); // printf("