gvb-1.2.1/0000755000175000017500000000000011336006273011660 5ustar pietropietrogvb-1.2.1/po/0000755000175000017500000000000011336006273012276 5ustar pietropietrogvb-1.2.1/po/cs.po0000644000175000017500000001556611336006273013260 0ustar pietropietro# Czech translation for gvb # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the gvb package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: gvb\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: 2009-11-15 09:36+0000\n" "Last-Translator: Vojtěch Trefný \n" "Language-Team: Czech \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-11-25 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: gvb.py:270 msgid "Stop" msgstr "" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "Spustit" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "" #: gvbmod/dispositions.py:160 msgid "square" msgstr "" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "" #: stuff/gvb.glade:23 msgid "_File" msgstr "_Soubor" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "Uspořá_dání" #: stuff/gvb.glade:92 msgid "_Options" msgstr "V_olby" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "Počet bodů" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "Uložit ve formátu PNG" #: stuff/gvb.glade:123 msgid "_Help" msgstr "Nápo_věda" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "" #: stuff/gvb.glade:195 msgid "Speed" msgstr "Rychlost" #: stuff/gvb.glade:231 msgid "Step" msgstr "Krok" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "výpočet [ms]" #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "vykreslování [ms]" #: stuff/gvb.glade:355 msgid "Rope" msgstr "Křivka" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "Membrána" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "Výpočet" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "Snímků za sekundu" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "Grafika" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "O Good ViBrations" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "Simulátor vlnění." #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "" #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Good ViBrations je svobodný software; můžete jej šířit a modifikovat podle " "ustanovení GNU General Public License, vydávané Free Software Foundation; a " "to buď verze 3 této licence anebo (podle svého uvážení) kterékoli pozdější " "verze.\n" "\n" "Program Good ViBrations je rozšiřován v naději, že bude užitečný, avšak BEZ " "JAKÉKOLI ZÁRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo " "VHODNOSTI PRO URČITÝ ÚČEL. Další podrobnosti hledejte v GNU General Public " "License.\n" "\n" "Kopii GNU General Public License jste měli obdržet spolu s programem Good " "ViBrations; pokud se tak nestalo, napište na adresu Free Software " "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 " "USA" #: stuff/gvb.glade:620 msgid "Initial position" msgstr "Výchozí pozice" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "" #: stuff/gvb.glade:728 msgid "product" msgstr "produkt" #: stuff/gvb.glade:742 msgid "sum" msgstr "" #: stuff/gvb.glade:757 msgid "maximum" msgstr "maximum" #: stuff/gvb.glade:772 msgid "minimum" msgstr "minimum" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" #~ msgid "Copyright Pietro Battiston 2008" #~ msgstr "Copyright Pietro Battiston 2008" #~ msgid "Add to actual disposition" #~ msgstr "Přidat do aktuálního uspořádání" gvb-1.2.1/po/ru.po0000644000175000017500000002050211336006273013263 0ustar pietropietro# Russian translation for gvb # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the gvb package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: gvb\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: 2009-11-15 09:37+0000\n" "Last-Translator: Roman A. aka BasicXP \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-11-25 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: gvb.py:270 msgid "Stop" msgstr "Остановить" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "Старт" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "плоский" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "синус" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "половина синуса" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "треугольный сигнал" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "синусоидальный сигнал" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "противоположные синусоидальные" #: gvbmod/dispositions.py:160 msgid "square" msgstr "квадрат" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "квадратный сигнал" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "косинус (сдвинутый)" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "водопад" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "синусоидальный" #: stuff/gvb.glade:23 msgid "_File" msgstr "_Файл" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "_Диспозиция" #: stuff/gvb.glade:92 msgid "_Options" msgstr "_Параметры" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "Количество точек" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "Сохранить кадры как PNG" #: stuff/gvb.glade:123 msgid "_Help" msgstr "_Справка" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "" #: stuff/gvb.glade:195 msgid "Speed" msgstr "Скорость" #: stuff/gvb.glade:231 msgid "Step" msgstr "Шаг" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "расчёт мс." #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "рисование мс." #: stuff/gvb.glade:355 msgid "Rope" msgstr "Верёвка" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "Мембрана" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "Расчёт" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "Кадров в секунду" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "Графика" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "О программе Good ViBrations" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "Симулятор волн." #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "" #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Good ViBrations - бесплатное программное обеспечение; вы можете " "распространять и/или изменять его на условиях лицензии GNU GPL, " "опубликованной Free Software Foundation; используется версия 3 либо (по " "вашему выбору) более поздняя.\n" "\n" "Good ViBrations распространяется с надеждой, что программы будет полезна, но " "БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без гарантии ТОВАРНОСТИ или ПРИГОДНОСТИ ДЛЯ " "КОНКРЕТНОЙ ЦЕЛИ. Смотрите лицензию GNU GPL для подробностей.\n" "\n" "Вы должны были получить копию лицензии GNU GPL вместе с программой Good " "ViBrations; если это не так, свяжитесь с Free Software Foundation, Inc., 59 " "Temple Place - Офис 330, Бостон, MA 02111-1307 США." #: stuff/gvb.glade:620 msgid "Initial position" msgstr "Начальное положение" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "Правило сопоставления:" #: stuff/gvb.glade:728 msgid "product" msgstr "продукт" #: stuff/gvb.glade:742 msgid "sum" msgstr "сумма" #: stuff/gvb.glade:757 msgid "maximum" msgstr "максимум" #: stuff/gvb.glade:772 msgid "minimum" msgstr "минимум" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "Вертикальный" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "Горизонтальный" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "Отражение" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "Форма волны" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "Полная длина" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "Сдвиг" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "Длина волны" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "Фаза" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "Амплитуда" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "Центровка" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "Инвертировать" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "Подсказка:" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "Выберите путь" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "Файл уже существует" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" "Уже существует файл с таким-же именем,\n" "вы уверены, что хотите перезаписать его?" #~ msgid "Copyright Pietro Battiston 2008" #~ msgstr "Копирайт (C) Пиетро Баттистон 2008" #~ msgid "Add to actual disposition" #~ msgstr "Добавить к текущей диспозиции" #~ msgid "Number of points (per dimension):" #~ msgstr "Количество точек (на измерение):" gvb-1.2.1/po/fr.po0000644000175000017500000001720711336006273013254 0ustar pietropietro# French translation for gvb # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the gvb package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: gvb\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: 2009-11-15 09:36+0000\n" "Last-Translator: Pietro Battiston \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-11-25 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: gvb.py:270 msgid "Stop" msgstr "Arrêter" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "Commencer" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "sin" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "Signal triangulaire" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "Signal sinusoïdal" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "" #: gvbmod/dispositions.py:160 msgid "square" msgstr "carré" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "Signal carré" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "goutte" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "sinusoïdal" #: stuff/gvb.glade:23 msgid "_File" msgstr "_Fichier" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "_Disposition" #: stuff/gvb.glade:92 msgid "_Options" msgstr "_Options" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "Nombre de points" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "Sauvegarder les images en png." #: stuff/gvb.glade:123 msgid "_Help" msgstr "_Aide" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "" #: stuff/gvb.glade:195 msgid "Speed" msgstr "Vitesse" #: stuff/gvb.glade:231 msgid "Step" msgstr "Pas" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "" #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "" #: stuff/gvb.glade:355 msgid "Rope" msgstr "Corde" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "Membrane" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "Calcul" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "Frames/secondes" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "Affichage" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "À Propos de Good ViBrations" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "Un simulateur d'ondes." #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "" #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Good ViBrations est un logiciel libre : vous pouvez le redistribuer et/ou le " "modifier selon les termes de la GNU/GPL publiée par la Free Software " "Foundation ; soit en version 3 de cette licence, soit supérieure si vous " "voulez. \n" "\n" "Good ViBrations est distribué dans l'espoir qu'il sera utile, mais SANS " "AUCUNE GARANTIE, sans même la garntie d'une VALERU COMMERCIALE ou APTITUDES " "DANS UN BUT PARTICULIER. Voir la GNU/GPL pour plus d'informations.\n" "\n" "Vous devriez avoir reçu une copie de la GNU/GPL avec Good ViBrations, si " "non, écrivez à la Free Software Foundation, Inc., 59 Temple Place - Suite " "330, Boston, MA 02111-1307, USA." #: stuff/gvb.glade:620 msgid "Initial position" msgstr "Position initiale" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "" #: stuff/gvb.glade:728 msgid "product" msgstr "produit" #: stuff/gvb.glade:742 msgid "sum" msgstr "somme" #: stuff/gvb.glade:757 msgid "maximum" msgstr "maximum" #: stuff/gvb.glade:772 msgid "minimum" msgstr "minimum" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "Vertical" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "Horizontal" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "Reflet" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "Forme de l'onde" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "Longueur totale" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "Déplacement" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "Longueur d'onde" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "Phase" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "Amplitude" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "Centrage" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "Inverser" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "Conseil:" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "Choisir un chemin" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "Le fichier existe" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" "Il existe déjà un fichier avec ce nom.\n" "Voulez vous vraiment écraser ce fichier?" #~ msgid "Copyright Pietro Battiston 2008" #~ msgstr "Copyright Pietro Battiston 2008" #~ msgid "Number of points (per dimension):" #~ msgstr "Nombre de points (par dimension):" #~ msgid "" #~ "If you want to observe harmonics,\n" #~ "the ideal number is an n such that\n" #~ "n-1 has a lot of small factors (e.g:\n" #~ "if n-1 contains many times 2 as\n" #~ "factor, it will be possible to draw \n" #~ "better the second harmonic, the \n" #~ "fourth and so on)" #~ msgstr "" #~ "Si vous voulez observer les harmoniques,\n" #~ "le nombre idéal est n tel que\n" #~ "n-1 ait beaucoup de petits facteurs.\n" #~ "(par exemple, si n-1 contient souvent 2 comme\n" #~ "facteur, il sera possible de mieux tracer\n" #~ "la seconde harmonique, la quatrième, etc.)" gvb-1.2.1/po/sv.po0000644000175000017500000001625611336006273013300 0ustar pietropietro# Swedish translation for gvb # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the gvb package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: gvb\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: 2009-11-15 09:37+0000\n" "Last-Translator: Pietro Battiston \n" "Language-Team: Swedish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-11-25 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: gvb.py:270 msgid "Stop" msgstr "Stoppa" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "Starta" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "rak" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "sin" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "sinusformad signal" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "" #: gvbmod/dispositions.py:160 msgid "square" msgstr "kvadrat" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "damm" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "vattenfall" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "Sinusformad" #: stuff/gvb.glade:23 msgid "_File" msgstr "_Arkiv" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "_Disposition" #: stuff/gvb.glade:92 msgid "_Options" msgstr "A_lternativ" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "Antal punkter" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "Spara bilder som png" #: stuff/gvb.glade:123 msgid "_Help" msgstr "_Hjälp" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "" #: stuff/gvb.glade:195 msgid "Speed" msgstr "Hastighet" #: stuff/gvb.glade:231 msgid "Step" msgstr "Steg" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "kalkyleringsmiss" #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "ritningsmiss" #: stuff/gvb.glade:355 msgid "Rope" msgstr "Rep" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "Membran" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "Beräkning" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "Bilder/sekund" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "Grafik" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "Om Good ViBrations" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "En vågsimulator." #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "" #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Good ViBrations är fri och öppen mjukvara; du kan redistribuera den " "och/eller modifiera den enligt villkoren i GNU General Public License som " "publicerade avFree Software Foundation; antingen version 3 av Licensen, " "eller (om du föredrar det) någon senare version.Good ViBrations har " "distribuerats med förhoppningen att vara användbar, men UTAN NÅGON GARANTI; " "till och med utan underförstådd garanti för SÄLJBARHET eller LÄMPLIGHET FÖR " "SITT SYFTE. Se GNU General Public License för fler detaljer. Du ska ha fått " "en kopia av GNU General Public License tillsammans med Good ViBrations; om " "intet, skriv till Free Software Foundation, Inc., 59 Temple Place - Suite " "330, Boston, MA 02111-1307, USA." #: stuff/gvb.glade:620 msgid "Initial position" msgstr "Startposition" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "Kompositionsregel:" #: stuff/gvb.glade:728 msgid "product" msgstr "produkt" #: stuff/gvb.glade:742 msgid "sum" msgstr "summa" #: stuff/gvb.glade:757 msgid "maximum" msgstr "maximum" #: stuff/gvb.glade:772 msgid "minimum" msgstr "minimum" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "Lodrät" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "Vågrät" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "Reflektera" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "Vågform" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "Total längd" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "Skift" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "Våglängd" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "Fas" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "Amplitud" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "Centrering" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "Invertera" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "Tips:" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "Välj en sökväg" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "Filen finns" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" "Det finns redan en fil med detta namn,\n" "är du säker på att du vill skriva över den?" #~ msgid "Copyright Pietro Battiston 2008" #~ msgstr "Copyright Pietro Battiston 2008" #~ msgid "Number of points (per dimension):" #~ msgstr "Antal punkter (per dimension):" #~ msgid "Add to actual disposition" #~ msgstr "Addera till aktuell tendens" gvb-1.2.1/po/da.po0000644000175000017500000001426111336006273013226 0ustar pietropietro# Danish translation for gvb # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the gvb package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: gvb\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: 2009-12-30 03:02+0000\n" "Last-Translator: nanker \n" "Language-Team: Danish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-12-31 04:56+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: gvb.py:270 msgid "Stop" msgstr "Stop" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "Start" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "flad" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "sin" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "" #: gvbmod/dispositions.py:160 msgid "square" msgstr "kvadratisk" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "kvadratisk signal" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "" #: stuff/gvb.glade:23 msgid "_File" msgstr "_Fil" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "" #: stuff/gvb.glade:92 msgid "_Options" msgstr "_Indstillinger" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "Antal points" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "" #: stuff/gvb.glade:123 msgid "_Help" msgstr "_Hjælp" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "_Indhold" #: stuff/gvb.glade:195 msgid "Speed" msgstr "Hastighed" #: stuff/gvb.glade:231 msgid "Step" msgstr "Trin" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "" #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "" #: stuff/gvb.glade:355 msgid "Rope" msgstr "" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "Beregning" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "Rammer/sekund" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "Grafik" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "Om Good ViBrations" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "" #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "Besøg GVB's hjemmeside" #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" #: stuff/gvb.glade:620 msgid "Initial position" msgstr "Udgansposition" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "" #: stuff/gvb.glade:728 msgid "product" msgstr "produkt" #: stuff/gvb.glade:742 msgid "sum" msgstr "sum" #: stuff/gvb.glade:757 msgid "maximum" msgstr "maksimum" #: stuff/gvb.glade:772 msgid "minimum" msgstr "minimum" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "Lodret" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "Vandret" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "Bølgeform" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "Total længde" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "Skift" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "Bølgelængde" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "Fase" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "Amplitude" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "Centrering" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "Modsat" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "Totalt antal point:" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "Råd:" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "Vælg en sti" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "Filen findes" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" "Der er allerede en fil med det navn,\n" "er du sikker på, at du vil overskrive den?" #~ msgid "Copyright Pietro Battiston 2008" #~ msgstr "Ophavsret Pietro Battiston 2008" gvb-1.2.1/po/it.po0000644000175000017500000002102511336006273013252 0ustar pietropietro# Italian translations for PACKAGE package # Traduzioni italiane per il pacchetto PACKAGE.. # Copyright (C) 2008 THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # Pietro Battiston , 2008. # msgid "" msgstr "" "Project-Id-Version: Gnome ViBrations 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: 2009-11-15 09:36+0000\n" "Last-Translator: Pietro Battiston \n" "Language-Team: Italian\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-11-25 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: gvb.py:270 msgid "Stop" msgstr "Ferma" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "Parti" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "%d dimensione: precotte" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "%d dimensione: avanzato" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "%d dimensioni: precotte" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "%d dimensioni:avanzato" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "piatta" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "seno" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "mezzo seno" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "pizzicata" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "segnale triangolare" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "segnale sinusoidale" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "pizzicata lateralmente" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "triangolari opposti" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "sinusoidali opposti" #: gvbmod/dispositions.py:160 msgid "square" msgstr "quadra" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "segnale quadro" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "picco discontinuo" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "coseno (traslato)" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "stagno" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "cascata" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "goccia" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "picco" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "sinusoidale" #: stuff/gvb.glade:23 msgid "_File" msgstr "_File" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "_Disposizioni" #: stuff/gvb.glade:92 msgid "_Options" msgstr "_Opzioni" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "Numero di punti" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "Salva i fotogrammi come png" #: stuff/gvb.glade:123 msgid "_Help" msgstr "_Aiuto" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "_Sommario" #: stuff/gvb.glade:195 msgid "Speed" msgstr "Velocità" #: stuff/gvb.glade:231 msgid "Step" msgstr "Passo" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "ms. di calcolo" #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "ms. di disegno" #: stuff/gvb.glade:355 msgid "Rope" msgstr "Corda" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "Superficie" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "Metodo di calcolo" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "Fotogrammi/secondo" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "Grafica" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "Informazioni su Good ViBrations" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "Un simulatore di vibrazioni." #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "Visita il sito web di GVB" #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Good ViBrations è software libero; puoi redistribuirlo e/o modificarlo nei " "termini della GNU General Public License come pubblicato dalla Free Software " "Foundation versione 2 o successive.\n" "\n" "Good ViBrations è distribuito sperando sia utile, ma SENZA ALCUNA GARANZIA " "espressa o implicita, di COMMERCIABILITÀ o di IDONEITÀ AD UNO SCOPO " "PARTICOLARE. Vedere la GNU General Public License per ulteriori dettagli.\n" "\n" "Dovresti aver ricevuto una copia della GNU General Public License con Good " "ViBrations; se così non fosse, scrivi alla Free Software Foundation, Inc., " "59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." #: stuff/gvb.glade:620 msgid "Initial position" msgstr "Disposizione iniziale" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "Aggiungere alla posizione attuale" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "Regola di composizione:" #: stuff/gvb.glade:728 msgid "product" msgstr "prodotto" #: stuff/gvb.glade:742 msgid "sum" msgstr "somma" #: stuff/gvb.glade:757 msgid "maximum" msgstr "massimo" #: stuff/gvb.glade:772 msgid "minimum" msgstr "minimo" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "Verticale" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "Orizzontale" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "Rifletti" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "Forma d'onda" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "Lunghezza totale" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "Spostamento" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "Lunghezza d'onda" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "Fase" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "Ampiezza" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "Centratura" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "Inverti" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "Numero totale di punti:" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" "Quando si lavora in due dimensioni, i punti sono disposti in una griglia " "rettangolare: se il numero scelto non è adatto potranno esserne utilizzati " "meno." #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" "Se si vuole studiare le armoniche, il numero ideale di punti per dimensione " "è un n tale che n+1 abbia molti fattori piccoli (ad esempio, se n+1 contiene " "molte volte il 2 come fattore, sarà possibile disegnare al meglio le " "armoniche seconda, quarta...)" #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "Suggerimento:" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "Scegli un percorso" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "File esistente" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" "Esiste già un file con questo nome,\n" "sei sicuro di volerlo sovrascrivere?" #~ msgid "Copyright Pietro Battiston 2008" #~ msgstr "Copyright Pietro Battiston 2008" #~ msgid "Add to actual disposition" #~ msgstr "Aggiungi alla posizione attuale" #~ msgid "Number of points (per dimension):" #~ msgstr "Numero di punti (per dimensione):" #~ msgid "" #~ "If you want to observe harmonics,\n" #~ "the ideal number is an n such that\n" #~ "n-1 has a lot of small factors (e.g:\n" #~ "if n-1 contains many times 2 as\n" #~ "factor, it will be possible to draw \n" #~ "better the second harmonic, the \n" #~ "fourth and so on)" #~ msgstr "" #~ "Se si vuole studiare le armoniche,\n" #~ "il numero ideale è un n tale che n-1\n" #~ "abbia molti fattori piccoli (ad esempio,\n" #~ "se n-1 contiene molte volte il 2 come\n" #~ "fattore, sarà possibile disegnare al\n" #~ "meglio le armoniche seconda, quarta...)" gvb-1.2.1/po/pl.po0000644000175000017500000001500311336006273013250 0ustar pietropietro# Polish translation for gvb # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the gvb package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: gvb\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: 2010-01-03 23:14+0000\n" "Last-Translator: Jarosław Ogrodnik \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-01-05 04:37+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: gvb.py:270 msgid "Stop" msgstr "Zatrzymaj" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "Rozpocznij" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "sin" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "sygnał sinusoidalny" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "" #: gvbmod/dispositions.py:160 msgid "square" msgstr "" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "szczyt" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "sinusoidalny" #: stuff/gvb.glade:23 msgid "_File" msgstr "_Plik" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "_Rozkład" #: stuff/gvb.glade:92 msgid "_Options" msgstr "_Opcje" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "Liczba punktów" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "Zapisz klatki jako png" #: stuff/gvb.glade:123 msgid "_Help" msgstr "_Pomoc" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "" #: stuff/gvb.glade:195 msgid "Speed" msgstr "Prędkość" #: stuff/gvb.glade:231 msgid "Step" msgstr "Krok" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "obliczenia - ms" #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "rysowanie - ms" #: stuff/gvb.glade:355 msgid "Rope" msgstr "Pęk" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "Membrana" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "Obliczenia" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "Klatek na sekundę" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "Kreślenie" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "Informacje o Good ViBrations" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "Symulator fal" #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "" #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" #: stuff/gvb.glade:620 msgid "Initial position" msgstr "Pozycja początkowa" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "Metoda składania:" #: stuff/gvb.glade:728 msgid "product" msgstr "iloczyn" #: stuff/gvb.glade:742 msgid "sum" msgstr "suma" #: stuff/gvb.glade:757 msgid "maximum" msgstr "maksimum" #: stuff/gvb.glade:772 msgid "minimum" msgstr "minimum" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "Pionowo" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "Poziomo" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "Odbicie" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "Kształt fali" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "Łączna długość" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "Przesunięcie" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "Długość fali" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "Faza" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "Amplituda" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "Wyśrodkowanie" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "Odwrócenie" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "Wskazówka" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "Wybierz ścieżkę" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "Plik istnieje" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" "Plik o takiej nazwie już istnieje.\n" "Czy na pewno chcesz go zastąpić nowym plikiem?" #~ msgid "Copyright Pietro Battiston 2008" #~ msgstr "Copyright Pietro Battiston 2008" #~ msgid "Number of points (per dimension):" #~ msgstr "Liczba punktów (na wymiar):" #~ msgid "Add to actual disposition" #~ msgstr "Dodaj do aktualnego rozkładu" gvb-1.2.1/po/ar.po0000644000175000017500000001336511336006273013250 0ustar pietropietro# Arabic translation for gvb # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the gvb package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: gvb\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: 2009-11-15 09:36+0000\n" "Last-Translator: Pietro Battiston \n" "Language-Team: Arabic \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-11-25 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: gvb.py:270 msgid "Stop" msgstr "" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "" #: gvbmod/dispositions.py:160 msgid "square" msgstr "" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "" #: stuff/gvb.glade:23 msgid "_File" msgstr "_ملف" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "" #: stuff/gvb.glade:92 msgid "_Options" msgstr "_خيارات" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "" #: stuff/gvb.glade:123 msgid "_Help" msgstr "م_ساعدة" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "" #: stuff/gvb.glade:195 msgid "Speed" msgstr "السرعة" #: stuff/gvb.glade:231 msgid "Step" msgstr "خطوة" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "" #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "" #: stuff/gvb.glade:355 msgid "Rope" msgstr "" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "" #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "" #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" #: stuff/gvb.glade:620 msgid "Initial position" msgstr "" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "" #: stuff/gvb.glade:728 msgid "product" msgstr "" #: stuff/gvb.glade:742 msgid "sum" msgstr "" #: stuff/gvb.glade:757 msgid "maximum" msgstr "" #: stuff/gvb.glade:772 msgid "minimum" msgstr "" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" gvb-1.2.1/po/nb.po0000644000175000017500000001610311336006273013236 0ustar pietropietro# Norwegian Bokmal translation for gvb # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the gvb package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: gvb\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: 2010-01-19 19:37+0000\n" "Last-Translator: Tor Syversen \n" "Language-Team: Norwegian Bokmal \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2010-01-20 04:35+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: gvb.py:270 msgid "Stop" msgstr "Stopp" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "Start" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "flat" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "sinus" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "halv sinus" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "trekant signal" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "sinusformet signal" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "motsatt sinusformet" #: gvbmod/dispositions.py:160 msgid "square" msgstr "firkant" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "firkant signal" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "foss" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "sinusformet" #: stuff/gvb.glade:23 msgid "_File" msgstr "_Fil" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "_disposisjon" #: stuff/gvb.glade:92 msgid "_Options" msgstr "_Alternativer" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "Antall poeng" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "Lagre bilder som png" #: stuff/gvb.glade:123 msgid "_Help" msgstr "_Hjelp" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "_Innhold" #: stuff/gvb.glade:195 msgid "Speed" msgstr "Hastighet" #: stuff/gvb.glade:231 msgid "Step" msgstr "Steg" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "kalkulasjon ms." #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "tegner ms." #: stuff/gvb.glade:355 msgid "Rope" msgstr "" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "Membran" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "Beregning" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "Bilder/sekund" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "Grafikk" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "Om Good ViBrations" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "En bølgesimulator" #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "Besøk GVB web side." #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Good ViBrations er fri mykvare; du kan redistribuere det og/eller modifisere " "det under vilkårene i GNU General Public Licence publisert av Free Software " "Foundation; enten versjon 3 av lisensen, eller (etter eget valg) en senere " "versjon.\n" "\n" "Good ViBrations er disribuert i håp om at det er nyttig. men det kommer UTEN " "NOEN GARANTI; uten engang en underforstått garanti om SALGBARHET eller " "DUGELIGHET FOR EN GITT HENSIKT. Se GNU General Public License for flere " "detaljer.\n" "\n" "Du burde ha fått en kopi av GNU General Public License sammen med Good " "ViBrations; hvis ikke, skriv til Free Software Foundation, Inc., 39 Temple " "place - Suite 330, Boston, MA 02111-1307, USA." #: stuff/gvb.glade:620 msgid "Initial position" msgstr "Utgangsposisjon" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "" #: stuff/gvb.glade:728 msgid "product" msgstr "produkt" #: stuff/gvb.glade:742 msgid "sum" msgstr "sum" #: stuff/gvb.glade:757 msgid "maximum" msgstr "maksimum" #: stuff/gvb.glade:772 msgid "minimum" msgstr "minimum" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "Loddrett" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "Vannrett" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "Reflekter" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "Bølgeform" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "Total lengde" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "Bølgelengde" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "Fase" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "Amplitude" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "Sentrering" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "Inverter" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "Totalt antall piksler:" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "Hint:" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "Velg en bane" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "Filen eksisterer" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" "Det finnes allerede en fil med dette navnet\n" "er du sikker på at du vil erstatte den?" #~ msgid "Copyright Pietro Battiston 2008" #~ msgstr "Copyright Pietro Battiston 2008" gvb-1.2.1/po/nl.po0000644000175000017500000001567511336006273013265 0ustar pietropietro# Dutch translation for gvb # Copyright (c) 2009 Rosetta Contributors and Canonical Ltd 2009 # This file is distributed under the same license as the gvb package. # FIRST AUTHOR , 2009. # msgid "" msgstr "" "Project-Id-Version: gvb\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: 2009-11-15 09:36+0000\n" "Last-Translator: Wander Nauta \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-11-25 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: gvb.py:270 msgid "Stop" msgstr "Stoppen" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "Start" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "" #: gvbmod/dispositions.py:160 msgid "square" msgstr "" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "sinusoidaal" #: stuff/gvb.glade:23 msgid "_File" msgstr "_Bestand" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "" #: stuff/gvb.glade:92 msgid "_Options" msgstr "_Opties" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "Aantal punten" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "Frames opslaan als PNG" #: stuff/gvb.glade:123 msgid "_Help" msgstr "_Help" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "" #: stuff/gvb.glade:195 msgid "Speed" msgstr "Snelheid" #: stuff/gvb.glade:231 msgid "Step" msgstr "Stap" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "berekening ms." #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "tekenen ms." #: stuff/gvb.glade:355 msgid "Rope" msgstr "Touw" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "Membraan" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "Berekening" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "Frames/seconde" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "Beeld" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "Over Good ViBrations" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "Een golfsimulator." #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "" #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." #: stuff/gvb.glade:620 msgid "Initial position" msgstr "Beginpositie" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "Compositieregel:" #: stuff/gvb.glade:728 msgid "product" msgstr "product" #: stuff/gvb.glade:742 msgid "sum" msgstr "som" #: stuff/gvb.glade:757 msgid "maximum" msgstr "maximum" #: stuff/gvb.glade:772 msgid "minimum" msgstr "minimum" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "Verticaal" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "Horizontaal" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "Reflecteren" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "Golfvorm" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "Totaallengte" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "Shift" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "Golflengte" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "Fase" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "Amplitude" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "Centreren" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "Omkeren" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "Hint:" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "Kies een pad" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "Bestand bestaat al" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" #~ msgid "Copyright Pietro Battiston 2008" #~ msgstr "Copyright Pietro Battiston 2008" #~ msgid "Number of points (per dimension):" #~ msgstr "Aantal punten (per dimensie):" gvb-1.2.1/po/good-vibrations.pot0000644000175000017500000001311511336006273016131 0ustar pietropietro# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: gvb.py:270 msgid "Stop" msgstr "" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "" #: gvbmod/dispositions.py:160 msgid "square" msgstr "" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "" #: stuff/gvb.glade:23 msgid "_File" msgstr "" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "" #: stuff/gvb.glade:92 msgid "_Options" msgstr "" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "" #: stuff/gvb.glade:123 msgid "_Help" msgstr "" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "" #: stuff/gvb.glade:195 msgid "Speed" msgstr "" #: stuff/gvb.glade:231 msgid "Step" msgstr "" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "" #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "" #: stuff/gvb.glade:355 msgid "Rope" msgstr "" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "" #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "" #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" #: stuff/gvb.glade:620 msgid "Initial position" msgstr "" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "" #: stuff/gvb.glade:728 msgid "product" msgstr "" #: stuff/gvb.glade:742 msgid "sum" msgstr "" #: stuff/gvb.glade:757 msgid "maximum" msgstr "" #: stuff/gvb.glade:772 msgid "minimum" msgstr "" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" gvb-1.2.1/po/es.po0000644000175000017500000002107711336006273013254 0ustar pietropietro# Spanish translation for gvb # Copyright (c) 2008 Rosetta Contributors and Canonical Ltd 2008 # This file is distributed under the same license as the gvb package. # FIRST AUTHOR , 2008. # msgid "" msgstr "" "Project-Id-Version: gvb\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2009-11-14 16:36+0100\n" "PO-Revision-Date: 2009-11-15 14:00+0000\n" "Last-Translator: J Álvaro Fernández \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Launchpad-Export-Date: 2009-11-25 04:46+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: gvb.py:270 msgid "Stop" msgstr "Detener" #: gvb.py:277 stuff/gvb.glade:393 msgid "Start" msgstr "Comenzar" #: gvb.py:309 #, python-format msgid "%d dimension: precooked" msgstr "%d dimensión: precocinada" #: gvb.py:310 #, python-format msgid "%d dimension: advanced" msgstr "%d dimensión: avanzada" #: gvb.py:312 #, python-format msgid "%d dimensions: precooked" msgstr "%d dimensiones: precocinada" #: gvb.py:313 #, python-format msgid "%d dimensions: advanced" msgstr "%d dimensiones: avanzada" #: gvbmod/dispositions.py:160 msgid "flat" msgstr "plano" #: gvbmod/dispositions.py:160 msgid "sin" msgstr "seno" #: gvbmod/dispositions.py:160 msgid "half sin" msgstr "medio seno" #: gvbmod/dispositions.py:160 msgid "picked" msgstr "pico" #: gvbmod/dispositions.py:160 msgid "triangular signal" msgstr "señal triangular" #: gvbmod/dispositions.py:160 msgid "sinusoidal signal" msgstr "señal sinusoidal" #: gvbmod/dispositions.py:160 msgid "picked lateral" msgstr "pico lateral" #: gvbmod/dispositions.py:160 msgid "opposite triangulars" msgstr "triangulares opuestas" #: gvbmod/dispositions.py:160 msgid "opposite sinusoidals" msgstr "sinusoidales opuestas" #: gvbmod/dispositions.py:160 msgid "square" msgstr "cuadrada" #: gvbmod/dispositions.py:160 msgid "square signal" msgstr "señal cuadrada" #: gvbmod/dispositions.py:160 msgid "discontinuous peak" msgstr "pico discontinuo" #: gvbmod/dispositions.py:160 msgid "cos (shifted)" msgstr "coseno (alzado)" #: gvbmod/dispositions.py:160 msgid "pond" msgstr "estanque" #: gvbmod/dispositions.py:160 msgid "waterfall" msgstr "cascada" #: gvbmod/dispositions.py:160 msgid "gut" msgstr "tubo" #: gvbmod/dispositions.py:160 msgid "peak" msgstr "pico" #: gvbmod/dispositions.py:160 msgid "sinusoidal" msgstr "sinusoidal" #: stuff/gvb.glade:23 msgid "_File" msgstr "_Archivo" #: stuff/gvb.glade:80 msgid "_Disposition" msgstr "_Disposición" #: stuff/gvb.glade:92 msgid "_Options" msgstr "_Opciones" #: stuff/gvb.glade:102 stuff/gvb.glade:1249 msgid "Number of points" msgstr "Número de puntos" #: stuff/gvb.glade:111 msgid "Save frames as png" msgstr "Guardar cuadro como png" #: stuff/gvb.glade:123 msgid "_Help" msgstr "A_yuda" #: stuff/gvb.glade:130 msgid "_Contents" msgstr "_Contenidos" #: stuff/gvb.glade:195 msgid "Speed" msgstr "Velocidad" #: stuff/gvb.glade:231 msgid "Step" msgstr "Avance" #: stuff/gvb.glade:294 msgid "calculation ms." msgstr "cálculo (ms)" #: stuff/gvb.glade:329 msgid "drawing ms." msgstr "dibujo (ms)" #: stuff/gvb.glade:355 msgid "Rope" msgstr "Cuerda" #: stuff/gvb.glade:371 msgid "Membrane" msgstr "Membrana" #: stuff/gvb.glade:415 msgid "Calculation" msgstr "Cálculo" #: stuff/gvb.glade:454 msgid "Frames/second" msgstr "Cuadros por segundo (fps)" #: stuff/gvb.glade:491 stuff/gvb.glade:644 msgid "Graphics" msgstr "Gráficos" #: stuff/gvb.glade:565 msgid "About Good ViBrations" msgstr "Acerca de Good ViBrations" #: stuff/gvb.glade:572 msgid "A waves simulator." msgstr "Un simulador de ondas." #: stuff/gvb.glade:574 msgid "Visit GVB website." msgstr "Visitar GVB en la web" #: stuff/gvb.glade:575 msgid "" "Good ViBrations 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.\n" "\n" "Good ViBrations 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.\n" "\n" "You should have received a copy of the GNU General Public License along with " "Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 " "Temple Place - Suite 330, Boston, MA 02111-1307, USA." msgstr "" "Good ViBrations es software libre; puede distribuirlo y/o modificarlo bajo " "los términos de la licencia GPL GNU publicada por la Fundación de Software " "Libre; ya sea la versión 3 de la licencia, o (a su criterio) cualquier " "versión posterior.\n" "\n" "Good ViBrations se distribuye con la idea de que sea útil, pero SIN GARANTÍA " "ALGUNA; incluso sin la garantía implícita de MERCANTIBILIDAD ni de " "ADECUACIÓN A PROPÓSITO CONCRETO. Lea la licencia GPL GNU para conocer más " "detalles.\n" "\n" "Debería haber recibido una copia de la licencia GPL GNU junto a este " "programa. En caso contrario, contacte con la Fundación en la siguiente " "dirección: Free Software Foundation, Inc., 59 Temple Place - Suite 330, " "Boston, MA 02111-1307, USA." #: stuff/gvb.glade:620 msgid "Initial position" msgstr "Posición inicial" #: stuff/gvb.glade:690 msgid "Add to current disposition" msgstr "Añadir a disposición actual" #: stuff/gvb.glade:720 msgid "Composition rule:" msgstr "Regla de composición:" #: stuff/gvb.glade:728 msgid "product" msgstr "producto" #: stuff/gvb.glade:742 msgid "sum" msgstr "suma" #: stuff/gvb.glade:757 msgid "maximum" msgstr "máximo" #: stuff/gvb.glade:772 msgid "minimum" msgstr "mínimo" #: stuff/gvb.glade:796 msgid "Vertical" msgstr "Vertical" #: stuff/gvb.glade:807 msgid "Horizontal" msgstr "Horizontal" #: stuff/gvb.glade:1048 stuff/gvb.glade:1064 msgid "Reflect" msgstr "Voltear" #: stuff/gvb.glade:1082 msgid "Waveform" msgstr "Forma de onda" #: stuff/gvb.glade:1093 msgid "Total lenght" msgstr "Longitud total" #: stuff/gvb.glade:1104 msgid "Shift" msgstr "Desplazar" #: stuff/gvb.glade:1115 msgid "Wavelenght" msgstr "Longitud de onda" #: stuff/gvb.glade:1126 msgid "Phase" msgstr "Fase" #: stuff/gvb.glade:1137 msgid "Amplitude" msgstr "Amplitud" #: stuff/gvb.glade:1148 msgid "Centering" msgstr "Centrado" #: stuff/gvb.glade:1157 msgid "Invert" msgstr "Invertir" #: stuff/gvb.glade:1271 msgid "Total number of points:" msgstr "Número total de puntos:" #: stuff/gvb.glade:1298 msgid "" "When working in two dimensions, points are arranged in a rectangular grid: " "if the chosen number doesn't fit, some points may be dropped." msgstr "" "Al trabajar en dos dimensiones, los puntos se organizan en una rejilla " "rectangular: si el número elegido no se ajusta completamente, se perderán " "los puntos sobrantes." #: stuff/gvb.glade:1314 msgid "" "If you want to observe harmonics, the perfect number of points per dimension " "is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many " "times 2 as factor, it will be possible to draw better the second harmonic, " "the fourth and so on)." msgstr "" "Si desea observar armónicos, el número ideal de puntos por dimensión es un " "entero n tal que n+1 posea muchos factores pequeños (p. e.: si n+1 contiene " "el factor 2 muchas veces, será posible dibujar mejor el armónico segundo, el " "cuarto, etc.)." #: stuff/gvb.glade:1322 msgid "Hint:" msgstr "Consejo:" #: stuff/gvb.glade:1387 msgid "Choose a path" msgstr "Elija una ruta" #: stuff/gvb.glade:1454 msgid "File exists" msgstr "El archivo ya existe" #: stuff/gvb.glade:1468 msgid "" "There is already a file with this name,\n" "are you sure you want to overwrite it?" msgstr "" "Ya existe un archivo con este nombre,\n" "¿seguro que desea sobreescribirlo?" #~ msgid "Copyright Pietro Battiston 2008" #~ msgstr "Copyright Pietro Battiston 2008" #~ msgid "Add to actual disposition" #~ msgstr "Añadir a disposición actual" #~ msgid "Number of points (per dimension):" #~ msgstr "Número de puntos (por dimensión):" #~ msgid "" #~ "If you want to observe harmonics,\n" #~ "the ideal number is an n such that\n" #~ "n-1 has a lot of small factors (e.g:\n" #~ "if n-1 contains many times 2 as\n" #~ "factor, it will be possible to draw \n" #~ "better the second harmonic, the \n" #~ "fourth and so on)" #~ msgstr "" #~ "Si desea observar los armónicos,\n" #~ "el número ideal es un n tal que\n" #~ "n-1 posea muchos factores pequeños\n" #~ "(p. e.: si n-1 contiene como factor muchos\n" #~ "doses, será posible dibujar mejor los\n" #~ "armónicos segundo, cuarto, etc.)" gvb-1.2.1/COPYING0000644000175000017500000010451311336006273012717 0ustar pietropietro 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 . gvb-1.2.1/gvb0000755000175000017500000003632211336006273012372 0ustar pietropietro#!/usr/bin/python # GVB - a GTK+/GNOME vibrations simulator # # Copyright (C) 2008 Pietro Battiston # # 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, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import gtk, gobject, gnome from glib import GError import os from scipy import array, sin, pi, zeros, shape from time import time from gvbmod import dispositions, calculators, points, drawers from gvbmod.advancededitor import AdvancedEditor from gvbmod.gvbi18n import _ import locale import gettext ########################## CONFIGURATION ####################################### APP = 'gvb' import sys not_installed_dir = os.path.dirname(os.path.realpath(__file__)) if os.path.exists(not_installed_dir + '/stuff/gvb.svg'): STUFF_DIR = not_installed_dir + '/stuff' HELP_DIR = not_installed_dir + '/help' LOCALE_DIR = not_installed_dir + '/locale' INSTALLED = False else: for directory in [sys.prefix, sys.prefix + '/local']: installed_root_dir = directory + '/share' if os.path.exists(installed_root_dir + '/%s/stuff' % APP): STUFF_DIR = installed_root_dir + '/%s/stuff' % APP LOCALE_DIR = installed_root_dir + '/locale' break INSTALLED = True ########################## END OF CONFIGURATION ################################ gettext.install(APP, localedir=LOCALE_DIR, unicode=True) locale.bindtextdomain(APP, LOCALE_DIR) DIMS = [1,2] #(Still) no fluid dinamics... WAIT_FRAMES = True #If computer is too slow and we loose frames, shall we fake them (False) or wait for them at the cost of (willingly) altering speed (True)? #Notice that probably speed gets altered anyway. I imagine that if gobject.timeout_add calls can't get run, they just get queued, not lost. class MainGbv(): def __init__(self): self.STEPS = 127 #Number of points (per dimension). Suggestion: should be of the form 3^a*4^b*5^c...-1 or simply, 2^n-1. self.filename = None self.dumping = False self.inhibit_dumping = False self.occupied = False self.file_chooser_state = None xml=gtk.Builder() xml.set_translation_domain('gvb') xml.add_from_file(STUFF_DIR + '/gvb.glade') self.xml=xml self.main=xml.get_object('main') self.drawing=xml.get_object('drawing') self.start_button=xml.get_object('start button') self.frame_number=xml.get_object('frame number') self.frame_ms=xml.get_object('frame ms') self.draw_ms_label=xml.get_object('draw ms') self.calculator_entry=xml.get_object('calculator entry') self.ready=True #This is used to block "draw" and "initialize" dummy calls self.inhibit_reconfigure=False self.inhibit_change_dim=False self.cr=None #DrawingArea's Drawable is not created until it's not show()n self.editor = None self.file_chooser = None #Startup situation self.shape = (self.STEPS,) self.dim = len(self.shape) self.disposition='sin' self.startpos = None self.points = None self.MPF = int(1000/self.xml.get_object('mpf').get_value()) #Milliseconds per (drawn) frame (25 ==> 40 frames per second) are then taken from GUI self.actual_drawers = [None for dim in DIMS] #One per dimension #Two counters representing drawn frames' ("real") time and calc ("anticipately calculated") time: both in ms. self.drawn_time=0 self.calc_time=0 self.set_text_counter=0 self.speed=self.xml.get_object('speed').get_value() self.runner=None self.dispositions_menu() self.calculators_menu() handlers={ 'change granularity': self.change_granularity, 'change speed': self.change_speed, 'change steps': self.change_steps, 'change calculator': self.change_calculator, 'change dim': self.change_dim, 'change mpf': self.change_mpf, 'quit': self.quit, 'start': self.start, 'show about': self.show_about, 'show help': self.show_help, 'save': self.save, 'save as': self.save, 'load': self.load, 'png dump': self.png_dump, 'file chooser catcher': self.file_chooser_catcher, 'steps_catcher': self.steps_catcher, 'file activated': self.file_activated} xml.connect_signals(handlers) self.initialize() def initialize(self, *args): # print args self.stop() if not self.ready: return if self.points: self.actual_drawers[len(self.points.shape)-1] = self.points.drawer.dr_type # print self.actual_drawers, self.shape self.points=points.Points( shape = self.shape, gr = self.xml.get_object('granularity').get_value(), disp = self.disposition, calc = self.xml.get_object('combo calculator').get_active_text(), drawer = drawers.Drawer(self.drawing, self.xml.get_object('combo drawer'), dr_type = self.actual_drawers[len(self.shape)-1]), pos = self.startpos) self.xml.get_object('granularity').set_sensitive(self.points.calculator.discrete) self.drawn_time=0 self.frame_number.set_text('1') self.frame_ms.set_text('') self.draw_ms_label.set_text('') def change_speed(self, spin, *args): self.speed=float(spin.get_value()) # print self.speed def change_granularity(self, spin, *args): # print "changed" self.points.reconfigure(gr=spin.get_value()) def change_dim(self, widget=None, data=None, dim=None): # print widget, data, dim if self.inhibit_change_dim: # print "inhibited" return self.inhibit_change_dim = True # print "Widget", widget if widget: for dim in [1,2]: if self.xml.get_object('dim '+str(dim)).get_active(): self.dim = dim # print "dim", dim break else: self.dim = dim self.xml.get_object('dim '+str(dim)).set_active(True) self.shape = self.recalculate_shape() self.startpos = None self.inhibit_reconfigure = True #"change_calculator" would call a useless "reconfigure" self.calculators_menu() self.inhibit_reconfigure = False self.initialize() self.inhibit_change_dim = False def recalculate_shape(self, steps=None, dim=None): if not steps: steps = self.STEPS if not dim: dim = self.dim shape = [int(steps**(1/float(dim)))]*dim # Not ready for 3 dimensions. # Also: this cycle will run at most 2 times, so I don't bother about # overhead of testing dim also the second: while dim > 1 and shape[0] * (shape[1] + 1) <= self.STEPS: shape[1] += 1 return tuple(shape) def change_mpf(self, spin, *args): self.MPF = int(1000/spin.get_value()) # print "changed" if self.runner: gobject.source_remove(self.runner) self.runner=gobject.timeout_add(self.MPF, self.update) def change_disposition(self, menu_item=None, pos=None): if menu_item: new_dim = int(menu_item.name.partition(' ')[0]) # print new_dim self.disposition = menu_item.name.partition(' ')[2] self.startpos = None else: self.startpos = pos new_dim=len(self.startpos.shape) if new_dim is not self.dim: self.change_dim(dim=new_dim) elif menu_item: self.points.reconfigure(disp=self.disposition) else: self.points.reconfigure(pos=pos) self.stop() # print "draw!" self.drawn_time=0 def change_calculator(self, combobox=None, arg2=None): if self.points and not self.inhibit_reconfigure: self.points.reconfigure(calc=combobox.get_active_text()) self.xml.get_object('granularity').set_sensitive(self.points.calculator.discrete) self.drawn_time = 0 def start(self, *args): if self.runner: self.stop() else: self.runner=gobject.timeout_add(self.MPF, self.update) self.labeler=gobject.timeout_add_seconds(2, self.set_labels) self.start_button.set_label(_('Stop')) def stop(self, *args): if self.runner: gobject.source_remove(self.runner) gobject.source_remove(self.labeler) self.runner = 0 self.start_button.set_label(_('Start')) def update(self, *args): if self.occupied and (self.points.drawer.dumpdir or SKIP_FRAMES): #If we are dumping, we can wait, user won't notice it. return True self.occupied = True elapsed_ms, draw_ms = self.points.update(self.drawn_time) if elapsed_ms: self.elapsed_ms=elapsed_ms if draw_ms: self.draw_ms = draw_ms self.drawn_time=self.drawn_time+self.MPF*(float(self.speed)*min(self.shape)/100) self.occupied = False return True def set_labels(self, *args): self.frame_number.set_text(str(self.points.number)) self.frame_ms.set_text(str(round(self.elapsed_ms, 3))) self.draw_ms_label.set_text(str(round(self.draw_ms, 3))) return True def dispositions_menu(self): main_menu = self.xml.get_object('dispositions menu') for dim in DIMS: if dim == 1: submenu_title = _('%d dimension: precooked') advanced_title = _('%d dimension: advanced') else: submenu_title = _('%d dimensions: precooked') advanced_title = _('%d dimensions: advanced') submenu_header=gtk.MenuItem(submenu_title % dim) submenu=gtk.Menu() for disposition in dispositions.dispositions[dim]: disposition_item = gtk.MenuItem(_(disposition)) disposition_item.set_name(str(dim)+' '+disposition) disposition_item.connect('activate', self.change_disposition) submenu.append(disposition_item) submenu_header.set_submenu(submenu) submenu_header.show() submenu.show_all() main_menu.append(submenu_header) advanced_item = gtk.MenuItem(advanced_title % dim) advanced_item.connect('activate', self.editor_start, dim) advanced_item.show() main_menu.append(advanced_item) def calculators_menu(self): self.build_menu('calculator', calculators.calculators) # def drawers_menu(self): # self.ready = True # self.build_menu('drawer', drawers.drawers) def build_menu(self, name, items): combo = self.xml.get_object('combo '+name) combo_model=gtk.ListStore(str) for item in items[self.dim]: combo_model.append([item]) combo.set_model(combo_model) combo.set_active(0) def editor_start(self, *args): self.stop() new_shape = self.recalculate_shape(self.STEPS, args[1]) if len(new_shape) != len(self.shape): self.change_dim(dim=len(new_shape)) # print "passing shape:", self.points.pos.shape if self.editor: self.editor.go(self.points, new_shape) else: self.editor=AdvancedEditor(self, self.xml, self.points, new_shape) def editor_save(self, points): self.change_disposition(pos=points.pos) # self.editor_esc() def editor_esc(self): # print "self.editor", self.editor self.editor.window.hide() del self.editor def show_about(self, *args): self.about_window=self.xml.get_object('about') self.about_window.show() self.about_window.connect('response', self.about_catcher) def show_help(self, *args): if INSTALLED: gnome.help_display_uri('ghelp:gvb') else: import locale loc = locale.getdefaultlocale()[0] if os.path.exists('%s/%s/gvb.xml' % (HELP_DIR, loc)): gnome.help_display_uri('ghelp:%s/%s/gvb.xml' % (HELP_DIR, loc)) elif os.path.exists('%s/%s/gvb.xml' % (HELP_DIR, loc.split('_')[0])): gnome.help_display_uri('ghelp:%s/%s/gvb.xml' % (HELP_DIR, loc.split('_')[0])) else: gnome.help_display_uri('ghelp:%s/C/gvb.xml' % HELP_DIR) def change_steps(self, *args): self.steps_window = self.xml.get_object('steps') self.xml.get_object('steps spin').set_adjustment(gtk.Adjustment(self.STEPS, 1, 10000, 1, 10)) self.steps_window.run() def steps_catcher(self, dialog, response): self.steps_window.hide() if response == 1: new_steps = int(self.xml.get_object('steps spin').get_value()) if new_steps != self.STEPS: self.STEPS = new_steps self.shape = self.recalculate_shape() # print "steps changed:", self.shape self.initialize() def about_catcher(self, *args): self.about_window.hide() def quit(self, *args): gtk.main_quit() def save(self, *args): if self.filename: if self.running: self.stop() self.points.dump(self.filename) self.start() else: self.points.dump(self.filename) else: self.save_as(*args) def save_as(self, *args): self.stop() self.file_chooser_state='saving' self.file_chooser = self.xml.get_object('file chooser') self.xml.get_object('file chooser button').set_label('gtk-save') self.file_chooser.run() def load(self, *args): self.stop() self.file_chooser_state='loading' self.file_chooser = self.xml.get_object('file chooser') self.xml.get_object('file chooser button').set_label('gtk-open') self.file_chooser.run() def file_chooser_catcher(self, dialog, response=None): # print self.file_chooser.get_filename() # print response # filename = args[0].get_filename() if int(response) in [-1,-4]: #never mind... if self.file_chooser_state=='dumping': #Toggle has been set, but user changed his mind self.inhibit_dumping = True #So let's say to "png_dump" it's not the user self.xml.get_object('png dump').set_active(False) #And unset it self.file_chooser_state = None self.file_chooser.hide() if self.file_chooser is not dialog: dialog.hide() return filename = self.file_chooser.get_filename() if not filename: return if self.file_chooser_state == 'saving': if response == 2 and os.path.exists(filename): self.xml.get_object('file exists').run() return self.filename = filename self.points.dump(self.filename) self.file_chooser.hide() if self.file_chooser is not dialog: dialog.hide() elif self.file_chooser_state == 'loading': if response == 5: self.xml.get_object('file not exists').hide() return self.filename = dialog.get_filename() if not os.path.exists(self.filename): self.xml.get_object('file not exists').run() return self.points=points.Points(drawer = drawers.Drawer(self.drawing, self.xml.get_object('combo drawer')), gr = self.xml.get_object('granularity').get_value(), from_file = self.filename) self.shape = self.points.pos.shape self.STEPS = self.shape[0] new_dim = len(self.shape) if new_dim is not self.dim: self.change_dim(dim=new_dim) self.startpos = self.points.pos self.initialize() dialog.hide() elif self.file_chooser_state == 'dumping': if os.path.exists(filename): if not os.path.isdir(filename): if response == 2: #Let's ask the user if he is sure self.xml.get_object('file exists').run() return else: #OK, he's sure os.remove(filename) os.mkdir(filename) else: os.mkdir(filename) self.dumping = True self.points.drawer.dump(filename) self.file_chooser.hide() if self.file_chooser is not dialog: dialog.hide() self.file_chooser_state = None def file_activated(self, dialog): self.file_chooser_catcher(dialog, 2) def png_dump(self, *args): if self.inhibit_dumping: self.inhibit_dumping = False return if self.dumping: self.points.drawer.dump(None) self.dumping = False return self.stop() self.file_chooser_state = 'dumping' self.file_chooser = self.xml.get_object('file chooser') self.xml.get_object('file chooser button').set_label('gtk-save') self.file_chooser.run() def main(): global app app=MainGbv() if __name__=='__main__': main() gtk.main() gvb-1.2.1/reparse.py0000755000175000017500000000142411336006273013677 0ustar pietropietro#! /usr/bin/python from xml.dom.minidom import parse, Element import sys # Small script to workaround http://bugzilla.gnome.org/show_bug.cgi?id=578484 # Must be ran everytime glade modifies the xml file. doc = parse(sys.argv[1]) root = doc.childNodes[0] for ch in root.childNodes: if ch.__class__ is Element: if ch.hasAttribute('class'): if ch.getAttribute('class') == 'GtkAdjustment': for prop in ch.childNodes: if prop.__class__ is Element: if prop.getAttribute('name') == 'value': ch.removeChild(prop) ch.appendChild(prop) break fout = open(sys.argv[1], 'w') fout.write(doc.toxml().encode('UTF-8')) fout.close() gvb-1.2.1/INSTALL0000644000175000017500000000016111336006273012707 0ustar pietropietroGBV doesn't necessarily need to be installed, but has some dependecies: - pycairo - pygtk - scipy - python-gnome gvb-1.2.1/help/0000755000175000017500000000000011336006273012610 5ustar pietropietrogvb-1.2.1/help/C/0000755000175000017500000000000011336006273012772 5ustar pietropietrogvb-1.2.1/help/C/figures/0000755000175000017500000000000011336006273014436 5ustar pietropietrogvb-1.2.1/help/C/figures/main_window.png0000644000175000017500000006240411336006273017465 0ustar pietropietroPNG  IHDRv'6sBITOtEXtSoftwaregnome-screenshot> IDATxw\SO’ aWAmmݵn-VVQZwկնTjqU S 4A@x/^s={p.^8 K!,S-'[žp'C"*B!u.d=}҄1f'H)etwer x\[K:҂1?ogs'[fTK-"✂iN6TuBVKgcc640>nZ*' @$+Jqgߡ\+ 9CXԑ ]xFIL~,]m-7E꠷;èr u*mỹ?ÐI\##GM^#3򣤌%%짃7o oύ-*`{9|dӜON|Nq%<#޵0I;_QO#z#qb #wl*N]{V$zKcXNf%\IxN31ؚ[-tH^n-3e0yEkvWքJn4l{c?`cU\a D p]zX[QO iW~~Q~ v [w*~[P-( #mGaxm?31Q Q(ux#wS5kp{ֵS~=p>aɻc{0̍' MxkJ=v:j:38P3Xa Tۄk\q kr Kݳu'1Lן%+wRI2FF_p$Rk7}a1~>rhZg^}l;> ۬HuI_lP0G.=j⑞QN.v߱ˠ37R.:~y&onJ2Q~-7Sm-ZHY'4X,r&F|L!/V(RrWꝦj|Y"BS 6ZXi ւR]RFe3vr6oRx ]a}u Q]o;+SksD74V7T>ݓW$15+*`ki*Hr +v48Yy59ݔ.]pq5x;Y" 冭֬tb>_0E\iwt664`g2'T׬|w#\Ww(8;~θ>o{ 4-XXk e_ nWP<.ˑe[PR{ZXi nī]9ggmAjZw<~4E^9ȻI#oF6ݔ] sOw7>@0PdkijefXd@v~EWʴXWUp(A֮}}د4}tV/_8ҒX,VI[67Y#:QٻJ{-K4hoowƃמڛv׷>RqtUt~s^umUnѦ7o+cP e[Ps]-7k¬Y*Ngg|Gj08{#1H`ߗՙ3(ΓwǼ DS;[Bi;ф~ݴ:Ù6_fOɽ-(L#p8 Ō<%maeԘo0WKeW\"55;ژ]ЮjujZV=I ˮ'g%ˡAz\{ D9K5e[__r[PǺcic\kOuux;y2vm}549/7+[QnQȾvws}"S,;{]ٚ¢4X88Ӕ2/؋+5-((*~)&&.NDMe#>bl-W131pPa/KH 2E?*z[{A`WREW9kkKTqhۦڦlqʪ5Y5oDFYV5Z5շff> pR>#Hj3s Q9mݶDcIBHM) v}.;ZYUZ?/(%Jr{.T%4-V!T!߀w~-;T*<QZ`%ER^6e}TR$V- -(aBH+-B ~P!B֌3!=HMI޺WB(aBkQ!UY!P j蒲wp|Qy=B^GB7?ðwp85mwԗ8 !gNo_dHW֯V8[=MjkkhM_WnEFzWˮ\ (0022E8+ B5t!H0$\@/23nZknsudzgφA>}o݌uO>0ٳgBJy9\bwZrM4iܹY55rZspt_ڻk׭6mqiS}M{Wq{4K M;BHZ`4+TY|~ÆN{綱e+hP˭=…h~6o':xʥ/_9w̵ثYY׬aWZqR̥)Wa2demZSkb.9rA}~>wnU…C :Tu]5Y^J?rwSS7n̎%%J5%G'gշiNE@ +++g;㫔M)IR/oIK|:cF߾}T׽|钧O {q7ۿo''O?7*hDm5pHԤiU.I $<$|0wse2%eoo_G+XRjD{ppچڴiˎ Ü9svǿ{]vvvle<))ֶFԶ4^p.1}d߾}]tQSUWJ?!'ǍpyI2SqS"ݻ/ٵs-6mÇe20%K :-8hŋBP(\g-0**j?3⽫8+>oIF{GS3a}i>>{}}F;7vmf֬ن'OpuuUӻOO&LYbŦSwнGH_̛/X tԹcΎ ϯizX\Sko{Ϟ?O[vm}x+Ί[QB.z+o:B{G ###mPim΍]Jjw٭z:xBJ!}B?($+F{G9BV BH3 B!Zy #Y9BiZJ9{mBQ}.Sp~^ #H%R P:| UZVK!QHtI汫ϞQ.սqvxoARgOϝ9emk:% B~K$}зc@k7*'I\^董P ?FHȳu u0jud2mdg Q -\~am77ܫ7o5z;r\m=#E0ʟqq}}I}oũ.*"% BH:aB\\\hhhDĢ숈EqqqʔQv5"aJ/zGFFX>0m4SS#GkZ! WAA5k;nffֱcɓ&vUqՠvm07査+Ծe +"ڴY0 `߷} `܇F|[% B 'zzxK6T\gR Ჴ`Ǜ~ ]|ɾNOO l/mM噙vkro*') bW,+: |{{ C6T6))-AiҤɪ+}ϟ?,>?pcNNNj-h*W- $I70 *L|PzpD!:xPVV\.OMM]WʥlavE~<~s%&d{O4aC#.\wP͝n-L L X\kVSAN #.cm1!6W0Ru ՒQ 7o:vrrnܧoަ\عsmmlK쳙AAC uquH}vJU,fg$*(gh嚙tћH%‚gO|6u8uE˛BI, 3_ܽoecmee-y5"(aBX"yجy ;{]Rd2Mx<3ΝޥABQXX`na@Ꜳ2 emk[Xv9@[tBMO~n3 T y\n٣G BO^^1/\XPPȨ,*!aʥ[y$&>|C֣3 BiXnC":hуGgJ^رciifff;v3/]Kc.FߺzڌR/ e[X*G ^M=("] 7~7kgϞ ~_̛geeUfw3%wv좕+Wٱ/ d܅r,r<O^9BT#wW\o0!,--###"##y~d,[3===0Cnnn5sx<\n``6-ZٺL.kݶ]uJDx !54idʕ^>Vppp81''? 99Y lU̼ @aAY:EEc(ߞ:~QJu "QG0!t࡬,\E?VxٳTGbX,?~Ec^*ط[PQԭAQ7o:vrrnܧo.tƌwI}̠!CM2%_Νmgmc@1֍]65kwoeef*r{'h >u9B6v9!?1::7T+,(z9&[#cc]R:~Ob"Ml2ӒdȤRΞ:|dA~>Ԕ[5 BiLLLߊp.oصGO.)BiXT026nܼk <]vEJjSwMLvdT!zV|OĞ`*Ԟu% Bp&&)3EkY/-,&ݣ.)B~2yzB1[;ڠ]™3kx`k ggD4dgMdeۣsg@@^R A٢ї?޽y~~<k֠cG%e\k1z416!\ѫ0OuDDkJ>]""ׯ ~zkeъT*lڬϦ~` ƌxBPԮUtQnl5[;bٳ=<<>6 8pObɒ7?9%xÆ[^ D|uBƒsgތ=f)$$$񉈈fJ,U+VHϸ~-ZՔԔ+W);'CCCgϞSΟpO?l؈#O:ygO 4hUϘ`Ŀ~㺖;B'lԍ6d :-0 vFx8о=-CտkU0r$8 !>)8?/"mi]HԶ߃ PPZj"o˽]nj+l{!///O<4x; =fz־666lW7շUZi;3~9;;WrI HMI޺eK};øv :ahHعWHл7^ΝJ1z4:uµk5!B wwwk \\ݲsrYR6&++Kww -drWg[Gr_vl?{\=9~{DEIEE5 AAEX0jT`($$ ,  ¬Y(*-CRRZ'&L0߻wYϞ2 Z"}S^2Y5뤤$;VYkԴz0bb ။q#kiظ/611iBT9b𴴴ElaIIqJjٲoDϝ[v-MZZZ>~l!C/\H( R ;I&?x@*2 #wB֦:0d2,Znݐ uFǎDŽ HLDnXN !_̛״iݺpinܰ>""mР\ko=շ_hpppٵ45!={XH`/hq…ճ*;nK~}};#F9a뀀]0y2н;v킣"zބP}2p4+u"[5 WI;\!Մ=wիhRhWw=EB0c8Ř:Gmyu5ԩ1n/FeBH}WLO>e|96oA]7crX |B !.% C`p8غ: -,Z[` WB3 K⯿`hݻ1aڄ ؽ/K]D=@jDHg{bp]TEÇc^Y郂]DHC@(*B߾xؿ:72p !.^D߾44KQu(.Fh(.]* q#}V\agg'VW/[fgk˾s188"2"ٳBBz\t ?462:p K.Pگvrr255wa 8|2;[[;[˗iq&&&SN)**Zv[:&/^dd ...֯CC…زNłF-XPlA IL777ڌI*Cd;3Rppk}];\~kl˝ )33եt\WWWM,Iz@ cf^ BU|}_Wcf]GCr #勲ʝQF266ywe2c<<6thDD0;[(.\qM3#9|__гg:tHdYMwbP_A_1SS<< cPjpaU6m;w ܥjfF 2tCdffh05jԺMN;7 % Щ?%[۪SAp0K F}G92 ]BYN$`0<~ .QQ ([ET\<~a EDeffFF.ׯ!5` _FbDGcl]GCH5ssuоe^H2~1~ml?7ob0q"L2yʔɺԸ?ø|3f@ؾNonp};Z3h2pBHS #+ ÇC"%ۢ*fj}`i Ç#%'50rp8W +8`HiRdˆ(}Zm:EM8t43gh!D[50Ú5e#k-;JϚ58vL=(%/b1PG>>^3wI%'c80 {>fx< ??dfb8AmTDRXPgOl^>>ژk:F5%a(popvMggPQp KD`Аa΍]$_8v?BC;895\ehhhhh:>}oh|w{0+[u.;OR'yabbr cǎi9qLAAtr˖!(VlHŧa>xX,5{sb1[N5o6s՘7r|ٲ͚5o:q$v>P=ejs4fmܸQv>9SVӞj9-r6B5z5adeaX尴Į]xA+ >vr9Ǝ'3[J$= E"Q^wر|r;wqߠmUVVXqZث))+WRV|r[72VZ~[gϞypxүjjo+z4U0V06CK+Sm棅-fe;cnjv > ѣ#aN!]GCt-G۱ckĒe~~~ݺuw^7o_FbuaAAUqpp177ז|>ɓ'{6[XOOOO>4xȝsYYY]%ܿfTF*=¬_~ĉG l94舘씂"M׋th>vQ'QI$mA[gG 7fc)[T8v QQ8|7c4]D׻TQn=M d ILJlgwvssRr-33}Q%"ݍ+6r5k޷ދR]Tj3-4@UwWKo߾S\\rg̭_M]R ;<lfPP!C]\&O/TC5Nh]ZգQiPYuk. E˗ ehD"cGŁCt4:v|_~VTͻuqquӅEEJVy.wQ>r9믔-ޖ!~()-:&R >8k9ɹu$q~Q.a̛'O`rlY-5t-[br̝'O0o6ou@ m;<P0 TZ\R#>:-a?~`̚U]̚U:O?q]GC%aIqˢ‚‚EE>>kR@iĉ`av:xؾff`L7&j cƀx{ɕ-n#ZF ={bj2}:z;p䈮!7蝓S[j="[MbTtW B!rPW;}Dg!- ֮guF4ڵ:ii3"G*{N.]"ZZX6oÃULG~gOL\} &O޽8}QQ>: RryVff\܍=z{zRRiҳ'Οܹ*\-23ΨZvLMJwL52[!zy4lAjiڼG^'.JΨU3xzb*HK:R+&'7Cq-/?W*j%uDQ1C#1{ :;v`H)!P(<.#b`` +FZFQL۶QgTmpmLL02$Ґi0,@b"|%4xM/ 1 Bj]R/@}ػׯcf.]tY PS*;()IP(c63Jx &MBIIBH,a,[V:_uZTuk|$$`2]GCHmϟ3g@ :t3d oVUڵм9"#k' RHۇ]Ѧ"5Ԍ5ɓ999Ν[|y=إov kO\  #Zhfd\.RL\R{Ν;j*'>ӧO`Gʡ,={6dkkk33gff|>Æ e"Ӝ07n(;>rVR{:u4mڴ+WD"rvUTruРA3gLKKKMMmڴycccccc%IٵH4$'Od N@իKΒKHw^77)S{{{ϙ3GoѣO<\vZ@P[!a0 NEq1l sZT7ccT8AOST*_111^8rHa=zq#F9r]:իW#""oߎQ.Q6\@y _q k9 1|8SW|"ՎèH&M֬UyTׇ[rŻknn^TTܸjeߒ ,}:7~@ 6n5|9^]#zaJ#J}۷o/d2Yrrŋ۷o.|𡲦H$222244LLL ʃ ETLIf!;֭CM o@v6fu4 ?} hog'իWq;f ڵ%_ԯ_h`` 4$ HN7mPOSx=0g_?]DJLNY/2{iD뗟 8@jJ-[^1}:c-[닒LwKg["0BQy=Bj #) ,N!oK <IITǒ]RmАcn1z4:tu@JJ %EL|ct'5%3R) ge ((aUSl؀x| MT| U \nQKO)nrW&оzdr<$,]ߧ QXKK8++la`At%';چyOJz ?P`d1~`L\:?e<.׷K1\.IQ(aVثm۵34|mrJ_?]p,o': RK5 !.͸|9\KjdzjXu% ~=N@v6Eh(=_xsV~hc`jܸL&gJVq9\CZ9% coo̙]D49|{{<rL.oV%ӦƍCTNž=Cr/za8]GRijJʿwh6r--,h6!% }Ѻ51muIMBLG=&(̸=zp.{()T*Mz<;W]zۻN͔z&.Z))t)u~o ˧)e |{u{jKQ_g~11??fu4arrs^MΡvPgfjve} Xeݺu|}𸤤d۶mGm۶T.FCbm]qQ&M04 EE㏰ paȐ.=zԩS>HHH~_NHxpٛq7ҴbͲP¬=Q+VHϸ~-ZՔԔ+W);'CCCgϞeUz길Tccp6XdI~~Ǐo޼G$GGG)KaF3`Ǝӧeil0v, ږR`ccc ȈM*cϚի---W,_+mV;W\agg'VZo=fkOgܹsGj6lpqq177_r*ٳgݺu@ [¨]?6a<<=uzI{gglP;۴v(okKZzbeg;xⅻr^qUڬ,Vݳ;~ufbbR]eRL&U-IMMmٲ-Ñb}`ϾvrtPG9a4<66S1U(acS;ֵC]Ʉ 'LaVf⳧ej:88$%%D"uNN4F <}dggWN y -Oz},_?D=Bzݼ,yGHbTQh (ciI?vF_;QXa/+H18sʹB0r ED-[M"(==svBije2xEBP(/\8tjmFNO>$,lӧORݻwǏ)}1lذl ~gjcddG0̍7G㌌*hA%..`WWy(wǎt޽tڭOK.;vl-Mql!ۚ=7$u `=KlW=z :Cگ}.Sp~'Z $b?vO:M"q#>oUc`[A .5kߎeo 8@jJ-[ S@t4֯u4zdLR 5l6xbѢEޠ{3fիWƌM (a4lkזu4z{{cZ]GCf \]]ڷkoii&MZ;e چ ``8\ CC]TI$7%%o5=f{QյL:.͸|yQ%<ʪo+;[[cF>AT{!?FꋯTQQQic`jܸL&gJr|ccrJu!!X+VDFbj]TEFX!!0r9`p8F[.)/qbb 9'й3RDO<B.::ɩ <ƺ;6k&vZF {s]SܢiKBي_.ur(e*=-`-js,E ۆEqʥPTfB"57ctE51L|k^|MPb"EB!͛GW4 䕕Ѽy0MJX$*--Hwsb`h;;'~rUh+bݻwΞ鯥't#/޽NヵlHLJ**HI%ccEͨ4G*Niy>TQe3W>0pY-`T !"̤EWDD4GBS*h#(NaF*EF-FFBeeNn@Gцk\])*J@k$ FċmdTTTA`@x<:pah|jvB?AW$윜)S޾}{ԩ997JJ"553F)TM ͜IUUFIIuI4 ,ÆBNN{xxÇa999h^gXھ(7..{cw0p!mߎˡ݅0"""::jٲe˖-J5,^ܰERR ))( /֑t|ڎVto&55uC  se&::zȐ!~ҧh<| yNNt;py399ѱc;FaaDDNNy dE *LllҥKD .;w.11\t Ӑ<9-M7D`7jjL$)G~~$%'wji3lmDTT\gbjf``8[糖lm ;:]Gb1vz.7ndI$lhdxɒOg6IO`ͨ'{4gZbqxD ;vuuu+ 4NVy=#mF]_$Zhdl2xȇ۾o,11յW^.]bۓBCCuuuuuuCCCدҧ`݈ LGRRHCI?r;@@LUUA))DwvNvjY][7-,,_ΞIO; :s3|ӧg-WԳ7|~dZ=Аc}mDɩ-mMiWru>򥋗.QRZnzYYYY'Os=8W +^Hd'ļ nݺ5|p ҧMS X썙4;pjΞ%77HΎRSgOEԞjjŅ.^$X^0+3aSGM_jtޢR(ֹ~-OOOiϟiSPn[lf|@D#mFt(‚ӄo #F.6m 1YEFϩ_[ކ q8AW;z/G۷𼖗V^[oT=2p@CctOlvK_5z/޿?$5Tjffv޽Fp%|iI ZٻbvoOXސ+mFt"͙C?m"H$4g]HDm[gXǢ|Z\x)rmdnn^MM OXcえX__>Kd{O7s'z]ɓIn<-ԴQY@+J011oՂϯX"66M "ի׳gCDϞ=իWӭ*^|ZS[i#-[FDDG劮,_0=4KGE/Z|ZPPQtΛ^ƣ{-/WvR""*߰qlP(--ٹ-MWW[Z/..~PǀdG~ȑ#eDVVVM7ҧ`ya@Ybb=36l""ZNpR[[߻';3 [TT__KKba$z"zqaaѣ[||CBWUUU3֬  Bp5^^:+<}nbEgOsgۧN:&kcvQf/شC+{j*K&|_lΝ;.\F"0!oon'?&HMlmIGIKKv-|gN?xg^lmG-Y&MjwDZtN񁁁#F $7 tnZZHwis|9|D__˱dٳz괴4[[l"Z`ǽ7@~Æ*cUUUMMnn^QK[gΘaGh b__?S3BPm۬126 cQ=#mF8;]&>VV,69xG'=}6~q_ƍ{OnܸޥݻݻGEEÇ嗢z𡡡G$IXXA߾}}}};l.۪;qℭ-ڞ8q"..۲ߙ3x!;';5PPADs.]٭nϝ=A` '߹]Eoܴ)? -5JNvYYy@hHHqqѱ_^ξf:nnnDTRRrJS>##cD4}RKKUVijjzyy޽[ݻwÆ 999/^,--Wx;|>?33Fbcc9UVV]>d-Q_b\NNN|>o߾ᩩnEkkkkkk[Sr6sI7700Јb|?+B##[!-##|C(##͍rss]\\544N>MDAAA111DT__b "ߺuQ>}֭[w; EA`tSЕBA3zr˼_xTK[ؤCK&&&'/n~+//755m=i9ڎfQX,=ƏwyQ]cvQ] Ə'Hh„~4TUU544Bvj<`oo;@TW[ZZ:tPUUUUUU## 7R=w߃<@zA?]hׯ Ewȟ5w:/b-..nhcc[6nh:ՆbGϞ=~JNn;6p@R7ognz򤪬yU@@; }@QOO xJ`_s׉9WZr\uqXy+{BCi??{Ԗ:=zGyxxRXYי39wH겲pqX0DKIbjޤIV^0/rҤKϟ?ѣZQQ{)R]]k׮޽{ >mOܹ#]`^=8z'g̘0Lvv3>d~=Zك<@gll|ד%% Gڌ/sIDAT{wO-&ӧϰ~xǑ#mkj^ݿZ 9mdh6N6u' ML##y{Ɵ'VTTxyy1 U^^1qbC`|wWӟ6^~e˖}UHPP%8xر[hG|̷f/22r)&|4eH?? O)0`w>v{gLsT3O%Fx^<o 0pN 8A`'  0pN 8A`'  0pN 8A`'  0pN 8A`'  0pN 8A`'  0pN 8A`'  0pNYi *\8^+0ΩËΫ#s^s 8A`'  04v޽4jD`@c3fnڨҴ sOV7m7 h F6!)hl$ CRЌ#Qf44HVF0$/2!)x( IC`' CR%[trJK]t*bnIENDB`gvb-1.2.1/help/C/figures/advanced_editor_2d.png0000644000175000017500000017400311336006273020651 0ustar pietropietroPNG  IHDRaF sBITOtEXtSoftwaregnome-screenshot> IDATxw|SUެљ{QFQ?A,_e(*É(^7" Rw㖐IBw>77眜CrsD^nؘr B5+>$()UDB!}q:gf@pc罱'LD!PTZB'}>48J5+B!ڱJ}Y?Lߵ_O9B/<3C*cTͩ?B!ڣ*BrȈS|M[/{:R~'f9%wR!&A!Pb)g 9Q)TMv;<̑C![| wW`XPrIyxET!R W)aBX;,0;BMw :Ooh]g,ASU!ԂH>0`o%?qƏdMSw.K:]J*\TqjGJNۓz,n~r(F53pr'@}cp5#0.a7)h (p})8~W 8OΝr FL*6xaixGJ6x'7FF! |c"ÅBk):'Po0JĢ@k켢$#‚NGXpW+pg:Bȱ%'$moXwڦ! 8]b,9sIBS\! sX!P3;zdwK& U?wk= WP-zsT* Z8ײ;q/a˷N7H(6Wɔܥi{K%+2v*s{tTQe eg &fi}xc'uv@<=%B7ͯ LڼEl#F3+ a/)i3yxF?@* Dz85R;{ȠES-vY뙞?,q ,zR>aI ķ2l qOc4M/|a i'd?K˳F5qgҋ?|ntϧwSM㍯mt]Bg8 zEnɈ!Єy߈!v*N痘-&k]LAa#G9}bBХk0LRn0r_Y,4DZGd%=4F wu8$nqg&O_!c;0RBJ=˲y}z{׸ϹY"]gG5k`3]$,AvP8QA]iV 8oΞŏ=B-I0,8VʪjRQ>Xx$4CSWã(B]l6p*IZS@%3!_~io-Ų\FA^rfY.4#D`ؚuO`Y7ۋ( I IR{]'3``o93p+$ΤA7?u腱>Wwu6H@߽PY*oNg Py@],UT^2oD7x)(ԋbgR 0{lex EbgLfgqF9s5(ʇ&}>!U[qTىJE|E|eG5:@@7Zd(Wq̅~ =2: ׭Ag]8?q_GӖ#gox׉C{Q= ?oZz֊G| f%Ze nM1ff MIڼO5R}='3~E#Ԃ\|>|a<ܜLjק絧V~8zA'__?oX\kWJb"8w&I&DN_Vm776&J{Dʬ•AJfё)ݬpP`k%P[W|7Iݝf#Y=s+l޵AZx:{$aoQjmn~dgz %fHW 8+,,.XhHT%FJzJ \֠ (A5)/9?<VPݫ;nxO}Vwd-_|:w6e`P@`PSC롰-vQjR|IQu8%erW?B9C?.o/E+*y)¸5dvgn=aX(#N=ye1vLh8%G!:K~n7YhnH0.A!P(Iv~fo5RB!nSg~4TҕA!PǕю?ɖB!P KB!Z`\BB B!B+AQ1x6 @L ܼy8BubcyXRzD-F@@lp.ZW|AqIWRa{կD,jzM5X*&CujK9_ϖ r %W$=uë :Y(,٥+_ez LB b)baE B %!܆8!j-g{ÎBøTnZ4 8Ph c22ңc25vֵq(T-];_8B?N ի|G!:`˶ɸ_蓐S>ܤvOgeJϨUXVH*,H5/JQ)9>_|{%=zZlȤsxi٨q:๰Qwd22thEE;vqi3什?dN>Oرqo? )F+)]v=k:ʫ ewР7 vV]v׮Yy?yo]Ow.!& k}nZ9m/.ٰqGf?sa"wQ}-OOY3g yxTFcMm]B“/6wݻOB`Pt5=aXVY{;c!A$|s/: ^^rǂE/^`oHezmx}#{?Z=FOw}@> @> =٧F# L&3KFFEGFE/][S[Ho<>mvg_<{,kc6?E^ܹZO`۔uOl>ǴiS]$8sѣG41c󮧦\]z5?s_ϝU7nhĉ_~cK.+|믧y蹳g .x6^s0g ytΟi*WzիoPxs>k/*,tSyyo>e]gUQoQ-7?p§qE322r={IHHy-/\8zHj5֭{ŚڔuóOl"im_Vf\J"k,ɷOu C}RSSdN&_x#>2*l6k{bbj]FѳWIƍd2|;+نVJO)T:)2ئX,aʢҪpqɁw[n}tʰFjmMsuO>q˗.B:/;ߧP(\./8^'NXÇ~:t- $|ݷV 'U)]}lhǎwZ Zk۠$9W]xIAܺHxxu# RiW/..]77<=<^[ژѣ-6 bi'Buyuu,?wNh&?/n'r7TwZ~DDDշR:˟{~AB\\| $?>x#G&$$@aaal. >믿q3O<O^|I.̰]#''Uܝ|mO>_~Ԕ6i%8X$;{`/>2^gvh .X\p FPGR_V~~~k4ُ>aaa]_ȡ,ٶ};K/w\t:f7W/gv4m/.yw~믿CӴN;r䨳F$YVİzMitժ=>m^\QPPPYYjj~ܹOZ,DZPsKOJ[,%śoqq kWϗ.;Wso푈3fΞΝ;쌇1sD,vU&Or*FhV\9edgzd3KI!^^^7nܰ>tE=ztAA~[ь19ǖ.]Eիמ;a^o.%aaaK^~޸CBzIعs0[V^>qO%L4hp}||}WxW: ބBCBcǍcaֽɻk:u.FSOD6 $74P٫[%Db񯇏Um?v;>c嚵'3rؔ VYK@UT?00pʕ %]B-\8|}.HCA,^xɢE֝K,80q)aO͛7~xyóOl7Q9AyD'`ېvyC ux 9u %~"::uzԤN8022 !la\Q8-]aA!;4.88Vcv!A㒎c9G몡!܇qIGrT!܇qIG@PՊK)#足[h$]߈B¸_f)JPqIT'vd.: ^stCrl/PqI%2zL5WI@R>yTBKtuB`\ H2.*1XZm$+`_\!Ա*vI:a3]6 B!Z`\BB B!B%!j-p2 0f!ZP\!,K~^ޕ˗[.1$<:w)[-ja\B23Æ ۭbL߱c <<Z?V#k&KBhxi D"Ql\gP[k5L:={E!++/ lzWT[,4Zr%!@ pd= . 8՚Q#k_BB B%r￟~zA~~~Fuq qP(iWMJ8;7n܈mP9jͦZ/A5k_~}ƶO(l_t*ͮ]wk׮F/[4na\P)-d6[<2Qd)-z#֦y~׶_ύk׮]IIIzJJJj[4zuO߿:q(//_KK˔J_8 S*L&;N*Dܨd[|w^bşٷo3gcFQhi| |4˲O'ӧeegϜ9+<"288S5Myyy\||EE]***^ܹZ~*_~d2=tidTtdTҥL&_OO?d׮}C r䩯{vf>> /))iC,F|}@߾}<[F`5m5+KFyFɧ vT2^reȑ3f̜?ԔkWO?Zȧ}Cz{{.=z$5EQֽRxEEN>|*/?o rΜ=s ر߷/#C>8uڴCqOfFĉ.[֌ `Μ9k׮-//?rɓ'&8vرcjIϟK׮]zjnnڵkr]VѤ9sѣ'N\xqAAA~~~\\s=wg%Q_ǺO>EQQZhV"eg)|~w;y'VZ>`ڗ־޲eKZlS ޽=4@ڻO}WCޓr*(TIݺؿhHOO8iK4W._ )TiS}}} }]\TGl2}׋,eZQFGG/_|„ ֝"b|zR4 ;,-""?^ZZȑ#lsEFF111|]u_:wao}`Tlռ}%h_P5}EI?>&ٹ#HN>u/^/>ݩSΝ?0y}?.,,Lxd+Uꈈ~;""Bu5(' JvzR!mts×_|qӦuyyyqͦj\o $M ۇK+.. RTThM`ԩ5\xAi#g:5V%՚S3Tqzt_}u߾ зoΝ;)O<ēW._ҨK23?ϛ;.Z |"?dSQ[GdlT~;;;ϯ5vr\> |MVVol^ BPM.J323U*]iYY<2yO]~ SVm=zagϝ9{#nq B״i^}AA6mz}SF$ɱ1lذ;w=z;<ҥ2hzړs}ɓ'\Jh4+WN2_q\"]Vs̹vl8i^vvwuV^d~M2_()))))y|Az_\VKJJ~ HbqVVVRRZB7-GgO4ٳǝ9sfҤI>:["([95nq BCPuuA!m[^&,,|Ims͟7oUI7;K`ɒ&N<%4,yƏ_VZW׿oVlwvIǍ7s^z飏vX^6n߾!!#G:tu֬Y IDATիw^W^mWڪU+u6p]wVX4nDgjYf[n1C3fu͚5u jͩ[)PkD^-~OmCMV}/x晥[=k,%|yjͣZ "EGPϜ9v!՚Sc  Uzrv jͧZ)KBnNu՚S3jKB y7;jj>qWEM5ZsjCq B$i$Uf ~q BwFRZ*e_ ڐ[VKBG'>1 qʟ$84ɧz'$l6Mq B) q٪J+Jۻ{~J%%8VkZ !CBBh8<õR$A "Zaj¸!j"Pҵ@ fB B!B%!j-0.A!Pkq B!Z KB!Z`\BB B!B%!j-0.A!Pkq B!Z KB!Z`\BBhf_\ywͮj Ԭ~Rڝ*cY6 /4(L&?1$u hVøv9֯^E3I+ iHoհu+-];jΟ;,Lt?V/?'!ꆜiVè}2qjģ['_#9V]0Ϻ{W??5EȞOUYfmhD\ry ed#G|ruuuKZ Kܲo>?J C!`T纪D`֟f3@SdY3/+wso{6$DXGCpdąꪪBer2,6(L&t֙ [y4nq+eee7.nH.)@('JPd)X  bGTfֽűsF.4qjKL^|qޟ`I7nH$|?/degZie_3 ~/BӍ;fo+ ͛غu[QQQlѽ;e.߷oBXu^OvK_h'ɍ[  s7Lj[4z9qcяvfӴ$B$ A @'ee&R/ap;GO=k]Wo ^{m}Qaѿ9[p֭{TP1c榍>xl޸ik>z -/\8z􈧧+V[o?uĉ_-]` UUUϟ%U7}J6{D%#^4a Xo}Xw^jM)Z!Kj_V5LY5gL֛A o !'juDDV;~HN>u/^@dv ޺x6dT*sIIIIXh(f[M`ԟe:?7Z3hVssfMt˔$0(Պ̲b 2ʅjMYCe ظeشaX/p [y4nq Ig0Qu!%*@s4%p+#Il*#!5fjrIMrbUϿB~` V/Zpt:?t-W}lNPPТ q;/Yx۶m'O)**}v2WXlٳ={R(*XlC2L[UId 2\w՚G㶚 D҂}T,kۮS;]1abZQz%nF!b1482$s(eYv HGfhdu$jKaMP.M63-]TΝ=[߯L~.^w.]6(#jjyѡK$E~:w("RiDRbYPWׄ0$ b1DzRGT˜F#}Myeўg\\V~nrټfKƍk&ԫwo:drylll\\DPHI2$ BERаDPƲfͅ,MpEJKf;Y tLG!j}:\\Ѯ-]"(t̅,_,$G a+f14[gAYBEP.D@'"D?#"-8 Y.«f5j9Cd?ܩPR(zK$BXqɞ_~x?FF:ֹߔ%4fbe$GH^$HYuɤd&)׹F%@ٕG @I)[ž<1՟`Xa+?6iB%ۦ䥕\%6lG,,7D IJmעL?\R#CT~rҗYVq d7S@XaK3(o!j[:J\r™фJS5G* MOW$Ad$ugY (#=;F }'t:g|~̲)S$ ыb%1AdXf8e _)awzkmÁBV?.QKflWRNj-ZƲ/"R) Xd[Xߌ|)T$]I7GHa5lGOrY4Y@HeDJ.1*6 C"a'Ϟ?&;0!P/jSV]5\d.Xj:4Wq>AY&[b<˱8&6Xl ,,lj< 4 )cRIqxMi +sTڷdbBATӊ.S$54vgwZ&9:!P+ӞKfKW=R`MA fY-$E {+Π+ke=C%k%$ ,_ˇ|I B4][٪ kV*ѕ2yF:xӝr%HJO O7&:D!PnKX vcѲl?AfVYa +$N%q'})1rNBXY9qs,vz7-` H0m\S(ϲƍhG!jm\2EsSﳲb13" D@D5U "$A]CQ=ԔSg9fX$M3iL0PgՓ2O:>J0 "g_DR%!|X;>"q!?BĔEIF#']Lvz YQQрcBm;.{˱c/W2`~q~5Fc 5y @h3lRD i%7q\YWAMG @u&ɻ,P"QR5sk6! |JggE_v !BmN\lyi倊 4]>Y^Ahxwplb9HY{ZNF@JحV@Pi]ggh) 1,+-ToQ(f1|$T%YTJd x<5CMvRszk)T'NXM>y %:OL3jFjIKN[Gɕ@.DUSL9D~`&bj2uo0YSq8="SHֶτ8+8 ñL,+`&, CW̚3fnՁ&A0Q#_J)A{e^yz|fcr54b],MBaFۨAQQQ ʂ+k׾cƌis:~$OOsi_}nl-%O!IP~OdʎT Q"[<9ΰ(~^(rpr""L#M2E""sk_I+De24C8.$+@9Q t1tQBt) $n aպ/}uǒPVKOet9Z_3a"ݰ?%#xaяS>:йESPYv'>&Au6n/*멹O:EkիWGo۹҂\c+<<8vd2Qc>tWlNMW=Z{Җ⒃WJZ^ee?Km{MxHL^ K]\('Ѐ~P3o΅\BCs c,. ],`qēOFEFqohhHyEod25UWUz\Ʋ ې3dRNvՊ/c3[Mk5R\ra Jf >e&EPlvo%-J4ugYP+fA dz_ oTJ .\(dRH~!7+(8S[nx?OXJNgC (p9ņY`Xk8M8>N_ J¬1a&qdpNn9WwA ?{.\~JI'Mh}v[n+**=w]#J?mMo^f{{ph(j/ۉ9l5L\q T][#W)=/dU H9 J\]t M\jP;vhwITP@րƧO|$1F37PAd*K⽮0Wi>7\ADԟ8+"!eX.r *{@J,B"0~5R|IxW:;n78#è0`ҥ}GE={ĉ_-]߭O5 i82,A0w26l7r\&kvd8MZkj3qɹ]$^2ʅ U3Ϯ9pԭ`Apiiȁ%(뎀U,'sA.=4k& ?p?X u!;v^7nk..I5)&D,V,+7_S<-{THlvo *\w2`$p{aeX˃</zE t| 2M`zs p6\-}{۶,]RƏsy{{Ͼ>>>ho٢5#f ZAzu7l AfFn8~@*3_HP-fD,L5Sf (пH)pu:4Q ʺ=t%M(%]%;>Zׂn ,7n- A2A/9'!GF/_(n3jOߧ9!҇l d 9ݙ4BaLhJt?ৈBa'inIk'xZ;\b))iʡ \ՂKw;^^^k֬^f5q7nx=?|?% J,u~X[(61(ڍ6׹]#[Zu5ݮ"_Y3p@t!H"%J#9:YHzw/r  $vs9eSe/u\[3 #|Bx+]rhZeU1/ެ>o9yˤXb[`%T@L=S+|zL~b(tH7=ܜ1ÿPݷm(tH ]?ׁ\3t.2(_xԩӆcb[.eY  Jú~>g*k IDATlvm%,fЩodIFHCdկUX#P!)dZ@n1 ,udATH,ȺKϲgt8E:8B>LscWM[c ,JP?ߥϞ-)9F=a#/ ׶tHw' ؚޠ(pĚ ^lJLa[,7ܙ7:.)A\%TCq:β,.dk„?Awm~}F9^^^7n܈mu1/0 K5kq [iqɁ?JY) }|s|s,-+o]q.bE-DASߜ,o2(SV?C?tuhX -Q -#2GI@9Wn?UUhnnЊg%).[zVe1E͉kUA]& #r aWC[0Z|n5es@DC Jfގg/6O>6Ypt6iLd2.z\jqt3Vkgod0\ȚY:QUoWIP JF4 (^Up[~ C8AB(k**2/fjKk.4!Bͥo![2D*R`M%@>j`?$lnj!_ϵZʫ?KjM\`Հ6T[7W#fLw 2OwH+).t¶[U.°>˖-jmA {wUe%:69T׮]E`'m@QGP['?22N4Wܢhp{?HMѠ54!wztQsS!>K}l'ɆlOlE^g_ҿrL0)asњw5jbb(v b{P5TuM3 .[$*T jm0kA묻4l$VVo=+AQ;Ыwo,+,ccc-Z{Œ!O{Ez[JYfFC ~>Ntb)onI@,"Nq ^l'! >0-@Qxzw.W lC˟};ҚLMA [JHTT7Ʌz#.8/7.aZmdCj@* YҒiXA Qm^i$I&ص[" HDul t^*Y-Ka!pԜjB1-@4H gc"Bi/i X8D "rܪ:BAWrIߢ1Aoj!_BtQβ$%^us1~]^Z_ߤW.QZN[Ck.XpP@E>"ZtkA!fBf8A nOa:؆^QfAHUtH?Oq ' K >tF6*kެ4][eBfA(ׁXv= ٔːʶh!EYqGz@X:2F&H ''ɋBQ$M3~kttkF" ,J-)F2@N.@L8,+JaL5TGC49"Lyݍ;juA IYŶpwz^N|A  _wfC>kwLcEcmrtEg  _떥XXX=l}X|C!(Z{\b4,iKāb ȫo]/ w^!] 8sp[=x~ZnθͨߤReή~W bdxgBDzМ [sԠ("+qMedِG-.j>Uճp S6dK0;?%g~UP XUT(AiAz-y7I w!%rp5B>NV{oZ \>,@6H'8=e^Bv_ 5 36Gg$)oUuyvfg'lV "(p K$TeE"lޝsP]]=?ÄAtwz>9Q/3?/8β4&_bs&W3s_s$3!WFl~$jDn/rG䀣 m<^[UWmV)S7wQ ZZZktmԬ>}ÕD01Z:GLЕVm$5JF1K=]o {/G/n~cOK]<_@F٘td ^UZ YHd2c]kХBҬMCM KM)ֈ[V0 LJ||fZ'6rA(`b]̑V4iGSW{rbvO>o-^&<ѝl=<®c\cG˜fT !4G'aU.DYhFsjawCVySBiSK]x0@3-֙E^h‡m7vXo[oG~^YYizd>& aYl^gDގ+1EDŔkJY8U" oOG ܔ$G=3R*%bBxGԂ%Jcft0 ?S%MrT)2=c czߘS1_6U}Y-n8P daoӵ̬Bwo?͒/F#U#ԇT~(F^ҩB#vw  EfͭP^.#v&B޽o/퍽›݌b U~ Sϟeワ MMhRtsL`"|l|aI뒭ѭ^"'Ȣ6UQƫ>FWXB hDc`}@}4ъVM$_u&mm8(rONz2+~={O)nh6"w~M:fX$GV)#KBO 3~V1쩏+\ 4522r[觶M^fLGcjw@JE}@EO|PPAkAK Zbً! YC=CEC# 2Z]{7*+~k2 2Yr7ls#$~C?ǔW$Ŧ6 _s\S?hF `@ְt=[5XSqNtffDjEaXdbbkx'cJֺXB#{w B-6dB؍`]܂;]\ѯGͮ,BFmBk tӎd\4Lx{ω1XR'yr>v[b.OtT26rx=Ck>/&cz00@5NbEs_ n=vM-B a #64=Cn@bO縓E 9%7o|e 6aeYݙk&glj>"6R;#L[/np) !9{ VɛXz}*f$#2!0gE2|_=4\}yEJiX. Pk(I479RRlķ&n\fSS7i4@tRo/|t^<\~h;=v% wqv$1JJ$E{ZЏ!# w,jC,_'mrʳ-՟FLދ2C{O<#X't7Ӆ~i<6K ŘM) h_&nhfMCR)a, ~ק&2cfQ=y2cIm<ݫgKb, Rȕdl%}GQn\*-pxPy <ўݱO֠go SXU%^۴Fa '};DbFf_0\!2~gwgImCیQJWb&rBHgPYh#뙧t7.J,`Frha(Fg-ܗ]IF}l<سa>r+_՞KBrbcŝÃag6?Є=9g,-zQ R [UfR5G1jO,˖=T]iN~SQVs4"Nf.V1̘Q 8DފrE @2i 4۝E)V7Im4Fr6*|rTkq}EDꃤ>Nґ\)O2=ܥ Y!>TFeL_K \9{ njWfFjOiϦ|q-xg݃%f]ޣz7%J@QC0SُLR6D<ܮݙV"I/KJSߜq2 u+X?0;xc9l,l=Oj $mhRH&;4!m1B} gr=?GĘanMr{) UҲn0Kfq NnMA](?K/0gV.Ks+Zt;޹UI_'P xz¯>cz*mIM3&4e֑8]ai.28!T ?ptAB2&l2B *c 4qd @h+XG- &r0Phh89v›W2# Nـ^WW=WOžy 6ڏCqIR?!u|M+ymOƹkKZDm};"XBcF_db0,X.:gDI)0 ds- @G bt~16ֶuo=VKi7"KBY:F =J.\6x!K*ZZq =L:U?[nQ9tRZB)i q7O: ,O l̏R`TA:c!nЈx,Ux,5^C%e;4Βzq` zV5JcN=-Xns\zΌw 4Y@o`>3"Z2-oUՋ/47D"~-[=rܵRTvo{50WK҄zG݃=imQba ϑC bY3I1>Jv 3K)R۶u!bװ#Xpf˰~=;:MT}*h (C0uG7b+͡QMh^/d1XLpt4:(bݘY1G{VPu!bѐ0aT`" 2@2WP,r}8Yp09;%q$Hj7vѣY;顣w ccV3|u<_jXM(%{sOH $!x;v q~gK>uݍ@V pLH<܈&')^3A3eÈ WNщ*T545Xs햌C1U\1Z;:u\9s 7xēuH*@ 㞓Ռ,0 &Hb,mP-,"p G@j@E̥dRжg0-6e b$%XMK`Ůfk=+#J0?Pr;PU ae΍UH8d)(*̙sݵ9Xrɗ ]i ]Du3hj W IDATy(W$&+7֏, iۊ]iRK",òHaDC?v>atu.'{ 쥾19G?tShdIZL.5q^|.v`UW1$!`pWE,NgA۞$mv*˘?j-c0&dI3ؤQC^r3+|,EZMrQ=z!!y&|gОe;Vb }"weFc]P۴9g?u7 !6o~O_4GyD#:_/(H|&&&zѯj07OF?ѓ8˲P\Rz}>ÃWwhv<3@⋿|m'J~oK'wjWk= k/x\5_>45sז>w-KNj4Mh3')~S:lCj J05w)f095GDDmh+A(F3B#d٬wV5ئXZ#w"mZQʶ|zГ\VaWfG 2:bK`lnyƲ8uP佂18$4%9ք)"&rb0W3db  A?IS ˷uOJė',Ull5_ A&R3iFצK~y\ ɿ8+%%%o 'o|;w<;{ ]o}SOO^~eN~gɂ֭n{zV^ygy+/߸+ m6/ǥ9V,,,a%6m>C1q_8z$I^8w_u 3ol ^^0ǸO?f4נ=sK?kDDEBTўdO$$hѠա.&2QZ\u%\#c--4^T5X `w؛-hwұWeh!ќYϜ[BYS.D%Lʃ SW01x"ږ&dt]:1( - L <,SRōMwXlO3| S&.lz*bOe Ǖh%И77ΚkڢGy{ۇ˺?s.p795nݺɸO=xcm߶mvUU1-V^q38XwIJe y{Tis` ^לoYHٮ7*Pb񅶞!a_޲,n8w_uG~ZB.MDqݔū#Iְ":w߹]V2u\7F#l%ضOmcN_Ï&sgéRѬKH=ޓgc㧌V{.lg﫾L7hMycg1VaPCʧ\IHbd qp1K%$0OYq@9*dʴ}]qeV^'jg҄J,aCщ ƈ\Џelu|+8loQؙ/?0~Ǒe(d{8H2l%s219i&4 V5sd/lʬ5 tR-&&wp\:S_L 8G%u0 qP/!ƘEF Y^t ]㏧h8㦛nփƛ=\EEOwjose `uo3_q%gvHŹkb,!]"hhOk֘w˂믺_='_~?|188xUWhҸ믺|p h?sK>Gw62 , My|9PUG#wY~¹kbK/G˒iST\ʟK/*Cx;!#YSPueY? `L {][4)@ATsb?4-ؽ197d` hH5nVH7j:E/Z6XoMlc0\RWQطۼ #̇~RdM_1bŌ"/_ rh0+OpB ;$ 7= NQ755az#$酅؟(^O2|{Jk0F!>YC,<~nz=VDu!/]o-^C>c结 sg[ow:b 4T5yʪ5kXԆ]ۏwUkAkuw^gL 0~2>[t+34 w0L1_Cʆ@"x' Be.J!0KP٘{[nj;ܱ֐TǶv(^*ړD TTxg,y' %{䋱|y70\J+`%LD"pՀ gdYe cDA#ȥ 3/7iJ.c3C(܄R.'?ѭcS׎.=cbk҇2鵑ײaY*ҍFF1ڂJT@r ʅ>ўKzEv`Ȗ әP۱m[l1d.Z+X1k->jԾ#R)@䇑eT]67;^;łp.#>ctOTxcbY<%#MTݛë-8Fy Hc((:8J]LwEt h؇e7^D=M#Fze[PHi3X 7"\ "vӖ?A{VlgWF 0@\h=! ,ڸ9N$ >B %Nt)鱦Ha"&HX]0٦Qq$L] D$EX BÚ3vTffd,X/]M+b?b->&P/-hxhx_C䘹ZrQ-* b7R*ecYL8^[>-8j͖5 T-7ZGu?PѧV 5,Y@2 &#s2BbPt XB(Fbiս+aݼvg~՞(GP ٚƆ ׈)6OF2)s M=2Qa!/`Ⅴ?@+%`8, C^Go'.;Բr`0= ~9PM~G`lS Wb>l+@>lh,"g6 Yv}͢!cª%՝jՆָ lbYu |䪳ke&3Yq#(qAn\qb4MdكM2QlY"$f*̥WgH,S> !1{q(AFh1|]LpH(\p! !EQrGJ+.)J,^5T 0܌ r ejp\wf*lMlN۩vppppxGϺdbbĤd˄Yg{ A f5dMQ(ډΤI-hG=с[#'W~ M:IRZԖ^ol5`QjdetHHؠhԆ)  X0f\gVH +mUHLpXqd@1q&Ln St&%jL>D뭥I+zC8޻-V|"x?IGF0;f2a'&&r_oEuu0UEڵh]J-Wk_ԆIR->+ }QV(\;ىjT7q!/e_ޥзYueX6parנCp@+~\;R#uC`NGDgGh|fN  ITaYO2+X¾MEh+w$W=!4BOVqpC| IDAT7n89:8888,Kv;gf mhjsҤ<`*E颎˦0X_y0$.%5r/7!0O>lV)kU׮2 m UcӠ'?_Z[1B0 %NF~ῒ)vA <{ך# 0=ܭ  OfKrSI+~K;l#]- + &Dh$GHs:Q$.,6X }a7Gᧇ-eFĀQ{PJj=;Nb6s5zZ;q;~aG~͢ 0K*4@@+Z^=SzгHygIJ 2ŊdQ믮V Ws]8UbE@Y.+\;o"iab憲M0:+uvTnd1ըby){c0]L-q8C#&DԹ\T ϒAr)i`.F`ArM|S)τG9Ӗ mkvm\v%6uc,{+:V[ѬrppppXS5U=\Ԍy xjnXDN~ dvO fd!&Cw:E1ɐ7?%:@s4էT0m7ދҧg8MrATaX J@ 3҅8LrY$i]B cr8)yb SOT! D@PgRFہ\_3G[VٍYds)$z7?WwҊ|Ւ4ut-Y7໔ұBk[m]V>oeuG77ĹkJ7]qFv  AR #Gv]㙑5c̫02@^ڱ(dn;-hEm7.|8"KKpO~u0+]nVco](;qun:րũ|F71 n,1sȎ:vZ^L訦{Yg1]ZI&)ٵ%q5ȭRA.6^tb+7o7*p|U5ŏfݸfCsqxWz%\D"~-[=rܵ%Hl-;YZ/X|cV/[{) "aE"0j'=LC(3k(Ⱥ^EHn )xObbvGU'T%E&-y4÷SeHn.BÐut {ēNޱsG8gsoV֚||8f,tSȿ/K,X4<=Q݆ T bͬ-69n2_=4ɹB;AI!p j"d6fJSeLcAU_辏ư;V?VVc+9s.7x/999>K._oy?4;~!-;w-ҡUW[d͚{6|j+o\ri)0fL/qK=Y-/=j{2F--Gf_AQ݁R֠ xR?BW F}ye%<{UL|,¸+ m>HTYbNUiKȳr8!X ԡκ-!e`j˝7wHWkȹISᆳ:$DxL)Ls L u6'%9rXn#vQb1TȜ*4@1p\vRO7s 'P*^07ÙEoūJЁC?o`S6w]B*9W?wųX>] Xq1߲;wem|Y/dYk,9p[@pEEŽcm|'s1{.4 |(J m}ӌ=j a$8#oG|sJ%GC^ rđ(DMiQlf6mؖSH_cܠ*d y.y 5eIWQ.8r2 g42f$Ghu{MZ7(Z)qx<^^Y;V Rd>Bަ"Y8xzYҺcH[!D"gxfUx5DC薐x:$Etُmض GG#F_W -ZiAY)~pӍ7{}>_(Ui8| +zc%%%}/eee;1b&{PN}ȟ_xT-أϰtkѓhM]͇|(6#;\JpEpUrU':y'QaъrwGs18`ẀQ´d=k@zy<# w*XzU]{NÆ>PXQN氩'&0>wl[W.DL4yݠ'9x;J". WX"'P ~=Dg1=ڐLn K91JJco8xIȳ#4{Xko`RQѾ6tm|`[RΥ÷ :}L EQdήo9s~tpM3f\9.n5wGwSc0MFȤ3+Zn"s]-Q'=jA4&h햶D/Ԣ mSb8jbI<x&F&I[w6?b8!*I,ʓ6u8[e浢r!j97(@Av{j8'%E={i[%f`53^oNN|;dqP/AkpۇatHDd⤢&@HR{φS+zIO9םD9̬gm?+'|訫{]t}wꩧ]v饻1Lpݡv5g!=p(,G}jGmcWX+zrrX&*DgDDs]K4I,^$n4F dcdZsaA4ީd~oöBNa(F?cGp2氩oԽ%\F~.Ew*&!:N1W/rxLl o#L&g1$%;tL;oHC 4n UX8ʡIV@.Tn,TTQ?ͅO`"E)=t'rV ЁF4nmюJ[cLZL8)o|+_o?Z/N;N=5J_|b$Xx7|Cu&@# ; .g~}]K#uN㜞[b/zV9x?0\45 9jN#5Lk/Іzh%JsG{T<ҋ޴+S {O%FTVL:n7FT(|Nɻ >0B^HS<.pqQ2TU Vn!mՔ8g Gԟ7|n͐,6D=a* ?Q (w.8IAٔ63_S@9nK A$2s뭘[bOtTS<{W:C  ?7FhG+.cMV-'kg]]9]1eMv.yGvSpЃ.-?4$6QkyѯAs 3v>A.fd(9[fn$vbZԷuZO=y%Os̜ީ!IB ű4utZ_D1hnTx=y^NqiyQmw91[&$P.]4b|4 jN"0.@@$paa_Y9>K$ buit8xůp,(%o|.E~dVy^,].%o UxCaP"ը #{< "H3wϲ ߉>u>e%|G)w4zi%-s wNKɫzZs 6 M~e)ak=dI-(=r*Jf79 -!)f|)(v:#s,Udy㄃&ɨ2TU D IDAT$Ȱ2/S*5LSF*Da+L;+=Bp++ތƏB%(2OFp[CoeMZv.ifF$_y%toeP@&1h|}AcgIk|x.5JfqՖ9g {X{Oaeų9>ڊN (k$QO*Q9q"ZM5Q iRšs(r,/fq%eu skÒg!*0ub963KVZ%QqU" "AF :ru}Eâi$qh7X00&fudϕv;l$˞-hC+:Ow>5mllllt(k|d#b@@T&0d JkbۧfnJpYQ^@D̬Eܜcs arhH$H;LaL"e4hj&g4QϷT:u^xPt⦉Cϩ8ia{Lm-){t cq(J$`ɡ/nm5Ԑ~bŲ:cgI</2l|uc:i˃dg钗y9xh uѲEۓ|Ir<W #nAyIq UYrI4uLX&G]b4Vp,hF]m Rr/rGȆm>s숅59#̴Jp0@Bqė[U;naQq[Ri@yoBSfT%ܪB7-飢ZM|qw_~4nccccȮ%#f~ϓ?Ld (FLqOMd'&Vf=2hViYC9ZW'#!3;X۠ <;}[f / R6cJj<ɳ$ei@^nƅ/ 3F0"CrXRRZ^Qs T6BuN n0ɀWٰ:JZ%HMffj adxLY ҌfKgjsjygږmllllRu$~ fXk*S0L4-C>Ojވb($]93aI!` jɍQ#|kXmS7]Gtg!v'Ө;k_)J ϊ$_W Zʸi MMh !@yVQ~xWx1d]r? Qд]r8CKYx*t@Q"y [RdVN_} hD':ѹ !c[oNۧccccc]Kp;)Z ZUWOt񷞋=T %V푾#m]uJqcsT.iKc̩8*js(AJ#:/Ih,_W? hG ݛ:B7P $ntW2KT&8`4aa%5 ϭ[X\˔t"pvaM3Kf(cގ kʯDkE ,MJl2]ԋOG[X+W<^>3‰E *Sw#NqQL%柶 HCQ.%tK( LwUz+NJ&4Mִ+M Ik-E@۰-q#Xsm~j|X25a7D<_쬯6666c钉kݤqY %}.܊F&D# 䔏aZӹ媍-|ȐC 9BDi ~1IG$b <A3DY.%܌^#&1(P`q>bt'bĀayNJiU%hh7,y>#HyQqd،ͳ&f``4oB (v(1? IaD-h)A~j$-hG}k^t}xÈ L{bg1-But9?T[4) ]yO}2:9I%sn 8$BS )U?Hb,pc84Y2_ lCxs3d nh^M8B|#y;}Jn؊uQD{ћ8J'u及pSSċU^RdXPOT<31fV/ˤuق- hhBS#-L' 0EA\wr%Hq3 hhAnM ^t/s %&4ՠ]]cccyyyvbW{{vmj&ʫP]̠i1`d"u^mܳcrz6l˞ӂ`S뷥B;_>_v]\q׸sΕ/=u3*}ganւ^V*[՚53`YzLaIaT ALaBxW$e#-kɾcaY,~$f(}٣DM{g܃L9-ӄzV!^1.CֽnSd)^vNǸ=r<c p#i=B#Ц$HV%Sɚ3)<"T-T9z2}ЩhݚQu(G}|-ּn@yJ?/qaײIQR;\~G?=aRyS9FwR LM:D":#^7ӎ u[њ>|.kL[ @ƪPEeI4SX ]BZ&'RE}EbQg:?Pkq JK *o9dOnщ 3an0Os4CќF4&r8/HìN$ׯY)k0 0UӒؠAq3KF׍ XdԢ99T#%$b|̷|,_" VT/ʹt]?UԕtrA"˙A3`bt"flf`h:55zTaϲi n:5NWQu?%9L9òx9/ˌ)PKD38[ׂ|'na|ў4-҈[׉.t΢}~guG"4_>y 'E~0u1WwfKك,NF8gPӖb30P6 cƈA=  0Eg!DZdNhEk>|iRϙ48g U,>xGƨoԡiI}O]d0SoG{!ٙa>UjM=K4iĠ,%1Rz&XEsPCs0mN ])13.= ڷ((,>+.kf1[o}:v77zaADesuIWO=S2 ׶_)+L+=*o!d{ 8V:Nm;y1bńoe%vgJGxb:BD&O[5qq9#8ꋪ9frwY\PXH {Q߷&4yC G02n& ts浣=>1md*͊"|$G,t t$ՙ$PtknKĆÑy.' ?aÁf]6j;Wu[,!|gť 6׷u;r"|#<wny{?wI-2hN-ei-<9@tOYg$≮+ie`j {D]s <**.Q֠㷎'FF.m\#0VZμ^buiiE#qpnBSό*5*P/X ڌ͉&d Y~br;()(,|~qfvo ӟfε47աYojQZ24?q4P>+)PQ[R6htIr]wt>Њւ\k'|7iAK0=mm[7S8.ޱ"9qAr,QNfB}uR]#%gQ{ U $Whh5tJ? m PP.t1Mۙ*؊[cp0“wL9bg݉tLmfy[ {hBzڵko~xyٶqjlD"͘nW$Bҏ=jOvԲsuIJo]-JQ]Y>Wܿ~2i$b؊\c O`EcIGiČ<4h W{7};W$.=r9fLNE}&e7CVWPױ >O#JT?@5˛Y΂#O2HF8K"Ʊ qٮX c8ovlʌ b @0;fַqPيgf1yWsrr9燿{W_{/}^PXj՝<@__mm]W߽fMwww?O.\`b>p8|ꩧ^H!q,c_˂je]sz˖4[o''p=kx.=s?kb?ܖ8]u巯ZE nw=jO|2u}R H+0pSVXwc碈W^qp-sd2:Cq/f4`;[ OI@{@ fF(q74){uDED>*93X(E~q, Gwt5p>mŞ-9Urfʄ e7Yn\ۊ}6l^P`v!s~C?_u ϯ[Ï|3==G%^b7ƿ /W~Y,i2Gnmdxd9??}͚{6|j+o\ڳ?S۷yd;ŴأK^"=1d\pd8ԑRcJO/W\A JŒ@M%GX4af>G0B?xsл+Oj x,Fu:2` fSiAK%*ѝәXDé|HjRlb]g6qƢ,Zavh{C9 wD,{IZLyV6„)@; I| wNK;]#bLLoB|ߺpϿG钎?/vک7pCggWUU9ww8[VZ{w[ 'rjZ]2s~?^Ie6l"A$t[}[_ G0i}@x36SP+]:;b/`AO*ڄR/zЅzԯn=rbͬ^8x3HC ߳r>vxddNy䖵koaR!\.W[Ø;wn٥xUU^}}}~DfNT!&#S'o{veg&sl='ܙ΂ Elc&_n0Ǚ{0šcI&ݞ=?1aaLԣ^LeYzՅĸ_y⏠>uwG1Z.gLv!IB tF~)8`b|"P(91z[T/YSWŋh bICN񼗾 q~̄eBsCvY1գMxv|p\%>g1v{5\Oϴ[NNNKKK]]QlѢE X~U)>ի.9Î>~w;{s='|'_гdB5O#OMڎ{BM4aN ֡] IDAT :Ânޯ J%3 JG?$pRz^פ%tc&ӡ9Ry q}ǐLb&K-B{@NB(NXcJ?{ZSҦ-٫ӹ0[o!v’y睲9s,X8m>vt?YsXnn/涫>|g_~cz;5QN bi@pXq^U`ɩhol.Cp:\\V`@B0aȹW]5'avHJ$m@ K=N>#9A.oS %`򠅍饛 bł100'27Ѡŋ;\aV{ˀ?̖1 GYѬ(9{%yW=e QH jF y=MclqcknI(Hv^bHdx#(@98SUf2DP*P~uywyhWKβʽb|lllll>/pJaQo~|Yng3=P*ĥK4d!88Mn*!=l~EڪiUvcd1] 2aj ER2kMڢ{_w8-M9UwN-ncccccGwK,>eOa3ofe,=="DT Z܋$[1az UN c|a֧'"I0Ua! ZJ=DRdQY!oF0+^:wRڹ@ۨ=RKlQbccccbo%jjtW*bbǯ:u}i*mo n&2R* "CcN PLX:+Zc36`QZDrDl?vP 6+C9cv.r>2~p#ydccccic/%e\蹳x&, BB`J)S'FO7n 59|HRZJ!eL8%uf 0>ȹi Ŗ́"EmN9z5a2=I~FI.=kt YU?}D8@L03-]RGѿݭQ39c2|7$R l~ GAQ pت9(W1`(S %wN~R"8!0 懍c2D؇B" JEI|CDooaKnk'}so;^K\➇ _[{2$KsN0,&N/1R$SwDChlYQI~@! 2dD51b6Stq8T,/pWxsQV{~sQ_7f/`_%νgr4%P$h2(7suOY5X ׼RlhL5Uý185I䌘 rUJp. ^&߼^_߰^>K|ᅭ_?62d%Gaf r?T'ɘ^B Ng`bFYz/BE L'/9x7 iy0(!~&0=W]?]\\͞ξK|i/<A aV${dp͗j{ݟOp4H ;:XJ<pzZk@"Db U[k 8<9%;ǼM{wL] r}p %9¥>z20` QNM D |wW6ڢ&}Mr@@˅0d\Qn!)Us99BZƂÉ T:DVt *c2N@Ǎs?;4Տf_%rsszm=UQ@)h|eRyh0(eQ֎Z!.k~30Uܘrk7ϽzP}}ʿ$ȋ;}AAQ&JIiQا0pvSC qQޢ)+P[/|붛/&o(Ppa݂=j.@)}7.=4=%dZJ*xJ'}G53iJd[fsl<8g^r+>벱7((,ݽ7ٰ~}89o>GB6l8v^l2a>"p#uK j5tO!8`\I,8X)ѦȘO.*դluNalQbg]WP6/n;NAaeoglnqK`0ӈ=j$^y#?l\$PGCո'Ixa&HJ'0 $l 5O~N>O}G?I';  Hq3f2+n+ArMc=j{eSK,qw^t?l˵kצizmOY k/(,Zzս8ܿŖer7Ӈm(^vu^yxwecoSam3UW\~i_ܳa=<015셣O.sw9/˟pw|^֔8&Dǣ\As) Dt̗U8 2 { ozq663Ǎ7Lњ5;oZ~lMZ{iK "BAze-d++ "W+W񧢠 rQ(;B7F}ɞ1&4mtR'9s{I+WoT*n|:9Y33v/Z¬>|бϻ=Wui5ZJMy sXU!_SF&Y,pXUUU~~fBSYYY]/BD"Ѳ[law`L o476Piyzg򋵕y 9Y33̡ 8w1gépAߨ*/S\n;GHl5rĈo=KsM7;C@@@Fqw0Bݻwmz׮^۱+x<_WP2wMo\^`Κ#5xۺ}GuU%[/o{)zܵM$,ޘ;:"xYE~~ǟXj?.uq饯7wܹx=$88''Cb#Ȩ[;[W^),,zofBHJJc{+_ pqqiCo<Q|y#bg8Y3wz%NNNs1'@ۋ_{ W^)ӛ,IٺukR藗-<Ԣ 3Z;5˖7.u^r'NnZ+?2qRY*5{\.uqijllrΚ#5 pzc}fK/vt K%% ry{٢Mz pڴ˗u^ILLpF\~jǟ~75Y%:::&&V$_lg+4$tpBR0~|prrJ2g^-ڋxNbs|:4SJN~)9QuҥCY %K+PW.@]\u p %K+PW.@]\u p %K+XERT*}x<; AZ'1׮9s'$3ĞI>} U2|`u2KEQg bTJW׍h:{&ymo=z4!X8k ֗8 NK;;t:ڙmL2/4,a:'y{W^=yDv-ggW_]xɓ'*e?7 '׿޽{B-il 󭷲9y򥋥FVY\x[EnzBHrKO> VݷoC!}H+ 1ߢI߰ۻ&Q~~~GX̡)|vgSP]RҔC4888RVV0d(#cn7jPU)(hIʒׯXȡ) kgS>Bȼ]wBvڽpB/5sURVѡ1:s+V666(l g;P!=aϞ=...}g͜t鲂BV{9sv W_YC[ӟY:nmZ݈95.@]0|Jd۪R*m5k߿XBY$eȐ!/%'OLhvE >2flA&3f9u^bELL#G008(nLiZg[`;*zxy3 0Bx664\~g!Ї~ @ZQR|ݻQp?<'.;BQ*Zb$;"΂KyA^CZ%K+PW.@]\u p %K+PW.@]\u p %K+PW.@]\Bt$JWjZOH::4[qyj\ΐ #K3񭪔t/RPߐu# ݧwD* ٺ-.6;C*L=s/mHTWcBJz_8q_N0[SZl(C*H10sVt1c:t#k(䩟%$}HH$""^5g?|L(sZQ\cG}R8CJ;?1yʊ7kowt\LT9ZP>|㏧HIIɍWQ;:ؖ1֎c3 87|kIJʋfyyyE|w/IRcȥKT*{4gϞ N5j͛n[?{))πl?󰇇| b?{]Ek:nÆA!smll4YVgfy!BHzzB;vlUUN: Bg-oFѲM\V/Z88${o6FI[.&662*zͶ٩eyjNi`V>*6+WXT  zg*++ !˗?cڿ˗h\+Y[פ)f7mZyY3uÇ~rڴgOO ?oK-cgwK ay ^Ç.\` }ARfzeBgΜy'Nt2bKO|뭬_N|bii)méeyjNYV>$6+sϛu+:::-m!6~g|-!o>_͖8D* 5f[[`;f ̼ګwÇ$My!77'ˋP(CB GD+/]8Aϟ<%/e@&f:殅 oxzzEeFu1/ BIDATEtt4!D& 12MӼ}ww?7D?]^|YRk]o6יΖ7h&޻OÇw0rQQQF1]`85ӭS|Z0kZz8_,BL&{l)I9xQ__VűRaٟY%w?ܽ%jƆ³c?Sz& 2I&ѷd?2'BD"1jn m}=y򗑣F0cVo!H4*C˼5 ޣ'} ߔ/ZVZBILL4D-+- Y? a6oFѲMٝ`{F3YSlìMbp'NZU]M>m2{l(e.6nTjg͞ӷDw3LEE[ۧE=Y;((#MwܡoDŽݻ̓5۰ƛoA2BoW1yGUXؽ{!͜9{̙iiioFټax׮]v憅EbajfYSl^={972W* )3oؿxǎܱRjX[PU7fcNhߨ1o߶FV_tiY)k֬L]fԤjڴ'M<ܹ/eggk4t:߁o{=HF^mۮP(^^ܴì3.]VPXjo޼5g\f=X^_9!H6nxڵk׮mܸQ"ˉڸ~jB͛6uWVYM̪թuuukFlNtkS3{MlJJY,vv.sY ϟkΉ'n/V*ܱRjm^76M 0̢(}[Eيh9QxXuO 8(<2f'Dl{99!qM;,Y2dHBRЗ'&NdJ"?ʕ{;?ZVyu瞟T*_M͛YoÇ=<٭\"&ۈL7eƩ=ͦz6[.$$t) +VΝ;C !{駟^re+wT6>k׽6~X !?ӟ3BRY)y,qc?,zJFrs3*ڙ B^Ͼu^y9!? GO''K./-S$"2*,<{1= TJ&ݥ(*/7Vٳ7]?C *k>}tq3/QLR&-7`@1E:߿{N<' y`Qx̡F3;M &~ۣ=|@xeqV4йVOΐ CW}}qQQxd^O͉8\Z؄(6vjs3Uy9*jDPtow "ܦƦQcJ7od:K$JcX0wJc=cû3׍3勅b555 >휬[30* #yWZyXR) !Mnj/d[TE(-lxy >NSגMN~ <ĉZF.o-q96;C*LK E}]]DDJ kXc\^^oDTD2_G%*&D"5\VZ7>ŵ\. 0b_RZwKJt$o (-.J] M_[Sjf'$ UWST)cb3)~ WJsDj!lM柱g4EQZ.ojlohojlTT%SrlvT;Ej/‚H^V<zu'lj]TJH,˛GBMM,A"TSU)'CtB4BH$(DQٯ0d{(U@ӽoWյV׋|6H3g{w456k#T*H,VLT!HPE"5/4x< ӿD`+;(_mvnq%LVqqtM^"/[i&6Y}zhsx^YWmM 6JVq\x^jledk7$ 뙻~.ddK3V]egݤzRy +z%w*ew OH$zKld.]=ztXDڗF)*)d2_$ĨҢQD]r呱c#"::{ 1Db 1ꀄhw{ EUTwtvZ[WhlCB !-%|>z@4B:f"!Fz p (z7"Үm5\/@]yxx<7olm+++멧ڵT*MHHꫯ::"nٴiX,޴iSGP Fh G9c [F|6;v1cܼyz֭h-$#ĐN۹s;Sk.NgKmC_~[nBt:ڵkܞꀀ2 1Lw [lD V|;=_~Ŋbx7$%%yzzN4n wJz*ݮh/_yf-Wѣ .>v. 7m>gJe6zh&;wg"f.M6BxK.edd8;;zyyM:uϞ=L={L>Ӵ3'#####CVk4rŒf'N}˹׿m'|Hzzŋ{ /u qU/|hR晽 /`>}:,,,::ȑ#111{ 08;;;111;;0EO8j3=rQQQ`` s*J>xOBh b7nd2gf^ YTTԵkW&0vFbH+}F+sR9gϞ{tC IHҫWo//5kRڙA|g} u?HX `zUyjuGbW>eHn 𬭭г>7mڴ'ֆ% ֽ~۴ʶ:Xb64Ή-Fa;C|i~~~ҔɶGh;%m"pmuG&{Ή Fa;C{~=< F]E !F쐐JC3[9_KEQznW._q{xYl 1x Good ViBrations"> ]>
Good ViBrations 2009 Pietro Battiston Pietro Battiston (toobaz@email.it) This document is made available under the Creative Commons ShareAlike 3.0 License (CC-BY-SA). This documentation 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 AS DESCRIBED IN THE DISCLAIMER. A copy of the licence is available here. Pietro Battiston GVB developer Gvb manual 1.0 November 2009 Pietro Battiston toobaz@email.it Pietro Battiston This manual describes version 1.2 of Good ViBrations (GVB). Feedback To report a bug or make a suggestion regarding the Good ViBrations application or this manual, please use the project's Launchpad page. User manual for Good ViBrations. Good ViBrations Introduction Good ViBrations is an application that can simulate 1 and 2-dimensional vibrations. Good ViBrations main window The vast majority of Good ViBrations functionalities can be accessed directly from the main screen:
GVB main window Shows the GVB main window.
On the left, the main action area can be seen, where the simulation is visualized. On the right are the various controls and indicators: press Start to see them in action. Speed: sets the speed at which the simulation evolves. Step: in those calculation methods which operate in discrete time (see for more info), this sets the time between an iteration and the following. Notice that the lower the value, the higher will be the precision of the simulation but also the computational effort required. Below Step, is the counter, showing how many frames were calculated from the beginning of the simulation. calculation ms. shows the milliseconds which were spent, on average, in calculations for each frame (in the last 2 seconds). drawing ms. shows the milliseconds which were spent, on average, in graphically rendering each frame (in the last 2 seconds). Rope and Membrane allow to switch between (respectively) 1 dimension and 2 dimensions simulations. Changing this will stop and reset the animation. Below, the button Start now shows Stop: push it in order to stop the animation. Calculation: sets the calculation method used. See for a list of methods and their descriptions. Frames/second: sets the number of frames shown per second. Under 20, the animation can appear choppy, but over 25, almost no improvement should be noticed (and the computational effort will increase for calculation methods operating in continuous time). Graphics: sets the drawing method used. See for a list of methods and their descriptions. Beware excessive precision! Speed, Step and Frames/second are key parameters (together with the number of points used - see ) to determine the number of mathematical operations the computer must perform for each second of simulation: if excessive values are chosen, the animation may become choppy, or Good ViBrations may even freeze, becoming unresponsive. In this case, click Stop (only once): in most cases, the interface will be responsive again in few seconds.
The <guimenu>File</guimenu> menu The File menu lists some general operations: FileOpen: open a disposition (the definition of points positions and speeds) from a file. FileSave: save the disposition and speed of points to a file. FileSave As: save the disposition and speed of points to a new file (if you still didn't save any disposition, this is equivalent to FileSave). FileQuit: exit Good ViBrations. The <guimenu>Disposition</guimenu> menu The Disposition menu allows to set the shape of the string or of the membrane at the start of the simulation. This can be done in two ways: by choosing one of the precooked dispositions: a collection of them is available, in both 1 and 2 dimensions, by opening the advanced editor, also available for both 1 and 2 dimensions (see ). The <guimenu>Options</guimenu> menu The Options menu allows to configure some aspects of the simulation. OptionsNumber of points: change the number of points used in the simulation (see ). OptionsSave frames as png: if this checkbox is toggled, the animation will be saved to disk instead of being rendered to screen: see for more information. The <guimenu>Help</guimenu> menu The Help menu can be used to access informations about the program. HelpContents: open this help. HelpAbout: show some informations about Good ViBrations.
Changing the number of points In Good ViBrations, the string and the membrane are approximated as some points connected by straight lines. The higher the number of points, the higher the quality of the simulation, but also number of computational operations required to perform it. To change the number of points, click OptionsNumber of points. When this dialog is opened, the animation, if running, will automatically pause and, if the number of points is then indeed changed, will reset to its initial disposition, since Good ViBrations is not able to change the number of points of a running simulation. While in 1 dimension any number is equally acceptable, in 2 dimensions the points must be placed on a rectangular (and almost square) grid. If the number chosen does not fit, less points will be used. For instance, if the number of points chosen is 11, only 9 will be used (3×3), if it is 14, only 12 will be used (3×4). When points are too many The number of points used is a key factor in determining the computational requirements to perform the simulation: performance may deteriorate very fast with their increase in number, and while some number between 100 and 150 should be acceptable on any computer, a number above those values may cause the interface to be unresponsive (depending also on the calculation method chosen - see - and on the value of the others parameters explained in ). If you want to observe harmonics, some optimal number can be found in the following way: take a number with many small factors, for instance 2×2×3=12, substract 1: 11. if you want to perform a bidimensional simulation, take its square: 11×11=121. This example will allow you to observe optimally the second, fourth and third harmonics. Drawing methods Good ViBrations has three different ways of rendering a simulation, both in 1 and 2 dimensions, accessible through the drop-down box: wave/3D the points are drawn at different heights (in perspective, if working in 2 dimensions), resulting in something indeed similar to a string or to a membrane; speeds is similar to the former, but it also shows the current speed of each point, in the form of a red segment oriented in the direction of movement; geo shows the heights as a geographical maps would show altitudes: points are represented by squares, with colours varying from dark blue (lowest points) to light blue, green, brown, dark brown and finally white (highest points). The advanced dispositions editor By clicking Dispositions1 dimension: advanced or Dispositions2 dimensions: advanced, the advanced dispositions editor opens. This is a window that allows to configure the starting position of the string or of the membrane interactively, with much more freedom than by just taking one of the precooked dispositions.
The advanced editor in 2 dimensions Shows the GVB advanced editor.
On the top, the Graphics drop-down box makes it possible to change the visualization of the disposition in the editor, similarly to what could be done in the main window. Notice that in this case there is no particular difference between wave/3D and speeds, since there is no speed involved. The advanced editor works by tuning the parameters of given wave shapes and combining them. On the left, a preview of the disposition makes it possible to see changes as they are applied. On the right are the various controls that can be used to tune the shape until it is as desired. Dimension-speficic controls Waveform: determines the form of the wave to use: can be sinusoidal, triangular, square or just a peak. Total lenght: determines the fraction of the available space on which the new shape be applied. It defaults to all of it, but if for instance the cursor is halfway, the resulting shape will occupy only half of space of the simulation. Shift: determines if the wave shape must start from the first point (default) or from some other point in the middle. Notice that if the wave shape is shifted, any part that overflows from the right/front border will by placed to the left/back, in a sort of rotation. Wavelenght: determines the wavelenght of the wave, which is the space over which its shape repeats, or in other terms the distance between two subsequent peaks of it. It defaults to exactly the whole space, but its value can be tuned down to 4 times less and up to 4 times more. Phase: determines the phase of the wave, which is the offset by which the waveform shifted. If Total lenght is set to the maximum, this has exactly the same effect of Shift; if however this is not the case, it can be used to shift/rotate the wave shape inside the range in which it is applied. Amplitude: determines the amplitude of the wave, which is the vertical distance between its peaks and the rest line: defaults to the maximum, but can be reduced to scale down vertically the wave shape. Centering: determines at which point the waveform must reach its peak: it defaults to the middle - resulting in a symmetric waveform - but can be moved left or right to increase the slope of the shape on the left of the peak and decrease it on the right, or vice versa. Reflect: toggling this check substitutes the wave shape with its symmetric with respect to an horizontal axis in the middle. Those listed so far are properties that are bound to a single dimension: hence, when working in 2 dimensions, two instances of each are available, one in the Horizontal column and one in the Vertical one, applying respectively to the left-right and to the back-front domain. General controls The other options that follow are instead general, applying to 1 or 2 dimensions. Invert: toggling or untoggling this check inverts the wave shape, hence changing the height of every point through a reflection on the horizontal plane: what is above will go below, and vice versa. Composition rule (only enabled when working in 2 dimensions): since the dimension-specific controls only result in the definition of two particular 1-dimensional wave shapes, which will be oriented one from left to right and one from back to front, here it is possible to establish how those two shapes must then be combined: product: each point's height will be the product of the heights given by the two shapes; sum: each point's height will be the sum of the heights given by the two shapes; maximum: each point's height will be the maximum value it takes among the two shapes; minimum: each point's height will be the minimum value it takes among the two shapes. Add to current disposition: if the number of dimensions we are working in is the same as the one currently used in the main window's simulation, it is possible, by toggling this check, to sum the wave form just created to the current state of the simulation. This is a very powerful tool to get arbitrarily complex dispositions, by just adding one wave shape at a time, possibly each restricted to a particular section of the available space. On the bottom of the window, three buttons are available. Revert resets all the regulations to their default values. Cancel closes the window, discarding any change made. Apply closes the window, applying all changes made.
Calculation methods Several calculation methods are available in Good ViBrations, and are accessible from the Calculation drop-down box in the main window. Warning, technical details! This page contains a technically detailed list of the algorythms available in Good ViBrations, and as such it is probably not understandable to readers not practical with the mathematical concepts used. Since it's not necessary to be graduated in math to use Good ViBrations, here's a smaller and simpler summary: naif: unprecise and slow, no real reason to ever use it; naif matrix: identical to naif, but faster; quad: more precise, but requires more computational power; eig: less precise than quad for very short animations, but the most precise on the long run, since it will not introduce and amplify errors as time passes by: however, it must do some initial calculations, which may take a lot of time and make the program interface become unresponsive before the animation starts, if a high numbers of points is used. The more detailed list follows. naif operates in discrete time: it calculates the position of a point at a given iteration roughly as the position in the previous iteration plus the speed in the previous iteration multiplied by the time elapsed (which is given by the parameter Step), and the speed at a given iteration as the difference between its height and the average height of the surrounding points at previous iteration. naif matrix is identical to naif except it doesn't calculate the points singularly, but considers them as a vector, which is updated iteration after iteration through the multiplication by a proper matrix. It can be considered as a benchmark: comparing calculation times with naif's ones gives an idea of how much the underying scipy libraries for matrix computations are able to perform better than native Python code. quad is similar to naif, except it doesn't linearize the calculation of speed, which is no more calculated as the simple difference in height with respect to the surrounding points, but instead takes in consideration the "real" distance, including the horizontal component. eig operates in continuous time: it takes the linearized problem (as naif), but considers the associated system of differential equations, which is determined by a given matrix, of which it computes the exponential: for this step to be accomplished, it must calculate the eigenvalues and eigenvectors of it (through the scipy library). Once this calculation is done, it simply multiplies together the resulting matrix and the diagonal matrix given by the exponentials of the eigenvalues. Saving frames as images When OptionsSave frames as png is clicked, a dialog will open asking to choose a directory, and the frames will be saved in that directory as png images instead than being rendered to screen. This is useful when they are needed to create a video, or when the complexity of calculation involved is simply to high for them to be seen in real time. Clicking it again will untoggle the checkbox, and the animation will start to be drawn again to screen. An easy way to transform the produced images into a video is the following: ensure the program ffmpeg is installed on your system, open a terminal and move to the directory containing the images prepared with Good ViBrations, give the command ffmpeg -i %08d.png video.mp4.
gvb-1.2.1/help/C/gvb-C.omf0000644000175000017500000000117211336006273014434 0ustar pietropietro toobaz@email.it (Pietro Battiston) Good ViBrations Manual 2009-11-11 gvb-1.2.1/help/it/0000755000175000017500000000000011336006273013224 5ustar pietropietrogvb-1.2.1/help/it/figures/0000755000175000017500000000000011336006273014670 5ustar pietropietrogvb-1.2.1/help/it/figures/main_window.png0000644000175000017500000006260011336006273017715 0ustar pietropietroPNG  IHDRv̖~sBITOtEXtSoftwaregnome-screenshot> IDATxw\SOeC[ց]XqT:jV[sT:Pn Ȓ$lYDž4@W_7sۘiP2nVB!:<E׀lڈBH˱'WOf%{!~eIerVq-MՒL 6pio> u $rE!DYyoE](gZ|o] 'cflG0-{_&>1595P_O IS(oT{ekc}*d?=]xjj !1峏8ى=ݽSHEÛ tlmBB. )bWN^'>pt,:ٻ{;)60>MS 6mbfj 3+EoܴJOZ<*܃r2{aЀ'n6*ҏ<$Y)yt>qSQR^ſ۷Oǣ$n s;ݶUS9Gii(=;n?mӲ 8buii-M G.?VlT{eo?w~qɘB #))Pz>Un;X]GjagiSWZ6W1-Mչc-zDžǢ\&΃)/AGqpX% r~:0 d!:ڙqGqSמ2s3Yv%r]~9lɟiGWRZVi_yK?_l=/Ztp&qc=rg)$=qptp]Z;m:oyg7oDOOO,}ШѾ3%)/F|ܩc b{K%TO]M7|Qaa!5וH¬<\$1c[6U3_η6dz(C2{VO[[۔޸E+ay~aiճ.yc{ɭhԅbu G?9ڸmcI.3ui- u)#MJO=QX}" lj[ ?h`fpiVQF͚W9mlŶil=_kAXt\zn?Vf>roL #_ZYZru\xMk-.3{ϒ߫F ſ}'iQ0Iג8ů12|NF<[NLR0]Z)*xI#][ ڷU_çNJNUي³qAv?ElX*rQ=U\R(bQZu=x˳ *91`-}=.A]ݻuݧW(y2)W\.W{as[=2 ԯ\yܭɯCS_أ.5ڨ #33e\wWg3[cW4d]޼I+uuuV|5Y99 ź:66ׯ”7E e Me+osRyoM }d ϓDlbd_Fe-%=Hys 6|k_[;[;re?MKebjγʦlw5Y}мY[K E++K++KTh*Քy7ȊKߪχkۊBjBDߨsqlԨY?U V/Bhdûph98R")=uQz`wڊ!/0`1_(/T. =(yBHe ':͍φg(BB.?!s$%y%!RP RamG!<yB0JB* N[YئI-!G6UGb*zՆݝ@{ackMjʛEn8{Y%m%66oV޸y@gА-ZߧW^l9MjJ%6G*p& U}IMIMIw7շ*իQ2`wn߽s{2իWڎlr|_fů&/mdB)UO[dWi٪یrs+?|JFڴijǭ[^e.^ѳwb۶j}@h  y4iѤEWo:::9>W6l8{I>5666664ٳgmܴIs`6,/@.\hfj:bXdrH咑#G*]j`)k ~k la;uTaL_(KU~ ^sDm^*׬^mgggddӧ߹:*ioD"wX7VVVVVV+clr>jcǎ)_ֶQFsf~ALOO[Y)"XW۷Ya߹sgĈ~Νu!ZBHTKó ݺ٥M[OP񥥥YXX._ӷO.{NQX@ tqqf]JQ RA P9RӥAKHuJ_D.nv.n"hﯿU+ B }*JQ_D"H|#GC ꫯBP( jaJ رs߾999999߱c_.^-]ʷwڭKn66K~Jƍ?jΫߧb|;{gugɟ}Rgݫ\i3ӴY!Cu]Q>g*®LU8sfmݶ Nai(JQk# ai'%y.2kwpT)_Ò[-VvR{+y̯I͢ ! P *)u팿F!FyBsA!Б! {# u!4p-ZV,e{ٵpiҤq5| <! #ǥfi;ZaKARTG( Q sR)[OklA7mU޻޾}{Rd2vtB.9(^11|ŀcbWlHɃ_!jŰ "&&/$$8=]H%Q T= )gMSi0ZaWLhhիfϞmhh8{իW2J6k4 -Zs;F偯C\&\YNӦOUi[XX8?0=0pbjDڴY3۶og V*bO0a1BBobz07_/@դruާ~Q|֪ %R i۶ɓ%Gm߾}ƍ~w.>}l``b7*mW^z+*2*fbR5k~RXd& +P8s5~Yf>}#$$?V&zrjFMx&3vinTZ|٣d;:mEH8_6l(v[6o!{{{˿ʷG Unxѓ'naGX5?]! Knx<իWw~bEtQQ]L ...Aě7oeZ͊{啺 t9=n0 Ҳ :+&z2212^\bN\uuMI9eY_H$*9KJAHp + b^>#Fttr1s ?V!|kw:/[ƖxqӦMz޻Jӷn[6:996ܧO}DMnz-̟\_ :Z&5y;vH =D9oi_)O0lq &jH9nۑ. !\NvC? F1Qz 6]F3fp'Ο?nؼe~oӦ [s/X )ϻvsBGZn}cƍ+33?hݺRtڊB.F9֭[q2=A! qUVa/: 2JzNǕTCԴ<OaҎ!>pfcFuڒ232--VAthbR1-a<ԯe2##o#P,JLWO]3')ՙCj@/g x'+[܇<!Ac_Y7Gͽqjvv$:mE! 0 Zm2N]kGGp)->nۮX*wtjѪ'.<!j)511ݻ׷~keiݐO_sGgj%# XѶuyt䣣+)E.AWtAP  "o/XPTĄ.|;w%%@gNNk[g($'J$r\dP<!ZfuXX &:;3F(uΟЭ};PXXX8?0=0pʰڒѤG)ɥ'osEB[%6<!P?~Yf>}#$$-3w%KNF vϟ=+,,,,,|왝bg؅~*^2u%/lhtAQg!!'O|cǎ 丸8;vj( r 64x2|Ny#8::98%̌ 32lW׶b艟dHK`9nۑ.4X:wv GNv={h޸1{J8!5{7JMI~۫/F*vaYY_kyBxwNLtz=zEq(] K9}OF=zeX )yB)b`hѧ %9XtڊRq\75d 'AɃRq\cc,CCmR+&*]i+BH}iH(h+!';㇭ڴQג<!A'dSPSr\cc6yo*A8\.[[;:<!T%B!FɃBHQ Ra<!T%B!FyB'sݶ[(yB'ՊN[B0JB*! A!(yB0Jwj* T~Hׯ! 3b1 |>`i,t+QV@(<>^^=@,Fr2D"ܾ ݺOoBJG/#.Çq60|8֯G.J"r6`xxyO0f \]k(lB5 G_?cv /pBBУG.z@Hn‹2۷Qd5$K+/{wƍѱ}^=zV;Bv۷_sbN[UD" mڬ{cm۷q&Ltvqw=fP(,Onn U+au6yص 5 8v /_b4br|cǐQ]R+]|/_>oip횵"+5W^O.ݎNNNf Ǐ0ķObcc{xxkRSRoEEFELLJ\fJ2+ 3k"! K+mS ?@Pѱ#VDUg(`Z BȻ"/uꛕQʖVgOXXXwtrV~&5@[v>4h}}n䉿xOgjG۴<~hƍ߮ד'=ڪU6'OnwSnyI޵yDEkWj͛8p ƏG׮ TPT*eݻ',R^;sҜe͕߼ySNddN.V|G'gQzzyZ E@ʬ@jXI?;#2Ÿq{4`8" #7HH5OĮ[.0p bAx©=|p_(H{a[Y)au$yDDMlWW\[al\C66֭zزm "6MHU>}Ɠ'O$ 02TQ^5Q#G E"PlYǎdiPrrrVVVpH[XPP``o`Rf#/[, Baвe#GPiUfRj}J=ܽ.]F.{CϞTZv+BjNlˊܱSse˂L<=uۭ{7͕\i&=zj-ܺesHHa}:UHp0ߚݡw˖*ayj*ƍåK02®]7Nb W/<[[mD ]0'D+jѡ.]B&qVd 4iKС_v@5yߏ޽?͛hJ)i 7o޽!}ɃaW4 5 O\1`nӧ1k 1i %n)!z%SbJX ;v@;j\S:!M#?#F`^p8gq`{1b!ԄZ<޾NéS۷U)hv$l 0a*hh> ==adgk; BeN-H8WBOGbPmT)CQU HBs@фQ G^pZ*??->_]??i; B.ZMb1 Õ+oFjF}p @HuPeV.u2lU͚5wpt6}znyAAmE'V={j~mfXZ-[TmX4r?ţK(.FرСP:aZcѝcamGCʥn{"} il9.~EB5<.^D@tꄃt5 p" KUfR7=eRGMΖ9"4+(]$J -sѬPD&0r$d2)4jT[y)B&ȑ(]P}s@YMżΝ}F2?lGcɒb-d nơCؾ^^6MR[̜9cڎTLy\sm[ppgڶsisBHVC aj#GU5j#G`j Gn"Yՙ7>_~ k-C F. |Ϥ)nzzzzzzn?2ͻC s4ˡÆ#捸W߮_w5=iRI7oxԨ7Uk:˪N/ ޹3](ʕ֭awI(,x֮Gm۶m۶mppp~~~^}-޿fb޼SXXXy{{ݳg5ZZw٦'0a1cyh^*̽tj_8x<+KÇ8J岄[YNSnv^vN¾:$$4if=b+mQ]UJ@!1 tuq LM!aDz?Xٓ]XjU~~~~D"޽{WZKѷtuJyʕ#J1aa):MR;~Yf>}ãn#G;jJVw䈢5kuE\500011 [I{Tourrg;een-VVVk֬#G~Z{{{##_}u)E}Z?<Ķ555]jZ =WK;v 8WY 8N9z4Ç>\jR[DRWiVn(],N΢r|jSqJfjjq5<)>7տ9-h"EuݽZ7oh3XCUGl,-WWlV5}6(۶-ZX-C2]o@exsmJr\^}D={*&?W/,^*潤p4iv͚ţ&Hx5x^u󖇍M||<"yH$8yy?LLφC^&NDH]ۼy#LN_'\\.Wnkx/؃5:ŧB&~2oCOq{ttullNy;:?SSٷlסC'2h/K X ZUI@ ]VX  ,^L7_ʑdr]{:sy< gR$/m-O[h/q,~ |}1~UD0~ј?g yyosssrbR9gP䑑i002ž=4nnUg06 uBCeǂHLuиqDq! !J%'w/9s4Rl {ImGC!t̚r?O*?995 ݺB1%ɤ2*.xɢ/߸aܪ"46lYHN_`>mDjD"IJL|~]"rMMLh@L'Ob~3fT]D3p0.\=Cn$L&HKݻ[cݐBD"ĿzqeمU5VFFtª'Gg͢;LvΝ>{4AHWWףi}=~K*<.,:av-9nnXp!5a3ҝ]!䜙!H }ܹUl\:p݋cif@.xr9tu{7aM<v.rLBAGoJ+WMh۶"m/X\h&bcǎ*0lJJju4&wa4oК !4͛ {WѐH$D#}}ٳgWmV/rO2!}jB*B_\H$L2kkܹs^z5bsss##utuul榧oCe R#:@Ѩ|֭Qh|!D8 6l޼yIIIM6]xNdddddX,feZn2ыX& ʺu8qX#FД*!K.۷/{VPT۰aNQiɃa0k`pLlرC /fG"H&&cc>}l}aa͛7CBBݻmByt&Tޒ2<~ <"5x0FơC8>v@ʕ~(d+eO'Y?466͵wPC-)S䑖V$9nHl݊s琑 1p J Che(VX\GӧO(AJ\0?"lT 6nk;RsSf]Q ͛УGOS ]e%y>woLR42#, bD HQ233J?A~~+1c[G… .\R"<E`vM`[]lDF16 srssx囮$y%Rb_Z+tx+VKQ cff& h8 R;PG};PP3p2W0 f(kviƵN>\.$!3BAZTv3:%e ={0u"eٳaa0n B%\ξu6wndge]%<̬uVʫ(y;7!a"0ڛ7X,-p8:zRa(yr:z*<kklڄɓy7o22`ӦCtt]sUC.Ie2kx\Nsm۴LCm`d|Q9_3g4jԨ:k ,PSسgOPPХKnܸqҥ={hA%d&@P^v4 ƫW { ]suV-[b<[Lrf͚;8:M>=77ŇV|Gaa@W7wW7ŏş8:97oTt2umK=H$!M5so챭x’ &:;3F(U'xlooobb2a„\1S~~ԩSMMM7nܨ[v.((ؽ{ӧx{{>}zeeQhH͋lt&0 OGn. s72d@ >xbosnX' V'DB kRSRoEEFELLJ\f-[vZPtvLQԵ-o}r),vLtrr2[8~Yf>}#$DR[[yWXn]LLLdddRRA,_<++oߎwc4{yy)J `Y ð߶j=n"ĉ ΝعhoOXWIREM  }sǏ|"g 6*&y󆝝lggw+*RQhK][M/{{ț7J+^,-Uz(4廍2L.ˉ6662vӧrll.bWÖ6|ݷ̙հ+ e .^Dr2/GM_^=oo-[*رcׯѣ>ڿ򪔔]oKN.SEG$iiiΊ2+S׶To޼)Y'22j7+ݻWj*36 T*QԪU+[#.]HMMflmuWO W99t'3;w¢}͘1}Μ3gS^ecc=_BAZ=v9>>ʊ]V+4WmlllU O} -KėVeƦFμ󲵵}$6''}eggkkv9.>^Q^_NP.ݧo;wz雗e<!CpW#I۾.27)ʗYS&O \*.N*>zxlFlYP( A˖9-5rdHHP$ ˖Y_;v̒AYYY!!laAAA|BBlUfl*0FSN KDɓ'(+iԨQAAޖ. B]_x'G__& ><&&aÇ$}}} =(P}`Rxh/QqtwUb^>#Fttr1sߠkϝۧo?ōO!|kw:/[Ɩ/[djfٮ[wnݻ)UW_rM٫wGGp!!NNÆ SVeƦa`.]:<_Iv!$$>hٲeN>;vխT.8q+УGXb+s%qںmGH²CTRo=0EX ^ed2pp88siD]}2i*#.,<gŕg|ݻw0ޝ]}sssJڿ7?qD =!CHJ|]tр3 <7k;zdGgάP էi Z͛`?A衖( 0a͛7&LPQh6l(5$j;zC7Ɔ ڎ(T7ɩC{UA.pss+gV݆4 ׯ[zHňŘ4 o_yư"5=h3g̜9C}kbOG ^.EvcbbV@L ,].]ʪMjR_.(Cȃ˗1hq )]D֯oo,_h;9e׫תvP .70q"ޅck1q"d24jQѫ\n\hiڬ{Kmr^1$h7@\v4uܹ&'cff& P.[p8 J:ǁڎN9pSCKj צM"ޤdrm12MjkךlcQ))3޽EY{;"A(x- 7 =۝Æ 0f wC|k22( ]ӂXXZj J{1%'ggm C_6 %%3|N 1gHL>)PrVj &YYԷkVwGh o޼rD s %7ooϏk֦PEEH簵uAT2ٙ~0WW]B /[8IOT1y2V4DE麚&*f+0y!moKׅP JC.j)--}@115'׭ú8|://z>B٪z=}cGVVju1<~R) sBcs5̝ A lvgfeM<&O'!) (+̙uA:UY3QVCC$%^ ,oowFFRGa zQe dg7ʷ4xq7@v6lשmPdcc%KDEEgdxP,XPGRRͪHJ,XobjhΗuuޜؤgϞ0`ВfA߿K/vglHV惇sUOT͝3_#W㫯t]M+^ ᣏtUEiIќrӳ9_I-^8''ԩS]t Qbٳ'===%%%99̙3u6O"5!iRw ÃJ%낚QNTzMLͶm>p`S^z[YYUBmbj]\]-njcbnV/P(?ٹ킅 >|~W8,, >P.GFE99;;uܲu8q"w}ِTU\X_&{+4֮_6mެ.4DbbWNLMMΝ;jOJJ077777HR}|ZC.B6;A ffѭk(n_~u2t놃[I̬%E/^tJnnώܝsTÇo\י3}8_޼q}ڴioG/'ldd]&q-$bŊ)'oؐ{%%9|Vfaa16v\ƹoZfӧO}׼kZfmiIYiT<8>yի R=4hЕ+WoHVaQw$4d[6ibSks$&LB77$'cG]Ԕ*+鉌 HfXtZ߫Z9JKML.]̱ѣGC r%W5WzjҾÝo2t{ܟ/8}Lt{} A5e+k8po߾ px!ׯ_6}ŜlU~ڣGZU t>}TMw~]t];iD-ܹӻwZ{]U***SoqٳK.S%N:UTTt@EEENjH֥Z^3O{Gu9mE-Y8|oj[oW*|s\SR\w /dOȫP=:t=^]~zf^Lz~~sf;z;ro|ɐ!CԍNNN5_lHEQyPY}{c:lXF4HUUQFF>pơͼ˗^p!_vmt. r\.A2eee##U3fL_juIIIIIU||fhjOddTIiiIIɪUb)...&&f߾}l5kܹsΝϞ=[-kkiPoդRwÃ^D[1s&ZUsؾV̙غdY122nڴnb/]6r>6vyOHww'JN2ylzGG}v-|_^~cp W2s>u ժ~VֽCƌ7fuh.((~@PPȑ#Uϝ;7b^偁A HHH sj2qR$$  ) P(0~<m s0׉w/''Eu]ȋr¼f͚>z-%p%rrr×-MHܻ؛gwx q&OFj*́f=hĜ9P(8tҡ+))) u]߿_%4!'...{vDw}_b3g?cG=ѣ!G꺠?QA&8z_0?s¤qބ{{ 5sԔ:w_cXdi;> d;_Νu]QsԚ$\$~kе+0kZݚ II5 2<=7UQcJJ3Vg"fP HZ-JRZv.5Np(NuA _3[5u*E4I,,, nu!-*?߽gbbZ+xq ̓ `B꺠…̛al남7ĉos\w/UmT*KKJΞ==zZOj+jTS"&u 6AE5Fh(oD(DG9HCg~_udםO,,-w}RԤ66jUH{pr‚ؾׯc>}^rJZSOKzi{&X:{{c`=2Ξ=NBl,V(/\?щ!S?W|UbxP399Xyy;aa(/o./GXƎE^.ENƌy(j3vv_vO.ldxPs7"=nnش !1iO` ѯ6mu9iFAZ mޙN)P(7 3g~$/pwG@ 3gdK"$U؁bL77:F{KCpsäI(.Ǝzq1>رc\]];_UUܱ* vĉ|tLN>YR\ pEW'T%Ūz rs$',,,T5>2a„4nZl'~jjĉL6-,,i={ٹs;wѣǺu벲222 V\?(FFFiiiCU :4--ȨGh7ѕi\bܠ7}2gx'FFFQC EK/ļڄ ݻhѢD##曩U݌cbbM2%<<\__:..ɓvu1k֬quuݼyd͇ANٳR*34/X>#\{9$ZosN޽k5:B˫{̘K.=ڳgm>-7WcTdԿ]QQSqUKJי3񅻻y/㪂{ը:70N[S^^^{k`7_09%Ey7oh?lnngJGǎ8ph #_}էOJA3gnW>xPVXX <eV lٲ5,,ThaaqJny2j!՛R葧׫Y/[_z#-G j"V3>~Æ8y2UUUFF:kok?LeIDATeee##_Nj"7~+W ;w?Uշ=zԡCCCü<5v//;vtiРA7|344ƍrŋw^x&C>wYYY dffN>vA41<)[[oV)6C۹s/?ekk7mtw7wG~wr'066/p&P᫯zsNѫք͛W\eaa9e%K0uKxQFNϟ:uj#ol| 'N˯L49:::((H4IBCe=ML&r:-eqe[j=~oKdLۥF3.#޽{e7~iZ=퓸80'O5m*t@``Qľ? "j=Ү}^AD?y0_ָÃ8==z'Kj_BZADmDҽ{Ғ3S"y*}DԖIJ?s}Y/=f]SS*s?6аDԖI,-\p>AYݟE*veS3<-H$ A`x'74022 OoQ@U)""za ""ADD1,ODD *N[QCg8mEDD =G*N[sԝ=G*N[ѳi=*N[ѳi5V3mUp7ADD$4dk "V-&,SPIENDB`gvb-1.2.1/help/it/figures/advanced_editor_2d.png0000644000175000017500000017451311336006273021111 0ustar pietropietroPNG  IHDRc,'[sBITOtEXtSoftwaregnome-screenshot> IDATxw|]vҙ4ݻ=ABAL lPAEE=f~\ iVShZ>W^.O'˧=y*y}B!ڻjS.0m -wEB! w*?M>%vX5_veB!IqHNfrH|<g{hP*&.;JUõ!B1K*T.w26ZE&vPLWauj_!BTheUIO >ewKߪ@zDe6/,”ײ*AYB!Z:1≾G~%3 TZYXוsovԊ$9]tf0'US"B.GB%'޺pį?8|6SLiZWXPp1 յ[_[y@n/jjo/tnf@0PV^R/O@'/$?8^LfNA^ANa!쨕 -vVnn@y-ުEDVNFD1Qa^0W_|^PohPSbYǺj6d |+*<˭2D5Q%օd7LyH}"2TCWH^(8fO(\gj):l֣f^VNJPv(MI¤^ SKk7S~Hu;m)8/?ә.ԠATܘ8ġV[PBd766$A$M_.3;.Lyڄvc[/3ۼ-}OŌ~ol֓whZVAp_ʺº6a|}|xXݷsHs=8$ݩU?L;BzTiPXSĊ_pPXa's<<|~@ܳ}2iagc4f}ޣC%`?)C3P% FZYi:9϶kse6Þ_G0 ]1QJݧبC^klzv_pqȕ_OJO(”?DE ~R7N_N:uLڎxz+86[o$bG/ FO\̈Gց;d^C!LJwU ,"6np00LޏH_#2Th=Fhuo`ūCJpoR٧$ 5 nxYۑxHZHInBiV7#S32BS__c!o N[}ĔA%V4r/ (|>fJS&P5!|~@yET@%Lrx!9_l9ۅNw?Z(ej?d{?{׎Nds٩w3?ys/)?gu=|;Byk8|Z7-uWs159ط|p-9{a.j8knVLx嘾)Lj_u=e,ywDwF^Bilfԑr2Φ}|^'.f>-SSm #Z!IMO҇|v*.^h]g(+9t6&($"~6gIsQrPa]0 ;B5yܗuYD5yHvؾsld$G5lJW&»ZgBqTs*|[E-c" 4#IM8mL HT=r-2<4)%pV*gY0̡I%|t%QU+<Lg:Ӭ?{ͻ?+9s#Soo_$ TR7}>Ndsّa﫣: ͏'o۬ۉzH*uЎ:vhg/TsJ ~))e.M[6Bҕ $ ^2'()CNHViH /]n^(z+1M:f&?`0x\L'gYNms춃]g~,.Q(ZInQޯiveeUvnN~~<{{q)ˏϏ[d7?~:rUus>ǷVvNTD1u:f1~0ݢjmժ͗^^;nufT*Jkܢkdֵ7IL*'ۉjRAIoTպ7zL!h ˏ}@*'#(NT@Z#C,bj~Z?hG8Wd:QmR*!~B͗JzJ"{tJFJ!j˪8;]y$B棕 ?WRtucB!!9ٟ=#B! C%B!0TB! C%B!0TB! C%B!nj JJO[ zI𖐁pukBRjKT_/V;e8{wm]l tusB豆RWTfPmN繺EZt(qBe0TjƓ??Cn\?WWwߛP !\u7z;vuCPt*DmpB*5 |>ݍ3=1T:vdxɓ'"x 3gHINJJF a*fڤ?O|b^^hNV}s{~exi?<јMjBoر)cNS ESSӷMtb9Nl6ݔɮ]M~T*U(S/xwŵkj5_*,, HS `4WVVV~3_9piHRD$$n3f_t} `a߾/o8>=X)C^jJzÇh:5 ?|u\JTNo\6!؃}'6nj[o.tkeffFJuI{ZP(YY,p\|kI^^^yyP3pfϼl4 ׬|k'aa4jkW/[W_.|sEq|>S|&W/_rҋ?I>Q 5ŋm߶}WVVVVV~۷m_hR&4y=jM3&neJRT.Yt1kLMM5=d;uʔgd[n+СCbrРlG̢#L;ytSBBB~hNnΈ#C:u駟63oټ)!!1$$tk^hQLLw-8(jxX 2WGлdǮl:Ie̟7zTPpooz[$>‹K5bcGX^t\B !::zGiӶ]>Da[f31a2k]u_t̞=pSⵞl͛۳g1cCB_1c䈑u{Asϝ7'~)#f&yR뗾%Xvø^tPÒGpZ7BJ3֍v 5(q/B8 8Wqdﰇc УC@_9ÎBMJ fl-Avj0Tz\ 8-#PRG@PYUr\ݖNjoH\`Hڶ!|`IҲXIeIiف21A)r% ?g`l;7cBy&hg0S]X !\ Cד[u; 7KǙ3>@d̐X7qT c CC1|!1l@E>.HE(uBj4z4a76]C!B8 !B. B!P !B. B!P !B. B!uB@S>k!9ߡ}MU:B`ɹyziiۂjAg֭Cy<`55=J!b4E).]8`(!G Cfz_Nq0kZ,z0TB!3RԵ+W>TDDۂjcZqΜpy}MEqZ7BÔCBK #v_ukJ!z4Ms8'7>AjC/hP#k?B=ڳgO|||ǎ`ԩX9v_#P !d1E\ѿN4I ݻwɒ%g׮]/^O)SGS3>/!j^??<"2<"r:Mw}>r_g{t5 0W>7#? nfKedfN014,<00qJ=sCB[nu۶:5i޽:wawz :W_;v(?36U<o׮]b[nW^`fmZvƌ2L&͜9SZtӧO ްa1cx{{=EEE(jٲe&LpZݻ9ҵkWڵ#Gvm:,uM0TBVw\KO77W(.Y ӧOwٔҹsӧO  ofnپRR!|<͹Jm۵?tHHKK7kl7IIJhCB͟GD[Nt999"]GlO˂z'bV1 M}̛O5\pQM<`0U2LјgoǏ7 ݹsgÏ?fhӦy,Zg^0::ȑ#111PXXصkל;f|\oڱu3FDb>!7']pBȒu P(0~SbO ,?aŻ+]VhA8b*t1h05ƾ5kVXv#z]7rHhJ7m?Y[aaaP`!(0ТSSMLHzJU}, m jv4BBvr<++yiӧ<7+EwmQkڣiadBg8`hƣs.~mFFudz`aV춲ؔn6__ vnz\.ϔ!=#ÔKH4FF IDAT^jJJJEEy^^.c  QQQn\`yZ0pХWL)._0pZqPv_A0TBn̘K)JRdұc?##%ۢi޽{`0ܸqcʔ)#aO L<)..ҥK \x1..nIA }R=J%,[&wֽk˖.}ڶlޔ:zt\lXy.]ձc^dBgX,#F0ao'L'w [n9|pPPCkJY[bbcN;v OHHmٲ^^m۶޽{ҷm۶dR#FZjןxO??}~ڙ/dO8qŊC۷߰aWX1qD5`J}]8G]#OFzqJ'TUٸ ~߾}>Ӧ'NtP6Mk|Ճ8! [رy'LODFF:#}R_=J!T_󈈈:vvk_څB=pX%cJ#v B.P50TBC3LQ#c*p1TB!#IJU!qӲ^J4a\{1 B˫XgFb H&~C%r1i߾ù#%IrM3JEхv҅`59=Xk~ BHخ}+/US8p<ڵo# EBa5?J!bApȠ b}ԑB`5M=X+ B\[v_3B!P !B. B!P !B. B!P !B. B!P !B. B!P !B. B!P !B. B!P !B. B!P !B.Єi3_HQܞ{'\\O#/V*\݊ќ ]vNbqL$c .h=҃8q߼kz趂;0AV,]:BrJ5;RUUU+ti!g4ZbP\ ;.lQɁW=rLP芫7:|?!aW!d>rW78֚@urC34C,2~FAUrʁ7n>z ~8 V~HQzz_{3!c>]%/QP!8pu/jZ,4Et "JErj|b5A0Tr$a̢|8Q@(Qߋ,u)dwCwf#jAezw詃č귂#rLOe>m޼U˖[mm߮ho,Yy>q]N<Blڵ0g6C>2{ oݧo?hԩS{>sAZ$} ! :u\kܿ!իVb;jqFglʑ^@DFYM*U>'*]Hn Hv>t:ӳ h[f CwIx.8; 0͐KڐpU坿{zqD"k($8 5~~~l jVrrEU-/xwŵkjE (0v;,,L}5;h|C gBija$YM*Zr}2I?ۺ1P XGzdF^^Ux[I!NBw(Ϣ]Wrl]u|W9j4H%%%99aa]k~??~=`T*'MmVxf{AWUUGD:Ȭ̴|@]8;B3]9)zV}!z& >~G}쬞 ^o':ͣ8\0rjd>_ LoԪ1`y|=7Bym۶ݶm9ʖ.[Vkc$&iFHHH5)S_j;nO> _m&jZP  3}{LMMft鲭[Kǎc3[5k|JXlCԌlZf5EِⷖO7k|ۃ`][L\o2>:N"i Ze5 $v\7I_1, ׀o!+ַmڴqy7l;7CkXdɂotmOp޼[l3flAAAtt 7{N%lޔ=ej@@ٳ^̞=pS*-l7ڭ;=jҥ6Z;h(/oʑ5X\UQ.zuFV%UUUcW=?k;KrHeG/&%) EEW}xi:`4;F0b[Wh}hI2~UDFسgy{Yp|ܹsg.^tuC˗.v],;_JV]p! 0u6u*]#`nN'v=֣JS㟾)wDܛ PD:nx<{q0$.PU$ M%P)Rp4(#k11"`%$,ZP'&=bW7:ة^*ItttLLK+k||C埐$i} Zt h*(!0:T(΍241>1Dt+u Dnr|4@QQ.0 S0FPsi! < $awm3EIr0JLT}H/@=7n`׌Θ[rwwwuCi|.wÖ>Iwc \4 -HW$5jKa h=» \!A$Iҗ $)"%M 8%49\O^P 3T ȲOi 0x.zB!؅JMADO3կ2I2Fc%E)ia*%\/$fb4<9!}.M v2ŭq|p|xD8 S@E i5MK^RB HַT}zvB!*?ǷӺS!] -t7U4$}Hҗ Iғ$)B*V T+6D d|H(*K=5EihPj 0ʴ1ł—Ľ?!B=*P?[s~~R 6##h)i I/#-%~,9L-0=u'IY #!Ba)M+܍&B2M9sBJW^| 7DPwrB#b F.yjIsut~ xݴj3Me:d'7xWMc4zO@n38_\ n=}E.%B!zE'u©"30e MDXLt";Q hN"UHxEqDIIh"X.֑~,}sJ/clA!\u\ng̺}|@!B5Q%G͊--KvOFU4]K\*z=ehnC G($Lw߫SIm2Sh*X*MQ2!̎\(h@:EA(Jv\Ȇr}*aŴN47xju"AAWEJ#ڽ:6Y22raG ͡$: 5e˿$꣣`oD6J2THޫ%oܜM;`T] ֊ F.n4 :A^\|YVϚ|_rʕ]4\P*%%ZHƒlJxJ6ܥdKNxCx 囊<FF_E$t%L$)n0aZa%%K" t%l#rD/ #,@!*v`7WRREQ!DjZ_emhGiw1q'kg7n ř\L{ TQ}jZJT"t2e֜TTT^ѣyynnnO<īܷo_#/V*꫶wn޼1y47wwu| bxa_|'E wwkr jJґGDψLW/ (|NkfF (Z XC,6^"O-ؽgl@' ?*2/ITݖz?-zAe26"'rgOy3)IKF L-1ֻ!b(^1$Rb:gG5!222/2 ΂,{ך[GZ"ȡ#s4##t 883oP TYQV1MSt]k@,UJyI|V&ǢhJR*jn~  y$ovpI/Cq Ĥ@4'[BdHvf!SW[p ZCp}nWAqAĀtjVf#YLƫ_彭)g BrCITf}4Db8g0}N"ɀ R.d^]>]oذJeR԰f̙{H$#ō;$/_;T*՘1qׯ|~1qqWb$8vwIKKc^(;lg }zؾLJͳnm۶DFFnX>==Ícǎ6mZEQ+Wڷo_J5|M7ׯ_y󖂂V-[nݶ}v{rWaeͿkZp67,Ǻ^:GlK*-=hS I%EY̿p};@?U8z'@ha"Q Z/~0gV'̂,!١S;D.h#})gh#+鵢7BX.) <j @ΏE14YWĞ )Sh#t:ODvT<3 셏D*0=&z1W^y}B0gNU/>`eA~3 3k+WX̚=k CQ[&+^|qšիvTׯ^&!!v/:סRG}{ :u6 RfΜ_t5l}_}ӷ)TZv7̙3{ 6n客_){7Zop8:v_dzD r).JW [I(qh= v5;GеQtp  dCr#VxCbH?&:(UkfH13w;#GI%KLJo,n*s$?YA}+.2 Hȇ: ,ʡn-T{ZziaP???"8"{-w Q'%\n]oE Yj2¤T]i@y{im\qSz朆hMvH z85ۀ!kRyP` =jYJmʘ)@Ai1UYԹ-2ʣ i:@p 6KhY!FAT՚;bwdm2SEiFGU  hJ -ZZ22*ڔ.-D\nJdis_}acǏϝ;oح{6}{;h@ww:5_<{rWi9/z/dkFD]cr +a qgO#ۏKCydD@[l͜ڿ!93 ~)5M{^tk{mH&H_o%'_$,\uL_a׃⡝T>WbA3AW]yN,م L_9oї՗\S!ՙ9XC%tIN ĔCy!i4M?5zڴiz=)J n֭kWӫ le{Y6q̘Kmݺ,]:v6W^]a(z\3555::jB@ ffeum)S_j;nO>qbZR( WDc-~k z񞞞^Tv_34B7{y8WvfI  K/Ay D!W$34HF 4% YO18h0cN*?_)SjiVUmmomυeodȶEP-|ڻ2d EA?+B-'-YN,l-PNd@UQ}?:f jE)Yչ+ɲɢE ?t VVV v^۫WoJ5z%Kb-[]uѣG-[M>bS222?8g쁃RT-7%$$fO0g~:PΛ7w˖-cƌ-((~c-n协2bqUEP,yZ-HTUUf5s%vW\< _%¯@7I̟hI/*<&9=|1'xAmzM0{tp/jJ[-'׵u"@SJͷ^c;?+q1]z ; Yө^/31Yrު*mn^)+߮Ϯۊ@C廕}oe{&rcrl|Krsu.˝Pj… [SATܜOvjJyny]ѹqyTag$ ]&ٙXA ( %Eda03**JEx6s+zzz:M{wXsy]T]_x5Kzܼ| Y^OaR'蟢U{UYWn7sa|uy+ZPVt#A%n5K:P5akJKrdGzSA f\[yfzu@ Smúl+˒˖L][@Cb1e=lW5GmbׇyELr9/DRsQfFJIۛaU\PoSvJûRz1p ڋBudgԾy|+W8"Œ!яE5"#WɗȦ`x*Q ;5L^xKB[&48m"g΋,Pj7sDW'b)B¢sI|qK|Åȫ0snE(ʽG.tsR2?V@V$+(3{-m o)28"ʖW?'|>h xH7*.Rfl6$ɐcLX2YӔ! uuu1HE ؓ:s.(<@G2qǨdi&[Z\Lcm6[iyWr{GMlօ:y` ԇ#(KAS%G0Pc]hjQqcZ@5ف%62Jړo/jBి>JmMV|rqDDO!UíGuҋ>5'xy{G&B5 R) @UD .8H$&)-( B趐=#1]jR ..(ə3a!թ)i$(˩ncyyc:8888,viZцƀK\% hu.%^;:|-r,Ad: 1nH_>=y:lƖaU(=;]zc )*rX`*{9ʠzF CDvN0_0ClqcK0R)RM\V;CTxY;c {r/9VCiFl$5%Ԭoq{E+r!c*_MHp(;=T+>`ؘ6ϙTfu{zRl,c h"um**b\x p6m6z*ק*Bmyt݃*le]0-Ɍ=h-<ߘBCrmbЋ_4>mNyJK56{9j)˼(Kg.DnbJfҁZ` ú<,r~'"u9YԸO?m6YGuR$>uaF'E/n&_cawOZ\)8 /̤rA;?ϯ\xxMwk1,& YsܳSzkO?#Ogylk@rIzwP׀yp8ڋDEyI:]X1g` " fnn2d\V)͂(ٜ_bD hX(,PabQKMo3 VJy%VnEFх\G}arѕVQG},>wFX8לiL'XQԠq#5bv18)>{S/f4TIB&p-@@v݃LuuSј40t_1vitK7tx jl]Kٻ\c&~cEԍ=3/iQc<~ƢJ"ۨj?|_%/,̌ n.$m"GH]J%"" 9_f0;Qsz35XXE$@L:'3f4.+^b<N8@2ZsPx;>OWW/Inl6#{M2LObJ0J(* ^gm8jTiIM<066uKۧ0fbx ޶ )ޯƿB%(Y hР mQDUֈe-Pȶa?bQKv}**}Fj!-mh}wM?k&daa̻Ϋ/s& c8[z(DwЕʹ)ێ:P]Ow3EH"dMYuSqXb0ó*q^HG T\ysՓչ-3ʨGFWN*lF ,q+Ѷ'hC]wAA'%$4 SY8["/Q-@7x Oitc)Nհ0K [{7:}!L@b\]Fu諡+ԍ{JkGV}2ZXMl r܇R-I>\Ζץ6j-,W|baZִ|(nPG]_q%zK{9~Jl~fs{k4 ˲\ҷ4GM^9{%=$|RQ%b9U%D+ VrW\ԇDƠ܉F0"A9sNMC-0PpIAdCbۣWұkb <4qV(:K3B!H#>Z:Ax&~,l^;pLό5Xvkpp+Z1{{˰Z5eӏԟLKTzUOgb604;7>&-JRֈ9_wgXHj@`a%%<QPx+/4ĕ!VƎ(ӘnF3a}QZ5\].$iOi11dSyTeB:1U<3zk;^l[${ds/x(qmSқ~m5:%"Dg%*RSvhAT8^Оp*LOM$J'0'@@ʴP S9oZdlD~џ}W M WqRu9iFCRi1:KFܠ'd%R,u l>Z<=Q[gW954zh!#K}_)}"jiwJ4b:T\%=AS=XQaپ(R&y# -1:wKvY!HFK@.cIC7"(}kY}΋,;/3<:<3TzzӮ\7u@ߪG`WxҼL->[m&ZWmo(awԁ{Vŋx& >X͌^~/,^ KT|d1% T*Y+A{>ܿ'̏F i(` |+F|nB"{WaA0Kcr'T+79BQւЙ;xDMStN\;'Vbxb%3_K(T7L+b)fQ4,ȏ"c*WV-,NKS/ crPm3w &01o`)%yW~2xSl_d(CeOO:k$ը"(EhF8r]=<tOEc?)ʤO&( ̐yոX1N#QfHp)Qq @`F~196[2t}bU> stgqo?MN&QU,A! w1{}GtqR$&*LF8͇0EAݢu}~wV0u\vWr#kΊ+^; IDATB5 <4aHY^F62̚D Z6Lob=m!T/na d(qb!9RtH4 GE#L4PO~Ptsns(x kh,9qÞ⛗#]MhG 1>UzOY&qc)-+ףfQ]݂`۶/-Y޲ȣ-s[<,FԇUyDz-jbp#fa{W,Xe`ɐ3Ȉ5i d c"D쿳2,BWQ+|멷?Z|RI, gKEF,RhG{ J&1?xKpTdIM\7"OE-IJ`/hgI%U\44Z`)Q /š2brKeIjq0B55Q1s&[V"~ .ZjT{L ώwVo`:hcmGppXl}툪^|ɥ!?gmza76yqa1u-h {1@{AӞ o+uXF1D:  '19F,{.MZym4~ʽػU(N(=Չ%XbvjgJ5߬>*P]G#)%ɉB[e492;fEFK{> E!:LrpU!xWh/-PRJQ覊D*(2agX qn\k0{82Vr!Q+D &b<'aVn;:'+`{PZV%;;O<>3<ω'}j;;CоhǷxXtQv CG|\My3Eb|Vp0ckhγ18ta Kl ;ntנf0lliLª؝ܘDUせKbCɵV={GđVL0t_aW|l=ۈ&!<~LB 7i߳ye Ӥ1+!67[D¡sPTRbHy9XtRgamCzR3Egvm]#Uc(Myg~?u:)s~{j3{Ҍ>By-T), !c= hF7*Q81((z>cD9I!ֈF[y)8DRJMU67u^|-z`5<|/]E 1TqA8Rblۤ$@ ވdh.oS c~B8 P79dq #n$V!P$-*j?aw 7bisz)9Mh'KQ*@fVr/O3>5e|L;Rp{==qxxx@Ӵ駟|_|%v?M޲;_"|ӟz|>=/q?LȱyGR"W_}SO]rŮO;;7\ 䆟mٓkތRxꏿObrHnK" fcI%V#) C'Rf .T,@*i TΚXb]z:P6U)JɨPs(3~VM)]2`$T\ AC#_ux./Qݥ/okjjr~8[*o{'O<|EQnZCM꓿3Ol㎣>^^ܹaN;=!2;̿O4^jq]44-ۇdAX8odqǷw=v#a" S](Wъ:/ǹ0OI 3Xe:L': Ph% Q4dgVK uN$!hR!_pK$: .B ƕ'%Ctx\C0 e*sGx-S?dG?{R̗Lߺ9nY\cg6guK~hhc>&Y_^s'\oymoߡ*2fGU__4C7ƱK]f3h,s仃1FҢy%DQwq~⺏/wLO+wîrZ2x%b`D>>__?{?2.7n'>pò +**z{{-[7Ghyyyby 0l{ux !ܺğyv3NBq~J{Yյ_k<9dS͓D>\Hj"Qsm(P4̉Nat;]*e$&РBe` _WUE0l@P;{<^~7ihhRVWE {htbݎob.@%b(&*j\0lqD4(,M4Z?4 V-qMD7lQLYE 2^ʉqqugnjWOE?&GO{8!⤜rŸ Ko Z S>v1z%9`Af閧y6/CA͎vφ6_;xȚ5LOOyO馛|4sΕW^ uKv?8kg_yG}Tj(.~r?nMm|]*N?ko|nX?=0;3sםu7HK.-,\cTbu4k*%/ӭ m !^CY%BMJe숒BI׃w;y==-!v#;@>` e_lʴ%L=85tLϩۻ%dF̦٣h-S^o&x * t1zWI!1#RsNI%HFSF, @8̣&ޏ@ `b{C>Ī!SIggbTpJtq{->Tݦr CuTzF#fE}w Qtn|./ҧq 7\u8`wsomܸ??<<|UW˷lٲe˖K\Izpݺ9z%Oe>Ysɋ/ou~đ>So\vr|`fqɘɁ7y)ۏ!^|GPlSRφK+/6FOd Da|ϐd5oTXao2x7τ >G-(pw'Q7濴&4u#yIڬ;&4%JY!+|o✊ɷ'zh, cq+rONt56'3Swч;ܗ2FT.룰gۓpdLpRJxFx[!K*s#qppvR"e `p ˺iWLل&#YGmB9Hh;:[_9B)K f/Գs"ĥX]֠9mD|xc?v'ސ>gֿ␕zkp`#,d&F6o\]Sj y|(RK?E]p +LUaA+AIF%0)%|tiL6 y٦lÂ`~p}&Ѩ-3,\]ܳcg{OoGsKO-j0`o#K{&&]!\-cynɨ:+Չ;"/p)F*.H>E$=ՒL]Iղœq50H.$Tr+g`ΪG"r^}.]˽..)$;ˉphCG٦m@^}CqWϤҢu뮽]o|3z88Ct]HK<^oss+dy)vxqaIG ;&n6`#^&WfdeNȪpy!WuGgq%u'{@,6{H{7aƋ$2E$=ىs,P0wX]F)T3K=D0CeS?x9npCF`y)H\ F}=%6 m] ?^㹿/?5-O}qc9!r}VamnN$ek*hMX'3 Hr`I0`#ٴy˺$n`9f4w#9b,S:6vYmI@ך~V{5yrg4Ѯ[)NqWMIOnTJxoL1q`T81G&xń8Vlf5OڑHh}D$6qh/È7A7Hd#S s]k_hEk쩘 !ݙ]{^5ڌ Ð\K. .8_aYV?[ ,W8"Bݍ^xW`ol0Ĥsp tHp "yEPgn۟pѾ+Rz=WiuʪT*ƪRsS|K ,EibZFATA7l":!Q1Fh\ȣ~Q]EĐҜiH%2SnHe )U,"|,DztT PFtKH7\7075jCaAnqW88888?Y,R鍱7iL%-h~w2K"X nBm@y^WOLl ` M?{71GlA߶ c%v-==(TщeP=={ uXMrP؂JOr@L (YKws&Mu`Ԁꁮ2V$!¹hpՃ1d7|]F'1Bg3zB>H\eȶcLnNܟ*78 "x8Vexu&,Wsz< td̔-6B*8ƋPjכ,[|:ܿBpY%#w:^8S/J:r.Z>M@RSˉ8s~B)yT(1 .N\OLz^۟2}I 5=Ín&JQtPH/ir-wp=ʦg!F>uB8SacQH%MӺ1؅XK2TbtT#n¤ u)"?:YJ.?B6Ʉ+f*D+?|؟0et ~Nr@k-xe6Q*LnDT lW<ʽ@̪! 㥼xH)EhpsK 'ԥ=CTZ~fpzV:I|-{ "|g,#CqS^&> ,6>u1T@w+ł9_.+c%E!^bp zӏ&4U2y9bJ xg]K PǸ)zp9ɻx4KD}?jAܼI) o_"e:#t9xr5 DLkWҴ8RKX*L.C1 BiLҹr,Xb@':mYIڧ}}޶2!B8ڍ> a-$r ΤHxRDXYbZgvmR'ѣ$ðu,.odMI;!$&M(@!Mp'zh?ؾu6H`oWa3qzG^_uާ{_H$QWwa=Yx;wz֭ PN욨x]ՌkaJLzed'ixձ]cqcjt@!d9{֗AV۾܄" &}\`$jtc<hfD/%䡤ƞ0 IDAToY,=qQ a茈Ķh0W|v'GSb@:#n Xz| No]v;,-'"^7m~¾J^ߴec1kᑓXyy%Ә^FU HIyEA#}rA|J0WtDx7 >۬+۴O.%%_BH." \$0AD~qױ$OE$tGR/cҞ%3mR8OwT\eA ֱ.H*n8Qpw0 `+| ZNJ7RrC< r:*5"}EHMo _88888 ar,2ʪP.v4'I ( O@DRwwi{Fۂ"2= wԚ54޸(dbIep:2[ME1 |dȄ22ϵd`ӷ [)1yu5V\)« ^6ΐP2m.4\:uaqp! Q#(2~{| ʗ)bP/ݮn_wppppxRkЊV{*oG{1# Pg[5uRV:':w M hd Zޝb{x2l(k% MdG)Wg0N8x": C4)oy+dj(63HP?`L :^ 0\0sQ %L& 0ۈ)e%{7^x?P$tuoA/>JSSS4XX͇%Z& ,r('c8<`%fEN;IJcֆA 6aXehքDG}uzgqb '3-+4tWNVBqYYԮ$Y #bmR掖 Vbԯ+,[u~gr\},v;2;tdʈ9mUs,Q mD%*l n^\RvC#mj͵EL{F~[ Lhby7zDa#F`*h5&8!|^Id!4sg# ,B>N9OR*O3u]Bw;?7X*t#Œ;p -hjF^C4}H,2*q ]&.mg QsQuRt(:PL2HĮ@ki.j]3el:ԙDN˥7]+twғy1qWrppp؏ٗRixt'eaj-iI|3 \#`Fn+!S)ڃ=y ܍dV7&J7>Ԇ {3F[\RUS G E>8w#P1sY':rS9zG˹{J5D*Y bz)LRE\*^! eozqsQeZ2`Tr'|FޘcVnwOݷg;o g|9R*=Gtw2l˒C\=)4} $MЇR\Cg g grtVJ.5fEM0`=6vjGdq opBLr2mD$s{N)x)ȬkQ3H번4t4S&nqJ%v\{)rXAȄcTlXʟy 狞;L);p;бwxooVQTUJ7WZьrppppx/ZϢZ:ZMsb` (7͓s梈Y1ET8f b;=ٟ<@s4'ך0m7y5Ji}m/J%ep S` 7guXXblG8^zfW ~`F*q1̹ Pi4hҭ grTRĈPvw+Lb}Қzl6וyVZow ^d<})X[כȁ$pW p! s.HAvYߝЉ< 0>gCU2ea )mlX#Vp]P:[RMT75kj8r[L "J=Z}# :gK HH87-$VL̟CS@ XcWz2X!nD29@tp㥼7%Cy((PTChSʖu-B6+#@uI2aMpc*]ae56X:@@Zol p[f+DbilY Ec)ʃp#y =Ma۠(҆yQlr-wA)T%&!AB_($K׶N|~fowo]$ |x0;;3ܼ]ۗaY7AErs6D7D!:`S5yvᝊrnb CK˃ 'E4U.Vsh na)ۮCsP(8!j{ gtĔղ)2Z A'  PbǛ8$&cy+Z3ɒKRCz*RѺơ3]vﭯ]pUdc^{o/h/rQGQ 'cO߁>Jly| HERM;L>c ҋ1+.[ ](O;9tX;39hG{З[F뀋+ gUrAuq_^މ,òo}}G: ٽD4e|\N 1XoɮoqG[vd.]w5o#=͜PP截dӰ:yzP{m)-lVGXYi_!sӲ`̷\1 F17ko, Q[nfA\ΐ\'e(d|/آNRS?E.ː`[Ob:)S(JKA Ͳ?rLAGbV]'%gQ"i n(=̋7 0׌SBS%V%&nZQ $t ĽUdۚЉxycDzhrS⸾d6PҲpޏWq>qI GcO߁>*ur}FGƠlM,b? ogpYo 7\0Lk"wD\WP7tPÜNgYCs( X6IB\+~h2TrXau>! 0'Ħ$ŵbchCB軈!뜐C>f%@"hpP"hr(Wv$g`sL3l vT N}kF;~\I Ѻiy٤{w+~}KKK///_ 4oHO{Yݺﴸ 4ɺa .nD_gȹIjᆳ:$LxL)LD^6s L u'q_*U9$uN/eN"6#\8\(Hj(p/+vs`]ʈsAiݦ @1XzZk,URpUSW>yYt$(M_+ֲ,knժv}tL555wox|ѢE])4Ma`S%B2 > =}(`V8ʯC9[cC^ vı(ELP\.t-¢! e֤:&0#ߘ6hmV  rߜDBMi q U(N6J^w[x-FbcV(w6NwH`:7,X4C:v0a^z(q/!(27ɮTސ% 2ㆧ%` RN;)qRF9|MN]׆+T8W90iOi7.l#u>Vb}="\+PPxB|nҀMXM^n}'")'?޸aw޵zۭ'}:ľ}f9Vy%DQw>Ş}0+of_gWVql!~7S_==KQ,܅ `o Ќvdfbs^I̳$&Ћ^Kh;aduDkQs#CP )6׊tD@%*5hVye%ʝF"^W/) Nb4p@DzϒzR1F!ws8xސ=Ig1FTMs'@d'I$P>B"V!+(3O8r8ZTEoG{9IeNYa̩#Qynz1''GF_,V>4y3~׿o>x;9//pE]zUUUt{1S.$g]-bT԰֭219c+[4M ^Z/r9F ~\dYTpz0JQQ*-nt'aywџD=zĢܹA @Ќ}/mR#`裺 >MhWhL-=9;l0񺩡Bʹɉ7,i30A? gs2f(\ @&fB9bg`p)AԮZ D`rItB"INⲊx7^xjx8kM,g}M̊Kꠢq7^y-Vw:Q߻7p{4ŧ_QENY[=[W\qyCC4&s>K/kkjh{bM)pX.qޚ r59swRoЍKnJ"@#5w/y,63gNꙙqoܖ0?gCiS Je``v,NtZCƌ %()CY ~MT_Pg3u6&@sǪ0;fP3qg L<6> imȨ /SKb%"s'u6RDR:pDj^3H$ Bj?G8XC/,L6edzu?|,Vd~p>,}>U}~BZIBA]bwkm3O[9UUUYOYO_{zz#ʋ/83FFF.}7=in;DQ L=}0{[*1:i%T)t|a2P_bڂ_Lo-<-] $4& dq9X刡owTX.C*E F02䞊0m<菣$AMr^P1dr%(,,b,8:x|'g`zkyZ4Ʉ Đ84A83sX$ 15\8ۄP J2nEm?~teLP?Å`&I9QbUrg n,˰lovNddnQO}Sԧ=~駧mL)K.=:}ʕGy{!Ph__b[;PR[9q؄@':-[4>:?`ox {r.\GEI3oAntg.7!U @Jݰ*!&J\::.d"Dק$c`*9Gf+%f ^аݭߗF/`L \`\ԸcL6@6-U;Hbg3BEpp#/ZT]7q3l27!f *Q{"?`K=is@`Cn!-/9[G|?Ï}ll2rU=磑asq{*7SN79@8.!a! jB kg 5B@ 9:[>#bD~!1ě~2=sXJ K>y,_ k뵗}ɖJ6^qA ڋBu:vԾŞ=1]$%^x,|SS3܆%W8öniBij;2CO~҉ΔJNy^_6[;ثQ]׷ oKYT="NØ\-{.`12TEo2!2z9qfѡ\żJǣ#♢bUS۠蝺0\NCP(VRV1 {.Wm4ޯotZ)G(-DyF 48bA7&esϔNN Q WL"HdF[Sטmb Ts}R+%G5FAlFS.]MWׇ\}}ໍ^J/Ď<^ʐ5<;#Y%9$6IkyɯCh漃dC\˜f,wDF \ \xmܣ_ثRFb/)?G1jA{YfQf3,c+f1lɬ8x ?0FI(;I2z͞AXX36-o1Y\)\e"*YSY-jgJbiqK !S3et_GWg{/iZQ<PaPȊ,kݗd% T8B  D0tˋkZ]ͱe:$3,sw'Eq !&i?0WEr41_?Wܬ&G$wF/ \iVpLƺJGCܗ=_d 3h)IJ{Cc&:+Z2'&=_L^V(<)o𶠥r[3EG->w1u;K5KjD C%+$cq(J$hQɡVV/?_Td NenF6Jٷg;#9 b cԑm/l+BQ'c;L'CGPZsP f,T,'d+aYԋjTFnWQк%ҲBjJmm^1UiSIB0L덀,vO=-+/Vz9W:Gtm9^l;F,͘ /i\ZHYZa ܀$2&ƺesށRf mUW7 ϮvdC !d)Wݨ:2<ؼ{Rׅ(W0{ Lۢ\!mqdߍ>]2& #"A ʐmтyw_vx/ѬqE Eq$AjBS+Z7TH)QJB-R ZpbYn`!Ϲl!i!j ܔ)`QYeeu<zL(,ݜB"p1Cз _x=mllll=gfUga2[}Ne 0װ$Д[r|yQF*B2M5Ϭ4B5ܘ4"E.u| wc8,טJT )!i RFJ:κ4cOd<:ϑYq:os L$Ԣʚ5x$ypiJ 1܂':Ћ_Z.-o*c ݴ{666666{I*E".wJt,^8a ׇ$>z.XAKs K"X JrJsGsM_u9HvŎcύW]W|g,@6:T4P UY1tgu~Y~[Ҍfr?[:`/[(o"}?kQ#-19'0QYXU߲z媆+VW;aJf[Dm",jG{%2R5nY֯LIZ`PoBؼ?KRR=FM^ ]Ib٪;NzL_uFHMJ J$5sbJp!W^9«ӷ5#Gљ3(=#RN,siN2]wЀ Vp :1?*TjC[;ڣHOBBE|윜$q؉&4-ԃIOc:kO$e3Ţ%m 3}z 4-BWPxa!#r9V:|^jli_"kS)l9ekۍiC,tc6p6;E}A?a\7ͅtӎ MA3G㠳jG<; .9h9C>բw9^cڈ>TEff8!W*O"h!/òa `f><K PM ǣޛίY=wuf[WZc6Ͷm6IV%k3 Kyp! "nK/v}K=X OfpG|ƣ?m춱KRi&(}СLq~5hA@\Y=y-ЖPAGc| ix&<, ͫ '%IN줠Mh!6Q:+5)qBAeA5/Vy^,㜅cC=Ef)O(Ɣ[O;Z҆\{&Ob42=hFu;w:t RB=𼵣-pέt)C5nBІ4tojj(mllll޷X7=p~ɥE5&S^<*Ta.3dZ inH][Q ,ʘ3%-aF1:mj:} dו.ew;~OӼ:Z48:1zbrv VLaYVrLsUJLaäxw~@G>} r;,,NƯ2 gn |0-ӌm֌f"7ʾ|Ɣ(84eڑӛ{j3{C*mW'wah <OA)$iD?H۞j );lmقm7t٠u.r6UkRAVe֋ntWHYRÀKf> "wD\kfuRc筞lUտ"eK:!{M֏:=bsѡ;^M$"2?3NA܉-h! E 7Ʀ0Uz*}ސJc|"u\ץEeg1 Dk ]CϪ9 IXwzѻв&1F1܎"-òdl%HWVO'.&eݜ*w 2վyaѠc<v?]G,Yh?1>1i7JСH R4Ma'v.RKGrO m8ᷱRidl/Ղx̒[Nk\֍8C0 1j!ۼA*.x0!C^qCXCC*Rk.ޡ XmodʭwuA,鼊!Cl>ECzvPJ'UZ,\G؁KZ? e#c#<=.yvDk-Y97 h{4eہ%DڐJ BZa4,R&LǼl!Za֫'Gx H-hٲq٪ b?i/iiNC@EzQ@[MTn]:QFw1yp;c%>Nqg7U=3?=. l#o,5)( Lu+W 1ר 5cl0! Pc4& YV +ӷO()ؤ^ކBȇ̈~4L%s< g>}`˦֝Z~E,C/BJYƼlP=ͬ`Xq^n͟3ؼ%>_S+Jgn[#0 CF"E6-hBSC=|;յ]tyjȑGDZbtDg1jy4p @ *KcY>+cЇu}hST}XbDvKѝpQneܳ+1YUk%1\7]h5)rӇSsqI fOfpZY{⍼smQ-b|i1x"U}HR,u赺ER{K)NtJ\77e[:P430/Z$Gu(E-@ Z}J2ʯS?iaÌC`pc09;a@sƊis``]Pr/\_XH`ؙ\̈#v;٭^j}É"^ z3kZVw܅G'7z-<ȚϷ&༺XڼWDQ͘ݮh$B}JiEe-~wA?P"ުWe_!ehtNtpӞ{=zPhAkDc(7tCwSL3 TdJB]Ar\4S p.fOuBRtY'ݨF-jG0{0mLkΒc}&$H-h 3XfDBpkQD-#frzY)ؙ juBAA~׏?‹/OXKJ֯롇ill{Æ{ҥwWXnmn?H$rmذp gm<|I{6Hqƕ=~ڿw~)lMzA,z&h;oȸ۝bO^=lA:d8CEZ͖Mu@J^)Ko\U+P1i5НoCQ1qҎLx'||o?\=f58hwfKrw+hDR(&RQ痝մ:@4_׭P[== t«F*cm޷~\s7_sTݼyO~cgq 7W_^wr֯O|;[-3mNOJ?/~-G,d/o|l3Ϥā|X ,U{oož .,ATFODEQ-Ş{>كRwxIRE+M|,wa1ؙOuoU>I'D垣-XW0sی=bE6@?:t-j4n. ~&<>>"$:P<-k%Paen}s,.z>/[& ./>DZJA=a`U c5v{H\e[ͭ}>5y360 W*6, oG{ inck IDATflx eKp\i c]RWWXK;QGlܹsW^re[i7t֭DQνILݭ<݂1F=}{|3|{p9gp/xz۾4زm:"eǦʯ( 8bX .CO;KfL31TTcT}KN'muα$&QD01$pXzi'8!ֈs᜛N%- #EGwqy^5 HgO41 L eÛ{210C|,elfBO.cV`m_~oUWo^۷zkWfeeeiVTT?VUG=`mmm_7nN Ë2xݗ6 "B8w!/M fdZ.9{F;9:"uP\X9~={ 6ÄEٍj,^ۡ|@16$˄2Njf³y6'Vsn?1F|^6bg3|;Q)m{7v<(C& ->ibNN" %r x{qy|wDt.;ȿ9p]f+`ؿ3^ƹ'ݓ: @}}ݪV=gusuk~^{<3s>K/kkj^zG3TENY[z{⟮K 6{waW]}qBn3=%!]oӞcs׌XIhi.Ob(Asb ;XIِ.w$hR|@ YAO)!y r_ ~,icF3= y ÞA}!ӹ ޥΏP4/x.-M0m[!8iR飗9C_+.ɟgc{G?Vs96ܽ tG{qH䳟5פ/zN?/Zok.htg\]wϩ`͚'|j׺0 #83Ggd{ޙh4x"pמ{;9 or"mⒽ[;==}WN<>jW,^e43jGZS'/ Jf-ll=eI&x<&IoDvaRpeb^lBID:DQN*k΍d:HRDe_0:Idx#XfI)ZVa~Ѵlkrܯr[6Gv/F^E/_ms V y{oz\һh OrRBLK3%+SOHKch={,w܍ډ"~AyA@e,SpC&şKENIuJ@$H<$667kk,RpƊ\Wx?诬(j؝sU=磑IeXR.m8x2`sqk: 婁`5E+.Z<NwI]aVѹ/J dVUIǐ& g&tge'$݆RzG8E!:Qc OgzUu}gOL4+F # "À{)8$׊5 ӥb][\l0e0S>)%Mc>Z2K*q'Rp1&,Ҏ&@_V-3SG9WxM~3լ*K5W[ f?ټ2]_ 3D)W]eZyWY+rOVh Z!rb9sT  d@M9gBլN ɐnqӘb9p-)o_~gu+,7޴x>eT)Q+d8 z%#u9 %VX9BI9JLKŲqW9 0J 8!u~}׵{ < ПYOoccccccgx:9MzoS`) '2I 8f5KXwU#^):RZ.UZȯ&u,ӌR 4qW Mv"?S52gMy쩲r;f~*Yv׃^(}'~GlL].6j Ҡ%7M7NIQ 宺6%NP*!\)UɐH`#N@94SGTf2BP*Pخq7Ecw"자ydW,"˝U;;?h_7V%O|ZiYgՁ_nS%.ńJ!Xa)*aĹirS Tr4\,iI'cdƱ[ 1D`j eR2rnUߡ/F؛s9ZR^㧽ˀ$Hֲ`p39,J)"( -&alrNb 5~$dYI\l12J=#f`׾ӥb/TwoEzaFhA.;Z|ollllll9TP\\_=X48ھ7)lR$;%>PRNh%U݌Gdhs"`;_衧Sn8`EK *X@6nwxIɍG SrK3o..cxf$ܡxt^p RwWL"ЉiG'l0^;e[9f$EdwW̓J nVpgNn=~/\GJ_x2⤈K+N4,!N0R&S+IClѴ]~@! 2dUoI5-jSrq8t],W,pYxsOSN>op H%]t勞Ө"CV |k`aEuZ2(3(7 uBYY.7lr)R7Ƞ@ 2N 9+D @2M%ƉsV*( :mRss˞C6666666"|Ɨ!+ d&s8/EgCHp>W,7dQ4ĉ2X"fB1JVtb]gR8#Goæullllllĺ#|b)%>sGN'TSsչRXS#m%ωzꈛ*yMi̐ Ùx*Ѝ+tr"gNO3CVG|:'^9߰}||6IRJQIJ/- qm-Wx>G]W(%Z9( !D<ӺBHQ4UDEZNFF7: u˩U2IoyPD@++I%zK uڀ:s#nj{p\ID"ErZɣ(T!4:>Y/d8Ϟ9s9rhѼ8nwAcN*B$ɖ~OfZytǚjY"5QK&9 ԻP\Q2L)Cd{U.]XYU5))٫qc8ݷ/]ةS sVv8SGgDH ݸJMԆq]{ضr媩S=}عsݻvz~ٲ{8pk;b^~ãGZl1m\{roqN[͛ yy;yNޣ6n -i͆f9;;h+'[3VNfWRԴܡ̘5S>PgPHJ F?bxB'|^۽ARZ,U2ȉGBDIaX)<򖚢&+TQHfv@:/yZvݥ˗?ָqs,^z*ӧOw[ooM>6m?-.RpB ?Oy+W,fʕ))l̻j L]Ei"/znۯG]YG jQGHٳÇ5ʽ6UY iBʟRd!BFBp4L4;IUdaf,޽ާ %,\G^TiUɓ׬jO&ض_Hr{ E-qm_oHWϞ ƛ>BBBBcƎ]/yyyUTTDEVdJݝɓZ2/_wVJ`C c:Wr# xy!U7nT2a*M;oxu&K%`l֬_}mmkyxz^ސ^=zԨiӦ/_<<,[`"My{{߾};66YJ%y զM7MTZZ:w<j͡} {GaWi"zSϞ>4mh™4TID"qw "&&_-]xqRlӦ͔dSlذa=zMMNJz徕ioX.%eQCBB&'% ^֭:ej5!!!S$ I5,\<<<*ʞ=!6mEQ%qssuSfИSuCZ rj  J*B  J*B  J*B  J*B  J*;FVu(j؛0mBk>'T ~h4YO>)TA*&t>`࠲OmXK]Oɓ'';ѣG"E >>'T ~`̙_-Y[AR-Y<A6̔@ ~@Ma:RmЧO6bMaU7zoaB\녞Vq[j9쿈Ȩ᯿q 0׮]ѣpSl LB$Eݺ%&N4L4xSSlK>T 9}w{M;!{>Paoo]Ǐq\._8PǏ+R'?0QVV!#..θPhxSSlK>y U|}} !''YCIL#i$LsB} kUl#iKۯp ((wYaR%͓!:ҼyVZBu6B֭ے&'AAAY"EЮ1yEEGEmٲy ז;LcBҧO;vxzzkۖ-=jԴisrsu:իƍϻ۷m,W_)4Ŝ9 U7RZzVRr-9s%yJ2uꔄ_ 8x`''%r_,=+NFܳcՄ3bK`00p7BB|aA!AzNc'lZ]6ٰm;@=nxzzvye-[oH(O"梭04]Q^qOP,:/?3V)H,yCSlԗYxM͆m9S'E6ıʶoߑ8矏;"!Js(ʴB^{_Ͽusm-Κ>[;];pIƍ''Oq&!D/YֲeaƏ`TII#Z~nCFጔZiQ1Q1ӦMW՜sFgDdThhfQϟIjfrr2xƍrëj)h2Y?? p]:w mڭ{3g~Ϟ!>8$w>W^3TېѲU)S.jֽGpHh>d/'Z@gEBݵ{wزrጏVqFB׮4RٷoݻwB^\d.C*27oiۮ}@`f>ap8E^;;}?,fǡ]e#chzN-&%@}RVV!#..vK/?~kr|Tβe.]xnwe q칳?lrNo=bě7_~-666%ei˗-/.*t_Nu BŊ+ě4iYyy쿵k?xγ">}޽s{Ӧ=MhF84]( mJ9|0M4MO>|+Iw!/?~XP$xϞdvxgy%8Բk wdďv _0Y_"I7lڌO9#}ޡc/Ell,!DP:I [7&&rΝÆggeOJeoܸ)kFGGHvuf͌ E¸u󆟟ac?*`q,ݻwyYv;LIx@F ؄f]R.quuرcaa&M\xQV/?'u򲧦 @`qA Cx;kBxgy%Ռ8Բk wdďv _i2f~pmUҨee* 䧩LOу`H)q.YLBHAAA|‹!Z?g83_XXnZP(vddBlΞ=7W#"#<1 0""Јx̏?6#ۍy DDD fuϽzܹˑ7 ƍ3f{lyEEEEEEs}᜖U*\&ݻ{!_OI_T\\TT4w>wֽG|-ջS.aM, ìnݺwoΜ4_ \8u-㏤ɜp UhFL{0ҥ>vmFh޹kK.=bJ4#`aB3(TrRK/5 %CTN_!KXPyM##~[^jsXzYwyYٖ@Μ/YR?|~ۯYۗ-WTߛqFMũ r+x/6LO_~Gj2ccF۸8K47oN=i{Յj\pMVVV>,==ՕVg͞7% 6lŊl2?-\Ν;M>r?9/m8'6E/[|޽Xv}4Hy(2Af֒Bnz.?o@i>kJR粳<$kߡK4VË85s⮉k eݵǍ#3ʅ6 [waadtjͼ}4#fk1/%p AzFݡSc[ u̸ :tt'wM\긍*nnnj]G -9ĻlBg iMcNY|4x#x[nH`jmk>XRk<==s*օn]Eš^@ٵkעE frK.,VgϞ[833BQT-kVwyszV7ZlW^.o/P7~Gf[$$8!1q06fjg}v'GΟOۊ ٚͼ2LTOnaAccƎ7vܕ"Ean],iXk6]|+WޙԒͦm 4L {ߚCh̶fIHaTw9"둑:vؿ?^,TnЦM7)ʂf0YjZ5f}_E,4AfG̒lҎ>3f p;>I6 1 ѣ06h̒eժY7 Q|1W\Եj\ֽ} *UZꂅKksnV_lԸ ީeE%t힖W!2ŮIn95/%eYƬ 87KSF 8`hz0juMndB|UJj;C꣧%̧JfpVV @R%AH!UT @R%Aoz0&(J*Hboj *8!V쬒7D"nݪu눨(: *8ZW^pO>ͤR#[Z6//'NHe҈HI1 jT K^7:c2N rTp*`@;.p: IDD㰩ҧ%Z9 :pV 4-Jr.!L C>Xg!U0 v@d2N3ް [c8\2YV6N J O>>>z*[^ݿsʼnt77t{(; ~H UpZ9Vjsss{5rHԀ%Xj9 z-[֬YuV^oݘ@90~@޻v...M67nZ6_>::ո#GڷosNS...m6mѥK˗/999ÇmԨѫZXXhq__ߤ$P.Hq"߰h#!2 BG oV1cFHHH``ڵkBR% O>MOOo߾S'Ox[ -Zd(?{ٳg5qѣG/\رcgΜ!hZ+O8q B1lذ'C2eÇ[h1sLu&lْDyw7olo"rE#55իΝuփBli4mn{'6BBBN<ɖכ5kF}v~rrr򼼼PC;l3f 2$,,U$?~GW*bcc>|hI?Xڐ!>5S999ݺu{\.WT111kTTH"B٨p~@rNǣ=ڼysWhms1Vᨨ(g&77w'={688-WUFHH0#CaPOV\xbo+W4h 5COOv[*t:vOIyBQgp@86mڤP(J6/R.4:EQPPmFC>pV]7**jǎӦM+//gzqnn.פI90 өS?<77gdB#G+1q͛7ʞ>|oPP*r%w>RY~d*vش~G"tE΋Zk4\ Ƣp_L/8agQ( b֬Mw4~8zk׮i4u:[}MB(J777WWdb[z/ҥKxx$""cǎ_}HBqqqׯϟ:uiڏDh? o7Yf[w4JWs?|wvyKHHOh&w9;4hĈ,X`ml)={j؛SY7Ι3788dРj9 ۶m7n,pر۶m_<#cáC6 ׯϞ=M~8l? BGQdؘ5kV˖-vڶm0Z4UeΆhww9jǷ*Q\l_l< BGEB"u83aM~%ONI9&R-# y|@t(ǧHhPlI׏1 ?eWʪ !g?AQ4(||̙v}d.&g0 ˔]8gD* k eO:mKHRoqrwi Z*8d.111M6 o %b@80 ՂT 9Ie.2{G@0  5ՅT @R%AH!UT @R%AH!UT @R%AH!U$c}p@TASP)ѥIENDB`gvb-1.2.1/help/it/gvb-it.omf0000644000175000017500000000117311336006273015121 0ustar pietropietro toobaz@email.it (Pietro Battiston) Good ViBrations Manual 2009-11-14 gvb-1.2.1/help/it/gvb.xml0000644000175000017500000006642211336006273014536 0ustar pietropietro Good ViBrations"> ]>
Good ViBrations 2009 Pietro Battiston Pietro Battiston (toobaz@email.it) Questo documento è rilasciato sotto una licenza Creative Commons ShareAlike 3.0 (CC-BY-SA). Questo documento è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA: senza neanche la garanzia implicita di COMMERCIABILITÀ o di APPLICABILITÀ PER UN PARTICOLARE SCOPO. Una copia della licenza è disponibile qui. Pietro Battiston Sviluppatore di GVB Pietro Battiston Sviluppatore di GVB toobaz@email.it Traduzione italiana Manuale 1.0 di Gvb Novembre 2009 Pietro Battiston toobaz@email.it Pietro Battiston Questo manuale descrive la versione 1.2 di Good ViBrations (GVB). Feedback Per segnalare un bug o dare suggerimenti riguardanti il programma Good ViBrations o questo manuale, si prega di utilizzare la pagina su Launchpad del progetto. Manuale utente di Good ViBrations. Good ViBrations Introduzione Good ViBrations (letteralmente, "buone vibrazioni" in italiano) è un'applicazione per simulare vibrazioni in 1 e 2 dimensioni. Finestra principale di Good ViBrations La maggioranza delle funzionalità di Good ViBrations è accessibile direttamente dalla schermata principale:
Finestra principale di GVB Mostra la finestra principale di GVB.
Sulla sinistra, si può vedere l'area di visualizzazione principale, in cui si svolge la simulazione. Sulla destra si trovano le varie regolazioni e gli indicatori: premere Parti per vederli in azione. Velocità: imposta la velocità a cui si svolge la simulazione. Passo: per quei metodi di calcolo che operano in tempo discreto (si veda (see per informazioni), permette di impostare il tempo trascorso tra un'iterazione e la successiva. Più questo valore è basso, maggiore sarà la precisione della simulazione, ma anche il costo computazionale. Sotto a Passo si trova il contatore, che mostra quanti fotogrammi sono stati calcolati dall'inizio della simulazione. ms. di calcolo riporta la media dei millisecondi spesi per calcolare ogni nuovo fotogramma (negli ultimi 2 seconds). ms. di disegno riporta la media dei millisecondi spesi per disegnare ogni nuovo fotogramma (negli ultimi 2 secondi). Corda e Superficie permettono di passare a simulazioni in (rispettivamente) 1 e 2 dimensioni. Cambiando questa impostazione, l'animazione sarà fermata e riavviata. Sotto, il pulsante Start riporta ora la scritta Ferma: premendolo, l'animazione si arresterà. Metodo di calcolo: imposta il metodo di calcolo utilizzato. Si veda per una lista dei metodi e le rispettive descrizioni. Fotogramma/secondo: imposta il numero di fotogrammi visualizzati al secondo. Sotto i 20, l'animazione può essere scattosa, ma sopra i 25 non si dovrebbe notare quasi alcuna differenza (ed il costo computazionale salirà per i metodi che operano in tempo continuo). Grafica: imposta il metodo di visualizzazione. Si veda per una lista dei metodi e le rispettive descrizioni. Troppa precisione può far male! Velocità, Passo e Fotogrammi/secondo sono parametri fondamentali (insieme al numero di punti utilizzati - si veda ) nel determinare la quantità di operazioni matematiche che il computer deve effettuare ogni secondo: se sono scelti valori eccessivi, l'animazione può diventare scattosa, o addirittura Good ViBrations può bloccarsi. In questa eventualità, cliccare Ferma (solo una volta): nella maggior parte dei casi, l'interfaccia tornerà alla normalità in pochi secondi.
Il menu <guimenu>File</guimenu> Il menu File elenca alcune operazioni generali: FileApri: apre una disposizione (ovvero la descrizione dei punti e delle loro velocità) da un file. FileSalva: salva la disposizione dei punti e le loro velocità in un file. FileSalva come: salva la disposizione dei punti e le loro velocità in un nuovo file (se non si è ancora salvata alcuna disposizione, questa opzione è equivalente a FileSalva). FileEsci: esci da Good ViBrations. Il menu <guimenu>Disposizioni</guimenu> Il menu Disposizioni permette di impostare la forma della corda o della membrana all'inizio della simulazione. Ci sono due modi di farlo: scegliendo una delle disposizioni precotte: ne è disponibile una collezione, sia in 1 che in 2 dimensioni, avviando l'editor avanzato, anche questo disponibile per 1 e 2 dimensioni (si veda ). Il menu <guimenu>Opzioni</guimenu> Il menu Opzioni permette di configurare alcuni aspetti della simulazione. OpzioniNumero di punti: cambia il numero di punti utilizzati nella simulazione (si veda ). OpzioniSalva i fotogrammi come png: se questa casellina è spuntata, l'animazione verrà salvata su disco invece di essere resa sullo schermo: si veda per informazioni. Il menu <guimenu>Aiuto</guimenu> Il menu Aiuto permette di accedere ad informazioni riguardanti il programma. AiutoSommario: apri questo manuale. AiutoInformazioni: mostra alcune informazioni su Good ViBrations.
Cambiare il numero di punti In Good ViBrations, la corda e la membrana sono approssimate come un certo numero di punti connessi da segmenti diritti. Maggiore è il numero di punti, maggiore sarà la qualità della simulazione, ma crescerà anche il numero di operazioni di calcolo necessarie per effettuarla. Per cambiare il numero di punti, selezionare OpzioniNumero di punti. Una volta aperta questa finestra di dialogo, l'animazione, se attiva, si fermerà automaticamente e, se il numero di punti viene effettivamente cambiato, sarà riportata alla posizione iniziale, dato che Good ViBrations non è in grado di cambiare il numero di punti di una simulazione durante il suo svolgimento. Mentre in 1 dimensione un numero può valere l'altro, in 2 dimensioni i punti devono essere disposti lungo una griglia rettangolare (quasi quadrata). Se il numero scelto non è adatto, ne saranno utilizzati meno. Ad esempio, se il numero di punti scelto è 11, ne verranno utilizzati solo 9 (3×3); se è 14, ne verranno utilizzati solo 12 (3×4). Quando i punti sono troppi Il numero di punti utilizzati è un parametro fondamentale per determinare il costo computazionale della simulazione: l'efficienza può peggiorare molto con il loro incremento, e mentre un numero tra 100 e 150 dovrebbe essere accettabile su qualsiasi computer, un numero superiore a questi livelli può far sì che l'interfaccia si blocchi (a seconda anche del metodo di calcolo scelto - si veda - e del valore degli altri parametri descritti in ). Per osservare le armoniche, si può trovare il numero più adatto in questo modo: prendere un numero con molti fattori piccolo, come ad esempio 2×2×3=12, sottrarre 1: 11. se si vuole effettuare una simulazione in 2 dimensioni, prenderne il quadrato: 11×11=121. In questo esempio, sarà possibile osservare in modo ottimale le armoniche seconda, quarta e terza. Metodi di disegno Good ViBrations ha tre diversi modi di visualizzare una simulazione, sia in 1 che in 2 dimensioni, accessibili tramite la casella di scelta: wave/3D i punti sono disegnati ad altezze diverse (in prospettiva se si sta lavorando in 2 dimensioni), formando qualcosa di effettivamente simile ad una corda o ad una membrana; speeds è simile al precedente, ma mostra anche la velocità istantanea di ogni punto, sotto forma di un segmento rosso orientato nella direzione del movimento; geo mostra le altezze similmente a come le mappe geografiche mostrano le altitudini: i punti sono rappresentati da quadratini, con colori che variano dal blu scuro (i punti più in basso) a blu chiaro, verde, marrone, marrone scuro ed infine bianco (i punti più alti). L'editor avanzato di disposizioni Selezionando Disposizioni1 dimensione: avanzato o Disposizioni2 dimensioni: avanzato, si accede all'editor avanzato di disposizioni. È una finestra che permette di configurare la posizione di partenza della corda o della membrana interattivamente, con molta più libertà di scelta che accontentandosi di una delle disposizioni precotte.
L'editor avanzato in 2 dimensioni Mostra l'editor avanzato GVB.
In cima, la casella di scelta Grafica permette di cambiare la visualizzazione della disposizione all'interno dell'editor, un po' come nella finestra principale. Si noti che in questo caso non c'è particolare differenza tra wave/3D e speeds, dato che non si sta considerando alcuna velocità. L'editor avanzato si utilizza regolando i parametri di certe forme d'onda e combinandole. Sulla sinistra, si può vedere un'anteprima della disposizione mano a mano che le modifiche sono applicate. Sulla destra si trovano le varie regolazioni per modificare la forma fino a raggiungere quella desiderata. Regolazioni per una dimensione specifica Forma d'onda: stabilisce la forma base della onda da usare: può essere sinusoidale, triangolare, quadrata o un semplice picco. Lunghezza d'onda: stabilisce la frazione dello spazio disponibile che la nuova forma deve occupare. Il valore iniziale è "tutta"; se ad esempio il cursore viene spostata a metà corsa, la forma risultante occuperà solo metà dell'intero spazio della simulazione. Spostamento: stabilisce se la forma deve partire dal primo punto (è il valore di default) o da un qualche altro punto nel mezzo. Si noti che se l'onda è spostata fino a superare il limite dello spazio totale, la parte in eccesso dalla parte destra/anteriore viene aggiunta dalla parte sinistra/posteriore, in una sorta di rotazione. Lunghezza d'onda: stabilisce la lunghezza d'onda della forma base, ovvero lo spazio occupato da una sua ripetizione completa, o in altre parole la distanza tra due picchi successivi. Il valore iniziale è esattamente lo spazio disponibile, ma lo si può accrescere fino a 4 volte tanto e diminuire fino a 4 volte meno. Fase: stabilisce la fase dell'onda, ovvero la traslazione che viene effettuata alla forma base. Se Lunghezza totale ha il valore massimo, l'effetto di questa regolazione è esattamente lo stesso di Spostamento; se invece così non è, può essere utilizzata per traslare/ruotare la forma d'onda all'interno dell'intervallo di applicazione. Ampiezza: stabilisce l'ampiezza dell'onda, ovvero la distanza verticale tra un picco e la linea di riposo: il valore di default è il massimo; se ridotto, tutta la forma d'onda viene riscalata verticalmente. Centratura: stabilisce a che punto la forma d'onda deve raggiungere il picco massimo: normalmente è posto a metà, e la forma d'onda e simmetrica; spostandolo a sinistra aumenterà la pendenza della forma d'onda a sinistra ed aumenterà a destra, e viceversa spostandolo a destra. Rifletti: selezionando questa casella, la forma d'onda viene riflessa rispetto ad un asse verticale posto a metà. Quelle elencate sono proprietà legate ad una singola dimensione: quando si lavora in 2 dimensioni, ognuna di esse è ripetuta due volte, una nella colonna Orizzontale ed una in quella Verticale, e riguarda rispettivamente il dominio sinistra-destra e quello dietro-avanti. Controlli generali Le altre opzioni che seguono invece si applicano genericamente ad 1 o 2 dimensioni. Inverti: selezionando questa casella, la forma d'onda è invertita, ovvero ogni punto viene riflesso rispetto ad un piano orizzontale: ciò che è sotto andrà sopra e viceversa. Regola di composizione (solo in 2 dimensioni): dato che le regolazioni legate ad una singola dimensione permettono di forgiare solo due particolari forme d'onda monodimensionali, che verranno orientate rispettivamente da sinistra a destra e da dietro a davanti, è qui possibile stabilire come queste forme dovranno combinarsi: prodotto: l'altezza di ogni punto sarà il prodotto delle altezze date dalle due forme d'onda; somma: l'altezza di ogni punto sarà la somma delle altezze date dalle due forme d'onda; massimo: l'altezza di ogni punto sarà il valore massimo assunto tra le due forme d'onda; minimo: l'altezza di ogni punto sarà il valore minimo assunto tra le due forme d'onda. Aggiungi alla posizione attuale: se il numero di dimensioni in cui stiamo lavorando è lo stesso utilizzato nella simulazione nella finestra principale, è possibile, selezionando questa casella, sommare la forma d'onda che si sta creando con lo stato corrente della simulazione. Ciò fornisce uno strumento molto potente per creare disposizioni arbitrariamente complesse, semplicemente aggiungendo una forma d'onda alla volta, eventualmente ognuna ristretta ad una parte soltanto dello spazio disponibile. In fondo alla finestra, sono presenti tre pulsanti. Ripristina riassegna ad ogni regolazione il suo valore iniziale. Annulla chiude la finestra, annullando ogni modifica fatta. Applica chiude la finestra, rendendo effettive le modifiche.
Metodi di calcolo Good ViBrations mette a disposizione diversi metodi di calcolo, accessibili dal menu a scelta Metodi ci calcolo, nella finestra principale. Attenzione, dettagli tecnici! Questa pagina contiene una lista dettagliata dei vari algoritmi disponibili Good ViBrations e dei loro aspetti tecnici; in quanto tale, potrebbe non essere comprensibile a chi non fosse abituato ai concetti matematici adoperati. Siccome Good ViBrations non è fatto solo per i laureati in matematica, ecco un riassunto più sintetico: naif: spreciso e lento, non c'è nessun motivo reale di utilizzarlo; naif matrix: identico a naif, ma più veloce; quad: più preciso, ma anche più pesante dal punto di vista dei calcoli necessari; eig: meno preciso di quad per animazioni molto brevi, ma il migliore a lungo termine, dato che non introduce o amplifica errori con il passare del tempo: tuttavia, deve effettuare alcuni calcoli iniziali, che potrebbero richiedere molto tempo e bloccare l'interfaccia prima dell'inizio dell'animazione se il numero di punti utilizzato è alto. Quella che segue è la lista più dettagliata. naif opera in tempo discreto: calcola la posizione di un punto ad una data iterazione grosso modo come la posizione nell'iterazione precedente più la velocità nell'iterazione precedente, moltiplicata per il tempo trascorso (che è dato dal parametro Passo), e la velocità in una data iterazione come la differenza tra la sua altezza e l'altezza media dei punti circostanti nell'iterazione precedente. naif matrix è identico a naif, tranne che non calcola i punti uno alla volta, ma li tratta come un vettore, che è aggiornato iterazione dopo iterazione moltiplicandolo per una matrice data. Lo si può considerare un test di riferimento: paragonare i tempi di calcolo con quelli di naif dà l'idea di quanto le librerie scipy utilizzate per i calcoli matriciali siano più efficienti del semplice codice Python. quad è simile a naif, tranne che non linearizza il calcolo della velocità: essa non è più la semplice differenza in altezza rispetto ai punti circostanti, ma prende in considerazione la distanza "vera", compresa la componente orizzontale. eig opera in tempo continuo: prende il problema linearizzato (come naif), ma considera il sistema associato di equazioni differenziali, che è definito da una certa matrice, di cui calcola l'esponenziale: per effettuare questa operazione, deve calcolarne gli autovalori ed autovettori (grazie alla libreria scipy). Una volta finito questo calcolo, non fa altro che moltiplicare tra di loro la matrice risultante e la matrice diagonale data dagli esponenziali degli autovalori. Salvare i fotogrammi come immagini Selezionando OpzioniSalva fotogrammi come png, si aprirà una finestra di dialogo in cui sarà possibile scegliere una cartella, ed i fotogrammi saranno quindi salvati in quella cartella come immagini png, invece di essere visualizzati sullo schermo. Questa funzionalità è comoda per creare un video, o quando la complessità dei calcoli richiesti è eccessiva per una visualizzazione in tempo reale. Deselezionando la casellina, l'animazione riprenderà ad essere visualizzata sullo schermo. Un modo semplice per trasformare le immagini così prodotte in un video è il seguente: assicurarsi che il programma ffmpeg sia installato nel sistema, aprire un terminale e spostarsi nella cartella contentente le immagini preparate con Good ViBrations, dare il comando ffmpeg -i %08d.png video.mp4.
gvb-1.2.1/stuff/0000755000175000017500000000000011336006273013007 5ustar pietropietrogvb-1.2.1/stuff/logo.png0000644000175000017500000000234511336006273014461 0ustar pietropietroPNG  IHDR@@iqsBIT|d pHYsItEXtSoftwarewww.inkscape.org<bIDATx[hEY-}IUz>TtVے>x)^*lͬQ *B RPGSoUjb4%UPR/TZ"EтI\čn6%3'3翳3sN[RRjQ@j& F!@jQ@j& F!@jqd'g5ۀ-ˇYmĂ׀5@(s L怺^ F_ƍ9x8WM;ˌY }nc@;0 h<qPm;25gۀc eQJuO13;gspF&&/S"| t/ۦ5gg.K`T/z+8Q{Vs=$X`m4HpL'/77 ~KX<<{f~@ 8{60SkO3u;3?%퀻xْu eX˳3Y uw|CcxYg@=g|/ų_ kħ/#t7~L` Gfgg7Y4mZRVs''8pvƵ3 `!Q-gTG@ƷyPpZs׫)Z̤/zT!!.fe׸13[{5ax< 8;0]`H,V/{Z0%T uN+>T*i*Muyeof 5(HM 5 RHBR 5(HM 5 RH} t\IENDB`gvb-1.2.1/stuff/gvb.svg0000644000175000017500000001122711336006273014311 0ustar pietropietro image/svg+xml gvb-1.2.1/stuff/wlogo.svg0000644000175000017500000001122711336006273014662 0ustar pietropietro image/svg+xml gvb-1.2.1/stuff/gvb.glade0000644000175000017500000026622011336006273014573 0ustar pietropietro True Good Vibrations center 438 246 wlogo.svg True True True _File True True gtk-open True True True accelgroup1 gtk-save True True True accelgroup1 gtk-save-as True True True accelgroup1 True gtk-quit True True True accelgroup1 True _Disposition True True True _Options True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Number of points True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Save frames as png True True _Help True True _Contents True True image1 False gtk-about True True True accelgroup1 False 0 True 300 300 True 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True True True Speed right False False 0 True True adjustment16 0.01 3 1 False False 0 True True True Step right False False 0 True True adjustment15 0.089999999999999997 2 False 1 False False 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK calculation ms. right 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 0 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK drawing ms. right 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 4 True Rope True True False True True True False 0 Membrane True True False True True dim 1 False 1 False False 5 Start 20 29 True True False True False False 6 True True True Calculation False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK liststore5 0 1 False False 7 True True True Frames/second right False False 0 True True mpf_adjustment 1 1 False 1 False False 8 True True True Graphics False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK liststore4 0 1 False False 9 False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 1 False 2 1 True False False 2 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 About Good ViBrations False center-on-parent wlogo.svg dialog Good ViBrations (gvb) Copyright Pietro Battiston 2008 A waves simulator. http://www.pietrobattiston.it/gvb Visit GVB website. Good ViBrations 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. Good ViBrations 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 Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. Pietro Battiston ar: صقر بن عبدالله cs: Vojtěch Trefný <vojtech.trefny@gmail.com> da: carson, nanker es: J Álvaro Fernández <jalvarof@gmail.com> fr:Pierre Slamich <pierre.slamich@gmail.com>, François Blondel it: Pietro Battiston <toobaz@email.it> nb: kingu <comradekingu@gmail.com>, Tor Syversen <sol-moe@online.no> nl: Wander Nauta <info@wandernauta.nl> pl: pawprok, Bartosz Kaszubowski <gosimek@gmail.com>, Jarosław Ogrodnik <nobodythere@gmail.com> ru: Roman Azarenko aka BasicXP <x12ozmouse@ya.ru> sv:carson, Carl-Uno Olsson, Daniel Nylander, nanker logo.svg True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end False end 0 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 Initial position center-on-parent wlogo.svg dialog True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True True Graphics False False 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK liststore3 0 1 False False 0 300 300 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK False False 1 Add to current disposition True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 2 0 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 10 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Composition rule: 0 product True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True 1 sum True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True editor rule prod 2 maximum True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True editor rule prod 3 minimum True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True True editor rule prod 4 3 9 10 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Vertical 2 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Horizontal 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK liststore2 0 2 3 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK liststore1 0 1 2 1 2 100 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment13 False 2 3 2 3 100 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment12 False 1 2 2 3 100 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment11 False 2 3 3 4 100 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment10 False 1 2 3 4 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment9 False 2 3 4 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment8 False 1 2 4 5 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment7 False 2 3 5 6 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment6 False 1 2 5 6 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment5 False 2 3 6 7 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment4 False 1 2 6 7 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment3 False 1 0 False right 2 3 7 8 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment2 False 1 0 False right 1 2 7 8 Reflect True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 2 3 8 9 Reflect True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 1 2 8 9 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Waveform 1 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Total lenght 2 3 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Shift 3 4 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Wavelenght 4 5 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Phase 5 6 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Amplitude 6 7 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Centering 7 8 Invert True True False GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True 8 9 1 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK gtk-revert-to-saved True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 gtk-cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 1 gtk-apply True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 2 False end 0 button3 button2 button1 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 Number of points center-on-parent wlogo.svg dialog True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Total number of points: 0 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK adjustment1 1 False False 0 True When working in two dimensions, points are arranged in a rectangular grid: if the chosen number doesn't fit, some points may be dropped. True 1 True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK If you want to observe harmonics, the perfect number of points per dimension is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many times 2 as factor, it will be possible to draw better the second harmonic, the fourth and so on). True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK Hint: 2 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 gtk-apply True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 1 False end 0 button5 button4 GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 Choose a path center-on-parent wlogo.svg dialog False True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 1 False end 0 button7 file chooser button GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 popup File exists center-on-parent wlogo.svg dialog True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK There is already a file with this name, are you sure you want to overwrite it? 1 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 gtk-save True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 1 False end 0 button9 button GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 5 False center-on-parent dialog True error File not found. True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK 2 True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK end gtk-cancel True True True GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK True False False 0 False end 0 button11 100 1 10 0.01 0.98999999999999999 0.10000000000000001 0.10000000000000001 0.10000000000000001 0.5 0.01 0.98999999999999999 0.10000000000000001 0.10000000000000001 0.10000000000000001 0.5 0.01 1 0.10000000000000001 0.10000000000000001 0.10000000000000001 0.90000000000000002 0.01 1 0.10000000000000001 0.10000000000000001 0.10000000000000001 0.90000000000000002 360 1 10 10 360 1 10 10 0.01 10 1 1 1 1 0.01 10 1 1 1 1 100 1 10 10 100 1 10 10 0.01 1 0.01 0.10000000000000001 0.10000000000000001 0.90000000000000002 0.01 1 0.01 0.10000000000000001 0.10000000000000001 0.90000000000000002 1 50 1 1 20 0.01 2 0.050000000000000003 0.10000000000000001 0.40000000000000002 1 0.01 0.10000000000000001 0.050000000000000003 sinusoidal sinusoidal True gtk-help gvb-1.2.1/stuff/gvb.desktop0000644000175000017500000000041711336006273015162 0ustar pietropietro[Desktop Entry] Categories=Education;Science;Physics; Comment=Play with waves and vibrations Comment[fr]=Joue avec les ondes e les vibrations Comment[it]=Gioca con onde e vibrazioni Exec=gvb Icon=gvb.svg Name=Gvb Terminal=false Type=Application X-KDE-SubstituteUID=false gvb-1.2.1/stuff/logo.svg0000644000175000017500000001025611336006273014474 0ustar pietropietro image/svg+xml gvb-1.2.1/locale/0000755000175000017500000000000011336006273013117 5ustar pietropietrogvb-1.2.1/locale/cs/0000755000175000017500000000000011336006273013524 5ustar pietropietrogvb-1.2.1/locale/cs/LC_MESSAGES/0000755000175000017500000000000011336006273015311 5ustar pietropietrogvb-1.2.1/locale/cs/LC_MESSAGES/gvb.mo0000644000175000017500000000554311336006273016433 0ustar pietropietro%01D Z ft!*;DUZmsy ~ |           ! ( 7 K S [    A waves simulator.About Good ViBrationsCalculationFrames/secondGood ViBrations 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. Good ViBrations 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 Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.GraphicsInitial positionMembraneNumber of pointsRopeSave frames as pngSpeedStartStep_Disposition_File_Help_Optionscalculation ms.drawing ms.maximumminimumproductProject-Id-Version: gvb Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2009-11-14 16:36+0100 PO-Revision-Date: 2009-11-15 09:36+0000 Last-Translator: Vojtěch Trefný Language-Team: Czech MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2009-11-25 04:46+0000 X-Generator: Launchpad (build Unknown) Simulátor vlnění.O Good ViBrationsVýpočetSnímků za sekunduGood ViBrations je svobodný software; můžete jej šířit a modifikovat podle ustanovení GNU General Public License, vydávané Free Software Foundation; a to buď verze 3 této licence anebo (podle svého uvážení) kterékoli pozdější verze. Program Good ViBrations je rozšiřován v naději, že bude užitečný, avšak BEZ JAKÉKOLI ZÁRUKY; neposkytují se ani odvozené záruky PRODEJNOSTI anebo VHODNOSTI PRO URČITÝ ÚČEL. Další podrobnosti hledejte v GNU General Public License. Kopii GNU General Public License jste měli obdržet spolu s programem Good ViBrations; pokud se tak nestalo, napište na adresu Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USAGrafikaVýchozí poziceMembránaPočet bodůKřivkaUložit ve formátu PNGRychlostSpustitKrokUspořá_dání_SouborNápo_vědaV_olbyvýpočet [ms]vykreslování [ms]maximumminimumproduktgvb-1.2.1/locale/es/0000755000175000017500000000000011336006273013526 5ustar pietropietrogvb-1.2.1/locale/es/LC_MESSAGES/0000755000175000017500000000000011336006273015313 5ustar pietropietrogvb-1.2.1/locale/es/LC_MESSAGES/gvb.mo0000644000175000017500000001357311336006273016437 0ustar pietropietroFLa|0Hat                  & , 1 N6     c m z              $ 3 8 @ D O a h v z  >Vq6Ke 9C LWPbkt  I(7PY o} 7 CQZ a ky   ! &1CL\as. #E+=-(:8>37'2 !C"0&)@5/,<$D %* ;49AF 6B?1%d dimension: advanced%d dimension: precooked%d dimensions: advanced%d dimensions: precookedA waves simulator.About Good ViBrationsAdd to current dispositionAmplitudeCalculationCenteringChoose a pathComposition rule:File existsFrames/secondGood ViBrations 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. Good ViBrations 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 Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.GraphicsHint:HorizontalIf you want to observe harmonics, the perfect number of points per dimension is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many times 2 as factor, it will be possible to draw better the second harmonic, the fourth and so on).Initial positionInvertMembraneNumber of pointsPhaseReflectRopeSave frames as pngShiftSpeedStartStepStopThere is already a file with this name, are you sure you want to overwrite it?Total lenghtTotal number of points:VerticalVisit GVB website.WaveformWavelenghtWhen working in two dimensions, points are arranged in a rectangular grid: if the chosen number doesn't fit, some points may be dropped._Contents_Disposition_File_Help_Optionscalculation ms.cos (shifted)discontinuous peakdrawing ms.flatguthalf sinmaximumminimumopposite sinusoidalsopposite triangularspeakpickedpicked lateralpondproductsinsinusoidalsinusoidal signalsquaresquare signalsumtriangular signalwaterfallProject-Id-Version: gvb Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2009-11-14 16:36+0100 PO-Revision-Date: 2009-11-15 14:00+0000 Last-Translator: J Álvaro Fernández Language-Team: Spanish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2009-11-25 04:46+0000 X-Generator: Launchpad (build Unknown) %d dimensión: avanzada%d dimensión: precocinada%d dimensiones: avanzada%d dimensiones: precocinadaUn simulador de ondas.Acerca de Good ViBrationsAñadir a disposición actualAmplitudCálculoCentradoElija una rutaRegla de composición:El archivo ya existeCuadros por segundo (fps)Good ViBrations es software libre; puede distribuirlo y/o modificarlo bajo los términos de la licencia GPL GNU publicada por la Fundación de Software Libre; ya sea la versión 3 de la licencia, o (a su criterio) cualquier versión posterior. Good ViBrations se distribuye con la idea de que sea útil, pero SIN GARANTÍA ALGUNA; incluso sin la garantía implícita de MERCANTIBILIDAD ni de ADECUACIÓN A PROPÓSITO CONCRETO. Lea la licencia GPL GNU para conocer más detalles. Debería haber recibido una copia de la licencia GPL GNU junto a este programa. En caso contrario, contacte con la Fundación en la siguiente dirección: Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.GráficosConsejo:HorizontalSi desea observar armónicos, el número ideal de puntos por dimensión es un entero n tal que n+1 posea muchos factores pequeños (p. e.: si n+1 contiene el factor 2 muchas veces, será posible dibujar mejor el armónico segundo, el cuarto, etc.).Posición inicialInvertirMembranaNúmero de puntosFaseVoltearCuerdaGuardar cuadro como pngDesplazarVelocidadComenzarAvanceDetenerYa existe un archivo con este nombre, ¿seguro que desea sobreescribirlo?Longitud totalNúmero total de puntos:VerticalVisitar GVB en la webForma de ondaLongitud de ondaAl trabajar en dos dimensiones, los puntos se organizan en una rejilla rectangular: si el número elegido no se ajusta completamente, se perderán los puntos sobrantes._Contenidos_Disposición_ArchivoA_yuda_Opcionescálculo (ms)coseno (alzado)pico discontinuodibujo (ms)planotubomedio senomáximomínimosinusoidales opuestastriangulares opuestaspicopicopico lateralestanqueproductosenosinusoidalseñal sinusoidalcuadradaseñal cuadradasumaseñal triangularcascadagvb-1.2.1/locale/da/0000755000175000017500000000000011336006273013503 5ustar pietropietrogvb-1.2.1/locale/da/LC_MESSAGES/0000755000175000017500000000000011336006273015270 5ustar pietropietrogvb-1.2.1/locale/da/LC_MESSAGES/gvb.mo0000644000175000017500000000417111336006273016406 0ustar pietropietro'T5`a w      N$ s   !       - 4AF LV\aPf   '6;DLT Xcu    !#$ %& "'About Good ViBrationsAmplitudeCalculationCenteringChoose a pathFile existsFrames/secondGraphicsHint:HorizontalInitial positionInvertNumber of pointsPhaseShiftSpeedStartStepStopThere is already a file with this name, are you sure you want to overwrite it?Total lenghtTotal number of points:VerticalVisit GVB website.WaveformWavelenght_Contents_File_Help_Optionsflatmaximumminimumproductsinsquaresquare signalsumProject-Id-Version: gvb Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2009-11-14 16:36+0100 PO-Revision-Date: 2009-12-30 03:02+0000 Last-Translator: nanker Language-Team: Danish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2009-12-31 04:56+0000 X-Generator: Launchpad (build Unknown) Om Good ViBrationsAmplitudeBeregningCentreringVælg en stiFilen findesRammer/sekundGrafikRåd:VandretUdganspositionModsatAntal pointsFaseSkiftHastighedStartTrinStopDer er allerede en fil med det navn, er du sikker på, at du vil overskrive den?Total længdeTotalt antal point:LodretBesøg GVB's hjemmesideBølgeformBølgelængde_Indhold_Fil_Hjælp_Indstillingerfladmaksimumminimumproduktsinkvadratiskkvadratisk signalsumgvb-1.2.1/locale/nl/0000755000175000017500000000000011336006273013530 5ustar pietropietrogvb-1.2.1/locale/nl/LC_MESSAGES/0000755000175000017500000000000011336006273015315 5ustar pietropietrogvb-1.2.1/locale/nl/LC_MESSAGES/gvb.mo0000644000175000017500000000670411336006273016437 0ustar pietropietro)d;       #(;AGMR Wdm v  x              # , 2 7 ? L V _ j s y       "'  #)(&%!$A waves simulator.About Good ViBrationsAmplitudeCalculationCenteringChoose a pathComposition rule:File existsFrames/secondGood ViBrations 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. Good ViBrations 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 Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.GraphicsHint:HorizontalInitial positionInvertMembraneNumber of pointsPhaseReflectRopeSave frames as pngShiftSpeedStartStepStopTotal lenghtVerticalWaveformWavelenght_File_Help_Optionscalculation ms.drawing ms.maximumminimumproductsinusoidalsumProject-Id-Version: gvb Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2009-11-14 16:36+0100 PO-Revision-Date: 2009-11-15 09:36+0000 Last-Translator: Wander Nauta Language-Team: Dutch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2009-11-25 04:46+0000 X-Generator: Launchpad (build Unknown) Een golfsimulator.Over Good ViBrationsAmplitudeBerekeningCentrerenKies een padCompositieregel:Bestand bestaat alFrames/secondeGood ViBrations 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. Good ViBrations 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 Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.BeeldHint:HorizontaalBeginpositieOmkerenMembraanAantal puntenFaseReflecterenTouwFrames opslaan als PNGShiftSnelheidStartStapStoppenTotaallengteVerticaalGolfvormGolflengte_Bestand_Help_Optiesberekening ms.tekenen ms.maximumminimumproductsinusoidaalsomgvb-1.2.1/locale/ar/0000755000175000017500000000000011336006273013521 5ustar pietropietrogvb-1.2.1/locale/ar/LC_MESSAGES/0000755000175000017500000000000011336006273015306 5ustar pietropietrogvb-1.2.1/locale/ar/LC_MESSAGES/gvb.mo0000644000175000017500000000124311336006273016421 0ustar pietropietroL | iv  SpeedStep_File_Help_OptionsProject-Id-Version: gvb Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2009-11-14 16:36+0100 PO-Revision-Date: 2009-11-15 09:36+0000 Last-Translator: Pietro Battiston Language-Team: Arabic MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2009-11-25 04:46+0000 X-Generator: Launchpad (build Unknown) السرعةخطوة_ملفم_ساعدة_خياراتgvb-1.2.1/locale/sv/0000755000175000017500000000000011336006273013547 5ustar pietropietrogvb-1.2.1/locale/sv/LC_MESSAGES/0000755000175000017500000000000011336006273015334 5ustar pietropietrogvb-1.2.1/locale/sv/LC_MESSAGES/gvb.mo0000644000175000017500000000763711336006273016464 0ustar pietropietro1C,89L b l x   ir xN FS\ e p}           *      #1 5@DY _ipuV|     $ 5BFNV[c gs ,1"$# ' &.+% *(  / -!)0A waves simulator.About Good ViBrationsAmplitudeCalculationCenteringChoose a pathComposition rule:File existsFrames/secondGood ViBrations 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. Good ViBrations 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 Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.GraphicsHint:HorizontalInitial positionInvertMembraneNumber of pointsPhaseReflectRopeSave frames as pngShiftSpeedStartStepStopThere is already a file with this name, are you sure you want to overwrite it?Total lenghtVerticalWaveformWavelenght_Disposition_File_Help_Optionscalculation ms.drawing ms.flatmaximumminimumpondproductsinsinusoidalsinusoidal signalsquaresumwaterfallProject-Id-Version: gvb Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2009-11-14 16:36+0100 PO-Revision-Date: 2009-11-15 09:37+0000 Last-Translator: Pietro Battiston Language-Team: Swedish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2009-11-25 04:46+0000 X-Generator: Launchpad (build Unknown) En vågsimulator.Om Good ViBrationsAmplitudBeräkningCentreringVälj en sökvägKompositionsregel:Filen finnsBilder/sekundGood ViBrations är fri och öppen mjukvara; du kan redistribuera den och/eller modifiera den enligt villkoren i GNU General Public License som publicerade avFree Software Foundation; antingen version 3 av Licensen, eller (om du föredrar det) någon senare version.Good ViBrations har distribuerats med förhoppningen att vara användbar, men UTAN NÅGON GARANTI; till och med utan underförstådd garanti för SÄLJBARHET eller LÄMPLIGHET FÖR SITT SYFTE. Se GNU General Public License för fler detaljer. Du ska ha fått en kopia av GNU General Public License tillsammans med Good ViBrations; om intet, skriv till Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.GrafikTips:VågrätStartpositionInverteraMembranAntal punkterFasReflekteraRepSpara bilder som pngSkiftHastighetStartaStegStoppaDet finns redan en fil med detta namn, är du säker på att du vill skriva över den?Total längdLodrätVågformVåglängd_Disposition_Arkiv_HjälpA_lternativkalkyleringsmissritningsmissrakmaximumminimumdammproduktsinSinusformadsinusformad signalkvadratsummavattenfallgvb-1.2.1/locale/pl/0000755000175000017500000000000011336006273013532 5ustar pietropietrogvb-1.2.1/locale/pl/LC_MESSAGES/0000755000175000017500000000000011336006273015317 5ustar pietropietrogvb-1.2.1/locale/pl/LC_MESSAGES/gvb.mo0000644000175000017500000000476411336006273016445 0ustar pietropietro-=    *8 J Vdm s~N ANW ` kx~       ) 4?G [gp    T2 F N \ l v |           %(!' ),   #* &$-+ "A waves simulator.About Good ViBrationsAmplitudeCalculationCenteringChoose a pathComposition rule:File existsFrames/secondGraphicsHint:HorizontalInitial positionInvertMembraneNumber of pointsPhaseReflectRopeSave frames as pngShiftSpeedStartStepStopThere is already a file with this name, are you sure you want to overwrite it?Total lenghtVerticalWaveformWavelenght_Disposition_File_Help_Optionscalculation ms.drawing ms.maximumminimumpeakproductsinsinusoidalsinusoidal signalsumProject-Id-Version: gvb Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2009-11-14 16:36+0100 PO-Revision-Date: 2010-01-03 23:14+0000 Last-Translator: Jarosław Ogrodnik Language-Team: Polish MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2010-01-05 04:37+0000 X-Generator: Launchpad (build Unknown) Symulator falInformacje o Good ViBrationsAmplitudaObliczeniaWyśrodkowanieWybierz ścieżkęMetoda składania:Plik istniejeKlatek na sekundęKreślenieWskazówkaPoziomoPozycja początkowaOdwrócenieMembranaLiczba punktówFazaOdbiciePękZapisz klatki jako pngPrzesunięciePrędkośćRozpocznijKrokZatrzymajPlik o takiej nazwie już istnieje. Czy na pewno chcesz go zastąpić nowym plikiem?Łączna długośćPionowoKształt faliDługość fali_Rozkład_Plik_Pomoc_Opcjeobliczenia - msrysowanie - msmaksimumminimumszczytiloczynsinsinusoidalnysygnał sinusoidalnysumagvb-1.2.1/locale/nb/0000755000175000017500000000000011336006273013516 5ustar pietropietrogvb-1.2.1/locale/nb/LC_MESSAGES/0000755000175000017500000000000011336006273015303 5ustar pietropietrogvb-1.2.1/locale/nb/LC_MESSAGES/gvb.mo0000644000175000017500000001013111336006273016412 0ustar pietropietro4G\xy        N iv        $ 9 A E P b i w {  ? R e o y   JRXaqz   T #0GP e p}     *2AET  '3+ $, / %.2(1"!&0#)* -4A waves simulator.About Good ViBrationsAmplitudeCalculationCenteringChoose a pathFile existsFrames/secondGood ViBrations 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. Good ViBrations 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 Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.GraphicsHint:HorizontalInitial positionInvertMembraneNumber of pointsPhaseReflectSave frames as pngSpeedStartStepStopThere is already a file with this name, are you sure you want to overwrite it?Total lenghtTotal number of points:VerticalVisit GVB website.WaveformWavelenght_Contents_Disposition_File_Help_Optionscalculation ms.drawing ms.flathalf sinmaximumminimumopposite sinusoidalsproductsinsinusoidalsinusoidal signalsquaresquare signalsumtriangular signalwaterfallProject-Id-Version: gvb Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2009-11-14 16:36+0100 PO-Revision-Date: 2010-01-19 19:37+0000 Last-Translator: Tor Syversen Language-Team: Norwegian Bokmal MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2010-01-20 04:35+0000 X-Generator: Launchpad (build Unknown) En bølgesimulatorOm Good ViBrationsAmplitudeBeregningSentreringVelg en baneFilen eksistererBilder/sekundGood ViBrations er fri mykvare; du kan redistribuere det og/eller modifisere det under vilkårene i GNU General Public Licence publisert av Free Software Foundation; enten versjon 3 av lisensen, eller (etter eget valg) en senere versjon. Good ViBrations er disribuert i håp om at det er nyttig. men det kommer UTEN NOEN GARANTI; uten engang en underforstått garanti om SALGBARHET eller DUGELIGHET FOR EN GITT HENSIKT. Se GNU General Public License for flere detaljer. Du burde ha fått en kopi av GNU General Public License sammen med Good ViBrations; hvis ikke, skriv til Free Software Foundation, Inc., 39 Temple place - Suite 330, Boston, MA 02111-1307, USA.GrafikkHint:VannrettUtgangsposisjonInverterMembranAntall poengFaseReflekterLagre bilder som pngHastighetStartStegStoppDet finnes allerede en fil med dette navnet er du sikker på at du vil erstatte den?Total lengdeTotalt antall piksler:LoddrettBesøk GVB web side.BølgeformBølgelengde_Innhold_disposisjon_Fil_Hjelp_Alternativerkalkulasjon ms.tegner ms.flathalv sinusmaksimumminimummotsatt sinusformetproduktsinussinusformetsinusformet signalfirkantfirkant signalsumtrekant signalfossgvb-1.2.1/locale/ru/0000755000175000017500000000000011336006273013545 5ustar pietropietrogvb-1.2.1/locale/ru/LC_MESSAGES/0000755000175000017500000000000011336006273015332 5ustar pietropietrogvb-1.2.1/locale/ru/LC_MESSAGES/gvb.mo0000644000175000017500000001216211336006273016447 0ustar pietropietro5Gl         +17=BNG        " * ? G K V h o }   C %`    * $ # B O^r% (, U` q|(@Yo #(FW;f )! 4#?c (,4-$3 0 %'&)2"!1 #*+ .5/A waves simulator.About Good ViBrationsAmplitudeCalculationCenteringChoose a pathComposition rule:File existsFrames/secondGood ViBrations 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. Good ViBrations 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 Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.GraphicsHint:HorizontalInitial positionInvertMembraneNumber of pointsPhaseReflectRopeSave frames as pngShiftSpeedStartStepStopThere is already a file with this name, are you sure you want to overwrite it?Total lenghtVerticalWaveformWavelenght_Disposition_File_Help_Optionscalculation ms.cos (shifted)drawing ms.flathalf sinmaximumminimumopposite sinusoidalsproductsinsinusoidalsinusoidal signalsquaresquare signalsumtriangular signalwaterfallProject-Id-Version: gvb Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2009-11-14 16:36+0100 PO-Revision-Date: 2009-11-15 09:37+0000 Last-Translator: Roman A. aka BasicXP Language-Team: Russian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2009-11-25 04:46+0000 X-Generator: Launchpad (build Unknown) Симулятор волн.О программе Good ViBrationsАмплитудаРасчётЦентровкаВыберите путьПравило сопоставления:Файл уже существуетКадров в секундуGood ViBrations - бесплатное программное обеспечение; вы можете распространять и/или изменять его на условиях лицензии GNU GPL, опубликованной Free Software Foundation; используется версия 3 либо (по вашему выбору) более поздняя. Good ViBrations распространяется с надеждой, что программы будет полезна, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без гарантии ТОВАРНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ. Смотрите лицензию GNU GPL для подробностей. Вы должны были получить копию лицензии GNU GPL вместе с программой Good ViBrations; если это не так, свяжитесь с Free Software Foundation, Inc., 59 Temple Place - Офис 330, Бостон, MA 02111-1307 США.ГрафикаПодсказка:ГоризонтальныйНачальное положениеИнвертироватьМембранаКоличество точекФазаОтражениеВерёвкаСохранить кадры как PNGСдвигСкоростьСтартШагОстановитьУже существует файл с таким-же именем, вы уверены, что хотите перезаписать его?Полная длинаВертикальныйФорма волныДлина волны_Диспозиция_Файл_Справка_Параметрырасчёт мс.косинус (сдвинутый)рисование мс.плоскийполовина синусамаксимумминимумпротивоположные синусоидальныепродуктсинуссинусоидальныйсинусоидальный сигналквадратквадратный сигналсумматреугольный сигналводопадgvb-1.2.1/locale/fr/0000755000175000017500000000000011336006273013526 5ustar pietropietrogvb-1.2.1/locale/fr/LC_MESSAGES/0000755000175000017500000000000011336006273015313 5ustar pietropietrogvb-1.2.1/locale/fr/LC_MESSAGES/gvb.mo0000644000175000017500000000741511336006273016435 0ustar pietropietro.=  $ 0 : H Tb ):AJ[ainN   #)/8<DLT Xcu |@ W t ~     w : D M X j s |        R >NWg w  $ !& '*.#  ( %,+) -"A waves simulator.About Good ViBrationsAmplitudeCalculationCenteringChoose a pathFile existsFrames/secondGood ViBrations 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. Good ViBrations 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 Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.GraphicsHint:HorizontalInitial positionInvertMembraneNumber of pointsPhaseReflectRopeSave frames as pngShiftSpeedStartStepStopThere is already a file with this name, are you sure you want to overwrite it?Total lenghtVerticalWaveformWavelenght_Disposition_File_Help_Optionsgutmaximumminimumproductsinsinusoidalsinusoidal signalsquaresquare signalsumtriangular signalProject-Id-Version: gvb Report-Msgid-Bugs-To: FULL NAME POT-Creation-Date: 2009-11-14 16:36+0100 PO-Revision-Date: 2009-11-15 09:36+0000 Last-Translator: Pietro Battiston Language-Team: French MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2009-11-25 04:46+0000 X-Generator: Launchpad (build Unknown) Un simulateur d'ondes.À Propos de Good ViBrationsAmplitudeCalculCentrageChoisir un cheminLe fichier existeFrames/secondesGood ViBrations est un logiciel libre : vous pouvez le redistribuer et/ou le modifier selon les termes de la GNU/GPL publiée par la Free Software Foundation ; soit en version 3 de cette licence, soit supérieure si vous voulez. Good ViBrations est distribué dans l'espoir qu'il sera utile, mais SANS AUCUNE GARANTIE, sans même la garntie d'une VALERU COMMERCIALE ou APTITUDES DANS UN BUT PARTICULIER. Voir la GNU/GPL pour plus d'informations. Vous devriez avoir reçu une copie de la GNU/GPL avec Good ViBrations, si non, écrivez à la Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.AffichageConseil:HorizontalPosition initialeInverserMembraneNombre de pointsPhaseRefletCordeSauvegarder les images en png.DéplacementVitesseCommencerPasArrêterIl existe déjà un fichier avec ce nom. Voulez vous vraiment écraser ce fichier?Longueur totaleVerticalForme de l'ondeLongueur d'onde_Disposition_Fichier_Aide_OptionsgouttemaximumminimumproduitsinsinusoïdalSignal sinusoïdalcarréSignal carrésommeSignal triangulairegvb-1.2.1/locale/it/0000755000175000017500000000000011336006273013533 5ustar pietropietrogvb-1.2.1/locale/it/LC_MESSAGES/0000755000175000017500000000000011336006273015320 5ustar pietropietrogvb-1.2.1/locale/it/LC_MESSAGES/gvb.mo0000644000175000017500000001342411336006273016437 0ustar pietropietroFLa|0Hat                  & , 1 N6     c m z              $ 3 8 @ D O a h v z  #;Sj! 2AjT   &, H T^djIp  %  !07 >IQXl   . #E+=-(:8>37'2 !C"0&)@5/,<$D %* ;49AF 6B?1%d dimension: advanced%d dimension: precooked%d dimensions: advanced%d dimensions: precookedA waves simulator.About Good ViBrationsAdd to current dispositionAmplitudeCalculationCenteringChoose a pathComposition rule:File existsFrames/secondGood ViBrations 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. Good ViBrations 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 Good ViBrations; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.GraphicsHint:HorizontalIf you want to observe harmonics, the perfect number of points per dimension is an n such that n+1 has a lot of small factors (e.g: if n+1 contains many times 2 as factor, it will be possible to draw better the second harmonic, the fourth and so on).Initial positionInvertMembraneNumber of pointsPhaseReflectRopeSave frames as pngShiftSpeedStartStepStopThere is already a file with this name, are you sure you want to overwrite it?Total lenghtTotal number of points:VerticalVisit GVB website.WaveformWavelenghtWhen working in two dimensions, points are arranged in a rectangular grid: if the chosen number doesn't fit, some points may be dropped._Contents_Disposition_File_Help_Optionscalculation ms.cos (shifted)discontinuous peakdrawing ms.flatguthalf sinmaximumminimumopposite sinusoidalsopposite triangularspeakpickedpicked lateralpondproductsinsinusoidalsinusoidal signalsquaresquare signalsumtriangular signalwaterfallProject-Id-Version: Gnome ViBrations 1.0 Report-Msgid-Bugs-To: POT-Creation-Date: 2009-11-14 16:36+0100 PO-Revision-Date: 2009-11-15 09:36+0000 Last-Translator: Pietro Battiston Language-Team: Italian MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Launchpad-Export-Date: 2009-11-25 04:46+0000 X-Generator: Launchpad (build Unknown) %d dimensione: avanzato%d dimensione: precotte%d dimensioni:avanzato%d dimensioni: precotteUn simulatore di vibrazioni.Informazioni su Good ViBrationsAggiungere alla posizione attualeAmpiezzaMetodo di calcoloCentraturaScegli un percorsoRegola di composizione:File esistenteFotogrammi/secondoGood ViBrations è software libero; puoi redistribuirlo e/o modificarlo nei termini della GNU General Public License come pubblicato dalla Free Software Foundation versione 2 o successive. Good ViBrations è distribuito sperando sia utile, ma SENZA ALCUNA GARANZIA espressa o implicita, di COMMERCIABILITÀ o di IDONEITÀ AD UNO SCOPO PARTICOLARE. Vedere la GNU General Public License per ulteriori dettagli. Dovresti aver ricevuto una copia della GNU General Public License con Good ViBrations; se così non fosse, scrivi alla Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.GraficaSuggerimento:OrizzontaleSe si vuole studiare le armoniche, il numero ideale di punti per dimensione è un n tale che n+1 abbia molti fattori piccoli (ad esempio, se n+1 contiene molte volte il 2 come fattore, sarà possibile disegnare al meglio le armoniche seconda, quarta...)Disposizione inizialeInvertiSuperficieNumero di puntiFaseRiflettiCordaSalva i fotogrammi come pngSpostamentoVelocitàPartiPassoFermaEsiste già un file con questo nome, sei sicuro di volerlo sovrascrivere?Lunghezza totaleNumero totale di punti:VerticaleVisita il sito web di GVBForma d'ondaLunghezza d'ondaQuando si lavora in due dimensioni, i punti sono disposti in una griglia rettangolare: se il numero scelto non è adatto potranno esserne utilizzati meno._Sommario_Disposizioni_File_Aiuto_Opzionims. di calcolocoseno (traslato)picco discontinuoms. di disegnopiattagocciamezzo senomassimominimosinusoidali oppostitriangolari oppostipiccopizzicatapizzicata lateralmentestagnoprodottosenosinusoidalesegnale sinusoidalequadrasegnale quadrosommasegnale triangolarecascatagvb-1.2.1/update_moos.py0000644000175000017500000000106311336006273014551 0ustar pietropietro#! /usr/bin/python #UPDATE: import os, subprocess for strings_file in os.listdir('po'): if not strings_file.endswith('.po'): continue lang = strings_file[:-3] # subprocess.call(['msgmerge', '-U', 'po/%s' % strings_file, 'po/good-vibrations.pot']) # if not os.path.exists('locale/%s/LC_MESSAGES' % lang): # os.mkdir('locale/%s' % lang) # os.mkdir('locale/%s/LC_MESSAGES' % lang) subprocess.call(['msgfmt', 'po/%s' % strings_file, '-o', 'locale/%s/LC_MESSAGES/gvb.mo' % lang]) # (commented because now Launchpad does it) gvb-1.2.1/gvbmod/0000755000175000017500000000000011336006273013136 5ustar pietropietrogvb-1.2.1/gvbmod/drawers.py0000644000175000017500000002776311336006273015176 0ustar pietropietro# GVB - a GTK+/GNOME vibrations simulator # # Copyright (C) 2008 Pietro Battiston # # 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, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from scipy import shape from gtk import STATE_NORMAL, ListStore from gtk.gdk import Pixmap from time import time from cairo import ImageSurface, FORMAT_ARGB32, Context def one_basic(cr, size, pos, speeds = None): spaced=1./(len(pos)+1) cr.scale(size[0], size[1]/4) cr.translate(0, 2) cr.set_line_width(.01) cr.set_source_rgb(1,0,0) cr.move_to(0,0) xposition=0 for ypos in pos: xposition=xposition+spaced # print xposition, point cr.line_to(xposition, -ypos) cr.line_to(1,0) cr.stroke() def with_speeds(cr, size, pos, speeds): n = len(pos) spaced=1./(n+1) coeff = .1*n cr.scale(size[0], size[1]/4) cr.translate(0, 2) cr.set_line_width(.1/n) cr.set_source_rgb(1,0,0) cr.move_to(0,0) xposition=spaced for idx in range(len(pos)): cr.move_to(xposition,-pos[idx]) cr.rel_line_to(0,-speeds[idx]*coeff) cr.stroke() xposition=xposition+spaced # print xposition, point cr.set_line_width(.02) cr.set_source_rgb(0,0,1) cr.move_to(0,0) xposition=0 for ypos in pos: xposition=xposition+spaced # print xposition, point cr.line_to(xposition, -ypos) cr.line_to(1,0) cr.stroke() def temperature(cr, size, pos, speeds = None): spaced=1./(len(pos)) cr.scale(size[0], size[1]/4) cr.translate(0, 2) cr.set_line_width(.5) cr.set_source_rgb(1,0,0) cr.move_to(0,0) xposition=0 for ypos in pos: cr.move_to(xposition,0) xposition=xposition+spaced # print xposition, point if ypos >= 1: cr.set_source_rgb(1,1,1) elif ypos > .5: cr.set_source_rgb((1-ypos)/2,(1-ypos)/2,0) elif ypos > 0: cr.set_source_rgb(ypos/2, 1-1.5*ypos, 0) elif ypos > -.5: cr.set_source_rgb(0,1+2*ypos,-ypos) else: cr.set_source_rgb(0,0,1+ypos) cr.line_to(xposition, 0) cr.stroke() # print pos[64] def _two_colours(cr, pos, size, speeds = None): # print "shape", shape(pos) # print pos hspaced=1./shape(pos)[0] vspaced=1./shape(pos)[1] cr.scale(size[0], size[1]) yposition=0 for ypos in pos: xposition=0 # print ypos for xpos in ypos: if xpos > 0: cr.set_source_rgb(1-xpos,1,1) else: cr.set_source_rgb(1,1+xpos,1) cr.rectangle(xposition, yposition, hspaced, vspaced) cr.fill() xposition=xposition+hspaced yposition=yposition+vspaced def colours(cr, size, pos, speeds = None): # print "shape", shape(pos) # print pos hspaced=1./shape(pos)[0] vspaced=1./shape(pos)[1] cr.scale(size[0], size[1]) cr.translate(0, vspaced/2) cr.set_line_width(vspaced) yposition=0 for ypos in pos: xposition=0 cr.move_to(0,yposition) # print ypos for xpos in ypos: cr.move_to(xposition, yposition) xposition=xposition+hspaced # if xpos > 0: # cr.set_source_rgb(xpos,(2-xpos)/3,0) if xpos >= 1: cr.set_source_rgb(1,1,1) elif xpos > .5: cr.set_source_rgb((1-xpos)/2,(1-xpos)/2,0) elif xpos > 0: cr.set_source_rgb(xpos/2, 1-1.5*xpos, 0) elif xpos > -.5: cr.set_source_rgb(0,1+2*xpos,-xpos) else: cr.set_source_rgb(0,0,1+xpos) cr.line_to(xposition, yposition) cr.stroke() yposition=yposition+vspaced def trid(cr, size, pos, speeds = None): # print "shape", shape(pos) # print pos m,n=shape(pos) vspaced=1./(3*n) yposition=.3 cr.set_line_join(2) pos = pos * .5 tr = ([[yposition for i in range(n+2)]] +[[yposition+(j+1)*vspaced]+[yposition + (j+1)*vspaced-pos[j][i]/2 for i in range(n)]+[yposition+(j+1)*vspaced] for j in range(m)] +[[yposition+(m+1)*vspaced for i in range(n+2)]]) cr.scale(size[0], size[1]) # cr.translate(0, vspaced/2) cr.set_line_width(.001) top_margin = .1 for row_idx in range(m+1): margin = top_margin*(1-(float(row_idx)/(m))) marg_under = top_margin*(1-(float(row_idx+1)/(m))) hspaced=(1-2*margin)/(n+3) xposition = margin + hspaced hsp_under=(1-2*marg_under)/(n+3) xpos_under = marg_under + hsp_under # print ypos for col_idx in range(n+1): if tr[row_idx][col_idx+1] > tr[row_idx+1][col_idx+1]: cr.set_source_rgba(1,0,0,.8) else: cr.set_source_rgba(0,1,0,.8) cr.move_to(xposition, tr[row_idx][col_idx]) cr.line_to(xposition + hspaced, tr[row_idx][col_idx+1]) cr.line_to(xpos_under + hsp_under, tr[row_idx+1][col_idx+1]) cr.close_path() cr.fill() if tr[row_idx][col_idx] > tr[row_idx+1][col_idx]: cr.set_source_rgba(1,0,0,.8) else: cr.set_source_rgba(0,1,0,.8) cr.move_to(xposition, tr[row_idx][col_idx]) cr.line_to(xpos_under + hsp_under, tr[row_idx+1][col_idx+1]) cr.line_to(xpos_under, tr[row_idx+1][col_idx]) cr.close_path() cr.fill() # if xpos > 0: # cr.set_source_rgb(xpos,(2-xpos)/3,0) cr.set_source_rgb(0,0,0) cr.move_to(xposition, tr[row_idx][col_idx]) cr.line_to(xposition + hspaced, tr[row_idx][col_idx+1]) cr.line_to(xpos_under + hsp_under, tr[row_idx+1][col_idx+1]) cr.line_to(xpos_under, tr[row_idx+1][col_idx]) cr.close_path() cr.stroke() xposition=xposition+hspaced xpos_under=xpos_under+hsp_under # print vspaced, hspaced def trid_speeds(cr, size, pos, speeds = None): # print "shape", shape(pos) # print pos m,n=shape(pos) vspaced=1./(3*n) coeff = .05*max(m,n) yposition=.3 cr.set_line_join(2) pos = pos * .5 tr = ([[yposition for i in range(n+2)]] +[[yposition+(j+1)*vspaced]+[yposition + (j+1)*vspaced-pos[j][i]/2 for i in range(n)]+[yposition+(j+1)*vspaced] for j in range(m)] +[[yposition+(m+1)*vspaced for i in range(n+2)]]) cr.scale(size[0], size[1]) # cr.translate(0, vspaced/2) cr.set_line_width(.001) top_margin = .1 for row_idx in range(m+1): margin = top_margin*(1-(float(row_idx)/(m))) marg_under = top_margin*(1-(float(row_idx+1)/(m))) hspaced=(1-2*margin)/(n+3) xposition = margin + hspaced hsp_under=(1-2*marg_under)/(n+3) xpos_under = marg_under + hsp_under # print ypos for col_idx in range(n+1): cr.set_line_width(.001) if tr[row_idx][col_idx+1] > tr[row_idx+1][col_idx+1]: cr.set_source_rgba(0,0,1,.8) else: cr.set_source_rgba(0,1,0,.8) cr.move_to(xposition, tr[row_idx][col_idx]) cr.line_to(xposition + hspaced, tr[row_idx][col_idx+1]) cr.line_to(xpos_under + hsp_under, tr[row_idx+1][col_idx+1]) cr.close_path() cr.fill() if tr[row_idx][col_idx] > tr[row_idx+1][col_idx]: cr.set_source_rgba(0,0,1,.8) else: cr.set_source_rgba(0,1,0,.8) cr.move_to(xposition, tr[row_idx][col_idx]) cr.line_to(xpos_under + hsp_under, tr[row_idx+1][col_idx+1]) cr.line_to(xpos_under, tr[row_idx+1][col_idx]) cr.close_path() cr.fill() # if xpos > 0: # cr.set_source_rgb(xpos,(2-xpos)/3,0) cr.set_source_rgb(0,0,0) cr.move_to(xposition, tr[row_idx][col_idx]) cr.line_to(xposition + hspaced, tr[row_idx][col_idx+1]) cr.line_to(xpos_under + hsp_under, tr[row_idx+1][col_idx+1]) cr.line_to(xpos_under, tr[row_idx+1][col_idx]) cr.close_path() cr.stroke() if row_idx != 0 and col_idx != 0: cr.set_line_width(.1/n) cr.set_source_rgba(1,0,0,.5) cr.move_to(xposition, tr[row_idx][col_idx]) cr.rel_line_to(0,-speeds[row_idx-1][col_idx-1]*coeff) cr.stroke() xposition=xposition+hspaced xpos_under=xpos_under+hsp_under # print vspaced, hspaced drawers_1d = { 'wave' : one_basic, 'temp' : temperature, 'speeds': with_speeds } drawers_2d = { 'geo' : colours, '3D' : trid, 'speeds': trid_speeds } drawers_dict={ 1: drawers_1d, 2: drawers_2d } drawers = {1: ['wave', 'temp', 'speeds'], 2: ['3D', 'geo', 'speeds']} class Drawer(): def __init__(self, drawing, combo, dr_type = None): self.drawing = drawing if drawing.window: self.pixmap = Pixmap(drawing.window, drawing.window.get_size()[0], drawing.window.get_size()[1], -1) else: self.pixmap = None self.combo = combo self.active = True self.points = None self.dim = None self.ready = False self.drawn = 0 self.dr_type = dr_type self.combo.connect('changed', self.change_drawer) if hasattr(self.drawing, 'signals_ids'): # This means that the drawing area was already drawn by another # drawer. This one is a possessive guy and want her to forget him. for signal_id in self.drawing.signals_ids: self.drawing.disconnect(signal_id) # Throw away all his ids! You're mine now! self.drawing.signals_ids = [] self.drawing.signals_ids.append(self.drawing.connect('configure-event', self.draw)) self.drawing.signals_ids.append(self.drawing.connect('expose-event', self.redraw)) self.size = None def draw(self, *args): # print "OK, drawing", self, self.__class__, self.drawer, self.dim if self.dim != len(self.points.shape): raise # else: # print "points", self.points.shape, self.points # print args if not self.drawing.window: return # if not self.ready: # self.configure() self.pixmap = Pixmap(self.drawing.window, self.drawing.window.get_size()[0], self.drawing.window.get_size()[1], -1) self.pixmap_size = self.drawing.window.get_size()[0:1] self.cr = self.pixmap.cairo_create() self.cr.set_source_rgb(1,1,1) self.cr.paint() before=time() self.drawer(self.cr, self.drawing.window.get_size(), self.points.pos, self.points.speeds) self.drawing.window.clear() self.drawing.window.draw_drawable(self.drawing.get_style().fg_gc[STATE_NORMAL], self.pixmap, 0, 0, 0, 0, -1, -1) self.drawn=time() return self.drawn-before def dump_draw(self): surface = ImageSurface(FORMAT_ARGB32, self.size[0], self.size[1]) self.cr = Context(surface) before=time() self.drawer(self.cr, self.size, self.points.pos, self.points.speeds) surface.write_to_png('%s/%08d.png' % (self.dumpdir, self.dumpindex)) self.dumpindex += 1 self.drawn=time() return self.drawn-before def redraw(self, widget, event): x, y, width, height = event.area if self.pixmap: #If "expose" wasn't called before than "configure" if self.pixmap_size == self.drawing.window.get_size()[0:1]: # If we're not redrawing anyway: self.drawing.window.draw_drawable(self.drawing.get_style().fg_gc[STATE_NORMAL], self.pixmap, x, y, x, y, width, height) else: self.draw() def change_drawer(self, combo): self.dr_type = self.combo.get_active_text() # print "change self.dr_type", self.dr_type, self if self.dr_type in drawers[self.dim]: self.drawer=drawers_dict[self.dim][self.dr_type] self.draw() def configure(self, points=None, dim=None): if not self.active: return # print combo if points: self.points = points self.points.changed = self.draw #When points change, we redraw dim = len(shape(points.pos)) if dim: if self.dim != dim: self.dim = dim # print "dim:", dim, "self.dim:", self.dim self.build_menu() self.ready = True else: # print "no points" return # if not (self.points and len(shape(self.points.pos)) == self.dim): #I won't change dimension if they don't tell me! # return # def set_active(self, state): # self.active = state def build_menu(self): combo_model=ListStore(str) for item in drawers[self.dim]: combo_model.append([item]) self.combo.set_model(combo_model) if self.dr_type in drawers[self.dim]: self.combo.set_active(drawers[self.dim].index(self.dr_type)) else: self.combo.set_active(0) # print "built" def dump(self, dumpdir): print "dumping in", dumpdir self.dumpindex = 0 if dumpdir: #This is a "start" command self.dumpdir = dumpdir self.size = self.drawing.window.get_size() self.points.changed = self.dump_draw else: #This is a "stop" command self.dumpdir = None self.size = None self.points.changed = self.draw gvb-1.2.1/gvbmod/__init__.py0000644000175000017500000000000011336006273015235 0ustar pietropietrogvb-1.2.1/gvbmod/points.py0000644000175000017500000001042511336006273015026 0ustar pietropietro# GVB - a GTK+/GNOME vibrations simulator # # Copyright (C) 2008 Pietro Battiston # # 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, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from scipy import array, zeros, concatenate, shape, split from dispositions import disposition from calculators import calculators_dict from time import time class Points(): def __init__(self, shape=None, gr=None, disp=None, calc=None, drawer=None, pos=None, from_file=None): self.number=0 #Frames numbering self.calculating = False if from_file: self.load(from_file) # print "new points" else: self.shape=shape if pos == None and disp: self.pos=disposition(shape, disp) else: self.pos = pos self.disp = 'flat' self.speeds=zeros(shape) self.gr=gr self.drawer = drawer self.changed = drawer.draw drawer.configure(self) self.changed() self.calc = calc if self.calc != None: self.calculator=calculators_dict[len(shape)][calc](shape, gr, self.pos, self.speeds) self.calc_time = 0 if self.calculator.discrete: self.update=self.update_incremental else: self.update=self.update_given_time def update_incremental(self, given_time): calculated=False # print "up", given_time, self.calc_time while self.calc_time < given_time: # print "u" before=time() self.pos, self.speeds=self.calculator.update(self.pos, self.speeds, given_time) last_calc = time()-before self.number=self.number+1 self.calc_time = self.calc_time + self.calculator.gr calculated=True if calculated: return last_calc*1000, self.changed() else: return None, None def update_given_time(self, given_time): before=time() self.pos, self.speeds = self.calculator.update(self.pos, self.speeds, given_time) self.last_calc = time() - before self.number=self.number+1 self.calc_time = given_time draw_time = self.changed() return self.last_calc*1000, draw_time def reconfigure(self, **args): # print args if 'pos' in args: self.pos=args['pos'] self.speeds=zeros(self.shape) self.calc_time = 0 self.changed() elif 'disp' in args: self.disp = args['disp'] self.pos=disposition(self.shape, self.disp) args['pos']=self.pos self.speeds=zeros(self.shape) self.calc_time = 0 self.changed() elif 'shape' in args: self.shape = args['shape'] self.pos=disposition(self.shape, self.disp) # print "draw!" self.calc_time = 0 self.changed() if 'calc' in args: self.calc = args['calc'] self.calculator=calculators_dict[len(self.shape)][self.calc](self.shape, self.gr, self.pos, self.speeds) self.calc_time = 0 if self.calculator.discrete: self.update=self.update_incremental else: self.update=self.update_given_time elif self.calc: self.calculator.reconfigure(**args) def dump(self, filename): filehand = open(filename, 'w') for to_dump in [self.shape, self.pos, self.speeds]: while len(shape(to_dump)) > 1: to_dump = concatenate(to_dump) dump_string = "".join([str(number)+',' for number in to_dump]) filehand.write(dump_string+'\n') filehand.close() def load(self, filename): filehand = open(filename) self.shape = tuple([int(number) for number in filehand.readline()[:-2].split(',')]) self.pos = array([float(number) for number in filehand.readline()[:-2].split(',')]) if len(self.shape) == 2: #FIXME: not ready for dimension > 2 print self.pos, len(self.pos), self.shape self.pos = array(split(self.pos, self.shape[0])) self.speeds = array([float(number) for number in filehand.readline()[:-2].split(',')]) if len(self.shape) == 2: #FIXME: not ready for dimension > 2 self.speeds = array(split(self.speeds, self.shape[0])) print self.shape, self.pos, self.speeds gvb-1.2.1/gvbmod/gvbi18n.py0000644000175000017500000000205211336006273014765 0ustar pietropietro# Good ViBrations - a GTK+/GNOME waves simulator # # Copyright (C) 2008 Pietro Battiston # # 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, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import locale import gettext from os.path import exists APP = 'gvb' if exists('locale'): DIR = 'locale' else: DIR = '/usr/share/locale' print "Using", DIR locale.setlocale(locale.LC_ALL, '') gettext.bindtextdomain(APP, DIR) gettext.textdomain(APP) _ = gettext.gettext gvb-1.2.1/gvbmod/advancededitor.py0000644000175000017500000001553311336006273016473 0ustar pietropietro# GVB - a GTK+/GNOME vibrations simulator # # Copyright (C) 2008 Pietro Battiston # # 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, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA import gtk import gobject from gvbmod import drawers, dispositions, points from scipy import array #Just until I find a "revert order" method for arrays... param_names = ['lenght', 'shift', 'wavelenght', 'fase', 'amplitude', 'centering'] int_params = ['lenght', 'shift', 'wavelenght', 'fase'] rule_names = ['prod', 'sum', 'max', 'min'] reflect = -1 label = -2 rules = -3 rules_hbox = -4 drawer = -5 DIMS = [1,2] def reflect_matrix(matrix): n = matrix.shape[0] return array([matrix[n - 1 - i ] for i in range(n) ]) class AdvancedEditor(): def __init__(self, caller, xml, old_points, shape): self.caller = caller self.dim = len(shape) self.points = None self.ready = False self.skipped_one = False self.xml = xml self.window = xml.get_object('advanced editor') self.for_good = True self.widgets = {} for dim in DIMS: self.widgets[dim] = {} self.widgets[dim]['waveform'] = xml.get_object('editor waveform combo '+str(dim)) # print self.widgets self.combo_model=gtk.ListStore(str,str) for waveform in dispositions.waveforms: # print "appended", waveform self.combo_model.append([_(waveform), waveform]) self.widgets[dim]['waveform'].set_model(self.combo_model) self.widgets[dim]['waveform'].set_active(0) # print "combo:", self.combo_form, self.combo_form.get_active() self.widgets[dim][reflect] = xml.get_object('editor reflect check '+str(dim)) self.widgets[dim][label] = xml.get_object('editor label '+str(dim)) for name in param_names: self.widgets[dim][name] = xml.get_object('editor '+name+' scale '+str(dim)) self.widgets[drawer] = xml.get_object('editor combo drawer') self.widgets[rules]=[] self.widgets[rules_hbox] = xml.get_object('editor rules hbox') for rule in rule_names: self.widgets[rules].append(xml.get_object('editor rule '+rule)) self.invert_check = xml.get_object('editor invert check') self.add_check = xml.get_object('editor addto check') for dim in DIMS: for widget in self.widgets[dim]: if type(self.widgets[dim][widget]) == gtk.ComboBox: self.widgets[dim][widget].connect('changed', self.update) elif type(self.widgets[dim][widget]) == gtk.CheckButton: self.widgets[dim][widget].connect('toggled', self.update) elif type(self.widgets[dim][widget]) == gtk.HScale: self.widgets[dim][widget].connect('change-value', self.update) for widget in [self.invert_check, self.add_check] + self.widgets[rules]: widget.connect('toggled', self.update) self.go(old_points, shape) def go(self, old_points, shape): # print "shape:", shape self.old_points = old_points self.shape = shape self.dim = len(shape) # self.drawer=drawers.drawers[self.dim][self.widgets[drawer].get_active_text()] for dim in range(1, self.dim+1): if self.points == None or len(self.points.shape) < dim or self.points.shape[dim-1] != shape[dim-1]: #If number of points or dimension changed since last editor call (or if this is the first call)... self.widgets[dim]['lenght'].set_adjustment(gtk.Adjustment(shape[0], 3, shape[0], 4, 10)) self.widgets[dim]['shift'].set_adjustment(gtk.Adjustment(0, 0, shape[0], 4, 10)) self.widgets[dim]['wavelenght'].set_adjustment(gtk.Adjustment(shape[0], 5, shape[0]*3, 4, 10)) # print "reset" for dim in DIMS: useful = not (dim > self.dim) for widget in self.widgets[dim]: self.widgets[dim][widget].set_sensitive(useful) self.widgets[rules_hbox].set_sensitive(bool(self.dim-1)) #If dimension is changing with this editor call, we cannot add self.add_check.set_sensitive(old_points.shape == shape) # print "reset" self.points = points.Points(self.shape, None, 'flat', None, drawers.Drawer(self.xml.get_object('editor drawing'), self.xml.get_object('editor combo drawer'))) # print "reconfigure" gobject.timeout_add(10, self.update) resp = self.window.run() while True: self.response(None, resp) if resp == 2: resp = self.window.run() else: break def update(self, arg=None, arg2=None, arg3=None): # print arg, arg2, arg3 if arg in self.widgets[rules]: #The radiobuttons always send 2 signals: one for the toggled and one for the untoggled if self.skipped_one: self.skipped_one = False else: self.skipped_one = True return params = [] for dim in range(1, self.dim+1): selected_iter = self.widgets[dim]['waveform'].get_active_iter() liststore = self.widgets[dim]['waveform'].get_model() params=params + [liststore.get(selected_iter, 1)[0]] params_dim = [self.widgets[dim][widget].get_value() for widget in param_names] # print params_dim for index in range(len(int_params)): params_dim[index]=int(params_dim[index]) params = params + params_dim #Get selected rule: params.append(rule_names[ [rule.get_active() for rule in self.widgets[rules]].index(True)]) #FIXME (ugly) # print params self.new_disp = dispositions.waveformer[self.dim](self.shape, *params) if self.dim == 1: if self.widgets[1][reflect].get_active(): self.new_disp = reflect_matrix(self.new_disp) else: if self.widgets[2][reflect].get_active(): self.new_disp = reflect_matrix(self.new_disp) if self.widgets[1][reflect].get_active(): self.new_disp = reflect_matrix(self.new_disp.transpose()).transpose() if self.invert_check.get_active(): self.new_disp = self.new_disp * -1 if self.add_check.get_active(): self.points.reconfigure(pos = self.old_points.pos + self.new_disp) else: self.points.reconfigure(pos = self.new_disp) self.ready = True # self.draw() def set_defaults(self): defaults = [self.shape[0], 0, self.shape[0], 0, 1, .5] for dim in range(1, self.dim+1): self.widgets[dim]['waveform'].set_active(0) for index in range(len(param_names)): self.widgets[dim][param_names[index]].set_value(defaults[index]) self.widgets[dim][reflect].set_active(False) self.widgets[rules][0].set_active(True) self.invert_check.set_active(False) self.add_check.set_active(False) self.update() def response(self, button, response): if response == 2: self.set_defaults() return if response == 1: self.caller.editor_save(self.points) self.window.hide() gvb-1.2.1/gvbmod/dispositions.py0000644000175000017500000001525611336006273016250 0ustar pietropietro# GVB - a GTK+/GNOME vibrations simulator # # Copyright (C) 2008 Pietro Battiston # # 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, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA #Give startup dispositions of the points from scipy import array, zeros, sin, cos, pi, concatenate, ones, prod, sqrt from scipy.linalg import norm from gvbi18n import _ def disposition(shape, type_descriptor): # print "shape", shape if len(shape) in dispositions and type_descriptor in dispositions[len(shape)]: return dispositions_dict[len(shape)][type_descriptor](shape) else: print "type not found:", type_descriptor return zeros(shape) waveforms_dict = { #hl=half wave lenght, cen=centering (from 0 to 1), x is between 1 (not 0) and wl-1 'square': (lambda hl, ce, t: 1) , 'triangular': (lambda hl, ce, t: min(float(t)/ce, float(hl-t)/(1-ce))/hl ) , 'sinusoidal': (lambda hl, ce, t: sin(min(float(t)/(2*ce), float(hl-t)/(2*(1-ce))) * pi/hl) ) , 'peak': (lambda hl, ce, t: max((abs(hl*ce-t),0),(.5,1))[1] ) } waveforms = ['sinusoidal', 'triangular', 'square', 'peak'] def waveformer_1d((n,), waveform, lenght, shift, wavelenght, fase_angle, height, centering, rule = None): singlewave = array([waveforms_dict[waveform](wavelenght/2+1, centering, t) for t in range (1,wavelenght/2+1)]) doublewave = concatenate([singlewave, zeros(1), -1*singlewave])*height fase = wavelenght * fase_angle/360 calculated = doublewave while len(calculated) < lenght+fase: calculated = concatenate([calculated, array([0]), doublewave]) # print "stopped extending:", len(calculated) calculated = calculated[fase:lenght+fase] # print "calculated clipped:", len(calculated) wave_clip = lenght - max(0, shift + lenght - n) zeros_before = shift-(lenght-wave_clip) zeros_after = n - (shift + wave_clip) wave_final = concatenate([ calculated[wave_clip:], zeros(zeros_before), calculated[:wave_clip], zeros(zeros_after) ]) # print "first trunk:", calculated[wave_clip:] # print "fase:", fase, "wave_clipped:", wave_clip return wave_final def waveformer_2d((n1,n2), *args): wave1 = waveformer_1d((n1,), *args[:7]) wave2 = waveformer_1d((n2,), *args[7:14]) rules = {'sum' : sum, 'prod' : prod, 'max' : max, 'min': min} rule = rules[args[14]] # print "rule:", rule #FIXME: really not efficient... should someway use scipy. wave_final = array( [[rule([wave1[i], wave2[j]]) for i in range(n1)] for j in range(n2)] ) # print "max final:", max ([max(i) for i in wave_final]) return wave_final waveformer = {1: waveformer_1d, 2: waveformer_2d} dispositions_1d={ #Dispositions are created combining waveformers and/or other dispositions 'flat': zeros , # 'sin': (lambda (n,): array([sin(t*pi*2/(n+1)) for t in range(1,n+1)])) 'sin': (lambda shape: waveformer_1d(shape, 'sinusoidal', shape[0], 0, shape[0], 0, 1, .5 ) ) , # 'half sin': (lambda (n,): array([sin(t*pi/(n+1)) for t in range(1,n+1)])) 'half sin': (lambda shape: waveformer_1d(shape, 'sinusoidal', shape[0], 0, 2*shape[0]+1, 0, 1, .5 ) ) , # 'picked': (lambda (n,): array([float(2*min(t, n-t+1))/n for t in range(1,n+1) ])) 'picked': (lambda shape: waveformer_1d(shape, 'triangular', shape[0], 0, 2*shape[0]+1, 0, 1, .5 ) ) , 'triangular signal': (lambda (n,): concatenate([ disposition((n/4,), 'picked'), disposition((n-n/4,), 'flat') ])) , 'sinusoidal signal': (lambda (n,): concatenate([ disposition((n/4,), 'sin'), disposition((n-n/4,), 'flat') ])) , # 'picked lateral': (lambda (n,): array([float(min(float(2*t)/n, float(n-t+1)/n)) for t in range(1,n+1) ])) 'picked lateral': (lambda shape: waveformer_1d(shape, 'triangular', shape[0], 0, 2*shape[0]+1, 0, 1, .25 ) ) , 'opposite triangulars': (lambda (n,): concatenate([ disposition((n/4,), 'picked'), disposition((n-n/4-n/4,), 'flat'), disposition((n/4,), 'picked') ])) , 'opposite sinusoidals': (lambda (n,): concatenate([ disposition((n/4,), 'sin'), disposition((n-n/4-n/4,), 'flat'), disposition((n/4,), 'sin') ])) , 'square': ones , 'square signal': (lambda (n,): concatenate([ disposition((n/4,), 'square'), disposition((n-n/4,), 'flat') ])) , # 'discontinuous peak': (lambda (n,): concatenate([ disposition((n/2,), 'flat'), [1], disposition((n-n/2-1,), 'flat') ])) 'discontinuous peak': (lambda shape: waveformer_1d(shape, 'peak', shape[0], 0, 2*shape[0]+1, 0, 1, .5 ) ) , 'cos (shifted)': (lambda shape: waveformer_1d(shape, 'sinusoidal', shape[0], 0, shape[0], 270, 1, .5) + ones(shape) ) } dispositions_2d={ 'flat': zeros , # 'picked': (lambda (n,m): array([array([float(2*min(t, m-t+1))/n for t in range(1,m+1) ])*float(2*min(j, n-j+1))/n for j in range(1,n+1)])) 'picked': (lambda shape: waveformer_2d(shape, 'triangular', shape[0], 0, 2*shape[0]+1, 0, .5, .5, 'triangular', shape[0], 0, 2*shape[0]+1, 0, .5, .5 , 'sum' ) ) , 'sin': (lambda shape: waveformer_2d(shape, 'sinusoidal', shape[0], 0, shape[0], 0, 1, .5, 'sinusoidal', shape[0], 0, shape[0], 0, 1, .5 , 'prod' ) ) , 'half sin': (lambda shape: waveformer_2d(shape, 'sinusoidal', shape[0], 0, 2*shape[0]+1, 0, .5, .5, 'sinusoidal', shape[0], 0, 2*shape[0]+1, 0, .5, .5 , 'sum' ) ) , 'pond': (lambda (n,m): array([[(lambda x,y,r : -.1*cos(10*pi*norm([x,y])/r) * max(1-norm([x,y])/r, 0) ) (i-float(m)/2, j-float(n)/2, float(min(m,n))/2) for i in range(1,m+1) ] for j in range(1,n+1)])) , 'waterfall': (lambda (n,m): array([[(lambda x,y : 1 if norm([x,y]) < min(m,n)/10 else 0)(i-float(m)/2, j-float(n)/2) for i in range(1,m+1) ] for j in range(1,n+1)])) , 'gut': (lambda (n,m): array([[(lambda x,y,r : -1-cos(8*pi*norm([x,y])/r) if norm([x,y]) < r/8 else 0) (i-float(m)/2, j-float(n)/2, float(min(m,n))) for i in range(1,m+1) ] for j in range(1,n+1)])) } dispositions_dict={1:dispositions_1d, 2:dispositions_2d} dispositions={} for dim in [1,2]: keys=dispositions_dict[dim].keys() keys.sort() dispositions[dim]=keys dummy_list_for_gettext=[_('flat'), _('sin'), _('half sin'), _('picked'), _('triangular signal'), _('sinusoidal signal'), _('picked lateral'), _('opposite triangulars'), _('picked'), _('opposite sinusoidals'), _('square'), _('square signal'), _('discontinuous peak'), _('cos (shifted)'), _('pond'), _('waterfall'), _('gut'), _('peak'), _('sinusoidal') ] gvb-1.2.1/gvbmod/calculators.py0000644000175000017500000002455611336006273016040 0ustar pietropietro# GVB - a GTK+/GNOME vibrations simulator # # Copyright (C) 2008 Pietro Battiston # # 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, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from scipy import array, dot, diag, identity, bmat, concatenate, exp, transpose, zeros, real, sum, ones, split, sqrt, sin, arccos, sign, repeat, matrix from scipy.linalg import eig, inv, solve import time as timer class Calculator(): def __init__(self, n, gr, pos, speeds): self.n=n self.gr=gr self.start=pos self.startspeeds=speeds def reconfigure(self, **args): if 'shape' in args: self.n=args['shape'] if 'gr' in args: self.gr=args['gr'] if 'pos' in args: self.start=args['pos'] class Calculator1d(Calculator): ''' Overriding two methods just because I want "self.n" to be an int. ''' def __init__(self, *args): Calculator.__init__(self, *args) self.n=self.n[0] def reconfigure(self, **args): Calculator.reconfigure(self, **args) if 'shape' in args and args['shape']: self.n=self.n[0] class Calculator_naif(Calculator1d): discrete=True def update(self, points, speeds, time): accels=array([2*points[0]-points[1]]+[2*points[i]-points[i-1]-points[i+1] for i in range(1,self.n-1)]+[2*points[self.n-1]-points[self.n-2]]) new_speeds=speeds-dot(self.gr, accels) new_points=points+dot(self.gr, new_speeds) return new_points, new_speeds class Calculator_quad(Calculator1d): discrete=True def update(self, points, speeds, time): step=1./(self.n+1) qstep=step**2 astep = repeat(step,self.n+1) aqstep = repeat(qstep,self.n+1) # print astep, aqstep factor = (lambda ip : ip * sin(arccos(astep/ip)) ) strenght = (lambda ydiff : factor(sqrt(ydiff*ydiff+aqstep)) * sign(ydiff) ) strenghts = strenght(concatenate([points, zeros(1)]) - concatenate([zeros(1), points])) new_speeds=speeds+self.gr*(strenghts[1:]-strenghts[:-1]) new_points=points+dot(self.gr, new_speeds) return new_points, new_speeds class Calculator_matrixnaif(Calculator1d): discrete=True def __init__(self, *args): Calculator1d.__init__(self, *args) self.build_mat() def build_mat(self): n_id=identity(self.n) self.op=diag([-2]*self.n)+diag([1]*(self.n-1),1)+diag([1]*(self.n-1),-1) self.mat=array(bmat([[n_id, self.gr*n_id], [self.gr*self.op, n_id]])) # print self.mat def reconfigure(self, **args): Calculator1d.reconfigure(self, **args) self.build_mat() def update(self, points, speeds, time): # print self.mat, points, speeds # print self.mat.shape, concatenate([points,speeds]).shape new_coords=dot(self.mat, concatenate([points, speeds])) return new_coords[:self.n], new_coords[self.n:] class Calculator_eig(Calculator1d): discrete=False def __init__(self, *args): Calculator1d.__init__(self, *args) self.build_mat() self.build_operator() self.time=0 def build_mat(self):#FIXME:merge n_id=identity(self.n) n_zero=zeros([self.n, self.n]) self.op=diag([-2]*self.n)+diag([1]*(self.n-1),1)+diag([1]*(self.n-1),-1) self.mat=array(bmat([[n_zero, n_id], [self.op, n_zero]])) self.eigval, self.eigvec = eig(self.mat) def build_operator(self): self.startvec = solve(self.eigvec, concatenate([self.start, self.startspeeds])) self.operator=dot(self.eigvec, diag(self.startvec)).transpose() def reconfigure(self, **args): Calculator1d.reconfigure(self, **args) if 'shape' in args: self.build_mat() self.build_operator() return if 'pos' in args: # print "rebuilding" self.build_operator() def update(self, points, speeds, time): expmultiplier=exp(self.eigval*time) result=real(dot(expmultiplier, self.operator)) #This dot product is perfectly equivalent to mutliplying by a diagonal and then adding rows return result[:self.n], result[self.n:] class Calculator_naif2d(Calculator): discrete=True def update(self, points, speeds, time): # print self.n n=self.n[0] m=self.n[1] accels=array( [ [ 4*points[0][0]-points[1][0]-points[0][1] ] +[ 4*points[0][i]-points[0][i-1]-points[0][i+1]-points[1][i] for i in range(1,n-1) ] +[ 4*points[0][n-1]-points[0][n-2]-points[1][n-1] ] ] + [ [ 4*points[j][0]-points[j+1][0]-points[j-1][0]-points[j][1] ] +[ 4*points[j][i]-points[j][i-1]-points[j][i+1]-points[j+1][i]-points[j-1][i] for i in range(1,n-1) ] +[ 4*points[j][n-1]-points[j][n-2]-points[j+1][n-1]-points[j-1][n-1] ] for j in range(1, m-1)] + [ [ 4*points[m-1][0]-points[n-2][0]-points[n-1][1] ] +[ 4*points[m-1][i]-points[m-1][i-1]-points[m-1][i+1]-points[m-2][i] for i in range(1,n-1)] +[ 4*points[m-1][n-1]-points[m-1][n-2]-points[m-2][n-1] ] ] ) new_speeds=speeds-dot(self.gr, accels) new_points=points+dot(self.gr, new_speeds) return new_points, new_speeds class Calculator_matrixnaif2d(Calculator): discrete=True def __init__(self, *args): Calculator.__init__(self, *args) self.build_mat() def build_mat(self): self.edge = self.n[0]*self.n[1] small_id = identity(self.n[1]) small_zeros = zeros((self.n[1], self.n[1])) n_id = identity(self.edge) small_op = -4*identity(self.n[1])+diag([1]*(self.n[1]-1),1)+diag([1]*(self.n[1]-1),-1) #rowlenght: rl = self.n[1] # print ([ self.op = bmat([ [small_op, small_id] + [small_zeros for i in range(2, self.n[0])] ]+[ [small_zeros for i in range(j)] + [small_id, small_op, small_id] + [small_zeros for i in range(j+1, rl-2)] for j in range(rl-2)] + [ [small_zeros for i in range(2, self.n[0])] + [small_id, small_op] ]) self.mat=array(bmat([[n_id, self.gr*n_id], [self.gr*self.op, n_id]])) # print self.mat def reconfigure(self, **args): Calculator.reconfigure(self, **args) self.build_mat() def update(self, points_matrix, speeds_matrix, time): # print self.mat, points, speeds # print self.mat.shape, concatenate([points,speeds]).shape # print points_matrix points = concatenate( points_matrix) speeds = concatenate(speeds_matrix) new_coords=array(split(dot(self.mat, concatenate([points, speeds])), 2*self.n[0])) # rowlenght = self.n[1] # points_lenght = self.n[0]*self.n[1] # new_points = array([new_coords[i*rowlenght:(i+1)*rowlenght] for i in range(self.n[0])]) # new_speeds = array([new_coords[points_lenght+i*rowlenght:points_lenght+(i+1)*rowlenght] for i in range(self.n[0])]) return new_coords[:self.n[0]], new_coords[self.n[0]:] class Calculator_eig2d(Calculator): discrete=False def __init__(self, *args): Calculator.__init__(self, *args) self.build_mat() self.build_operator() self.time=0 def build_mat(self):#FIXME:merge self.edge = self.n[0]*self.n[1] small_id = identity(self.n[1]) small_zeros = zeros((self.n[1], self.n[1])) n_id = identity(self.edge) n_zero = zeros([self.edge, self.edge]) small_op = -4*identity(self.n[1])+diag([1]*(self.n[1]-1),1)+diag([1]*(self.n[1]-1),-1) #rowlenght: rl = self.n[1] # print ([ self.op = bmat([ [small_op, small_id] + [small_zeros for i in range(2, self.n[0])] ]+[ [small_zeros for i in range(j)] + [small_id, small_op, small_id] + [small_zeros for i in range(j+1, rl-2)] for j in range(rl-2)] + [ [small_zeros for i in range(2, self.n[0])] + [small_id, small_op] ]) self.mat=array(bmat([[n_zero, n_id], [self.op, n_zero]])) self.eigval, self.eigvec = eig(self.mat) def build_operator(self): self.startvec = solve(self.eigvec, concatenate([concatenate(self.start), concatenate(self.startspeeds)])) self.operator=dot(self.eigvec, diag(self.startvec)).transpose() def reconfigure(self, **args): Calculator.reconfigure(self, **args) if 'shape' in args: self.build_mat() self.build_operator() return if 'pos' in args: # print "rebuilding" self.build_operator() def update(self, points, speeds, time): expmultiplier=exp(self.eigval*time) result=array(split(real(dot(expmultiplier, self.operator)), self.n[0]*2)) #This dot product is perfectly equivalent to mutliplying by a diagonal and then adding rows return result[:self.n[0]], result[self.n[0]:] class Calculator_quad_2D(Calculator): discrete=True def __init__(self, *args): Calculator.__init__(self, *args) self.build_lambdas() self.time=0 def build_lambdas(self): hstep=1./(self.n[1]+1) qhstep=hstep**2 mhstep = array(repeat(matrix(repeat(hstep,self.n[1]+1)), self.n[0], 0)) mqhstep = array(repeat(matrix(repeat(qhstep,self.n[1]+1)), self.n[0], 0)) vstep=1./(self.n[0]+1) qvstep=vstep**2 mvstep = array(repeat(matrix(repeat(vstep,self.n[1])), self.n[0]+1, 0)) mqvstep = array(repeat(matrix(repeat(qvstep,self.n[1])), self.n[0]+1, 0)) hfactor = (lambda ip : ip * sin(arccos(mhstep/ip)) ) self.hstrenght = (lambda zdiff : hfactor(sqrt(zdiff*zdiff+mqhstep)) * sign(zdiff) ) vfactor = (lambda ip : ip * sin(arccos(mvstep/ip)) ) self.vstrenght = (lambda zdiff : vfactor(sqrt(zdiff*zdiff+mqvstep)) * sign(zdiff) ) def reconfigure(self, **args): Calculator.reconfigure(self, **args) if 'shape' in args: self.build_lambdas() def update(self, pos, speeds, time): # print mhstep, mqhstep, mvstep, mqvstep, pos hstrenghts = self.hstrenght(concatenate([pos, zeros([self.n[0],1])], 1 ) - concatenate([zeros([self.n[0],1]), pos],1 )) vstrenghts = self.vstrenght(concatenate([pos, [zeros(self.n[1])]]) - concatenate([[zeros(self.n[1])], pos])) new_speeds=speeds+self.gr*(hstrenghts[:,1:]-hstrenghts[:,:-1] + vstrenghts[1:]-vstrenghts[:-1]) new_points=pos+self.gr*new_speeds return new_points, new_speeds calculators_1d={'eig': Calculator_eig, 'naif': Calculator_naif, 'naif matrix': Calculator_matrixnaif, 'quad': Calculator_quad} calculators_2d={'eig': Calculator_eig2d, 'naif': Calculator_naif2d, 'naif matrix': Calculator_matrixnaif2d, 'quad': Calculator_quad_2D}#, 'eig': Calculator_eig2} calculators_dict={1: calculators_1d, 2: calculators_2d} calculators={ 1: ['eig', 'quad', 'naif matrix', 'naif'], 2: ['eig', 'quad', 'naif matrix', 'naif'] } gvb-1.2.1/changelog0000644000175000017500000000152711336006273013537 0ustar pietropietro1.2.1 (2 February 2010): * Fixed setup.py to play with install parameters * Updated translations * Fixed typo in Italian manual 1.2 (15 November 2009): * Fixed bugs with resizing * Added manual * Given number of points is now a maximum, not dimensionwise. * Fixed bug with widgets partially hidden in the main window * Fixed bug with "Revert" in the advanced editor * Speed is now normalized with respect to number of points. * Made some more strings translatable * Added several translations from Launchpad * Migrated from libglade to gtk.Builder * Removed a couple of GtkWarnings * Removed hardcoded python2.5 1.1.2 (16 June 2008): updated version in setup.py 1.1.1 (15 June 2008): removed script headers from modules 1.1: added several translations, restructured organization, added setup.py 1.0: first stable release gvb-1.2.1/localize.py0000755000175000017500000000145711336006273014046 0ustar pietropietro#! /usr/bin/python import subprocess, os #PREPARE THE TEMPLATE: subprocess.call(['xgettext', '-o', 'po/good-vibrations.pot', 'gvb.py', 'gvbmod/dispositions.py', 'stuff/gvb.glade']) #INITIALIZE: #msginit --input=messages-all.pot #mv it.po po/it.po #mkdir -p trunk/locale/it/LC_MESSAGES/ #UPDATE: #for strings_file in os.listdir('po'): # if not strings_file.endswith('.po'): # continue # lang = strings_file[:-3] # subprocess.call(['msgmerge', '-U', 'po/%s' % strings_file, 'po/good-vibrations.pot']) # if not os.path.exists('locale/%s/LC_MESSAGES' % lang): # os.mkdir('locale/%s' % lang) # os.mkdir('locale/%s/LC_MESSAGES' % lang) # subprocess.call(['msgfmt', 'po/%s' % strings_file, '-o', 'locale/%s/LC_MESSAGES/gvb.mo' % lang]) # (commented because now Launchpad does it) gvb-1.2.1/gvb.py0000777000175000017500000000000011336006273013506 2gvbustar pietropietrogvb-1.2.1/setup.py0000644000175000017500000000560111336006273013374 0ustar pietropietro#!/usr/bin/env python from os import listdir, path from distutils.core import setup from DistUtilsExtra.command import * import sys import subprocess dist = setup(name='gvb', version='1.2', description='Good ViBrations', license='GPL', author='Pietro Battiston', author_email='toobaz@email.it', url='http://www.pietrobattiston.it/gvb', scripts=['gvb'], packages=['gvbmod'], data_files=[('share/gvb/stuff', ['stuff/logo.svg', 'stuff/wlogo.svg', 'stuff/gvb.glade']), # ('share/doc/gvb', ['README']), ('share/pixmaps', ['stuff/gvb.svg']), ('share/applications', ['stuff/gvb.desktop'])]+ [('share/locale/'+lang+'/LC_MESSAGES/', ['locale/'+lang+'/LC_MESSAGES/gvb.mo'] ) for lang in listdir('locale')], cmdclass = { "build" : build_extra.build_extra, "build_help" : build_help.build_help}, classifiers=[ 'Development Status :: 5 - Production/Stable', 'Environment :: X11 Applications :: GTK', 'Intended Audience :: Education', 'Intended Audience :: End Users/Desktop', 'License :: OSI Approved :: GNU General Public License (GPL)', 'Operating System :: POSIX :: Linux', 'Programming Language :: Python', 'Topic :: Education :: Testing', 'Topic :: Scientific/Engineering :: Physics', 'Topic :: Scientific/Engineering :: Visualization', ] ) if 'install' in dist.command_options: if 'prefix' in dist.command_options['install']: prefix = dist.command_options['install']['prefix'][1] else: prefix = sys.prefix # "prefix" usually starts with a "/", which disturbs our "path.join()"s below: net_prefix = prefix[prefix.startswith('/'):] if 'root' in dist.command_options['install']: root = dist.command_options['install']['root'][1] else: root = '/' omf_path, omf_files = filter(lambda x : 'help/C/gvb-C.omf' in x[1], dist.data_files)[0] for omf in omf_files: folder, lang, filename = omf.split('/') help_path, help_file = filter(lambda x: 'help/%s/gvb.xml' % lang in x[1], dist.data_files)[0] omf_full_path = path.join(root, net_prefix, omf_path, filename) help_full_path = path.join(prefix, help_path, 'gvb.xml') try: assert (not subprocess.call(['scrollkeeper-preinstall', help_full_path, omf_full_path, omf_full_path])) except: print 'Trying with "/usr/local" (do not worry about last error message, unless it is repeated below).' omf_full_path = omf_full_path.replace('usr/share', 'usr/local/share') help_full_path = help_full_path.replace('usr/share', 'usr/local/share') subprocess.call(['scrollkeeper-preinstall', help_full_path, omf_full_path, omf_full_path]) # print ['scrollkeeper-preinstall', help_full_path, omf_full_path, omf_full_path]