Compare commits

...

82 Commits

Author SHA1 Message Date
Florian Rival
11ac1be195 Update translations 2016-10-31 23:36:32 +01:00
Florian Rival
f1509cf7b8 Bump version 2016-10-16 00:03:40 +02:00
Florian Rival
612ea7f067 Fix crash when changing scene in external layout editor on OS X 2016-10-15 19:09:26 +02:00
Florian Rival
fa3399f7d2 Fix InitialInstancesContainer::RemoveInstance and harden test (#303) 2016-10-07 13:57:08 +02:00
Florian Rival
296a2ae345 Merge pull request #300 from victorlevasseur/no_shared_ptr
Manage gd::Object, gd::Layout, gd::ExternalEvents, gd::ExternalLayout and gd::SourceFile with std::unique_ptr
2016-10-02 17:20:07 +02:00
Victor Levasseur
0c7c841aab Use unique_ptr to store gd::SourceFile 2016-09-19 00:15:37 +02:00
Victor Levasseur
ce7b0bfe85 Merge remote-tracking branch 'upstream/master' into no_shared_ptr 2016-09-18 19:15:21 +02:00
Victor Levasseur
affdbbead8 Store external events and layouts using unique_ptr instead of shared_ptr 2016-09-18 19:13:05 +02:00
Florian Rival
6ac34ee7e3 Update translations 2016-09-18 16:22:50 +02:00
Florian Rival
e07b9ae942 Merge pull request #299 from victorlevasseur/improve-code
Improve various part of the codebase
2016-09-18 15:38:34 +02:00
Victor Levasseur
ac57c1e25a Fix gd::Project::Insert(New)Layout 2016-09-18 15:25:28 +02:00
Victor Levasseur
3f3b619cd2 Merge branch 'improve-code' into no_shared_ptr 2016-09-18 14:02:40 +02:00
Victor Levasseur
6a92872fd0 Use conditions to avoid crash with invalid camera number 2016-09-18 13:58:45 +02:00
Victor Levasseur
be38240eee Revert "Fix crash when using a wrong camera number"
This reverts commit 2ff461f3b1.
2016-09-18 13:49:24 +02:00
Victor Levasseur
1bf86461f0 Use std::vector<std::unique_ptr> to store objects in gd::Project 2016-09-18 13:45:45 +02:00
Victor Levasseur
2ff461f3b1 Fix crash when using a wrong camera number 2016-09-16 19:14:31 +02:00
Victor Levasseur
e88701df92 Use std::iter_swap to spaw objects in vectors 2016-09-16 18:39:20 +02:00
Victor Levasseur
5aa30efa52 Improve InitialInstancesContainer code
Add tests for InitialInstancesContainer
2016-09-14 11:52:40 +02:00
Victor Levasseur
0ac9f8720b Rename EventsCodeGeneratorContext test to EventsCodeGenerationContext 2016-09-13 17:00:02 +02:00
Victor Levasseur
82684041ff Use std::copy instead of loops in EventsCodeGenerationContext
Add test cases for EventsCodeGenerationContext
2016-09-13 01:12:26 +02:00
Florian Rival
85867a53a9 Avoid allocation when creating a gdjs.SpriteRuntimeObject 2016-09-11 22:46:35 +02:00
Florian Rival
0e21c757d2 Merge pull request #297 from victorlevasseur/master
Expand/Collapse instructions categories when user clicks on them
2016-09-11 19:27:26 +03:00
Florian Rival
cc4e48d82f Fix name of pasted scenes/external events/layouts having an extra space 2016-09-11 18:10:41 +02:00
Victor Levasseur
fa1861da27 Expand/Collapse instructions categories when user clicks on them 2016-09-11 14:06:10 +02:00
Victor Levasseur
3533608cb0 Updated LinkEvent editor with support for including groups (#287)
* LinkEvent can now includes an events group
* New editor for LinkEvent
* Fix events groups not always included by the link event
2016-09-06 08:47:12 +02:00
Victor Levasseur
d22a183078 Optimize Hitboxes collision testing for "big" objects (#289)
* Add a new GetHitBox method to get polygons inside an hint AABB

* Add GetAABB method to RuntimeObject and use it as an hint for collision

* Use GetHitbox with hint inside SeparateFromObjects

* Remove debug outputs in TileMapObject
2016-09-05 22:53:56 +02:00
Florian Rival
771a2196ea Merge pull request #292 from victorlevasseur/bugfix/heap-corruptions
Fix array deleted with delete instead of delete[]
2016-08-21 14:36:41 +02:00
Victor Levasseur
60ada8d94f Fix array deleted with delete instead of delete[]
Potentially causing an undefined behavior
2016-08-21 02:01:45 +02:00
Florian Rival
ee868546d3 Merge pull request #291 from 4ian/fix/code-generation
Fix code generation when multiple scenes link to the same events
2016-08-20 17:19:01 +02:00
Florian Rival
526fdd852f Improve a bit const-correctness of EventsCodeGenerator 2016-08-20 17:10:47 +02:00
Florian Rival
cc84aa5478 Fix code generation when multiple scenes used the same events.
Code generation was modifying the events in place. If two or more scenes
used the same events, the events could be modified for a scene during code
generation, leading to a bad code generation for the others.

(In particular, if a scene was not containing an object, any action related to it
would be set an action with an empty type. Any other scene using the action will then
have the action not working).
2016-08-20 16:19:24 +02:00
Florian Rival
8c613ed6a3 Merge pull request #290 from 4ian/feature/inventory
This includes a new small extension to store an inventory with items in memory, to avoid re-implementing this classic game element by hand using events. Items number can be limited, unlimited, marked as equipped.

The PR also includes a few improvements to the JS game engine to avoid garbage creation and fix compilation on OS X 10.11 ("El Capitan").
2016-08-20 16:12:08 +02:00
Florian Rival
1e2cf210b5 Merge pull request #286 from victorlevasseur/bugfix/heap-corruptions
Bugfix/heap corruptions
2016-08-20 12:52:37 +02:00
Florian Rival
422132d8c7 Avoid allocations in gdjs.RuntimeObject.getRendererObject and gdjs.evtTools.object.pickObjectsIf 2016-08-15 19:54:01 +02:00
Florian Rival
4830e6b5bc Reworked gdjs.Polygon.collisionTest to avoid allocations 2016-08-15 18:03:07 +02:00
Florian Rival
fc2fe9e1eb Reworked gdjs.evtTools.object.twoListsTest and Array.prototype.createFrom to avoid allocations 2016-08-14 19:33:43 +02:00
Florian Rival
682efcbfdc Avoid allocation in gdjs.PlatformerObjectRuntimeBehavior and add TODO where allocations should be removed 2016-08-14 18:59:42 +02:00
Florian Rival
e4c6f2dd0c Avoid allocations in gdjs.RuntimeScene and gdjs.SpriteRuntimeObject 2016-08-12 21:04:40 +02:00
Florian Rival
cbc0a6bf2b Add Inventory extension icons 2016-08-10 21:54:44 +02:00
Florian Rival
982fd4cc67 Add serialization of inventories for Javascript platform 2016-08-10 00:11:47 +02:00
Florian Rival
f33f361e45 Add serialization of inventories to variables for native games 2016-08-09 00:17:12 +02:00
Victor Levasseur
be72d44a4d Fix CppEvent editor adding empty line to the includes (#284) 2016-08-08 22:15:57 +02:00
Victor Levasseur
7e9a2e40aa Merge pull request #283 from victorlevasseur/master
Remove useless files (SPARK doc, Box2D doc, dlib doc)
2016-08-08 18:57:29 +02:00
Victor Levasseur
bc5349fd26 Remove useless files (SPARK doc, Box2D doc, dlib doc) 2016-08-08 18:45:51 +02:00
Victor Levasseur
9131b6a143 Fix out of bound access in FlatAuiTabArt.cpp 2016-08-08 18:17:34 +02:00
Victor Levasseur
6fc8d1cf97 Fix heap corruption with link events 2016-08-08 12:09:06 +02:00
Florian Rival
51c172f4d5 Fix compilation on Windows 2016-08-07 22:26:41 +02:00
Florian Rival
116e7cfe25 Implement Inventory for native games 2016-08-07 22:26:41 +02:00
Florian Rival
d70204b24c Fix compilation on OS X 10.11 by removing deprecated GLU calls 2016-08-07 22:26:41 +02:00
Florian Rival
edae3892ca Rework gdjs.TimeManager to avoid using Date.now() 2016-08-07 22:26:41 +02:00
Florian Rival
b3b39ab468 Remove gdjs.iterateOverArray and replace its usage by raw loops 2016-08-07 22:26:41 +02:00
Florian Rival
4699e161e4 Add Inventory extension (JS platform only for now) 2016-08-07 22:26:41 +02:00
Florian Rival
be3ae5802d Add support for adding multiple include files for instructions 2016-08-07 22:26:41 +02:00
Florian Rival
097508829a Merge pull request #278 from 4ian/feature/anchor-behavior-js
Implement AnchorBehavior for the Javascript Platform
2016-08-02 17:31:30 +02:00
Victor Levasseur
1eac74c12c Merge branch 'release/gd-4.0.93' 2016-08-01 14:45:20 +02:00
Victor Levasseur
af8d2fc5d8 Fix linking failing when GDevelop is installed in a path containing spaces 2016-08-01 14:33:59 +02:00
Florian Rival
2ae5f01836 Add an option to AnchorBehavior to position objects according to the original game window size
The option is activated by default, so that the distance to the edges are the same as the one
in the editor, even when the game size has been changed.
2016-07-27 01:14:16 +02:00
Florian Rival
a1fa6dad15 Implement AnchorBehavior for the Javascript Platform 2016-07-25 23:23:30 +02:00
Florian Rival
7d8178c2e5 Fix an anchor behavior issue with right edge 2016-07-24 20:58:27 +02:00
Florian Rival
70a35c11c2 Fix anchor behavior not always properly applying bottom/right edges and warnings 2016-07-24 18:13:50 +02:00
Victor Levasseur
d7c897b488 Anchor behavior for native games (#275)
* Add AnchorBehavior

* Improve the AnchorBehavior

* Add an icon to the AnchorBehavior

* Code cleaning in AnchorBehavior

* Add more icons for the AnchorBehavior
2016-07-24 15:45:09 +02:00
Florian Rival
d12924daaf Merge pull request #277 from Wend1go/variable_child_count
Add expression to retrieve the number of subitems from a structure variable (native & js)
2016-07-22 14:09:58 +02:00
Wend1go
2d3cdcdde8 Retrieve number of subitems from variable/structure (native/js)
- global variables (expression)
- scene variables  (expression)
- object variables (expression)
2016-07-22 09:07:49 +02:00
Florian Rival
5ab601e8e6 Add SystemInfo extension with isMobile condition 2016-07-17 18:33:24 +02:00
Florian Rival
5c66a37406 Merge pull request #274 from victorlevasseur/loading-optimization
Texture loading optimization
2016-07-17 15:13:26 +02:00
Florian Rival
cfa161f763 Fix music looping in HTML5 game and update Howler.js to latest version 2016-07-17 14:32:13 +02:00
Florian Rival
84c8efffa3 Fix compilation on OS X 2016-07-16 15:13:01 +02:00
Florian Rival
a4e2a3e8f1 Merge branch 'master' of github.com:4ian/GD 2016-07-16 13:24:44 +02:00
Florian Rival
73984d7cfc Fix loading stored values set to 0/empty string in HTML5 games 2016-07-16 13:24:28 +02:00
Victor Levasseur
327a3b05b8 Load the sf::Image and then load the sf::Texture from it (avoids an image copy) 2016-07-15 18:36:26 +02:00
Victor Levasseur
a9e5790d78 Avoid sf::Texture copy when loading them 2016-07-15 18:10:50 +02:00
Florian Rival
a544666ea4 Merge pull request #271 from RandomShaper/fix-manifest-side-effects
Fix side effects of too broad Windows targeting in the manifest for high contrast theme support
2016-07-13 14:01:13 +02:00
Florian Rival
d0ca9cac54 Merge pull request #273 from victorlevasseur/bugfix/gcc_6
Some fixes for GCC6 and Fedora 24
2016-07-13 13:56:34 +02:00
Victor Levasseur
d0910e3e6f Set the RPATH of compiled files when previewing the game 2016-07-12 12:24:18 +02:00
Victor Levasseur
4018353d50 Some fix for GCC6 and Fedora 24 2016-07-12 11:34:14 +02:00
Florian Rival
6388e6a914 Add Lil BUB's HELLO EARTH game links 2016-07-05 01:02:55 +02:00
Pedro J. Estébanez
4f144f7532 Fix side effects of too broad Windows targeting 2016-07-04 19:25:30 +02:00
Victor Levasseur
82a7c3048f Revert "Provide compatibility with Windows high contrast themes"
This reverts commit 91cfff6e84.
The updated manifest caused some bugs with the text object editor
2016-07-03 23:08:04 +02:00
Florian Rival
8daa0354e1 Merge branch 'master' of github.com:4ian/GD 2016-07-02 19:11:53 +02:00
Florian Rival
f26357c9b8 Fix platformer objects stuck in floor when resized when the origin is not at the top left of the object 2016-07-02 18:30:51 +02:00
Florian Rival
4110c38c10 Update gdupdate-info*.xml files 2016-07-02 18:30:18 +02:00
Florian Rival
084f8fbe72 Fix compilation of IDE on Windows 2016-06-28 23:54:07 +02:00
2366 changed files with 19735 additions and 632473 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -28,8 +28,6 @@
</dependency>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!-- Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows 8 -->

File diff suppressed because it is too large Load Diff

View File

@@ -32,7 +32,7 @@ msgstr ""
"Project-Id-Version: gdevelop\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-13 21:53+0200\n"
"PO-Revision-Date: 2016-04-15 14:33-0400\n"
"PO-Revision-Date: 2016-10-31 18:32-0400\n"
"Last-Translator: 4ian <Florian.rival@gmail.com>\n"
"Language-Team: Spanish\n"
"Language: es_ES\n"
@@ -1894,7 +1894,7 @@ msgid "This is a beta version of GDevelop for Mac OS X.\n\n"
"Bugs may be present and only HTML5 games will work. Please report any feedback on www.forum.compilgames.net.\n"
"Thanks!"
msgstr "Ésta es una versión beta de GDevelop para Mac OS X.\n\n"
"Pueden presentarse errores y sólo funcionarán los juegos HTML5. Por favor reporta cualquier información que creas conveniente en www.forum.compilgames.net.\n"
"Pueden presentarse errores y sólo funcionarán los juegos HTML5. Por favor reporta cualquier comentario en www.forum.compilgames.net.\n"
"¡Gracias!"
#: ../IDE/GeneratePassword.cpp:49
@@ -9736,7 +9736,7 @@ msgstr "Longitud :"
#: ../Extensions//PathBehavior/Extension.cpp:31
msgid "Path Behavior"
msgstr "Comportamiento Ruta"
msgstr "Comportamiento de ruta"
#: ../Extensions//PathBehavior/Extension.cpp:32
msgid "Behavior allowing to move objects on a predefined path"
@@ -13803,7 +13803,7 @@ msgstr "Ayuda acerca de este objeto"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:165
msgid "Import .tmx files (Tiled)..."
msgstr ""
msgstr "Importar archivos .tmx (Tiled)..."
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:265
msgid "The tileset is the texture containing all the tiles which will be used in your tilemap object."
@@ -13876,47 +13876,47 @@ msgstr "Remueve el punto seleccionado"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:695
msgid ".tmx file :"
msgstr ""
msgstr "archivo .tmx :"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:709
msgid "The tmx file saved with Tiled"
msgstr ""
msgstr "El archivo tmx guardado desde Tiled"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:719
msgid "Import settings"
msgstr ""
msgstr "Ajustes de importación"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:731
msgid "Import the tileset configuration"
msgstr ""
msgstr "Importar la configuración del juego de baldosas"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:736
msgid "Import the tileset image"
msgstr ""
msgstr "Importar la imagen del juego de baldosas"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:741
msgid "Import the tiles hitboxes"
msgstr ""
msgstr "Importar las máscaras de colisión del juego de azulejos"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:746
msgid "Tilemap"
msgstr ""
msgstr "Mapa de baldosas"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:750
msgid "Import the tilemap"
msgstr ""
msgstr "Importar el mapa de baldosas"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:755
msgid "Importer..."
msgstr ""
msgstr "Importar..."
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapImporterDialog.cpp:24
msgid "Import .tmx file"
msgstr ""
msgstr "Importar archivo .tmx"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapImporterDialog.cpp:51
msgid "Unable to read the file !"
msgstr ""
msgstr "¡Imposible leer el archivo!"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapObjectEditor.cpp:62
msgid "Tile editor"
@@ -13946,75 +13946,75 @@ msgstr "Aún no has seleccionado un juego de baldosas."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:43
msgid "Only orthogonal maps are supported !"
msgstr ""
msgstr "¡Sólo están soportados mapas ortogonales!"
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:50
msgid "There are no tilesets in this file !"
msgstr ""
msgstr "¡No hay juegos de baldosas en este archivo!"
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:55
msgid "Only the first tileset will be taken into account. Tiles from supplementary tilesets may be lost."
msgstr ""
msgstr "Sólo el primer juego de baldosas será tomado en cuenta. Baldosas de juegos de baldosas suplementarios podrían perderse."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:67
msgid "The image can't be found !"
msgstr ""
msgstr "¡No se pudo encontrar la imagen!"
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:76
msgid "The image is imported as "
msgstr ""
msgstr "La imagen se importa como "
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:86
msgid "Tileset image importation completed."
msgstr ""
msgstr "Importación de imagen del juego de baldosas completada."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:97
msgid "Tileset image size is not the same. Some tiles may not be rendered correctly."
msgstr ""
msgstr "El tamaño de la imagen del juego de baldosas no en el mismo. Algunas baldosas podrían renderizarse incorrectamente."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:106
msgid "Tilemap objects don't handle tilesets with margins around the images. Consider cutting the picture."
msgstr ""
msgstr "Los objetos mapa de baldosas no contemplan juegos de baldosas con márgenes alrededor de las texturas. Considera recortar la imagen."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:109
msgid "Tileset configuration importation completed."
msgstr ""
msgstr "Importación de configuración del juego de baldosas completada."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:117
msgid "Tilemap size is different."
msgstr ""
msgstr "El tamaño del mapa de baldosas es diferente."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:127
msgid "There are more than 3 tiles layers. Only the 3 firsts will be imported."
msgstr ""
msgstr "Hay más de 3 capas de baldosas. Sólo las 3 primeras serán importadas."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:131
msgid "There are less than 3 tiles layers. Upper layer(s) will be empty."
msgstr ""
msgstr "Hay menos de 3 capas de baldosas. La(s) capa(s) superior(es) estará(n) vacía(s)."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:151
msgid "Tilemap content importation completed."
msgstr ""
msgstr "Importación del contenido del mapa de baldosas completada."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:234
msgid "Some tiles have more than 1 hitbox. Only the first one is imported."
msgstr ""
msgstr "Algunas baldosas tienen más de 1 máscara de colisión. Sólo la primera será importada."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:236
msgid "Some tiles have a polyline or a ellipsis hitbox. Only rectangle and polygon hitboxes are supported."
msgstr ""
msgstr "Algunas baldosas tienen una máscara de colisión polilineal o elíptica. Sólo están soportadas máscaras de colisión rectangulares o poligonales."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:238
msgid "Some tiles have a concave polygon. It has been ignored and set to a rectangular hitbox as this object only supports convex hitboxes for tiles."
msgstr ""
msgstr "Algunas baldosas tienen un polígono cóncavo. Éste ha sido ignorado y establecido como una máscara de colisión rectangular, ya que sólo están soportadas máscaras de colisión convexas."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:240
msgid "Tiles hitboxes importation completed."
msgstr ""
msgstr "Importación de máscaras de colisión de baldosas completada."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:258
msgid "There are not as many tiles in the object's tileset as in the file. The result may not be correct."
msgstr ""
msgstr "No hay tantas baldosas en el juego de baldosas del objeto como hay en el archivo. El resultado podría ser incorrecto."
#: ../Extensions//TimedEvent/Extension.cpp:34
#: ../Extensions//TimedEvent/Extension.cpp:111
@@ -14059,7 +14059,7 @@ msgstr "Sin nombre"
#: ../Extensions//TimedEvent/TimedEvent.cpp:122
msgid " (Name: "
msgstr ""
msgstr " (Nombre: "
#: ../Extensions//TimedEvent/TimedEvent.cpp:123
msgid "Delayed execution after "
@@ -14232,7 +14232,7 @@ msgstr "Configuración del mapa de baldosas"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.h:257
msgid "Import a .tmx file (Tiled)"
msgstr ""
msgstr "Importar un archivo .tmx (Tiled)"
#: ../Core/GDCore/Events/Builtin/ForEachEvent.cpp:113
#: ../Core/GDCore/Extensions/Builtin/CommonInstructionsExtension.cpp:95
@@ -14438,7 +14438,7 @@ msgstr "Audio/Sonidos en canales"
#: ../Core/GDCore/Extensions/Builtin/AudioExtension.cpp:223
#: ../Core/GDCore/Extensions/Builtin/AudioExtension.cpp:237
msgid "Audio file (or audio resource name)"
msgstr ""
msgstr "Archivo de audio (o nombre del recurso de audio)"
#: ../Core/GDCore/Extensions/Builtin/AudioExtension.cpp:31
#: ../Core/GDCore/Extensions/Builtin/AudioExtension.cpp:45
@@ -15837,7 +15837,7 @@ msgstr "Posición X del centro de la cámara"
#: ../Core/GDCore/Extensions/Builtin/CameraExtension.cpp:24
msgid "Compare the X position of the center of a camera."
msgstr ""
msgstr "Evalúa la posición X del centro de la cámara."
#: ../Core/GDCore/Extensions/Builtin/CameraExtension.cpp:25
msgid "X position of camera _PARAM4_ is _PARAM1__PARAM2_ (layer: _PARAM3_)"
@@ -19998,7 +19998,7 @@ msgstr "Clic derecho en una imagen para acceder a más opciones"
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:189
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:202
msgid "Add a sound/music"
msgstr ""
msgstr "Agregar una música/sonido"
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:177
msgid "Remove from folder only"
@@ -20038,15 +20038,15 @@ msgstr "Recursos agregados exitosamente"
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:385
msgid "Choose one or more audio files to add"
msgstr ""
msgstr "Selecciona uno o más archivos de audio a agregar"
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:385
msgid "Supported audio files|*.ogg;*.mp3;*.wav|All files|*.*"
msgstr ""
msgstr "Archivos de audio soportados|*.ogg;*.mp3;*.wav|Todos los archivos|*.*"
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:388
msgid "Adding audio files"
msgstr ""
msgstr "Agregando archivos de audio"
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:454
msgid "Adding "

View File

@@ -32,7 +32,7 @@ msgstr ""
"Project-Id-Version: gdevelop\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-13 21:53+0200\n"
"PO-Revision-Date: 2016-04-17 08:56-0400\n"
"PO-Revision-Date: 2016-10-31 18:30-0400\n"
"Last-Translator: 4ian <Florian.rival@gmail.com>\n"
"Language-Team: French\n"
"Language: fr_FR\n"
@@ -2810,7 +2810,7 @@ msgstr "Choisissez une condition dans la liste"
#: ../IDE/InstructionSelectorDialog.cpp:131
msgid "Help on this "
msgstr "Aide sur cette "
msgstr "Aide dessus "
#: ../IDE/InstructionSelectorDialog.cpp:131
msgid "action"
@@ -4254,13 +4254,13 @@ msgstr "Permet la création de jeux en 2D qui peuvent être compilés et joués
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:39
msgid "The project was exported to \""
msgstr "Le projet a été exporté dans \""
msgstr "Le projet a été exporté vers \""
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:39
msgid "\".\n"
"Follow the instructions on the wiki to know how to build the android package from the exported files."
msgstr "\".\n"
"Suivez les instructions sur le wiki pour savoir comment compiler le paquet Android à partir des fichiers exportés."
"Suivez les instructions sur le wiki pour savoir comment compiler le paquet pour Android depuis les fichiers exportés."
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:39
msgid "Android export"
@@ -4268,7 +4268,7 @@ msgstr "Export Android"
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:51
msgid "Export in progress"
msgstr "Export en cours"
msgstr "Exportation en cours"
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:51 ../GDJS/GDJS//IDE/Exporter.cpp:99
#: ../GDJS/GDJS//IDE/Exporter.cpp:202
@@ -4822,11 +4822,11 @@ msgstr "aaa"
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:156
msgid "Exports the game to a native Android application. This will produce source files ready to be compiled for Android using the Android SDK and NDK."
msgstr "Exporte le jeu en application native Android. Cela va produire des fichiers source pouvant être compilés pour Android avec le SDK Android et le NDK."
msgstr "Exporte le jeu en application native Android. Cela produira des fichiers source prêt à être compilés pour Android avec le SDK Android et le NDK."
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:161
msgid "How to compile your game exported files."
msgstr "Comment compiler les fichiers exportés."
msgstr "Comment compiler les fichiers d'export du jeu."
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:172
#: ../GDCpp/GDCpp//IDE/Dialogs/ProjectExportDialog.cpp:102
@@ -5606,8 +5606,8 @@ msgid "Unable to launch your browser :(\n"
"Manually open your browser and type \"localhost:2828\" in\n"
"the address bar (without the quotes) to launch the preview!"
msgstr "Impossible de lancer votre navigateur :(\n"
"Ouvrez manuellement votre navigateur et tapez \"localhost:2828\" in\n"
"dans la barre d'adresse (sans les guillemets) pour lancer l'aperçu !"
"Ouvrez manuellement votre navigateur et tapez \"localhost:2828\" dans\n"
"la barre d'adresse (sans les guillemets) pour lancer l'aperçu !"
#: ../GDJS/GDJS//IDE/Dialogs/CordovaPackageDialog.cpp:13
msgid "http://wiki.compilgames.net/doku.php/en/game_develop/tutorials/howtouseintelxdk"
@@ -5664,7 +5664,7 @@ msgstr "Exporter vers un site web ou un jeu natif avec Cocos2d (expérimental)"
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:254
msgid "If you install Cocos2d-x, you can also use it to export the game to Android, iOS, Windows, Mac or Linux."
msgstr "Si vous installez Cocos2d-x, vous pourrez également exporter votre jeu vers Android, iOS, Windows, Mac ou LInux."
msgstr "Si vous installez Cocos2d-x, vous pourrez également exporter votre jeu vers Android, iOS, Windows, Mac ou Linux."
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:259
msgid "Click here to learn more about Cocos2d export"
@@ -8415,11 +8415,11 @@ msgstr "Taille par défaut"
#: ../Extensions//PanelSpriteObject/PanelSpriteObjectEditor.cpp:106
msgid "Texture configuration (for HTML5 games only)"
msgstr "Paramètres de la texture (pour les jeux HTML5 uniquement)"
msgstr "Configuration de texture (pour les jeux HTML5 uniquement)"
#: ../Extensions//PanelSpriteObject/PanelSpriteObjectEditor.cpp:107
msgid "Repeat borders and center textures (instead of stretching them)"
msgstr "Répéter les textures des bordures et du centre (au lieu de les étendre)"
msgstr "Répéter les textures des bords et du centre (au lieu de les étendre)"
#: ../Extensions//PanelSpriteObject/PanelSpriteObjectEditor.cpp:114
msgid "Margins"
@@ -10983,8 +10983,7 @@ msgstr "Entrez les coordonnées du polygone de collision :\n"
#: ../Extensions//PhysicsBehavior/CustomPolygonDialog.cpp:98
msgid "Coordinates must be entered clockwise."
msgstr "Il faut entrer les coordonnées dans le sens des aiguilles\n"
"d'une montre."
msgstr "Les coordonnées doivent être dans le sens horaire."
#: ../Extensions//PhysicsBehavior/CustomPolygonDialog.cpp:102
#: ../Core/GDCore/Extensions/Builtin/SpriteExtension/Dialogs/SpriteObjectEditor.cpp:1561
@@ -13805,7 +13804,7 @@ msgstr "Aide à propos de cet objet"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:165
msgid "Import .tmx files (Tiled)..."
msgstr "Importer un fichier .tmx (Tiled) ..."
msgstr "Importer un fichier .tmx (motifs) ..."
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:265
msgid "The tileset is the texture containing all the tiles which will be used in your tilemap object."
@@ -13882,31 +13881,31 @@ msgstr "Fichier .tmx :"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:709
msgid "The tmx file saved with Tiled"
msgstr "Le fichier tmx enregistré avec Tiled"
msgstr "Le fichier tmx enregistré avec les motifs"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:719
msgid "Import settings"
msgstr "Paramètres de l'import"
msgstr "Paramètres d'import"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:731
msgid "Import the tileset configuration"
msgstr "Importer la configuration du jeu de tuiles (tileset)"
msgstr "Importer la configuration des motifs"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:736
msgid "Import the tileset image"
msgstr "Importer la texture des tuiles"
msgstr "Importer l'image des motifs"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:741
msgid "Import the tiles hitboxes"
msgstr "Importer les masques de collision des tuiles"
msgstr "Importer les masques de collision des motifs"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:746
msgid "Tilemap"
msgstr "Carte de tuiles"
msgstr "Carte des tuiles"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:750
msgid "Import the tilemap"
msgstr "Importer la carte de tuile"
msgstr "Importer la carte des motifs"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:755
msgid "Importer..."
@@ -13918,7 +13917,7 @@ msgstr "Importer un fichier .tmx"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapImporterDialog.cpp:51
msgid "Unable to read the file !"
msgstr "Impossible d'ouvrir le fichier !"
msgstr "Lecture Impossible du fichier !"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapObjectEditor.cpp:62
msgid "Tile editor"
@@ -13952,11 +13951,11 @@ msgstr "Seules les cartes orthogonales sont supportées !"
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:50
msgid "There are no tilesets in this file !"
msgstr "Il n'y a pas de jeu de tuiles (tileset) dans ce fichier !"
msgstr "Il n'y a pas de carte à motif dans ce fichier !"
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:55
msgid "Only the first tileset will be taken into account. Tiles from supplementary tilesets may be lost."
msgstr "Seul le premier jeu de tuiles (tileset) sera pris en compte. Les tuiles des autres jeux de tuiles seront perdues."
msgstr "Seul le premier jeu de motif sera pris en compte. Les motifs des autres jeux seront perdues."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:67
msgid "The image can't be found !"
@@ -13968,55 +13967,55 @@ msgstr "L'image a été importée sous le nom "
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:86
msgid "Tileset image importation completed."
msgstr "Importation de la texture des tuiles terminée."
msgstr "Importation des motifs terminée."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:97
msgid "Tileset image size is not the same. Some tiles may not be rendered correctly."
msgstr "La taille des tuiles n'est pas identique entre la carte (tilemap) et le jeu de tuiles (tileset). Le rendu peut être incorrect."
msgstr "La taille des motifs n'est pas identique. Le rendu peut être incorrect pour certains motifs."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:106
msgid "Tilemap objects don't handle tilesets with margins around the images. Consider cutting the picture."
msgstr "L'objet Carte de tuiles ne supporte pas les jeux de tuiles (tileset) avec des marges autour de la texture."
msgstr "L'objet Carte des motifs ne supporte pas les motifs avec des marges autour de l'image. Envisager des découpes de l'image."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:109
msgid "Tileset configuration importation completed."
msgstr "Importation de la configuration du jeu de tuiles (tileset) terminée."
msgstr "Import de la configuration des motifs terminé."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:117
msgid "Tilemap size is different."
msgstr "La taille de la carte de tuiles est différente."
msgstr "La taille de la carte des motifs est différente."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:127
msgid "There are more than 3 tiles layers. Only the 3 firsts will be imported."
msgstr "Il y a plus que 3 couches de tuiles. Seules les 3 premières seront importées."
msgstr "Il y a plus de 3 calques de motifs. Seules les 3 premiers seront importés."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:131
msgid "There are less than 3 tiles layers. Upper layer(s) will be empty."
msgstr "Il y a moins de 3 couches de tuiles. Les couches supérieures seront vides."
msgstr "Il y a moins de 3 claques de motifs. Calque(s) supérieur(s) vide(s)."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:151
msgid "Tilemap content importation completed."
msgstr "Importation de la carte de tuiles terminée."
msgstr "Import de la carte de tuiles terminé."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:234
msgid "Some tiles have more than 1 hitbox. Only the first one is imported."
msgstr "Certaines tuiles ont plus qu'un masque de collision. Seul le premier sera importé."
msgstr "Certains motifs ont plus de 1 masque de collision. Seul le premier sera importé."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:236
msgid "Some tiles have a polyline or a ellipsis hitbox. Only rectangle and polygon hitboxes are supported."
msgstr "Certaines tuiles ont des masques de collision de type \"polyline\" ou ellipse. Seuls les rectangles et les polygones sont supportés."
msgstr "Certains motifs ont des masques de collision de type \"polyline\" ou ellipse. Seuls les rectangles et les polygones sont supportés."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:238
msgid "Some tiles have a concave polygon. It has been ignored and set to a rectangular hitbox as this object only supports convex hitboxes for tiles."
msgstr "Certaines tuiles ont des masques de collision concaves. Ils ont été ignorés et remplacés par un masque de collision rectangulaire car les polygones concaves ne sont pas supportés."
msgstr "Certains motifs ont des polygones concaves. Ils ont été ignorés et remplacés par un masque de collision rectangulaire car cet objet ne supporte que les polygones convexes."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:240
msgid "Tiles hitboxes importation completed."
msgstr "Importation des masques de collision des tuiles terminée."
msgstr "Import des masques de collision des motifs terminé."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:258
msgid "There are not as many tiles in the object's tileset as in the file. The result may not be correct."
msgstr "Il n'y a pas autant de tuiles dans le jeu de tuile (tileset) de l'objet que dans le fichier. Des erreur d'affichage peuvent apparaître."
msgstr "Il n'y a pas autant de motifs dans l'objet des motif que dans le fichier. Le résultat peut être incorrect."
#: ../Extensions//TimedEvent/Extension.cpp:34
#: ../Extensions//TimedEvent/Extension.cpp:111
@@ -14234,7 +14233,7 @@ msgstr "Configuration de la carte de tuile"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.h:257
msgid "Import a .tmx file (Tiled)"
msgstr "Importer un fichier .tmx (Tiled)"
msgstr "Importer un fichier .tmx (motifs)"
#: ../Core/GDCore/Events/Builtin/ForEachEvent.cpp:113
#: ../Core/GDCore/Extensions/Builtin/CommonInstructionsExtension.cpp:95
@@ -15840,7 +15839,7 @@ msgstr "Position X du centre de la caméra"
#: ../Core/GDCore/Extensions/Builtin/CameraExtension.cpp:24
msgid "Compare the X position of the center of a camera."
msgstr "Teste la valeur de la position X du centre d'une caméra."
msgstr "Compare la valeur de la position X du centre d'une caméra."
#: ../Core/GDCore/Extensions/Builtin/CameraExtension.cpp:25
msgid "X position of camera _PARAM4_ is _PARAM1__PARAM2_ (layer: _PARAM3_)"

File diff suppressed because it is too large Load Diff

View File

@@ -32,7 +32,7 @@ msgstr ""
"Project-Id-Version: gdevelop\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-13 21:53+0200\n"
"PO-Revision-Date: 2016-04-15 14:30-0400\n"
"PO-Revision-Date: 2016-09-18 09:59-0400\n"
"Last-Translator: 4ian <Florian.rival@gmail.com>\n"
"Language-Team: Dutch\n"
"Language: nl_NL\n"

View File

@@ -32,7 +32,7 @@ msgstr ""
"Project-Id-Version: gdevelop\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-13 21:53+0200\n"
"PO-Revision-Date: 2016-04-15 14:32-0400\n"
"PO-Revision-Date: 2016-10-31 18:31-0400\n"
"Last-Translator: 4ian <Florian.rival@gmail.com>\n"
"Language-Team: Polish\n"
"Language: pl_PL\n"
@@ -732,11 +732,11 @@ msgstr "GDevelop jest oprogramowaniem open source:\n\n"
#: ../IDE/Credits.cpp:134
msgid "Programmed in C++, compiled with GCC, written with Sublime Text"
msgstr ""
msgstr "Napisane w języku C++, skompilowane z GCC, kodowane w Sublime Text"
#: ../IDE/Credits.cpp:146
msgid "Use SFML, wxWidgets and TinyXml libraries."
msgstr ""
msgstr "Używa bibliotek SFML, wxWidgets i TinyXml."
#: ../IDE/Credits.cpp:159
msgid "The Web platform is written in Javascript and uses Pixi.js"
@@ -768,7 +768,7 @@ msgstr "François Dumortier: Projekt logo GDevelop i strony internetowej."
#: ../IDE/Credits.cpp:210
msgid "Victor Levasseur: Advanced XML, Tiled Sprite and Tile Map extensions and contributions to Physics Engine, Text object, Video object, Path behavior and Sound object extension."
msgstr ""
msgstr "Victor Levasseur: Rozszerzenia: Widgets, Advanced XML i Tiled Sprite oraz wkład w rozszerzenia: Physics Engine, Text object, Video object, Path behavior i Sound object."
#: ../IDE/Credits.cpp:213
msgid "Constantine Shvetsov: Awesome design of icons"
@@ -2809,7 +2809,7 @@ msgstr "Wybrać warunek z listy"
#: ../IDE/InstructionSelectorDialog.cpp:131
msgid "Help on this "
msgstr ""
msgstr "Pomoc na ten temat "
#: ../IDE/InstructionSelectorDialog.cpp:131
msgid "action"
@@ -4254,15 +4254,16 @@ msgstr "Projekt został wyeksportowany do \""
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:39
msgid "\".\n"
"Follow the instructions on the wiki to know how to build the android package from the exported files."
msgstr ""
msgstr "\".\n"
"Postępuj zgodnie z instrukcjami wyświetlanymi na wiki do wiedzieć, jak zbudować pakiet Android z eksportowanych plików."
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:39
msgid "Android export"
msgstr ""
msgstr "Android eksport"
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:51
msgid "Export in progress"
msgstr ""
msgstr "Eksport w toku"
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:51 ../GDJS/GDJS//IDE/Exporter.cpp:99
#: ../GDJS/GDJS//IDE/Exporter.cpp:202
@@ -4815,11 +4816,11 @@ msgstr "aaa"
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:156
msgid "Exports the game to a native Android application. This will produce source files ready to be compiled for Android using the Android SDK and NDK."
msgstr ""
msgstr "Eksportuje grę do natywnej aplikacji Android . To będzie produkować źródło pliki gotowe mają być opracowywane dla Androida za pomocą SDK Androida i NDK."
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:161
msgid "How to compile your game exported files."
msgstr ""
msgstr "Jak skompilować wyeksportowane pliki twojej gry."
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:172
#: ../GDCpp/GDCpp//IDE/Dialogs/ProjectExportDialog.cpp:102
@@ -5331,7 +5332,7 @@ msgstr "Gry dla platform Windows i Linux oparte na C++ oraz OpenGL."
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.h:113
msgid "Export to native Android"
msgstr ""
msgstr "Eksport do natywnego Androida"
#: ../GDJS/GDJS//Events/Builtin/JsCodeEvent.cpp:51
msgid "Javascript code"
@@ -5598,7 +5599,9 @@ msgstr "\n\n"
msgid "Unable to launch your browser :(\n"
"Manually open your browser and type \"localhost:2828\" in\n"
"the address bar (without the quotes) to launch the preview!"
msgstr ""
msgstr "Nie można uruchomić przeglądarki :( \n"
"Otwórz przeglądarkę ręcznie i wpisz \"localhost:2828\" w \n"
" pasku adresów (bez cudzysłowów) aby uruchomić podgląd!"
#: ../GDJS/GDJS//IDE/Dialogs/CordovaPackageDialog.cpp:13
msgid "http://wiki.compilgames.net/doku.php/en/game_develop/tutorials/howtouseintelxdk"
@@ -5655,15 +5658,16 @@ msgstr "Wystarczy kliknąć w przycisk \"Eksportuj\" a GDevelop zapakuje twoją
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:184
msgid "Export to a website or native game with Cocos2d (experimental)"
msgstr ""
msgstr "\n"
"Eksport do strony internetowej lub natywnej grze z Cocos2d (eksperymentalny)"
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:254
msgid "If you install Cocos2d-x, you can also use it to export the game to Android, iOS, Windows, Mac or Linux."
msgstr ""
msgstr "Jeśli zainstalujesz cocos2d -x , można również użyć go do eksportu gry na Android, iOS, Windows, Mac lub Linux."
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:259
msgid "Click here to learn more about Cocos2d export"
msgstr ""
msgstr "Kliknij tutaj, aby dowiedzieć się więcej o eksporcie Cocos2d"
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:296
msgid "Export"
@@ -5893,7 +5897,7 @@ msgstr "Pokaż banner reklamowy"
#: ../Extensions//AdMobObject/Extension.cpp:36
msgid "Show the banner ad of _PARAM0_"
msgstr ""
msgstr "Pokaż reklamę banner _PARAM0_"
#: ../Extensions//AdMobObject/Extension.cpp:37
#: ../Extensions//AdMobObject/Extension.cpp:46
@@ -5910,7 +5914,7 @@ msgstr "Ukryj ten transparent reklamowy"
#: ../Extensions//AdMobObject/Extension.cpp:45
msgid "Hide the banner ad of _PARAM0_"
msgstr ""
msgstr "Pokaż reklamę banner _PARAM0_"
#: ../Extensions//AdMobObject/Extension.cpp:52
msgid "Banner is displayed"
@@ -5922,7 +5926,7 @@ msgstr "Zwróć true jeżeli obiekt właśnie wyświetla banner"
#: ../Extensions//AdMobObject/Extension.cpp:54
msgid "_PARAM0_ is displaying a banner"
msgstr ""
msgstr "_PARAM0_ Yest wyświetlania banner"
#: ../Extensions//AdMobObject/Extension.cpp:61
msgid "Preload interstitial screen"
@@ -5963,11 +5967,12 @@ msgstr "Ekran interstitial jest gotowy"
#: ../Extensions//AdMobObject/Extension.cpp:80
msgid "Return true if the interstitial screen was loaded and is ready to be shown."
msgstr ""
msgstr "\n"
"Zwraca true, jeśli ekran śródmiąższowe został załadowany i jest gotowy być pokazane."
#: ../Extensions//AdMobObject/Extension.cpp:81
msgid "Interstitial screen of _PARAM0_ is ready"
msgstr ""
msgstr "Śródmiąższowy kran _PARAM0_ jest gotowy"
#: ../Extensions//AdvancedXML/src/Extension.cpp:31
msgid "Advanced XML 1.0"
@@ -6007,7 +6012,9 @@ msgstr "Załaduj plik XML."
#: ../Extensions//AdvancedXML/src/Extension.cpp:53
msgid "Load XML File _PARAM0_ into reference _PARAM1_"
msgstr ""
msgstr "\n"
"Załaduj XML _PARAM0_ File w odniesieniu _PARAM1_\n"
""
#: ../Extensions//AdvancedXML/src/Extension.cpp:58
#: ../Extensions//AES/Extension.cpp:40 ../Extensions//AES/Extension.cpp:55
@@ -6024,7 +6031,8 @@ msgstr "Zapisz plik XML."
#: ../Extensions//AdvancedXML/src/Extension.cpp:66
msgid "Save XML file _PARAM1_ into _PARAM0_"
msgstr ""
msgstr "\n"
"Zapisz plik XML _PARAM1_ pod _PARAM0_"
#: ../Extensions//AdvancedXML/src/Extension.cpp:71
msgid "File where to save the document"
@@ -6041,11 +6049,12 @@ msgstr "Załadowanie elementu do odnośnika"
#: ../Extensions//AdvancedXML/src/Extension.cpp:78
msgid "Load an element (relative to another) in a reference.\n"
"Note: References allows to access to an element using the name of the reference pointing to it."
msgstr ""
msgstr "\n"
"Załaduj element (względem siebie) w odniesieniu \\ N Uwaga : . Odniesienia pozwala uzyskać dostęp do elementu przy użyciu nazwy wskazując odniesienie do niej."
#: ../Extensions//AdvancedXML/src/Extension.cpp:79
msgid "Load path _PARAM2_ (relative to the element _PARAM0_) into reference _PARAM1_"
msgstr ""
msgstr "załadować ścieżka_PARAM2_ (w stosunku do elementu_PARAM0_) pod referencyjnej _PARAM1_"
#: ../Extensions//AdvancedXML/src/Extension.cpp:80
#: ../Extensions//AdvancedXML/src/Extension.cpp:94
@@ -6059,7 +6068,7 @@ msgstr "Zaawansowane XML: ogólne"
#: ../Extensions//AdvancedXML/src/Extension.cpp:84
msgid "Reference of an existing element ( The path of the element will be relative to this element )"
msgstr ""
msgstr "referencyjny do istniejącego elementu (Ścieżka elementu będzie w stosunku do tego elementu)"
#: ../Extensions//AdvancedXML/src/Extension.cpp:85
msgid "Name of the reference to the newly created element"
@@ -6084,7 +6093,7 @@ msgstr ""
#: ../Extensions//AdvancedXML/src/Extension.cpp:98
msgid "Reference to create"
msgstr ""
msgstr "referencyjny do tworzenia"
#: ../Extensions//AdvancedXML/src/Extension.cpp:99
msgid "Reference to the element preceeding the element to be accessed"
@@ -6748,7 +6757,7 @@ msgstr "Porównaj szerokość kostki 3D."
#: ../Extensions//Box3DObject/Extension.cpp:63
msgid "width of _PARAM0_ is _PARAM1__PARAM2_"
msgstr ""
msgstr "szerokość _PARAM0_ wynosi _PARAM1__PARAM2_"
#: ../Extensions//Box3DObject/Extension.cpp:69
#: ../Extensions//Box3DObject/Extension.cpp:99
@@ -6990,7 +6999,7 @@ msgstr "Porównanie wysokości kostki 3D."
#: ../Extensions//Box3DObject/Extension.cpp:93
msgid "height of _PARAM0_ is _PARAM1__PARAM2_"
msgstr ""
msgstr "wysokość _PARAM0_ wynosi _PARAM1__PARAM2_"
#: ../Extensions//Box3DObject/Extension.cpp:107
msgid "Modify the depth of a 3D Box."
@@ -7052,7 +7061,7 @@ msgstr ""
#: ../Extensions//Box3DObject/Extension.cpp:197
msgid "Modify Pitch of a 3D Box object."
msgstr ""
msgstr "Modyfikowanie nachylenia kostki 3D."
#: ../Extensions//Box3DObject/Extension.cpp:198
msgid "Do _PARAM1__PARAM2_ to pitch of _PARAM0_"
@@ -7069,7 +7078,7 @@ msgstr ""
#: ../Extensions//Box3DObject/Extension.cpp:227
msgid "Modify Roll of a 3D Box object."
msgstr ""
msgstr "Modyfikowanie obrotu kostki 3D."
#: ../Extensions//Box3DObject/Extension.cpp:228
msgid "Do _PARAM1__PARAM2_ to roll of _PARAM0_"
@@ -7077,7 +7086,7 @@ msgstr ""
#: ../Extensions//Box3DObject/Extension.cpp:241
msgid "Compare Roll of a 3D Box object."
msgstr ""
msgstr "Porównanie obrotu kostki 3D."
#: ../Extensions//Box3DObject/Extension.cpp:242
msgid "Roll of _PARAM0_ is _PARAM1__PARAM2_"
@@ -7089,7 +7098,7 @@ msgstr "Głębokość kostki 3D"
#: ../Extensions//CommonDialogs/Extension.cpp:25
msgid "Common dialogs"
msgstr ""
msgstr "Podstawowe dialogi"
#: ../Extensions//CommonDialogs/Extension.cpp:26
msgid "Extension allowing to display common dialogs ( Message box, open file dialog... )"
@@ -7105,7 +7114,7 @@ msgstr ""
#: ../Extensions//CommonDialogs/Extension.cpp:34
msgid "Display message \"_PARAM1_\" with title \"_PARAM2_\""
msgstr ""
msgstr "Wyświetl komunikat \"_PARAM1_\" pod tytułem \"_PARAM2_\""
#: ../Extensions//CommonDialogs/Extension.cpp:35
#: ../Extensions//CommonDialogs/Extension.cpp:49
@@ -7123,23 +7132,24 @@ msgstr "Tytuł"
#: ../Extensions//CommonDialogs/Extension.cpp:46
msgid "Show a window to choose a file"
msgstr ""
msgstr "Pokaż okno wyboru pliku"
#: ../Extensions//CommonDialogs/Extension.cpp:47
msgid "Display a window allowing to choose a file.\n"
"The name and the directory of the file will be saved in the specified variable."
msgstr ""
msgstr "Wyświetl okno, aby wybrać nazwę pliku. \n"
" Nazwa i położenie pliku będzie zapisane w określonej zmiennej."
#: ../Extensions//CommonDialogs/Extension.cpp:48
msgid "Open a window so as to choose a file, and save the result in _PARAM1_"
msgstr ""
msgstr "Otwórz okno aby wybrać plik i zapisać wynik w _PARAM1_"
#: ../Extensions//CommonDialogs/Extension.cpp:54
#: ../Extensions//CommonDialogs/Extension.cpp:69
#: ../Extensions//CommonDialogs/Extension.cpp:84
#: ../Core/GDCore/Extensions/Builtin/JoystickExtension.cpp:57
msgid "Save result to scene variable"
msgstr ""
msgstr "Zapisz rezultat do zmiennej sceny"
#: ../Extensions//CommonDialogs/Extension.cpp:56
msgid "Wildcard filter ( \"FileType|*.ext;*.ext2|2ndFileType|*.ext3\" ) ( Windows only ) "
@@ -7175,7 +7185,7 @@ msgstr "Otwórz okno wyboru Tak/Nie i zapisz rezultat do _PARAM1_"
#: ../Extensions//DestroyOutsideBehavior/Extension.cpp:16
#: ../Extensions//DestroyOutsideBehavior/JsExtension.cpp:29
msgid "Destroy Outside Screen Behavior"
msgstr ""
msgstr "Verhalten bei \"Zerstören außerhalb des Bildschirms\""
#: ../Extensions//DestroyOutsideBehavior/Extension.cpp:17
#: ../Extensions//DestroyOutsideBehavior/JsExtension.cpp:30
@@ -7184,7 +7194,7 @@ msgstr ""
#: ../Extensions//DestroyOutsideBehavior/Extension.cpp:22
msgid "Destroy when outside the screen"
msgstr ""
msgstr "Zerstören wenn außerhalb des Bildschirms"
#: ../Extensions//DestroyOutsideBehavior/Extension.cpp:23
msgid "DestroyOutside"
@@ -7413,24 +7423,24 @@ msgstr ""
#: ../Extensions//DraggableBehavior/Extension.cpp:16
#: ../Extensions//DraggableBehavior/JsExtension.cpp:29
msgid "Draggable Behavior"
msgstr ""
msgstr "Verhalten beim Verschieben"
#: ../Extensions//DraggableBehavior/Extension.cpp:17
#: ../Extensions//DraggableBehavior/JsExtension.cpp:30
msgid "Behavior allowing to move objects with the mouse"
msgstr ""
msgstr "Verhalten ermöglicht Objekte mit der Maus zu bewegen"
#: ../Extensions//DraggableBehavior/Extension.cpp:22
msgid "Draggable object"
msgstr ""
msgstr "Verschiebbares Objekt"
#: ../Extensions//DraggableBehavior/Extension.cpp:23
msgid "Draggable"
msgstr ""
msgstr "Verschiebbar"
#: ../Extensions//DraggableBehavior/Extension.cpp:24
msgid "Allows objects to be moved using the mouse."
msgstr ""
msgstr "Ermöglicht Objekte mit der Maus zu bewegen."
#: ../Extensions//DraggableBehavior/Extension.cpp:35
msgid "Being dragged"
@@ -7438,7 +7448,7 @@ msgstr ""
#: ../Extensions//DraggableBehavior/Extension.cpp:36
msgid "Check if the object is being dragged"
msgstr ""
msgstr "Sprawdź, czy obiekt jest przeciągany"
#: ../Extensions//DraggableBehavior/Extension.cpp:37
msgid "_PARAM0_ is being dragged"
@@ -7446,7 +7456,7 @@ msgstr ""
#: ../Extensions//Function/Extension.cpp:38
msgid "Function events"
msgstr ""
msgstr "Funkcja zdarzenia"
#: ../Extensions//Function/Extension.cpp:39
msgid "Extension allowing to use events behaving as functions."
@@ -7568,7 +7578,7 @@ msgstr ""
#: ../Extensions//Light/Extension.cpp:36
msgid "Emits light that can be stopped by objects"
msgstr ""
msgstr "Emituje światło, które może być zatrzymane przez obiekty"
#: ../Extensions//Light/Extension.cpp:48
msgid "Change light color."
@@ -7637,7 +7647,7 @@ msgstr "Intensywność"
#: ../Extensions//Light/Extension.cpp:61
msgid "Modify the intensity of a light"
msgstr ""
msgstr "Zmodyfikuj natężenie światła"
#: ../Extensions//Light/Extension.cpp:62
msgid "Do _PARAM1__PARAM2_ to the intensity of _PARAM0_"
@@ -7667,7 +7677,7 @@ msgstr ""
#: ../Extensions//Light/Extension.cpp:103
msgid "Test the radius of a light."
msgstr ""
msgstr "Testuj promień światła."
#: ../Extensions//Light/Extension.cpp:104
msgid "The radius of _PARAM0_ is _PARAM2_ _PARAM1_"
@@ -7682,7 +7692,7 @@ msgstr "Jakość"
#: ../Extensions//Light/Extension.cpp:117
msgid "Modify the quality of a light"
msgstr ""
msgstr "Zmień jakość światła"
#: ../Extensions//Light/Extension.cpp:118
msgid "Do _PARAM1__PARAM2_ to the quality of _PARAM0_"
@@ -7690,7 +7700,7 @@ msgstr ""
#: ../Extensions//Light/Extension.cpp:131
msgid "Test the quality of a light"
msgstr ""
msgstr "Testuj jakość światła"
#: ../Extensions//Light/Extension.cpp:132
msgid "The quality of _PARAM0_ is _PARAM1__PARAM2_"
@@ -7699,7 +7709,7 @@ msgstr ""
#: ../Extensions//Light/Extension.cpp:144
#: ../Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteExtension.cpp:331
msgid "Global color"
msgstr ""
msgstr "Kolor globalny"
#: ../Extensions//Light/Extension.cpp:145
msgid "Change scene color for a global light."
@@ -7772,7 +7782,7 @@ msgstr "Jakość:"
#: ../Extensions//Light/LightObjectEditor.cpp:89
msgid "Global light"
msgstr ""
msgstr "Globalne oświetlenie"
#: ../Extensions//Light/LightObjectEditor.cpp:91
msgid "Set the light as the global light"
@@ -7865,12 +7875,12 @@ msgstr ""
#: ../Extensions//LinkedObjects/Extension.cpp:84
#: ../Extensions//LinkedObjects/Extension.cpp:99
msgid "Pick these objects..."
msgstr ""
msgstr "Wybierz te obiekty..."
#: ../Extensions//LinkedObjects/Extension.cpp:85
#: ../Extensions//LinkedObjects/Extension.cpp:100
msgid "...if they are linked to this object"
msgstr ""
msgstr "...jeśli są powiązane z tym obiektem"
#: ../Extensions//LinkedObjects/Extension.cpp:92
msgid "Take objects linked to the object into account for next actions."
@@ -7878,7 +7888,7 @@ msgstr ""
#: ../Extensions//Network/Extension.cpp:29
msgid "Network features"
msgstr ""
msgstr "Funkcje sieciowe"
#: ../Extensions//Network/Extension.cpp:30
msgid "Built-in extension allowing to exchange data on the network between games."
@@ -7901,7 +7911,7 @@ msgstr ""
#: ../Extensions//Network/Extension.cpp:87
#: ../Extensions//Network/Extension.cpp:100
msgid "Network: Sending"
msgstr ""
msgstr "Sieć: Przesyłanie"
#: ../Extensions//Network/Extension.cpp:46
msgid "Recipient IP address."
@@ -8092,7 +8102,7 @@ msgstr ""
#: ../Extensions//Network/Extension.cpp:152
msgid "Local IP address ( local/LAN )"
msgstr ""
msgstr "Lokalny adres IP (lokalne/LAN)"
#: ../Extensions//Network/Extension.cpp:158
msgid "Generate objects' identifiers"
@@ -8122,7 +8132,7 @@ msgstr ""
#: ../Extensions//Network/Extension.cpp:174
msgid "NetworkUpdater"
msgstr ""
msgstr "NetworkUpdater"
#: ../Extensions//Network/Extension.cpp:175
msgid "Allows to automatically synchronize the objects of a game on the network."
@@ -9435,7 +9445,7 @@ msgstr "oraz"
#: ../Extensions//ParticleSystem/ParticleEmitterObjectEditor.cpp:312
msgid "seconds"
msgstr ""
msgstr "sekundy"
#: ../Extensions//ParticleSystem/ParticleEmitterObjectEditor.cpp:317
msgid "Unlimited capacity"
@@ -9550,7 +9560,7 @@ msgstr ""
#: ../Extensions//ParticleSystem/ParticleEmitterObjectEditor.cpp:525
#: ../Extensions//ParticleSystem/ParticleEmitterObjectEditor.cpp:564
msgid "Between"
msgstr ""
msgstr "Pomiędzy"
#: ../Extensions//ParticleSystem/ParticleEmitterObjectEditor.cpp:468
#: ../Extensions//ParticleSystem/ParticleEmitterObjectEditor.cpp:501
@@ -9949,7 +9959,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/SpriteExtension/Dialogs/SpriteObjectEditor.cpp:412
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:671
msgid "Name"
msgstr ""
msgstr "Nazwa"
#: ../Extensions//PathBehavior/Extension.cpp:204
msgid "Change the path"
@@ -10185,11 +10195,11 @@ msgstr ""
#: ../Extensions//PathBehavior/PathBehaviorEditor.cpp:234
msgid "Movement and speed"
msgstr ""
msgstr "Ruch i prędkość"
#: ../Extensions//PathBehavior/PathBehaviorEditor.cpp:237
msgid "Speed:"
msgstr ""
msgstr "Prędkość:"
#: ../Extensions//PathBehavior/PathBehaviorEditor.cpp:239
#: ../Extensions//PhysicsBehavior/CustomPolygonDialog.cpp:126
@@ -10268,7 +10278,7 @@ msgstr ""
#: ../Extensions//PathBehavior/PathBehaviorEditor.cpp:464
msgid "New path"
msgstr ""
msgstr "Nowa ścieżka"
#: ../Extensions//PathBehavior/PathBehaviorEditor.cpp:468
#: ../Extensions//PathBehavior/PathBehaviorEditor.cpp:519
@@ -10303,11 +10313,11 @@ msgstr ""
#: ../Extensions//PathBehavior/PathBehaviorEditor.cpp:515
msgid "Rename a path"
msgstr ""
msgstr "Zmień nazwę ścieżki"
#: ../Extensions//PathBehavior/PathBehaviorEditor.cpp:519
msgid "Unable to rename the path"
msgstr ""
msgstr "Nie można zmienić nazwy ścieżki"
#: ../Extensions//PathBehavior/PathBehaviorEditor.cpp:565
msgid "You have deleted a global path. Be sure that no other object was using it."
@@ -10412,7 +10422,7 @@ msgstr ""
#: ../Extensions//PathfindingBehavior/Extension.cpp:66
msgid "Return true if a path has been found."
msgstr ""
msgstr "Zwróć prawdę jeżeli ścieżka została znaleziona."
#: ../Extensions//PathfindingBehavior/Extension.cpp:67
msgid "A path has been found for _PARAM0_"
@@ -10544,7 +10554,7 @@ msgstr ""
#: ../Extensions//TopDownMovementBehavior/Extension.cpp:191
#: ../Extensions//TopDownMovementBehavior/Extension.cpp:333
msgid "Maximum speed"
msgstr ""
msgstr "Maksymalna prędkość"
#: ../Extensions//PathfindingBehavior/Extension.cpp:182
msgid "Change the maximum speed when moving the object"
@@ -10894,7 +10904,7 @@ msgstr ""
#: ../Extensions//TopDownMovementBehavior/TopDownMovementBehavior.cpp:191
#: ../Extensions//TopDownMovementBehavior/TopDownMovementBehavior.cpp:221
msgid "Max. speed"
msgstr ""
msgstr "Maksymalna prędkość"
#: ../Extensions//PathfindingBehavior/PathfindingBehavior.cpp:603
#: ../Extensions//PathfindingBehavior/PathfindingBehavior.cpp:634
@@ -11028,7 +11038,7 @@ msgstr ""
#: ../Extensions//PhysicsBehavior/CustomPolygonDialog.cpp:178
#: ../Extensions//PhysicsBehavior/CustomPolygonDialog.cpp:356
msgid "Cursor position:"
msgstr ""
msgstr "Pozycja kursora:"
#: ../Extensions//PhysicsBehavior/CustomPolygonDialog.cpp:420
msgid "X offset"
@@ -11083,11 +11093,11 @@ msgstr ""
#: ../Extensions//PhysicsBehavior/Extension.cpp:38
msgid "Physics engine"
msgstr ""
msgstr "Silnik fizyki"
#: ../Extensions//PhysicsBehavior/Extension.cpp:39
msgid "Physics"
msgstr ""
msgstr "Fizyka"
#: ../Extensions//PhysicsBehavior/Extension.cpp:40
msgid "Make objects move as if they were subject to the laws of physics."
@@ -11494,7 +11504,7 @@ msgstr ""
#: ../Extensions//PhysicsBehavior/Extension.cpp:365
msgid "New value"
msgstr ""
msgstr "Nowa wartość"
#: ../Extensions//PhysicsBehavior/Extension.cpp:371
msgid "Compare the angular speed of the object."
@@ -11601,7 +11611,7 @@ msgstr ""
#: ../Extensions//PhysicsBehavior/Extension.cpp:486
#: ../Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteExtension.cpp:141
msgid "Scale"
msgstr ""
msgstr "Skala"
#: ../Extensions//PhysicsBehavior/Extension.cpp:478
msgid "Change collision polygon Y scale"
@@ -11770,7 +11780,7 @@ msgstr ""
#: ../Extensions//PlatformBehavior/Extension.cpp:62
msgid "Is on ladder"
msgstr ""
msgstr "Jest na drabinie"
#: ../Extensions//PlatformBehavior/Extension.cpp:63
msgid "Check if the object is on a ladder."
@@ -11782,7 +11792,7 @@ msgstr ""
#: ../Extensions//PlatformBehavior/Extension.cpp:74
msgid "Is jumping"
msgstr ""
msgstr "Skacze"
#: ../Extensions//PlatformBehavior/Extension.cpp:75
msgid "Check if the object is jumping."
@@ -11794,7 +11804,7 @@ msgstr ""
#: ../Extensions//PlatformBehavior/Extension.cpp:86
msgid "Is falling"
msgstr ""
msgstr "Spada"
#: ../Extensions//PlatformBehavior/Extension.cpp:87
msgid "Check if the object is falling.\n"
@@ -11825,7 +11835,7 @@ msgstr ""
#: ../Extensions//PlatformBehavior/Extension.cpp:139
#: ../Extensions//PlatformBehavior/Extension.cpp:376
msgid "Maximum falling speed"
msgstr ""
msgstr "Maksymalna prędkość spadania"
#: ../Extensions//PlatformBehavior/Extension.cpp:126
msgid "Compare the maximum falling speed of the object (in pixels per second)."
@@ -11912,7 +11922,7 @@ msgstr ""
#: ../Extensions//PlatformBehavior/PlatformerObjectBehavior.cpp:566
#: ../Extensions//PlatformBehavior/PlatformerObjectBehavior.cpp:596
msgid "Jump speed"
msgstr ""
msgstr "Szybkość skoku"
#: ../Extensions//PlatformBehavior/Extension.cpp:237
msgid "Compare the jump speed of the object (in pixels per second)."
@@ -12064,7 +12074,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:40
#: ../Core/GDCore/IDE/Events/InstructionSentenceFormatter.cpp:123
msgid "Key"
msgstr ""
msgstr "Klawisz"
#: ../Extensions//PlatformBehavior/Extension.cpp:359
#: ../Extensions//TopDownMovementBehavior/Extension.cpp:98
@@ -12977,7 +12987,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/FileExtension.cpp:117
#: ../Core/GDCore/Extensions/Builtin/FileExtension.cpp:126
msgid "Filename"
msgstr ""
msgstr "Nazwa pliku"
#: ../Extensions//SoundObject/SoundObjectEditor.cpp:144
msgid "Name of the sound file:"
@@ -13057,7 +13067,7 @@ msgstr ""
#: ../Extensions//TextEntryObject/Extension.cpp:81
msgid "Text entered with keyboard"
msgstr ""
msgstr "Tekst wprowadzony z klawiatury"
#: ../Extensions//TextEntryObject/TextEntryObject.cpp:102
msgid "Activated ?"
@@ -16538,7 +16548,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:23
msgid "Key pressed"
msgstr ""
msgstr "Klawisz jest naciśnięty"
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:24
msgid "Test if a key is pressed"
@@ -16556,11 +16566,11 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:68
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:76
msgid "Keyboard"
msgstr ""
msgstr "Klawiatura"
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:33
msgid "Key released"
msgstr ""
msgstr "Klawisz został puszczony"
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:34
msgid "Test if a key was just released"
@@ -16594,7 +16604,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:65
msgid "Any key pressed"
msgstr ""
msgstr "Dowolny klawisz został naciśnięty"
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:66
msgid "Test if any key is pressed"
@@ -16602,11 +16612,11 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:67
msgid "Any key is pressed"
msgstr ""
msgstr "Dowolny klawisz jest naciśnięty"
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:74
msgid "Last pressed key"
msgstr ""
msgstr "Ostatni naciśnięty klawisz"
#: ../Core/GDCore/Extensions/Builtin/KeyboardExtension.cpp:75
msgid "Get the name of the latest key pressed on the keyboard"
@@ -16910,7 +16920,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/MouseExtension.cpp:147
#: ../Core/GDCore/Extensions/Builtin/MouseExtension.cpp:158
msgid "Mouse and touch"
msgstr ""
msgstr "Mysz i dotyk"
#: ../Core/GDCore/Extensions/Builtin/MouseExtension.cpp:32
msgid "Accurate test (yes by default)"
@@ -17037,7 +17047,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/MouseExtension.cpp:155
msgid "Mouse button released"
msgstr ""
msgstr "Guzik myszy został puszczony"
#: ../Core/GDCore/Extensions/Builtin/MouseExtension.cpp:156
msgid "Return true if the specified button of the mouse was released."
@@ -17113,7 +17123,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/MouseExtension.cpp:230
#: ../Core/GDCore/Extensions/Builtin/MouseExtension.cpp:236
msgid "Mouse cursor"
msgstr ""
msgstr "Kursor myszy"
#: ../Core/GDCore/Extensions/Builtin/MouseExtension.cpp:236
msgid "Mouse wheel: Displacement"
@@ -17443,7 +17453,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/SpriteExtension/Dialogs/SpriteObjectEditor.cpp:235
msgid "Animations"
msgstr ""
msgstr "Animacje"
#: ../Core/GDCore/Extensions/Builtin/SpriteExtension/Dialogs/SpriteObjectEditor.cpp:260
msgid "Go back to default mask"
@@ -17513,7 +17523,7 @@ msgstr "Przeciągnij obraz z banku obrazów do pola poniżej, aby dodać go do a
#: ../Core/GDCore/Extensions/Builtin/SpriteExtension/Dialogs/SpriteObjectEditor.cpp:525
msgid "All animations"
msgstr ""
msgstr "Wszystkie animacje"
#: ../Core/GDCore/Extensions/Builtin/SpriteExtension/Dialogs/SpriteObjectEditor.cpp:529
msgid "Animation "
@@ -17695,7 +17705,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteExtension.cpp:447
#: ../Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteExtension.cpp:450
msgid "Animations and images"
msgstr ""
msgstr "Animacje i obrazy"
#: ../Core/GDCore/Extensions/Builtin/SpriteExtension/SpriteExtension.cpp:59
msgid "Change the direction"
@@ -18084,7 +18094,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/StringInstructionsExtension.cpp:23
#: ../Core/GDCore/Extensions/Builtin/StringInstructionsExtension.cpp:24
msgid "Insert a new line"
msgstr ""
msgstr "Wstaw nowy wiersz"
#: ../Core/GDCore/Extensions/Builtin/StringInstructionsExtension.cpp:25
#: ../Core/GDCore/Extensions/Builtin/StringInstructionsExtension.cpp:31
@@ -19522,12 +19532,12 @@ msgstr ""
#: ../Core/GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvas.cpp:234
msgid "Add a behavior to the object"
msgstr ""
msgstr "Dodaj zachowanie do obiektu"
#: ../Core/GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvas.cpp:236
#: ../Core/GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvas.cpp:264
msgid "Insert a new object"
msgstr ""
msgstr "Wstaw nowy obiekt"
#: ../Core/GDCore/IDE/Dialogs/LayoutEditorCanvas/LayoutEditorCanvas.cpp:257
msgid "Lock the object(s)"
@@ -19673,11 +19683,11 @@ msgstr ""
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:49
msgid "Object name"
msgstr ""
msgstr "Nazwa obiektu"
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:50
msgid "Kind"
msgstr ""
msgstr "Rodzaj"
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:53
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:54

View File

@@ -32,7 +32,7 @@ msgstr ""
"Project-Id-Version: gdevelop\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-13 21:53+0200\n"
"PO-Revision-Date: 2016-04-15 14:32-0400\n"
"PO-Revision-Date: 2016-10-31 18:31-0400\n"
"Last-Translator: 4ian <Florian.rival@gmail.com>\n"
"Language-Team: Portuguese\n"
"Language: pt_PT\n"
@@ -67,11 +67,11 @@ msgstr "Bugs conhecidos para esta versão do GDevelop"
msgid "You can visit a page on our website which can\n"
"contain known bugs for this version of GDevelop:"
msgstr "Você pode visitar uma página em nosso site que pode\n"
"conter bugs conhecidos para esta versão do GDevelop:"
"conter erros conhecidos para esta versão do GDevelop:"
#: ../IDE/BugReport.cpp:102
msgid "View the known bugs for this version"
msgstr "Exibir os bugs conhecidos para esta versão"
msgstr "Exibir os erros conhecidos para esta versão"
#: ../IDE/BugReport.cpp:107 ../IDE/BugReport.cpp:134
#: ../IDE/SearchEvents.cpp:151
@@ -768,7 +768,7 @@ msgstr "François Dumortier: Designer da logo do GDevelop e concepção do Web s
#: ../IDE/Credits.cpp:210
msgid "Victor Levasseur: Advanced XML, Tiled Sprite and Tile Map extensions and contributions to Physics Engine, Text object, Video object, Path behavior and Sound object extension."
msgstr ""
msgstr "Victor Levasseur: Extensões XML avançado, Sprite Tiled e Mapa Tiled e contribuições para o Physics Engine, extensão de objeto Texto, objeto Vídeo, objeto Caminho e objeto Som."
#: ../IDE/Credits.cpp:213
msgid "Constantine Shvetsov: Awesome design of icons"
@@ -11836,8 +11836,8 @@ msgstr "Está caindo"
#: ../Extensions//PlatformBehavior/Extension.cpp:87
msgid "Check if the object is falling.\n"
"Note that the object can be flagged as jumping and falling at the same time: at the end of a jump, the fall speed becomes higher that the jump speed."
msgstr "Checa se o objeto está caindo.\n"
"Note que o objeto pode ser marcado como \"pulando\" e \"caindo\" ao mesmo tempo: no fim de um pulo, a velocidade de queda se torna maior que a de pulo."
msgstr "Verifica se o objeto está caindo.\n"
"Observe que o objeto pode ser marcado como \"pulando\" e \"caindo\" ao mesmo tempo: no final de um pulo, a velocidade de queda se torna maior que a de pulo."
#: ../Extensions//PlatformBehavior/Extension.cpp:88
msgid "_PARAM0_ is falling"
@@ -13967,7 +13967,7 @@ msgstr "Obejetos Tilemap não controlam tilesets com margens ao redor das imagen
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:109
msgid "Tileset configuration importation completed."
msgstr "Importação da configuração Tileset completada."
msgstr "Importação da configuração do Tileset está completa."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:117
msgid "Tilemap size is different."
@@ -13987,19 +13987,19 @@ msgstr "Importação do conteúdo da Tilemap concluída."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:234
msgid "Some tiles have more than 1 hitbox. Only the first one is imported."
msgstr "Algumas tiles tem mais que 1 hitbox. Apenas a primeira é importada."
msgstr "Algumas tiles tem mais que 1 caixa de colisão. Apenas a primeira é importada."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:236
msgid "Some tiles have a polyline or a ellipsis hitbox. Only rectangle and polygon hitboxes are supported."
msgstr "Algumas tiles tem uma hitbox polilinha ou elipse. Apenas hitboxes em retângulos e polígonos são suporadas."
msgstr "Algumas tiles tem caixas de colisões polilinha ou elíptica. Apenas as caixas de colisões em retângulos e polígonos são suportadas."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:238
msgid "Some tiles have a concave polygon. It has been ignored and set to a rectangular hitbox as this object only supports convex hitboxes for tiles."
msgstr "Algumas tiles tem um polígono côncavo. Ele foi ignorado e mudado para uma hitbox retângular já que esse objeto apenas suporta hitboxes convexas para tiles."
msgstr "Algumas tiles tem um polígono côncavo. Ele foi ignorado e mudado para uma caixa de colisão retangular já que esse objeto suporta apenas caixas de colisões convexas para tiles."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:240
msgid "Tiles hitboxes importation completed."
msgstr "Importação de hitboxes de tiles completa."
msgstr "Importação de caixa de colisões de tiles está completa."
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:258
msgid "There are not as many tiles in the object's tileset as in the file. The result may not be correct."
@@ -14389,7 +14389,7 @@ msgstr "Sempre"
#: ../Core/GDCore/Extensions/Builtin/AdvancedExtension.cpp:24
msgid "This condition returns always true (or always false if condition is inverted)."
msgstr "Esta condição sempre retorna em verdadeiro (ou sempre em falso se a condição é invertida)."
msgstr "Esta condição sempre retorna verdadeiro (ou sempre falso se a condição é invertida)."
#: ../Core/GDCore/Extensions/Builtin/AudioExtension.cpp:23
msgid "Play a sound on a channel"
@@ -18301,7 +18301,7 @@ msgstr "Valor de um temporizador"
#: ../Core/GDCore/Extensions/Builtin/TimeExtension.cpp:25
msgid "Test the elapsed time of a timer."
msgstr "Teste o tempo decorrido de um timer."
msgstr "Teste o tempo decorrido de um Temporizador."
#: ../Core/GDCore/Extensions/Builtin/TimeExtension.cpp:26
msgid "The timer _PARAM2_ is greater than _PARAM1_ seconds"
@@ -18807,25 +18807,25 @@ msgstr "Escolha um comportamento do objeto."
#: ../Core/GDCore/IDE/Dialogs/ChooseBehaviorDialog.cpp:122
msgid "This object doesn't have the appropriate behavior attached to it.\n"
"Check that you selected the right object or add the behavior in the object properties."
msgstr "Este objeto não possui o automatismo apropriado anexado a ele.\n"
"Verifique se você selecionou o objeto certo ou adicione este o automatismo nas propriedades do objeto."
msgstr "Este objeto não possui o comportamento apropriado anexado a ele.\n"
"Verifique se você selecionou o objeto certo ou adicione este o comportamento nas propriedades do objeto."
#: ../Core/GDCore/IDE/Dialogs/ChooseBehaviorDialog.cpp:126
#, c-format
msgid "This object doesn't have behavior \"%s\" attached to it.\n"
"Check that you selected the right object or add this behavior in the object properties."
msgstr "Este objeto não possui o automatismo \"%s\" anexado a ele.\n"
"Verifique se você selecionou o objeto certo ou adicione este o automatismo nas propriedades do objeto."
msgstr "Este objeto não possui o comportamento \"%s\" anexado a ele.\n"
"Verifique se você selecionou o objeto certo ou adicione este comportamento nas propriedades do objeto."
#: ../Core/GDCore/IDE/Dialogs/ChooseBehaviorTypeDialog.cpp:70
msgid "Choose the behavior to add to the object:"
msgstr "Escolha o automatismo para adicionar ao objeto:"
msgstr "Escolha o comportamento para adicionar ao objeto:"
#: ../Core/GDCore/IDE/Dialogs/ChooseBehaviorTypeDialog.cpp:74
msgid "You can also use the grayed behaviors:\n"
"their associated extension will be automatically enabled."
msgstr "Você também pode usar os objetos acizentados:\n"
"As suas extensões associadas serão ativadas autmaticamente."
msgstr "Você também pode usar os comportamentos acinzentados:\n"
"As suas extensões associadas serão ativadas automaticamente."
#: ../Core/GDCore/IDE/Dialogs/ChooseBehaviorTypeDialog.cpp:241
#: ../Core/GDCore/IDE/Dialogs/ChooseObjectTypeDialog.cpp:253
@@ -19818,7 +19818,7 @@ msgstr "Renomear..."
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:209
msgid "Choose the behavior to delete"
msgstr "Escolha o automatismo para excluir"
msgstr "Escolha o comportamento para excluir"
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:228
msgid "Enter a new name for the behavior"
@@ -20235,7 +20235,7 @@ msgstr "!\n"
#: ../Core/GDCore/IDE/ProjectFileWriter.cpp:144
msgid "Unable to open the file."
msgstr "Não é possível abrir o arquivo."
msgstr "Impossibilitado de abrir o arquivo."
#: ../Core/GDCore/IDE/ProjectFileWriter.cpp:144
#: ../Core/GDCore/IDE/ProjectFileWriter.cpp:167
@@ -20252,7 +20252,7 @@ msgstr "Erro ao carregar:"
msgid "Your project has been upgraded to be used with GDevelop 4.\n"
"If you save it, you won't be able to open it with an older version: please do a backup of your project file if you want to go back to GDevelop 3."
msgstr "Seu projeto foi atualizado para ser usado com GDevelop 4.\n"
"se você salvá-lo, você não será capaz de abri-lo com uma versão mais antiga: por favor, faça um backup do arquivo de projeto, se você quiser voltar a usar GDevelop 3."
"Se você salvá-lo, você não será capaz de abri-lo com uma versão mais antiga: por favor, faça um backup do arquivo de projeto se você quiser voltar a usar GDevelop 3."
#: ../Core/GDCore/IDE/wxTools/ShowFolder.cpp:32
msgid "Oops, it seems that the folder couldn't be displayed. Open your file explorer and go to:\n\n"
@@ -20296,11 +20296,11 @@ msgstr "Obrigado pela sua compreensão.\n"
#: ../Core/GDCore/Project/Project.cpp:630
msgid "The project is using the pathfinding behavior. This behavior has been replaced by a new one:\n"
msgstr "O projeto usando o automatismo de pathfinding. Esse automatismo foi substituído por um novo: \n"
msgstr "O projeto está usando o comportamento de \"Encontrando Caminhos\". Esse comportamento foi substituído por um novo: \n"
#: ../Core/GDCore/Project/Project.cpp:631
msgid "You must add the new 'Pathfinding' behavior to the objects that need to be moved, and add the 'Pathfinding Obstacle' to the objects that must act as obstacles."
msgstr "Você deve adicionar o novo automatismo ' Pathfinding ' para os objetos que precisam ser movidos, e adicionar o 'Obstáculo de Pathfinding' para os objetos que devem atuar como obstáculos."
msgstr "Você deve adicionar o novo comportamento de ' Encontrando Caminhos ' para os objetos que precisam ser movidos, e adicionar o 'Obstáculo de Encontrando Caminhos' para os objetos que devem atuar como obstáculos."
#: ../Core/GDCore/Project/Project.cpp:807
msgid "Please use only letters, digits\n"

View File

@@ -32,7 +32,7 @@ msgstr ""
"Project-Id-Version: gdevelop\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-13 21:53+0200\n"
"PO-Revision-Date: 2016-04-15 14:32-0400\n"
"PO-Revision-Date: 2016-10-31 18:32-0400\n"
"Last-Translator: 4ian <Florian.rival@gmail.com>\n"
"Language-Team: Russian\n"
"Language: ru_RU\n"
@@ -735,7 +735,7 @@ msgstr "Написано на C++, скомпилировано с помощь
#: ../IDE/Credits.cpp:146
msgid "Use SFML, wxWidgets and TinyXml libraries."
msgstr ""
msgstr "Использовать SFML, wxWidgets и TinyXml библиотеки."
#: ../IDE/Credits.cpp:159
msgid "The Web platform is written in Javascript and uses Pixi.js"
@@ -767,7 +767,7 @@ msgstr "François Dumortier: Разработчик логотипа и конц
#: ../IDE/Credits.cpp:210
msgid "Victor Levasseur: Advanced XML, Tiled Sprite and Tile Map extensions and contributions to Physics Engine, Text object, Video object, Path behavior and Sound object extension."
msgstr ""
msgstr "Виктор Левассеур: Продвинутый XML, Тайловый Спрайт, расширение Тайловый Карты, содействие Физического движка, Текстовый объект, Видео объект, Путь поведения и расширение Звукового объекта."
#: ../IDE/Credits.cpp:213
msgid "Constantine Shvetsov: Awesome design of icons"
@@ -2808,15 +2808,15 @@ msgstr "Выберите условие в списке"
#: ../IDE/InstructionSelectorDialog.cpp:131
msgid "Help on this "
msgstr ""
msgstr "Помочь в этом "
#: ../IDE/InstructionSelectorDialog.cpp:131
msgid "action"
msgstr ""
msgstr "действия"
#: ../IDE/InstructionSelectorDialog.cpp:131
msgid "condition"
msgstr ""
msgstr "условие"
#: ../IDE/InstructionSelectorDialog.cpp:145
msgid "Inversion"
@@ -4252,15 +4252,16 @@ msgstr "Проект экспортирован под \""
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:39
msgid "\".\n"
"Follow the instructions on the wiki to know how to build the android package from the exported files."
msgstr ""
msgstr "\".\n"
"Следовать по инструкции на вики знание как создать Android пакет из экспортированных файлах."
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:39
msgid "Android export"
msgstr ""
msgstr "Экспорт для Андроида"
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:51
msgid "Export in progress"
msgstr ""
msgstr "Идёт импорт"
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:51 ../GDJS/GDJS//IDE/Exporter.cpp:99
#: ../GDJS/GDJS//IDE/Exporter.cpp:202
@@ -4814,11 +4815,11 @@ msgstr "aaa"
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:156
msgid "Exports the game to a native Android application. This will produce source files ready to be compiled for Android using the Android SDK and NDK."
msgstr ""
msgstr "Экспортирует игру на нативном Android-приложение. Это позволит производить исходные файлы готовые быть скомпилированы для Android с помощью Android SDK и NDK."
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:161
msgid "How to compile your game exported files."
msgstr ""
msgstr "Как скомпилировать игру в экспортированных файлах."
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:172
#: ../GDCpp/GDCpp//IDE/Dialogs/ProjectExportDialog.cpp:102
@@ -5330,7 +5331,7 @@ msgstr "Игры на базе C++ и OpenGL для Windows или Linux."
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.h:113
msgid "Export to native Android"
msgstr ""
msgstr "Экспорт для простого Андроида"
#: ../GDJS/GDJS//Events/Builtin/JsCodeEvent.cpp:51
msgid "Javascript code"
@@ -5597,7 +5598,9 @@ msgstr "\n\n"
msgid "Unable to launch your browser :(\n"
"Manually open your browser and type \"localhost:2828\" in\n"
"the address bar (without the quotes) to launch the preview!"
msgstr ""
msgstr "Невозможно запустить браузер :(\n"
"Вручную откройте браузер и введите\"localhost:2828\" в\n"
"адресной строке(без кавычек) чтобы начать просмотр!)!"
#: ../GDJS/GDJS//IDE/Dialogs/CordovaPackageDialog.cpp:13
msgid "http://wiki.compilgames.net/doku.php/en/game_develop/tutorials/howtouseintelxdk"
@@ -5649,7 +5652,7 @@ msgstr "Просто нажмите на кнопку \"экспорт\" и GDev
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:184
msgid "Export to a website or native game with Cocos2d (experimental)"
msgstr ""
msgstr "Экспорт в веб или в нативных игр с Cocos2d (экспериментальная)"
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:254
msgid "If you install Cocos2d-x, you can also use it to export the game to Android, iOS, Windows, Mac or Linux."
@@ -5657,7 +5660,7 @@ msgstr "Если у вас установлен Cocos2d-x, вы также см
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:259
msgid "Click here to learn more about Cocos2d export"
msgstr ""
msgstr "Нажмите здесь, чтобы узнать больше о Cocos2d экспорт"
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:296
msgid "Export"
@@ -5705,7 +5708,10 @@ msgid "Activate any Cordova plugin that may be required by the objects\n"
"you use in the project.\n"
"In the \"Build\" tab, select \"Crosswalk for Android\" or \"iOS\".\n"
"XDK will be able to package your game into a native Android or iOS application."
msgstr ""
msgstr "Активировать любой плагин Cordova, которые потребует объекты\n"
"которые используете в ваш проект.\n"
"На вкладке \"Build\", выберите \"Crosswalk for Android\" или \"iOS\".\n"
"XDK будет в состоянии упаковать вашу игру в нативный Android или iOS приложения."
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:520
msgid "Detailed explanation available on the wiki"
@@ -5805,7 +5811,7 @@ msgstr "Загрузите упакованную игру на компилят
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.h:169
msgid "Package the game for Cordova (Intel XDK)"
msgstr ""
msgstr "Пакет игры для Cordova (Intel XDK)"
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.h:203
msgid "Edit the Javascript code"
@@ -5913,24 +5919,25 @@ msgstr "Баннер отображается"
#: ../Extensions//AdMobObject/Extension.cpp:53
msgid "Return true if the object is currently displaying a banner"
msgstr ""
msgstr "Возвращает значение true, если объект является в настоящем временем отображает баннер"
#: ../Extensions//AdMobObject/Extension.cpp:54
msgid "_PARAM0_ is displaying a banner"
msgstr ""
msgstr "_PARAM0_ отображает баннер"
#: ../Extensions//AdMobObject/Extension.cpp:61
msgid "Preload interstitial screen"
msgstr ""
msgstr "Преднагрузки интерстициальном экраном"
#: ../Extensions//AdMobObject/Extension.cpp:62
msgid "Preload the interstitial screen in memory, so that it can be shown later.\n"
"You can use this action at the beginning of a level for example."
msgstr ""
msgstr "Предзагрузить рекламный баннер, что бы использовать его позже.\n"
"Вы можете использовать это действие в начале уровня, например."
#: ../Extensions//AdMobObject/Extension.cpp:63
msgid "Preload an interstitial screen for _PARAM0_"
msgstr ""
msgstr "Предзагрузить рекламный баннер для _PARAM0_"
#: ../Extensions//AdMobObject/Extension.cpp:64
#: ../Extensions//AdMobObject/Extension.cpp:73
@@ -5939,16 +5946,17 @@ msgstr "Интерстициальный экран"
#: ../Extensions//AdMobObject/Extension.cpp:70
msgid "Show interstitial screen"
msgstr ""
msgstr "Показать рекламный баннер"
#: ../Extensions//AdMobObject/Extension.cpp:71
msgid "Show the interstitial screen.\n"
"If the interstitial screen has not been preloaded, it will be loaded and displayed when ready."
msgstr ""
msgstr "Предзагрузить рекламный баннер.\n"
"Если баннер не был предзагружен, он будет загружен и показан когда будет готов."
#: ../Extensions//AdMobObject/Extension.cpp:72
msgid "Show the interstitial screen of _PARAM0_"
msgstr ""
msgstr "Предзагрузить рекламный баннер _PARAM0_"
#: ../Extensions//AdMobObject/Extension.cpp:79
msgid "Interstitial screen is ready"
@@ -5956,11 +5964,11 @@ msgstr "Интерстициальный экран готов"
#: ../Extensions//AdMobObject/Extension.cpp:80
msgid "Return true if the interstitial screen was loaded and is ready to be shown."
msgstr ""
msgstr "Выдаёт значение true если рекламный баннер был загружен и готов к показу."
#: ../Extensions//AdMobObject/Extension.cpp:81
msgid "Interstitial screen of _PARAM0_ is ready"
msgstr ""
msgstr "Рекламный баннер _PARAM0_ готов"
#: ../Extensions//AdvancedXML/src/Extension.cpp:31
msgid "Advanced XML 1.0"
@@ -7181,7 +7189,7 @@ msgstr "Уничтожить поведение вне экрана"
#: ../Extensions//DestroyOutsideBehavior/Extension.cpp:17
#: ../Extensions//DestroyOutsideBehavior/JsExtension.cpp:30
msgid "Behavior destroying object when they go outside the screen"
msgstr ""
msgstr "Поведение уничтожения объекта за экраном"
#: ../Extensions//DestroyOutsideBehavior/Extension.cpp:22
msgid "Destroy when outside the screen"
@@ -8125,7 +8133,7 @@ msgstr "Создание уникальных сетевых идентифик
#: ../Extensions//Network/Extension.cpp:213
#: ../Extensions//Network/Extension.cpp:222
msgid "Behavior Automatic Network Updater"
msgstr ""
msgstr "Поведение автоматического интернет обновления"
#: ../Extensions//Network/Extension.cpp:173
msgid "Automatic network update"
@@ -9032,7 +9040,7 @@ msgstr "Размер, параметр 1"
#: ../Extensions//ParticleSystem/ExtensionSubDeclaration2.cpp:203
msgid "Modify parameter 1 of the size of particles"
msgstr ""
msgstr "Измененить параметра 1 размера частиц"
#: ../Extensions//ParticleSystem/ExtensionSubDeclaration2.cpp:204
msgid "Do _PARAM1__PARAM2_ to the parameter 1 of size of _PARAM0_"
@@ -13523,7 +13531,7 @@ msgstr ""
#: ../Extensions//TileMapObject/Extension.cpp:85
#: ../Extensions//TileMapObject/Extension.cpp:128
msgid "Tile row"
msgstr ""
msgstr "Строка плитки"
#: ../Extensions//TileMapObject/Extension.cpp:92
msgid "Tile width"
@@ -13653,7 +13661,7 @@ msgstr "Имя новой текстуры"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileEditor.cpp:30
msgid "Rectangle Shape"
msgstr ""
msgstr "Прямоугольник"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileEditor.cpp:32
msgid "Triangle Shape (top-left)"
@@ -13737,7 +13745,7 @@ msgstr "Карандашный режим\n"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:85
msgid "Rectangle mode"
msgstr ""
msgstr "Режим прямоугольника"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:85
msgid "Rectangle mode\n"
@@ -13746,7 +13754,7 @@ msgstr ""
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:87
msgid "Fill this space"
msgstr ""
msgstr "Заполнить это пространство"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:87
msgid "Fill the space with the selected tile"
@@ -13762,7 +13770,7 @@ msgstr ""
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:105
msgid "Change map size"
msgstr ""
msgstr "Изменить размер карты"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:109
msgid "Current layer:"
@@ -13770,7 +13778,7 @@ msgstr ""
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:126
msgid "Hide upper layers"
msgstr ""
msgstr "Скрыть верхние слои"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:142
msgid "Use left mouse click to add the current tile and right click to remove it."
@@ -13855,15 +13863,15 @@ msgstr "Удаляет выбранную точку"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:695
msgid ".tmx file :"
msgstr ""
msgstr ".tmx файл :"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:709
msgid "The tmx file saved with Tiled"
msgstr ""
msgstr "Tmx файл сохранен с Tiled"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:719
msgid "Import settings"
msgstr ""
msgstr "Импорт настройки"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:731
msgid "Import the tileset configuration"
@@ -13887,11 +13895,11 @@ msgstr ""
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.cpp:755
msgid "Importer..."
msgstr ""
msgstr "Загрузка..."
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapImporterDialog.cpp:24
msgid "Import .tmx file"
msgstr ""
msgstr "Загрузить .tmx файл"
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapImporterDialog.cpp:51
msgid "Unable to read the file !"
@@ -13937,11 +13945,11 @@ msgstr ""
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:67
msgid "The image can't be found !"
msgstr ""
msgstr "Эта картинка не была найдена!"
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:76
msgid "The image is imported as "
msgstr ""
msgstr "Эта картинка импортирована как "
#: ../Extensions//TileMapObject/IDE/TMXImport/TileMapImporter.cpp:86
msgid "Tileset image importation completed."
@@ -14038,7 +14046,7 @@ msgstr "Без имени"
#: ../Extensions//TimedEvent/TimedEvent.cpp:122
msgid " (Name: "
msgstr ""
msgstr " (Название: "
#: ../Extensions//TimedEvent/TimedEvent.cpp:123
msgid "Delayed execution after "
@@ -14210,7 +14218,7 @@ msgstr ""
#: ../Extensions//TileMapObject/IDE/Dialogs/TileMapDialogs.h:257
msgid "Import a .tmx file (Tiled)"
msgstr ""
msgstr "Импорт .tmx файла (Tiled)"
#: ../Core/GDCore/Events/Builtin/ForEachEvent.cpp:113
#: ../Core/GDCore/Extensions/Builtin/CommonInstructionsExtension.cpp:95
@@ -15434,11 +15442,11 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:520
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:76
msgid "Behaviors"
msgstr ""
msgstr "Поведение"
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:517
msgid "De/activate a behavior"
msgstr ""
msgstr "De/активировать поведение"
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:518
msgid "De/activate the behavior for the object."
@@ -15672,7 +15680,7 @@ msgstr "Текст, представляющий имя создаваемого
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:706
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:764
msgid "Pick all objects"
msgstr ""
msgstr "Выбраны все объекты"
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:707
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:765
@@ -15687,7 +15695,7 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:717
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:775
msgid "Pick a random object"
msgstr ""
msgstr "Выбран случайный объект"
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:718
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:776
@@ -15748,7 +15756,7 @@ msgstr "Выбрать ближайший _PARAM0_ для _PARAM1_; _PARAM2_"
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:799
msgid "Objects count"
msgstr ""
msgstr "Количество объектов"
#: ../Core/GDCore/Extensions/Builtin/BaseObjectExtension.cpp:800
msgid "Compare the number of picked objects"
@@ -17363,7 +17371,7 @@ msgstr "Возвращает \"Истина\" только в начале сц
#: ../Core/GDCore/Extensions/Builtin/SceneExtension.cpp:40
msgid "Change the scene"
msgstr ""
msgstr "Изменить сценыу"
#: ../Core/GDCore/Extensions/Builtin/SceneExtension.cpp:41
msgid "Stop this scene and start the specified one instead."
@@ -17376,11 +17384,11 @@ msgstr ""
#: ../Core/GDCore/Extensions/Builtin/SceneExtension.cpp:47
#: ../Core/GDCore/Extensions/Builtin/SceneExtension.cpp:59
msgid "Name of the new scene"
msgstr ""
msgstr "Имя новой сцены"
#: ../Core/GDCore/Extensions/Builtin/SceneExtension.cpp:48
msgid "Stop any other paused scenes?"
msgstr ""
msgstr "Остановить другие приостановленные сцены?"
#: ../Core/GDCore/Extensions/Builtin/SceneExtension.cpp:52
msgid "Pause and start a new scene"
@@ -18775,7 +18783,7 @@ msgstr "Открыть редактор текста"
#: ../Core/GDCore/IDE/Dialogs/ChooseBehaviorDialog.cpp:58
#: ../Core/GDCore/IDE/Dialogs/ChooseBehaviorTypeDialog.cpp:66
msgid "Choose a behavior"
msgstr ""
msgstr "Выберите поведение"
#: ../Core/GDCore/IDE/Dialogs/ChooseBehaviorDialog.cpp:69
msgid "Choose a behavior of the object."
@@ -19523,7 +19531,7 @@ msgstr "Постепенно применять к каждому созданн
#: ../Core/GDCore/IDE/Dialogs/InstancesAdvancedPasteDialog.cpp:130
msgid "deg"
msgstr ""
msgstr "Градус"
#: ../Core/GDCore/IDE/Dialogs/LayersEditorPanel.cpp:49
msgid "Edit the layer properties"
@@ -19771,12 +19779,12 @@ msgstr "Имя объекта"
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:50
msgid "Kind"
msgstr ""
msgstr "Вид"
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:53
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:54
msgid "Click to see help..."
msgstr ""
msgstr "Нажмите, чтобы увидеть помощь..."
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:70
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:191
@@ -19795,7 +19803,7 @@ msgstr "Переименовать..."
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:209
msgid "Choose the behavior to delete"
msgstr ""
msgstr "Выберите поведение для удаления"
#: ../Core/GDCore/IDE/Dialogs/ObjectsPropgridHelper.cpp:228
msgid "Enter a new name for the behavior"
@@ -19949,7 +19957,7 @@ msgstr "Щелкните ПКМ на изображении для доп. оп
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:189
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:202
msgid "Add a sound/music"
msgstr ""
msgstr "Добавить один звук/музыку"
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:177
msgid "Remove from folder only"
@@ -19997,7 +20005,7 @@ msgstr ""
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:388
msgid "Adding audio files"
msgstr ""
msgstr "Добавление аудиофайлов"
#: ../Core/GDCore/IDE/Dialogs/ResourcesEditor.cpp:454
msgid "Adding "

View File

@@ -32,7 +32,7 @@ msgstr ""
"Project-Id-Version: gdevelop\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-04-13 21:53+0200\n"
"PO-Revision-Date: 2016-04-15 14:30-0400\n"
"PO-Revision-Date: 2016-09-18 09:59-0400\n"
"Last-Translator: 4ian <Florian.rival@gmail.com>\n"
"Language-Team: Chinese Simplified\n"
"Language: zh_CN\n"
@@ -725,7 +725,7 @@ msgstr "GDevelop 是开放源码软件: \n\n"
#: ../IDE/Credits.cpp:134
msgid "Programmed in C++, compiled with GCC, written with Sublime Text"
msgstr ""
msgstr "程序使用 C++编写,编辑器使用 GCC文本编辑器使用 Sublime Text"
#: ../IDE/Credits.cpp:146
msgid "Use SFML, wxWidgets and TinyXml libraries."
@@ -2802,15 +2802,15 @@ msgstr "在列表中选择一个条件"
#: ../IDE/InstructionSelectorDialog.cpp:131
msgid "Help on this "
msgstr ""
msgstr "帮助这个 "
#: ../IDE/InstructionSelectorDialog.cpp:131
msgid "action"
msgstr ""
msgstr "行为"
#: ../IDE/InstructionSelectorDialog.cpp:131
msgid "condition"
msgstr ""
msgstr "条件"
#: ../IDE/InstructionSelectorDialog.cpp:145
msgid "Inversion"
@@ -4242,20 +4242,21 @@ msgstr "允许创建可在 Windows 或 Linux 上编译及游玩的 2D 游戏。"
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:39
msgid "The project was exported to \""
msgstr ""
msgstr "项目导出为"
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:39
msgid "\".\n"
"Follow the instructions on the wiki to know how to build the android package from the exported files."
msgstr ""
msgstr "\n"
"根据wiki上的指示去了解如何通过将导出的文件构建安卓应用包"
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:39
msgid "Android export"
msgstr ""
msgstr "导出为安卓"
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:51
msgid "Export in progress"
msgstr ""
msgstr "正在导出"
#: ../GDCpp/GDCpp//IDE/AndroidExporter.cpp:51 ../GDJS/GDJS//IDE/Exporter.cpp:99
#: ../GDJS/GDJS//IDE/Exporter.cpp:202
@@ -4808,11 +4809,11 @@ msgstr "aaa"
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:156
msgid "Exports the game to a native Android application. This will produce source files ready to be compiled for Android using the Android SDK and NDK."
msgstr ""
msgstr "导出游戏为安卓应用。这将会产生用于Android SDK和NDK编译Android的源代码。"
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:161
msgid "How to compile your game exported files."
msgstr ""
msgstr "如何编译你的游戏导出的文件。"
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.cpp:172
#: ../GDCpp/GDCpp//IDE/Dialogs/ProjectExportDialog.cpp:102
@@ -5324,7 +5325,7 @@ msgstr "基於 C + + 和 OpenGL 的 Windows 或 Linux 的游戏。"
#: ../GDCpp/GDCpp//IDE/Dialogs/GDCppDialogs.h:113
msgid "Export to native Android"
msgstr ""
msgstr "导出到原生 Android"
#: ../GDJS/GDJS//Events/Builtin/JsCodeEvent.cpp:51
msgid "Javascript code"
@@ -5643,15 +5644,15 @@ msgstr "只需单击\"导出\"按钮然后GDevelop 会打包你的游戏。 \n"
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:184
msgid "Export to a website or native game with Cocos2d (experimental)"
msgstr ""
msgstr "导出到网站或与Cocos2d兼容的本地游戏(测试)"
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:254
msgid "If you install Cocos2d-x, you can also use it to export the game to Android, iOS, Windows, Mac or Linux."
msgstr ""
msgstr "如果你安装了cocos2d你也可以导出游戏到 Android、 iOSWindows、 Mac 或 Linux。"
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:259
msgid "Click here to learn more about Cocos2d export"
msgstr ""
msgstr "单击此处以了解更多关于cocos2d的导出"
#: ../GDJS/GDJS//IDE/Dialogs/GDJSDialogs.cpp:296
msgid "Export"
@@ -5955,7 +5956,7 @@ msgstr "插屏已准备好"
#: ../Extensions//AdMobObject/Extension.cpp:80
msgid "Return true if the interstitial screen was loaded and is ready to be shown."
msgstr ""
msgstr "如果 interstitial screen 已经载入,并且可以显示了,则返回 true。"
#: ../Extensions//AdMobObject/Extension.cpp:81
msgid "Interstitial screen of _PARAM0_ is ready"
@@ -6093,7 +6094,7 @@ msgstr "引用是无效的"
#: ../Extensions//AdvancedXML/src/Extension.cpp:106
msgid "Is valid only when the reference is pointing to an existing and valid element."
msgstr ""
msgstr "只有当引用现有的和有效的元素的时候有效。"
#: ../Extensions//AdvancedXML/src/Extension.cpp:107
msgid "_PARAM0_ exists and is valid"
@@ -6181,7 +6182,7 @@ msgstr ""
#: ../Extensions//AdvancedXML/src/Extension.cpp:154
msgid "Reference which will be used to access to the element"
msgstr ""
msgstr "将用来访问对象的引用"
#: ../Extensions//AdvancedXML/src/Extension.cpp:155
msgid "Tye of the element to be created\n"
@@ -6210,15 +6211,15 @@ msgstr "删除元素 _PARAM0_"
#: ../Extensions//AdvancedXML/src/Extension.cpp:168
msgid "Reference to the element to be deleted"
msgstr ""
msgstr "指向要删除的对象"
#: ../Extensions//AdvancedXML/src/Extension.cpp:173
msgid "Add an element inside another"
msgstr ""
msgstr "把对象添加到另一个对象"
#: ../Extensions//AdvancedXML/src/Extension.cpp:174
msgid "Add an element into another: The element will be a \"child\" of its \"parent\"."
msgstr ""
msgstr "把一个对象添加到另一个对象︰这个对象将会是另一个对象的子对象。"
#: ../Extensions//AdvancedXML/src/Extension.cpp:175
msgid "Add _PARAM0_ as a child of _PARAM1_ (before _PARAM2_)"
@@ -6237,15 +6238,15 @@ msgstr "高级 XML: 标记"
#: ../Extensions//AdvancedXML/src/Extension.cpp:180
msgid "Reference to the element to be added"
msgstr ""
msgstr "指向被添加的对象"
#: ../Extensions//AdvancedXML/src/Extension.cpp:181
msgid "Reference to the parent element (must be a Tag element)"
msgstr ""
msgstr "指向父对象(必需是被标记的对象)"
#: ../Extensions//AdvancedXML/src/Extension.cpp:182
msgid "The element will be added before this element (if not defined, the element will be added at the end)"
msgstr ""
msgstr "添加到指定对象之前(如果没有指定对象,将会添加到最后)"
#: ../Extensions//AdvancedXML/src/Extension.cpp:187
#: ../Extensions//AdvancedXML/src/Extension.cpp:188
@@ -6284,7 +6285,7 @@ msgstr "获取标记的名称"
#: ../Extensions//AdvancedXML/src/Extension.cpp:213
msgid "Change the content of the element"
msgstr ""
msgstr "更改对象的内容"
#: ../Extensions//AdvancedXML/src/Extension.cpp:214
msgid "Change the content (text) of the element ( For text and comments elements only )."
@@ -9294,7 +9295,7 @@ msgstr "颗粒"
#: ../Extensions//ParticleSystem/ExtensionSubDeclaration3.cpp:169
#: ../Extensions//ParticleSystem/ParticleEmitterObject.cpp:599
msgid "Particles number"
msgstr ""
msgstr "粒子数"
#: ../Extensions//ParticleSystem/ExtensionSubDeclaration3.cpp:209
msgid "Emission angle A"
@@ -9322,7 +9323,7 @@ msgstr ""
#: ../Extensions//ParticleSystem/ExtensionSubDeclaration3.cpp:230
msgid "Gravity value"
msgstr ""
msgstr "重力值"
#: ../Extensions//ParticleSystem/ExtensionSubDeclaration3.cpp:233
msgid "Particles friction"
@@ -9893,11 +9894,11 @@ msgstr ""
#: ../Extensions//PathBehavior/Extension.cpp:147
msgid "Current segment"
msgstr ""
msgstr "当前阶段"
#: ../Extensions//PathBehavior/Extension.cpp:147
msgid "Number of the current segment"
msgstr ""
msgstr "当前阶段的数量"
#: ../Extensions//PathBehavior/Extension.cpp:154
msgid "Position of the object on the segment"
@@ -10077,7 +10078,7 @@ msgstr ""
#: ../Extensions//PathBehavior/Extension.cpp:335
#: ../Extensions//PathBehavior/Extension.cpp:336
msgid "Change the angle offset"
msgstr ""
msgstr "改变角度偏移量"
#: ../Extensions//PathBehavior/Extension.cpp:337
msgid "Do _PARAM2__PARAM3_ to angle offset of _PARAM0_"
@@ -10616,7 +10617,7 @@ msgstr ""
#: ../Extensions//TopDownMovementBehavior/Extension.cpp:260
#: ../Extensions//TopDownMovementBehavior/Extension.cpp:348
msgid "Rotation offset"
msgstr ""
msgstr "旋转偏移量"
#: ../Extensions//PathfindingBehavior/Extension.cpp:272
#: ../Extensions//TopDownMovementBehavior/Extension.cpp:247
@@ -11005,7 +11006,7 @@ msgstr "图形重置大小"
#: ../Extensions//PhysicsBehavior/CustomPolygonDialog.cpp:477
#: ../Extensions//PhysicsBehavior/CustomPolygonDialog.cpp:478
msgid "Rotation..."
msgstr ""
msgstr "旋转..."
#: ../Extensions//PhysicsBehavior/CustomPolygonDialog.cpp:151
msgid "Turn the polygon around a point"

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1" ?>
<News>
<Version Major="4" Minor="0" Build="89" Revision="0"/>
<Info Info="La version 4.0.89 est disponible.&#x0A;&#x0A;Ajout des traductions en Néerlandais et Finnois.&#x0A;Correction de la position par défaut des bannières AdMob.&#x0A;Amélioration et changements en interne.&#x0A;Correction de la condition 'Toujours' pour les jeux HTML5&#x0A;Correction d'un crash avec l'objet Carte de Tuiles lors de l'utilisation d'une image vide.&#x0A;Support de l'importation des fichiers TMX (créés avec Tiled Map Editor: http://www.mapeditor.org/) pour les objets Carte de Tuiles.&#x0A;Correction des actions de stockage qui n'enregistrait pas les données dans certaines conditions.&#x0A;Amélioration des performances de l'objet Panneau pour les jeux HTML5.&#x0A;Mise à jour du moteur de rendu des jeux HTML5 (pixi.js v3.0.8)&#x0A;Les fichiers Audio peuvent maintenant être ajoutés comme des ressources pour les précharger dans les jeux HTML5.&#x0A;Amélioration des performances des musiques des jeux HTML5 sur Android&#x0A;Correction pour les jeux natifs qui ne se lançaient pas dans les répertoires avec des caractères spéciaux.&#x0A;Correction de problèmes avec l'éditeur d'agencements externes.&#x0A;Correction d'une erreur 404 lors de l'aperçu de jeux HTML5 sur les distributions linux récentes." Lien="http://compilgames.net"/>
<Version Major="4" Minor="0" Build="92" Revision="0"/>
<Info Info="La version 4.0.92 est disponible.&#x0A;&#x0A;(Expérimental) Exportation des jeux HTML5 vers Android/iOS/Mac/Windows avec le moteur Cocos2d-JS.&#x0A;(Expérimental) Exportation des jeux natifs vers Android.&#x0A;&#x0A;Les objets avec le comportement 'Objet se déplaçant sur des plateformes' peuvent maintenant agripper les rebords des plateformes - il faut activer l'option dans le comportement de l'objet.&#x0A;Les animations des objets Sprite peuvent maintenant être nommés. Une condition et action ont été ajoutées pour utiliser ces noms.&#x0A;Ajout du support basique d'effets pour les jeux HTML5. ✨ Pour le moment, 3 effets sont disponibles et peuvent être attribués au calques d'une scène. &#x0A;Amélioration des performances des jeux HTML5&#x0A;Correction et améliorations pour les jeux HTML5 exportés avec Cocos2d-JS.&#x0A;Lors de la recherche dans les évènements, l'évènement surlignés est correctement affiché en dépliant au besoin les groupes/évènements repliés.&#x0A;Correction du rendu sur Windows avec les thèmes à fort contraste." Lien="http://compilgames.net"/>
<CommunityNews text="GDevApp est une web app de création de jeux basée sur GDevelop : venez essayer la plus avancée des applications online de création de jeux. Compatible avec les tablettes et fournie avec des superbes packs de graphismes pré-préparés." link1="https://github.com/4ian/GD" linkLabel1="GDevelop sur GitHub" link2="https://gdevapp.com?utm_source=software&amp;utm_medium=link_fr&amp;utm_campaign=launch" linkLabel2="Tester GDevApp, la nouvelle app de création de jeux"/>
</News>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="ISO-8859-1" ?>
<News>
<Version Major="4" Minor="0" Build="89" Revision="0"/>
<Info Info="Version 4.0.89 is available.&#x0A;&#x0A;Add complete Dutch translation&#x0A;Add Finnish translation&#x0A;Fix AdMob object banner default position being top of the screen&#x0A;Internal changes and improvements&#x0A;Fix 'Always' condition for HTML5 games&#x0A;Fix tilemap object crash when using an empty image&#x0A;Add support for importing TMX files (created with Tiled Map Editor: http://www.mapeditor.org/) in TiledMap objects.&#x0A;Fix storage actions not properly persisting values in some cases&#x0A;Improve performance of PanelSprite (9-patch) object for HTML5 games.&#x0A;Update the rendering engine of HTML5 games, pixi.js, to v3.0.8&#x0A;Audio files can be added as resources (like images) to preload them in HTML5 games&#x0A;Enhance performance of musics on Android&#x0A;Fix native games not launching properly when put in a directory containing unicode characters.&#x0A;Fix issues with external layouts editors.&#x0A;Wording fixes&#x0A;Fix 404 error when previewing a HTML5 game on recent linux distributions." Lien="http://compilgames.net"/>
<Version Major="4" Minor="0" Build="92" Revision="0"/>
<Info Info="Version 4.0.92 is available.&#x0A;&#x0A;New experimental option to export HTML5 games to Android/iOS/Mac/Windows using the Cocos2d as the underlying game engine.&#x0A;&#x0A; New experimental option to export native games to Android.&#x0A;&#x0A;Platformer object now have an option allowing them to grab platform ledges. Activate this option in the behavior and be sure to also enable this on platforms.&#x0A;Animations of Sprite objects can now be named. Specific actions/conditions are also available.&#x0A;Add basic support for effects for HTML5 games. For now, there are 3 simple effects (Night, LightNight, Sepia) and you can apply one of them on each layer of a scene.&#x0A;Performance improvement for HTML5 games.&#x0A;Fix text rendering when using a custom font, when exporting HTML5 games with Cocos2d-JS.&#x0A;Add support for non-smoothed texture for HTML5 games using Cocos2d-JS.&#x0A;Add support for storage actions when for HTML5 games using Cocos2d-JS on Android/iOS.&#x0A;When searching in events, events that are matched are unfolded.&#x0A;Provide compatibility with Windows high contrast themes (thanks @RandomShaper!)&#x0A;Many fixes" Lien="http://compilgames.net"/>
<CommunityNews text="GDevelop has a new website! Help us to translate it to your language by going on the Crowdin project.&#x0A;&#x0A;GDevApp is an online game creator based on GDevelop: Go try the most advanced game creation web app. Compatible with tablets and bundled with awesome graphics assets." link1="https://crowdin.com/project/gdevelop-website/" linkLabel1="Help translate GD website" link2="https://gdevapp.com?utm_source=software&amp;utm_medium=link_en&amp;utm_campaign=launch" linkLabel2="Try GDevApp, the online game creator based on GD"/>
</News>

View File

@@ -222,6 +222,7 @@ brew install cmake
brew install p7zip
brew install pkgconfig
brew install wxwidgets
brew install freetype
\endcode
* If you want to generate the documentation and translations, install Doxygen and Gettext:
\code

View File

@@ -19,7 +19,8 @@
#include "GDCore/Events/CodeGeneration/EventsCodeGenerator.h"
#include "GDCore/Events/Tools/EventsCodeNameMangler.h"
#include "GDCore/Events/Builtin/LinkEvent.h"
#include "GDCore/IDE/Dialogs/EditLink.h"
#include "GDCore/Events/Builtin/GroupEvent.h"
#include "GDCore/IDE/Dialogs/LinkEventEditor.h"
#include "GDCore/CommonTools.h"
using namespace std;
@@ -29,8 +30,8 @@ namespace gd
const EventsList * LinkEvent::GetLinkedEvents(const gd::Project & project) const
{
const EventsList * events = NULL;
const gd::ExternalEvents * linkedExternalEvents = NULL;
const EventsList * events = nullptr;
const gd::ExternalEvents * linkedExternalEvents = nullptr;
if ( project.HasExternalEventsNamed(GetTarget()) )
{
linkedExternalEvents = &project.GetExternalEvents(GetTarget());
@@ -39,17 +40,38 @@ const EventsList * LinkEvent::GetLinkedEvents(const gd::Project & project) const
else if ( project.HasLayoutNamed(GetTarget()) )
events = &project.GetLayout(GetTarget()).GetEvents();
//If the link only includes an events group, search it inside the layout/external events
if( includeConfig == INCLUDE_EVENTS_GROUP )
{
std::size_t i = 0;
std::size_t eventsCount = events->GetEventsCount();
for( ; i < eventsCount; ++i )
{
std::shared_ptr<const GroupEvent> groupEvent = std::dynamic_pointer_cast<const GroupEvent>(events->GetEventSmartPtr(i));
if(groupEvent && groupEvent->GetName() == eventsGroupName)
{
//Get its sub-events
events = &groupEvent->GetSubEvents();
break;
}
}
if(i >= eventsCount) //We didn't find the events group, return nullptr
events = nullptr;
}
return events;
}
void LinkEvent::ReplaceLinkByLinkedEvents(gd::Project & project, EventsList & eventList, std::size_t indexOfTheEventInThisList)
void LinkEvent::ReplaceLinkByLinkedEvents(const gd::Project & project, EventsList & eventList, std::size_t indexOfTheEventInThisList)
{
linkWasInvalid = false;
//Finding what to link to.
const EventsList * eventsToInclude = GetLinkedEvents(project);
if ( eventsToInclude != NULL )
{
std::size_t firstEvent = IncludeAllEvents() ? 0 : GetIncludeStart();
std::size_t lastEvent = IncludeAllEvents() ? eventsToInclude->size() - 1 : GetIncludeEnd();
std::size_t firstEvent = includeConfig == INCLUDE_BY_INDEX ? GetIncludeStart() : 0;
std::size_t lastEvent = includeConfig == INCLUDE_BY_INDEX ? GetIncludeEnd() : eventsToInclude->size() - 1;
//Check bounds
if ( firstEvent >= eventsToInclude->size() )
@@ -90,8 +112,6 @@ void LinkEvent::ReplaceLinkByLinkedEvents(gd::Project & project, EventsList & ev
eventList.RemoveEvent(indexOfTheEventInThisList);
return;
}
linkWasInvalid = false;
}
LinkEvent::~LinkEvent()
@@ -100,10 +120,18 @@ LinkEvent::~LinkEvent()
void LinkEvent::SerializeTo(SerializerElement & element) const
{
element.AddChild("include")
.SetAttribute("includeAll", IncludeAllEvents())
.SetAttribute("start", (int)GetIncludeStart())
.SetAttribute("end", (int)GetIncludeEnd());
SerializerElement & includeElement = element.AddChild("include")
.SetAttribute("includeConfig", static_cast<int>(GetIncludeConfig()));
if(GetIncludeConfig() == INCLUDE_EVENTS_GROUP)
{
includeElement.SetAttribute("eventsGroup", GetEventsGroupName());
}
else if(GetIncludeConfig() == INCLUDE_BY_INDEX)
{
includeElement.SetAttribute("start", static_cast<int>(GetIncludeStart()));
includeElement.SetAttribute("end", static_cast<int>(GetIncludeEnd()));
}
element.AddChild("target").SetValue(GetTarget());
}
@@ -111,17 +139,40 @@ void LinkEvent::SerializeTo(SerializerElement & element) const
void LinkEvent::UnserializeFrom(gd::Project & project, const SerializerElement & element)
{
SerializerElement & includeElement = element.GetChild("include", 0, "Limites");
SetIncludeStartAndEnd(includeElement.GetIntAttribute("start"),
includeElement.GetIntAttribute("end"));
SetIncludeAllEvents(includeElement.GetBoolAttribute("includeAll", true));
SetTarget(element.GetChild("target", 0, "Scene").GetValue().GetString());
if(includeElement.HasAttribute("includeAll"))
{
//Compatibility with GDevelop <= 4.0.92
if(includeElement.GetBoolAttribute("includeAll", true))
{
SetIncludeAllEvents();
}
else
{
SetIncludeStartAndEnd(includeElement.GetIntAttribute("start"),
includeElement.GetIntAttribute("end"));
}
}
else
{
//GDevelop > 4.0.92
IncludeConfig config = static_cast<IncludeConfig>(includeElement.GetIntAttribute("includeConfig", 0));
if(config == INCLUDE_ALL)
SetIncludeAllEvents();
else if(config == INCLUDE_EVENTS_GROUP)
SetIncludeEventsGroup(includeElement.GetStringAttribute("eventsGroup"));
else if(config == INCLUDE_BY_INDEX)
SetIncludeStartAndEnd(includeElement.GetIntAttribute("start"), includeElement.GetIntAttribute("end"));
}
}
gd::BaseEvent::EditEventReturnType LinkEvent::EditEvent(wxWindow* parent_, gd::Project & project, gd::Layout & scene_, gd::MainFrameWrapper & mainFrameWrapper_)
{
#if !defined(GD_NO_WX_GUI)
EditLink dialog(parent_, *this, project);
LinkEventEditor dialog(parent_, *this, project);
if ( dialog.ShowModal() == 0 ) return Cancelled;
#endif
@@ -152,11 +203,16 @@ void LinkEvent::Render(wxDC & dc, int x, int y, unsigned int width, gd::EventsEd
dc.SetFont(renderingHelper->GetNiceFont());
dc.DrawText( _("Link to ")+GetTarget(), x+32, y + 3 );
if ( !IncludeAllEvents() )
if ( GetIncludeConfig() == INCLUDE_BY_INDEX )
{
wxRect textRect = dc.GetTextExtent(_("Link to ")+GetTarget());
dc.DrawText( _("Include only events ")+gd::String::From(GetIncludeStart()+1)+_(" to ")+gd::String::From(GetIncludeEnd()+1), x+textRect.GetWidth()+32+10, y + 5 );
}
else if ( GetIncludeConfig() == INCLUDE_EVENTS_GROUP )
{
wxRect textRect = dc.GetTextExtent(_("Link to ")+GetTarget());
dc.DrawText( _("Include only the events group named \"")+gd::String::From(GetEventsGroupName())+_("\""), x+textRect.GetWidth()+32+10, y + 5 );
}
#endif
}

View File

@@ -18,9 +18,16 @@ namespace gd
class GD_CORE_API LinkEvent : public gd::BaseEvent
{
public:
LinkEvent() : BaseEvent(), includeAll(true), includeStart(gd::String::npos), includeEnd(gd::String::npos), linkWasInvalid(false) {};
enum IncludeConfig
{
INCLUDE_ALL = 0,
INCLUDE_EVENTS_GROUP = 1,
INCLUDE_BY_INDEX = 2 // Deprecated
};
LinkEvent() : BaseEvent(), includeConfig(INCLUDE_ALL), eventsGroupName(), includeStart(gd::String::npos), includeEnd(gd::String::npos), linkWasInvalid(false) {};
virtual ~LinkEvent();
virtual gd::LinkEvent * Clone() const { return new LinkEvent(*this);}
virtual gd::LinkEvent * Clone() const { return new LinkEvent(*this); }
/**
* Get the link target (i.e. the scene or external events the link refers to).
@@ -33,19 +40,23 @@ public:
void SetTarget(const gd::String & target_) { target = target_; };
/**
* Return true if the link event must include all the events of the target.
* Return the include config.
*/
bool IncludeAllEvents() const { return includeAll; };
IncludeConfig GetIncludeConfig() const { return includeConfig; }
/**
* Return true if the link event must include all the events of the target.
*/
void SetIncludeAllEvents(bool includeAllEvents) { includeAll = includeAllEvents; };
void SetIncludeAllEvents() { includeConfig = INCLUDE_ALL; }
void SetIncludeEventsGroup(const gd::String& name) { includeConfig = INCLUDE_EVENTS_GROUP; eventsGroupName = name; }
/**
* Set the number of the first and last event to be included ( Meaningful only if includeAll was set to false, see SetIncludeAllEvents )
*/
void SetIncludeStartAndEnd(std::size_t includeStart_, std::size_t includeEnd_) { includeStart = includeStart_; includeEnd = includeEnd_; };
void SetIncludeStartAndEnd(std::size_t includeStart_, std::size_t includeEnd_) { includeConfig = INCLUDE_BY_INDEX; includeStart = includeStart_; includeEnd = includeEnd_; }
gd::String GetEventsGroupName() const { return eventsGroupName; }
/**
* Get the number of the first event to be included. (Meaningful only if includeAll was set to false, see SetIncludeAllEvents)
@@ -75,7 +86,7 @@ public:
* When implementing a platform with a link event, you should call this function when preprocessing the events
* (See gd::EventMetadata::codeGeneration).
*/
void ReplaceLinkByLinkedEvents(gd::Project & project, EventsList & eventList, std::size_t indexOfTheEventInThisList);
void ReplaceLinkByLinkedEvents(const gd::Project & project, EventsList & eventList, std::size_t indexOfTheEventInThisList);
virtual bool IsExecutable() const { return true; };
@@ -96,9 +107,14 @@ public:
private:
gd::String target; ///< The name of the external events (or scene) to be included
bool includeAll; ///< If set to true, all the events of the target should be included
std::size_t includeStart; ///< If includeAll is set to false, represents the number of the first event of the target to included.
std::size_t includeEnd; ///< If includeAll is set to false, represents the number of the last event of the target to included.
IncludeConfig includeConfig; ///< Defines which events are included by this link
gd::String eventsGroupName; ///< If includeConfig is set to INCLUDE_EVENTS_GROUP, represents the name of the events group to be included.
std::size_t includeStart; ///< If includeConfig is set to INCLUDE_BY_INDEX, represents the number of the first event of the target to included.
std::size_t includeEnd; ///< If includeConfig is set to INCLUDE_BY_INDEX, represents the number of the last event of the target to included.
bool linkWasInvalid; ///< Set to true by Preprocess if the links was invalid the last time is was processed. Used to display a warning in the events editor.
};

View File

@@ -20,10 +20,8 @@ void EventsCodeGenerationContext::InheritsFrom(const EventsCodeGenerationContext
//Objects lists declared by parent became "already declared" in the child context.
alreadyDeclaredObjectsLists = parent_.alreadyDeclaredObjectsLists;
for ( std::set<gd::String>::iterator it = parent_.objectsListsToBeDeclared.begin() ; it != parent_.objectsListsToBeDeclared.end(); ++it )
alreadyDeclaredObjectsLists.insert(*it);
for ( std::set<gd::String>::iterator it = parent_.emptyObjectsListsToBeDeclared.begin() ; it != parent_.emptyObjectsListsToBeDeclared.end(); ++it )
alreadyDeclaredObjectsLists.insert(*it);
std::copy( parent_.objectsListsToBeDeclared.begin(), parent_.objectsListsToBeDeclared.end(), std::inserter( alreadyDeclaredObjectsLists, alreadyDeclaredObjectsLists.begin() ) );
std::copy( parent_.emptyObjectsListsToBeDeclared.begin(), parent_.emptyObjectsListsToBeDeclared.end(), std::inserter( alreadyDeclaredObjectsLists, alreadyDeclaredObjectsLists.begin() ) );
depthOfLastUse = parent_.depthOfLastUse;
customConditionDepth = parent_.customConditionDepth;

View File

@@ -32,7 +32,7 @@ public:
* Default constructor. You may want to call InheritsFrom just after.
* \param maxDepthLevel Optional pointer to an unsigned integer that will be updated to contain the maximal scope depth reached.
*/
EventsCodeGenerationContext(unsigned int * maxDepthLevel_ = NULL) : contextDepth(0), customConditionDepth(0), maxDepthLevel(maxDepthLevel_), parent(NULL) {};
EventsCodeGenerationContext(unsigned int * maxDepthLevel_ = nullptr) : contextDepth(0), customConditionDepth(0), maxDepthLevel(maxDepthLevel_), parent(NULL) {};
virtual ~EventsCodeGenerationContext() {};
/**

View File

@@ -185,7 +185,7 @@ gd::String EventsCodeGenerator::GenerateConditionCode(gd::Instruction & conditio
gd::InstructionMetadata instrInfos = MetadataProvider::GetConditionMetadata(platform, condition.GetType());
AddIncludeFile(instrInfos.codeExtraInformation.optionalIncludeFile);
AddIncludeFiles(instrInfos.codeExtraInformation.GetIncludeFiles());
maxConditionsListsSize = std::max(maxConditionsListsSize, condition.GetSubInstructions().size());
if ( instrInfos.codeExtraInformation.HasCustomCodeGenerator())
@@ -339,7 +339,7 @@ gd::String EventsCodeGenerator::GenerateActionCode(gd::Instruction & action, Eve
gd::InstructionMetadata instrInfos = MetadataProvider::GetActionMetadata(platform, action.GetType());
AddIncludeFile(instrInfos.codeExtraInformation.optionalIncludeFile);
AddIncludeFiles(instrInfos.codeExtraInformation.GetIncludeFiles());
if ( instrInfos.codeExtraInformation.HasCustomCodeGenerator() )
{

View File

@@ -40,7 +40,7 @@ void CallbacksForGeneratingExpressionCode::OnConstantToken(gd::String text)
void CallbacksForGeneratingExpressionCode::OnStaticFunction(gd::String functionName, const std::vector<gd::Expression> & parameters, const gd::ExpressionMetadata & expressionInfo)
{
codeGenerator.AddIncludeFile(expressionInfo.codeExtraInformation.optionalIncludeFile);
codeGenerator.AddIncludeFiles(expressionInfo.codeExtraInformation.GetIncludeFiles());
//Launch custom code generator if needed
if (expressionInfo.codeExtraInformation.HasCustomCodeGenerator())
@@ -76,7 +76,7 @@ void CallbacksForGeneratingExpressionCode::OnObjectFunction(gd::String functionN
const gd::Project & project = codeGenerator.GetProject();
const gd::Layout & scene = codeGenerator.GetLayout();
codeGenerator.AddIncludeFile(expressionInfo.codeExtraInformation.optionalIncludeFile);
codeGenerator.AddIncludeFiles(expressionInfo.codeExtraInformation.GetIncludeFiles());
if ( parameters.empty() ) return;
//Launch custom code generator if needed
@@ -119,7 +119,7 @@ void CallbacksForGeneratingExpressionCode::OnObjectBehaviorFunction(gd::String f
const gd::Project & project = codeGenerator.GetProject();
const gd::Layout & scene = codeGenerator.GetLayout();
codeGenerator.AddIncludeFile(expressionInfo.codeExtraInformation.optionalIncludeFile);
codeGenerator.AddIncludeFiles(expressionInfo.codeExtraInformation.GetIncludeFiles());
if ( parameters.size() < 2 ) return;
//Launch custom code generator if needed

View File

@@ -74,6 +74,11 @@ public:
*/
std::shared_ptr<BaseEvent> GetEventSmartPtr(size_t index) { return events[index]; };
/**
* \brief Return the smart pointer to the event at position \a index in the events list.
*/
std::shared_ptr<const BaseEvent> GetEventSmartPtr(size_t index) const { return events[index]; };
/**
* \brief Return a reference to the event at position \a index in the events list.
*/

View File

@@ -669,6 +669,10 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(gd:
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"));
obj.AddExpression("VariableChildCount", _("Object's variable number of children"), _("Get the number of children from an object"), _("Variables"), "res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"));
obj.AddStrExpression("VariableString", _("Object's variable"), _("Text of variable of an object"), _("Variables"), "res/actions/var.png")
.AddParameter("object", _("Object"))
.AddParameter("objectvar", _("Variable"));

View File

@@ -186,6 +186,12 @@ void GD_CORE_API BuiltinExtensionsImplementer::ImplementsVariablesExtension(gd::
.AddParameter("string", _("Child's name"))
.MarkAsAdvanced();
extension.AddExpression("GlobalVariableChildCount", _("Global variable number of children"), _("Get the number of children from global variable"), _("Variables"), "res/actions/var.png")
.AddParameter("globalvar", _("Variable"));
extension.AddExpression("VariableChildCount", _("Scene variable number of children"), _("Get the number of children from scene variable"), _("Variables"), "res/actions/var.png")
.AddParameter("scenevar", _("Variable"));
extension.AddExpression("Variable", _("Scene variables"), _("Scene variables"), _("Variables"), "res/actions/var.png")
.AddParameter("scenevar", _("Variable"));

View File

@@ -49,14 +49,31 @@ public:
}
/**
* \brief Set that the function is located in a specific include file
* \brief Erase any existing include file and add the specified include.
*/
ExpressionCodeGenerationInformation & SetIncludeFile(const gd::String & optionalIncludeFile_)
ExpressionCodeGenerationInformation & SetIncludeFile(const gd::String & includeFile)
{
optionalIncludeFile = optionalIncludeFile_;
includeFiles.clear();
includeFiles.push_back(includeFile);
return *this;
}
/**
* \brief Add a file to the already existing include files.
*/
ExpressionCodeGenerationInformation & AddIncludeFile(const gd::String & includeFile)
{
if ( std::find(includeFiles.begin(), includeFiles.end(), includeFile) == includeFiles.end())
includeFiles.push_back(includeFile);
return *this;
}
/**
* \brief Get the files that must be included to use the instruction.
*/
const std::vector<gd::String> & GetIncludeFiles() const { return includeFiles; };
/**
* \brief Set that the function must be generated using a custom code generator.
*/
@@ -81,12 +98,14 @@ public:
bool staticFunction;
gd::String functionCallName;
gd::String optionalIncludeFile;
bool hasCustomCodeGenerator;
std::function<gd::String(
const std::vector<gd::Expression> & parameters,
gd::EventsCodeGenerator & codeGenerator,
gd::EventsCodeGenerationContext & context)> customCodeGenerator;
private:
std::vector<gd::String> includeFiles;
};
/**

View File

@@ -285,14 +285,31 @@ public:
}
/**
* Set that the function is located in a specific include file
* \brief Erase any existing include file and add the specified include.
*/
ExtraInformation & SetIncludeFile(const gd::String & optionalIncludeFile_)
ExtraInformation & SetIncludeFile(const gd::String & includeFile)
{
optionalIncludeFile = optionalIncludeFile_;
includeFiles.clear();
includeFiles.push_back(includeFile);
return *this;
}
/**
* \brief Add a file to the already existing include files.
*/
ExtraInformation & AddIncludeFile(const gd::String & includeFile)
{
if ( std::find(includeFiles.begin(), includeFiles.end(), includeFile) == includeFiles.end())
includeFiles.push_back(includeFile);
return *this;
}
/**
* \brief Get the files that must be included to use the instruction.
*/
const std::vector<gd::String> & GetIncludeFiles() const { return includeFiles; };
ExtraInformation & SetCustomCodeGenerator(std::function<gd::String(Instruction & instruction,
gd::EventsCodeGenerator & codeGenerator, gd::EventsCodeGenerationContext & context)> codeGenerator)
{
@@ -316,10 +333,12 @@ public:
gd::String type;
AccessType accessType;
gd::String optionalAssociatedInstruction;
gd::String optionalIncludeFile;
bool hasCustomCodeGenerator;
std::function<gd::String(Instruction & instruction,
gd::EventsCodeGenerator & codeGenerator, gd::EventsCodeGenerationContext & context)> customCodeGenerator;
private:
std::vector<gd::String> includeFiles;
};
ExtraInformation codeExtraInformation; ///< Information about how generate code for the instruction

View File

@@ -1,198 +0,0 @@
#if defined(GD_IDE_ONLY) && !defined(GD_NO_WX_GUI)
#include "EditLink.h"
//(*InternalHeaders(EditLink)
#include <wx/bitmap.h>
#include <wx/font.h>
#include "GDCore/Tools/Localization.h"
#include <wx/image.h>
#include <wx/string.h>
#include <wx/settings.h>
//*)
#include <sstream>
#include "GDCore/IDE/wxTools/SkinHelper.h"
#include "GDCore/Tools/HelpFileAccess.h"
#include "GDCore/Events/Builtin/LinkEvent.h"
#include "GDCore/Project/ExternalEvents.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/CommonTools.h"
#include <wx/help.h>
namespace gd
{
//(*IdInit(EditLink)
const long EditLink::ID_STATICTEXT1 = wxNewId();
const long EditLink::ID_COMBOBOX1 = wxNewId();
const long EditLink::ID_RADIOBUTTON1 = wxNewId();
const long EditLink::ID_RADIOBUTTON2 = wxNewId();
const long EditLink::ID_TEXTCTRL2 = wxNewId();
const long EditLink::ID_STATICTEXT2 = wxNewId();
const long EditLink::ID_TEXTCTRL3 = wxNewId();
const long EditLink::ID_STATICTEXT4 = wxNewId();
const long EditLink::ID_STATICTEXT5 = wxNewId();
const long EditLink::ID_STATICLINE1 = wxNewId();
const long EditLink::ID_STATICBITMAP2 = wxNewId();
const long EditLink::ID_HYPERLINKCTRL1 = wxNewId();
const long EditLink::ID_BUTTON1 = wxNewId();
const long EditLink::ID_BUTTON2 = wxNewId();
//*)
BEGIN_EVENT_TABLE(EditLink,wxDialog)
//(*EventTable(EditLink)
//*)
END_EVENT_TABLE()
EditLink::EditLink(wxWindow* parent, LinkEvent & event, const gd::Project & game_) :
editedEvent(event),
game(game_)
{
//(*Initialize(EditLink)
wxFlexGridSizer* FlexGridSizer4;
wxFlexGridSizer* FlexGridSizer3;
wxFlexGridSizer* FlexGridSizer5;
wxFlexGridSizer* FlexGridSizer2;
wxFlexGridSizer* FlexGridSizer7;
wxStaticBoxSizer* StaticBoxSizer1;
wxFlexGridSizer* FlexGridSizer1;
Create(parent, wxID_ANY, _("Create a link to another scene"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE, _T("wxID_ANY"));
FlexGridSizer1 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer1->AddGrowableCol(0);
FlexGridSizer3 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer3->AddGrowableCol(0);
StaticText1 = new wxStaticText(this, ID_STATICTEXT1, _("Link to scene/external events:"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT1"));
FlexGridSizer3->Add(StaticText1, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
linkedNameEdit = new wxComboBox(this, ID_COMBOBOX1, wxEmptyString, wxDefaultPosition, wxDefaultSize, 0, 0, 0, wxDefaultValidator, _T("ID_COMBOBOX1"));
FlexGridSizer3->Add(linkedNameEdit, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
FlexGridSizer1->Add(FlexGridSizer3, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
StaticBoxSizer1 = new wxStaticBoxSizer(wxHORIZONTAL, this, _("Include"));
FlexGridSizer2 = new wxFlexGridSizer(0, 1, 0, 0);
FlexGridSizer2->AddGrowableCol(0);
AllEventsCheck = new wxRadioButton(this, ID_RADIOBUTTON1, _("All scene\'s events"), wxDefaultPosition, wxDefaultSize, wxRB_GROUP, wxDefaultValidator, _T("ID_RADIOBUTTON1"));
AllEventsCheck->SetValue(true);
FlexGridSizer2->Add(AllEventsCheck, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5);
FlexGridSizer4 = new wxFlexGridSizer(0, 5, 0, 0);
OnlyEventsCheck = new wxRadioButton(this, ID_RADIOBUTTON2, _("Only the events"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_RADIOBUTTON2"));
FlexGridSizer4->Add(OnlyEventsCheck, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
StartEdit = new wxTextCtrl(this, ID_TEXTCTRL2, wxEmptyString, wxDefaultPosition, wxSize(45,-1), 0, wxDefaultValidator, _T("ID_TEXTCTRL2"));
StartEdit->SetToolTip(_("Number of the first event"));
FlexGridSizer4->Add(StartEdit, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
StaticText2 = new wxStaticText(this, ID_STATICTEXT2, _("to"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT2"));
FlexGridSizer4->Add(StaticText2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
EndEdit = new wxTextCtrl(this, ID_TEXTCTRL3, wxEmptyString, wxDefaultPosition, wxSize(45,-1), 0, wxDefaultValidator, _T("ID_TEXTCTRL3"));
EndEdit->SetToolTip(_("Number of the last event"));
FlexGridSizer4->Add(EndEdit, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
StaticText4 = new wxStaticText(this, ID_STATICTEXT4, _("(included)"), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT4"));
FlexGridSizer4->Add(StaticText4, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
FlexGridSizer2->Add(FlexGridSizer4, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
StaticBoxSizer1->Add(FlexGridSizer2, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
FlexGridSizer1->Add(StaticBoxSizer1, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
StaticText5 = new wxStaticText(this, ID_STATICTEXT5, _("Remember to update the numbers of the events if\nyou delete or add events in the scene linked."), wxDefaultPosition, wxDefaultSize, 0, _T("ID_STATICTEXT5"));
wxFont StaticText5Font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
if ( !StaticText5Font.Ok() ) StaticText5Font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
StaticText5Font.SetStyle(wxFONTSTYLE_ITALIC);
StaticText5->SetFont(StaticText5Font);
FlexGridSizer1->Add(StaticText5, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
StaticLine1 = new wxStaticLine(this, ID_STATICLINE1, wxDefaultPosition, wxSize(10,-1), wxLI_HORIZONTAL, _T("ID_STATICLINE1"));
FlexGridSizer1->Add(StaticLine1, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
FlexGridSizer5 = new wxFlexGridSizer(0, 3, 0, 0);
FlexGridSizer5->AddGrowableCol(0);
FlexGridSizer7 = new wxFlexGridSizer(0, 3, 0, 0);
FlexGridSizer7->AddGrowableRow(0);
StaticBitmap1 = new wxStaticBitmap(this, ID_STATICBITMAP2, gd::SkinHelper::GetIcon("help", 16), wxDefaultPosition, wxDefaultSize, wxNO_BORDER, _T("ID_STATICBITMAP2"));
FlexGridSizer7->Add(StaticBitmap1, 1, wxTOP|wxBOTTOM|wxLEFT|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
HyperlinkCtrl1 = new wxHyperlinkCtrl(this, ID_HYPERLINKCTRL1, _("Help"), wxEmptyString, wxDefaultPosition, wxDefaultSize, wxHL_CONTEXTMENU|wxHL_ALIGN_CENTRE|wxNO_BORDER, _T("ID_HYPERLINKCTRL1"));
HyperlinkCtrl1->SetToolTip(_("Display help about this window"));
FlexGridSizer7->Add(HyperlinkCtrl1, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
FlexGridSizer5->Add(FlexGridSizer7, 1, wxALL|wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 0);
OkBt = new wxButton(this, ID_BUTTON1, _("Ok"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON1"));
FlexGridSizer5->Add(OkBt, 1, wxALL|wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL, 5);
AnnulerBt = new wxButton(this, ID_BUTTON2, _("Cancel"), wxDefaultPosition, wxDefaultSize, 0, wxDefaultValidator, _T("ID_BUTTON2"));
FlexGridSizer5->Add(AnnulerBt, 1, wxALL|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 5);
FlexGridSizer1->Add(FlexGridSizer5, 1, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL|wxALIGN_CENTER_VERTICAL, 0);
SetSizer(FlexGridSizer1);
FlexGridSizer1->Fit(this);
FlexGridSizer1->SetSizeHints(this);
Connect(ID_RADIOBUTTON1,wxEVT_COMMAND_RADIOBUTTON_SELECTED,(wxObjectEventFunction)&EditLink::OnOnlyEventsCheckSelect);
Connect(ID_RADIOBUTTON2,wxEVT_COMMAND_RADIOBUTTON_SELECTED,(wxObjectEventFunction)&EditLink::OnOnlyEventsCheckSelect);
Connect(ID_TEXTCTRL2,wxEVT_COMMAND_TEXT_UPDATED,(wxObjectEventFunction)&EditLink::OnStartEditText);
Connect(ID_TEXTCTRL3,wxEVT_COMMAND_TEXT_UPDATED,(wxObjectEventFunction)&EditLink::OnEndEditText);
Connect(ID_HYPERLINKCTRL1,wxEVT_COMMAND_HYPERLINK,(wxObjectEventFunction)&EditLink::OnAideBtClick);
Connect(ID_BUTTON1,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&EditLink::OnOkBtClick);
Connect(ID_BUTTON2,wxEVT_COMMAND_BUTTON_CLICKED,(wxObjectEventFunction)&EditLink::OnAnnulerBtClick);
//*)
linkedNameEdit->ChangeValue(editedEvent.GetTarget());
if ( !editedEvent.IncludeAllEvents() )
{
OnlyEventsCheck->SetValue(true);
StartEdit->ChangeValue(gd::String::From(editedEvent.GetIncludeStart()+1));
EndEdit->ChangeValue(gd::String::From(editedEvent.GetIncludeEnd()+1));
}
for (std::size_t i = 0;i<game.GetExternalEventsCount();++i)
linkedNameEdit->Append(game.GetExternalEvents(i).GetName());
for (std::size_t i = 0;i<game.GetLayoutsCount();++i)
linkedNameEdit->Append(game.GetLayout(i).GetName());
}
EditLink::~EditLink()
{
//(*Destroy(EditLink)
//*)
}
void EditLink::OnAideBtClick(wxCommandEvent& event)
{
gd::HelpFileAccess::Get()->OpenPage("game_develop/documentation/manual/link_events");
}
/**
* Cancel changes
*/
void EditLink::OnAnnulerBtClick(wxCommandEvent& event)
{
EndModal(0);
}
/**
* Apply changes
*/
void EditLink::OnOkBtClick(wxCommandEvent& event)
{
editedEvent.SetTarget(linkedNameEdit->GetValue());
if ( AllEventsCheck->GetValue() == true )
editedEvent.SetIncludeAllEvents(true);
else
{
editedEvent.SetIncludeAllEvents(false);
editedEvent.SetIncludeStartAndEnd(
gd::String(StartEdit->GetValue()).To<std::size_t>() - 1,
gd::String(EndEdit->GetValue()).To<std::size_t>() - 1);
}
EndModal(1);
}
void EditLink::OnStartEditText(wxCommandEvent& event)
{
OnlyEventsCheck->SetValue(true);
}
void EditLink::OnEndEditText(wxCommandEvent& event)
{
OnlyEventsCheck->SetValue(true);
}
void EditLink::OnOnlyEventsCheckSelect(wxCommandEvent& event)
{
StaticText5->Show(OnlyEventsCheck->GetValue());
}
}
#endif

View File

@@ -1,90 +0,0 @@
#if defined(GD_IDE_ONLY) && !defined(GD_NO_WX_GUI)
#ifndef EDITLINK_H
#define EDITLINK_H
//(*Headers(EditLink)
#include <wx/sizer.h>
#include <wx/stattext.h>
#include <wx/textctrl.h>
#include <wx/statline.h>
#include <wx/radiobut.h>
#include <wx/hyperlink.h>
#include <wx/statbmp.h>
#include <wx/button.h>
#include <wx/dialog.h>
#include <wx/combobox.h>
//*)
#include "GDCore/Events/Builtin/LinkEvent.h"
namespace gd { class Project; }
namespace gd
{
/**
* \brief Editor for the link events.
* \ingroup IDEDialogs
*/
class EditLink: public wxDialog
{
public:
EditLink(wxWindow* parent, LinkEvent & event, const gd::Project & game);
virtual ~EditLink();
//(*Declarations(EditLink)
wxButton* OkBt;
wxStaticText* StaticText2;
wxComboBox* linkedNameEdit;
wxRadioButton* AllEventsCheck;
wxStaticBitmap* StaticBitmap1;
wxTextCtrl* EndEdit;
wxStaticText* StaticText1;
wxHyperlinkCtrl* HyperlinkCtrl1;
wxTextCtrl* StartEdit;
wxRadioButton* OnlyEventsCheck;
wxStaticText* StaticText5;
wxStaticLine* StaticLine1;
wxButton* AnnulerBt;
wxStaticText* StaticText4;
//*)
protected:
//(*Identifiers(EditLink)
static const long ID_STATICTEXT1;
static const long ID_COMBOBOX1;
static const long ID_RADIOBUTTON1;
static const long ID_RADIOBUTTON2;
static const long ID_TEXTCTRL2;
static const long ID_STATICTEXT2;
static const long ID_TEXTCTRL3;
static const long ID_STATICTEXT4;
static const long ID_STATICTEXT5;
static const long ID_STATICLINE1;
static const long ID_STATICBITMAP2;
static const long ID_HYPERLINKCTRL1;
static const long ID_BUTTON1;
static const long ID_BUTTON2;
//*)
private:
//(*Handlers(EditLink)
void OnAideBtClick(wxCommandEvent& event);
void OnAnnulerBtClick(wxCommandEvent& event);
void OnOkBtClick(wxCommandEvent& event);
void OnStartEditText(wxCommandEvent& event);
void OnEndEditText(wxCommandEvent& event);
void OnOnlyEventsCheckSelect(wxCommandEvent& event);
//*)
LinkEvent & editedEvent;
const gd::Project & game;
DECLARE_EVENT_TABLE()
};
}
#endif
#endif

View File

@@ -71,11 +71,10 @@ LayersEditorPanelBase::LayersEditorPanelBase(wxWindow* parent, wxWindowID id, co
flexGridSizer13->Add(m_layersList, 0, wxALL|wxEXPAND, 0);
SetName(wxT("LayersEditorPanelBase"));
SetSizeHints(500,300);
if ( GetSizer() ) {
SetSize(500,300);
if (GetSizer()) {
GetSizer()->Fit(this);
}
CentreOnParent(wxBOTH);
// Connect events
this->Connect(ADD_LAYER_TOOL, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(LayersEditorPanelBase::OnAddLayerClicked), NULL, this);
this->Connect(DELETE_LAYER_TOOL, wxEVT_COMMAND_TOOL_CLICKED, wxCommandEventHandler(LayersEditorPanelBase::OnDeleteLayerClicked), NULL, this);
@@ -181,11 +180,15 @@ BaseGroupEventDialog::BaseGroupEventDialog(wxWindow* parent, wxWindowID id, cons
flexGridSizer45->Add(cancelBt, 0, wxALL, 5);
SetName(wxT("BaseGroupEventDialog"));
SetSizeHints(400,200);
if ( GetSizer() ) {
SetSize(400,200);
if (GetSizer()) {
GetSizer()->Fit(this);
}
CentreOnParent(wxBOTH);
if(GetParent()) {
CentreOnParent(wxBOTH);
} else {
CentreOnScreen(wxBOTH);
}
#if wxVERSION_NUMBER >= 2900
if(!wxPersistenceManager::Get().Find(this)) {
wxPersistenceManager::Get().RegisterAndRestore(this);
@@ -326,12 +329,16 @@ BaseEventStoreDialog::BaseEventStoreDialog(wxWindow* parent, wxWindowID id, cons
flexGridSizer7712->Add(cancelBt, 0, wxALL, 5);
SetName(wxT("BaseEventStoreDialog"));
SetMinSize( wxSize(500,300) );
SetSizeHints(750,450);
if ( GetSizer() ) {
SetMinClientSize(wxSize(500,300));
SetSize(750,450);
if (GetSizer()) {
GetSizer()->Fit(this);
}
CentreOnParent(wxBOTH);
if(GetParent()) {
CentreOnParent(wxBOTH);
} else {
CentreOnScreen(wxBOTH);
}
#if wxVERSION_NUMBER >= 2900
if(!wxPersistenceManager::Get().Find(this)) {
wxPersistenceManager::Get().RegisterAndRestore(this);
@@ -353,3 +360,161 @@ BaseEventStoreDialog::~BaseEventStoreDialog()
cancelBt->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(BaseEventStoreDialog::OnCancelBtClick), NULL, this);
}
LinkEventEditorBase::LinkEventEditorBase(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style)
: wxDialog(parent, id, title, pos, size, style)
{
if ( !bBitmapLoaded ) {
// We need to initialise the default bitmap handler
wxXmlResource::Get()->AddHandler(new wxBitmapXmlHandler);
wxC629BInitBitmapResources();
bBitmapLoaded = true;
}
wxFlexGridSizer* flexGridSizer158 = new wxFlexGridSizer(0, 1, 0, 0);
flexGridSizer158->SetFlexibleDirection( wxBOTH );
flexGridSizer158->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
flexGridSizer158->AddGrowableCol(0);
this->SetSizer(flexGridSizer158);
m_staticText160 = new wxStaticText(this, wxID_ANY, _("Link to scene/external events:"), wxDefaultPosition, wxSize(-1,-1), 0);
flexGridSizer158->Add(m_staticText160, 0, wxALL|wxEXPAND, 5);
wxArrayString m_eventsComboBoxArr;
m_eventsComboBox = new wxComboBox(this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(-1,-1), m_eventsComboBoxArr, 0);
#if wxVERSION_NUMBER >= 3000
m_eventsComboBox->SetHint(wxT(""));
#endif
flexGridSizer158->Add(m_eventsComboBox, 0, wxALL|wxEXPAND, 5);
m_includeAllEventsRadio = new wxRadioButton(this, wxID_ANY, _("Include all events"), wxDefaultPosition, wxSize(-1,-1), 0);
m_includeAllEventsRadio->SetValue(1);
flexGridSizer158->Add(m_includeAllEventsRadio, 0, wxALL, 5);
m_includeEventsGroupRadio = new wxRadioButton(this, wxID_ANY, _("Only include an events group:"), wxDefaultPosition, wxSize(-1,-1), 0);
m_includeEventsGroupRadio->SetValue(0);
flexGridSizer158->Add(m_includeEventsGroupRadio, 0, wxALL, 5);
wxArrayString m_eventsGroupComboBoxArr;
m_eventsGroupComboBox = new wxComboBox(this, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(-1,-1), m_eventsGroupComboBoxArr, 0);
#if wxVERSION_NUMBER >= 3000
m_eventsGroupComboBox->SetHint(wxT(""));
#endif
flexGridSizer158->Add(m_eventsGroupComboBox, 0, wxALL|wxEXPAND, 5);
m_eventsGroupsNames = new wxStaticText(this, wxID_ANY, _("Warning: Multiple groups have the same name. Only the first one will be included !"), wxDefaultPosition, wxSize(-1,-1), 0);
m_eventsGroupsNames->Wrap(285);
wxFont m_eventsGroupsNamesFont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
m_eventsGroupsNamesFont.SetWeight(wxFONTWEIGHT_BOLD);
m_eventsGroupsNames->SetFont(m_eventsGroupsNamesFont);
flexGridSizer158->Add(m_eventsGroupsNames, 0, wxALL|wxEXPAND|wxALIGN_LEFT, 5);
m_includeEventsByIndexRadio = new wxRadioButton(this, wxID_ANY, _("Only include the events: (deprecated)"), wxDefaultPosition, wxSize(-1,-1), 0);
m_includeEventsByIndexRadio->SetValue(0);
flexGridSizer158->Add(m_includeEventsByIndexRadio, 0, wxALL, 5);
m_deprecatedPanel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1,-1), wxTAB_TRAVERSAL);
flexGridSizer158->Add(m_deprecatedPanel, 0, wxALL|wxEXPAND, 0);
wxFlexGridSizer* flexGridSizer192 = new wxFlexGridSizer(0, 1, 0, 0);
flexGridSizer192->SetFlexibleDirection( wxBOTH );
flexGridSizer192->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
flexGridSizer192->AddGrowableCol(0);
m_deprecatedPanel->SetSizer(flexGridSizer192);
wxFlexGridSizer* flexGridSizer180 = new wxFlexGridSizer(0, 5, 0, 0);
flexGridSizer180->SetFlexibleDirection( wxBOTH );
flexGridSizer180->SetNonFlexibleGrowMode( wxFLEX_GROWMODE_SPECIFIED );
flexGridSizer192->Add(flexGridSizer180, 1, wxALL|wxEXPAND, 0);
m_staticText182 = new wxStaticText(m_deprecatedPanel, wxID_ANY, _("From"), wxDefaultPosition, wxSize(-1,-1), 0);
flexGridSizer180->Add(m_staticText182, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
m_startTextCtrl = new wxTextCtrl(m_deprecatedPanel, wxID_ANY, wxT("10"), wxDefaultPosition, wxSize(40,-1), 0);
#if wxVERSION_NUMBER >= 3000
m_startTextCtrl->SetHint(wxT(""));
#endif
flexGridSizer180->Add(m_startTextCtrl, 0, wxALL, 5);
m_staticText186 = new wxStaticText(m_deprecatedPanel, wxID_ANY, _("to"), wxDefaultPosition, wxSize(-1,-1), 0);
flexGridSizer180->Add(m_staticText186, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
m_endTextCtrl = new wxTextCtrl(m_deprecatedPanel, wxID_ANY, wxT(""), wxDefaultPosition, wxSize(40,-1), 0);
#if wxVERSION_NUMBER >= 3000
m_endTextCtrl->SetHint(wxT(""));
#endif
flexGridSizer180->Add(m_endTextCtrl, 0, wxALL, 5);
m_staticText194 = new wxStaticText(m_deprecatedPanel, wxID_ANY, _("(included)"), wxDefaultPosition, wxSize(-1,-1), 0);
flexGridSizer180->Add(m_staticText194, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5);
m_staticText196 = new wxStaticText(m_deprecatedPanel, wxID_ANY, _("This feature is only provided to keep compatibility with older projects."), wxDefaultPosition, wxSize(-1,-1), 0);
m_staticText196->Wrap(285);
flexGridSizer192->Add(m_staticText196, 0, wxALL|wxEXPAND|wxALIGN_CENTER_HORIZONTAL, 5);
m_staticText198 = new wxStaticText(m_deprecatedPanel, wxID_ANY, _("Not available for newly created link events."), wxDefaultPosition, wxSize(-1,-1), 0);
m_staticText198->Wrap(285);
wxFont m_staticText198Font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
m_staticText198Font.SetWeight(wxFONTWEIGHT_BOLD);
m_staticText198->SetFont(m_staticText198Font);
flexGridSizer192->Add(m_staticText198, 0, wxALL|wxALIGN_CENTER_HORIZONTAL, 5);
m_stdBtnSizer172 = new wxStdDialogButtonSizer();
flexGridSizer158->Add(m_stdBtnSizer172, 0, wxALL|wxALIGN_RIGHT, 5);
m_okButton = new wxButton(this, wxID_OK, wxT(""), wxDefaultPosition, wxSize(-1, -1), 0);
m_stdBtnSizer172->AddButton(m_okButton);
m_cancelButton = new wxButton(this, wxID_CANCEL, wxT(""), wxDefaultPosition, wxSize(-1, -1), 0);
m_stdBtnSizer172->AddButton(m_cancelButton);
m_stdBtnSizer172->Realize();
SetName(wxT("LinkEventEditorBase"));
SetSize(-1,-1);
if (GetSizer()) {
GetSizer()->Fit(this);
}
if(GetParent()) {
CentreOnParent(wxBOTH);
} else {
CentreOnScreen(wxBOTH);
}
// Connect events
m_eventsComboBox->Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(LinkEventEditorBase::OnEventsComboBoxTextChanged), NULL, this);
m_includeAllEventsRadio->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(LinkEventEditorBase::OnIncludeAllEventsRadioButtonClicked), NULL, this);
m_includeEventsGroupRadio->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(LinkEventEditorBase::OnIncludeEventsGroupRadioButtonClicked), NULL, this);
m_eventsGroupComboBox->Connect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(LinkEventEditorBase::OnEventsGroupComboBoxTextChanged), NULL, this);
m_includeEventsByIndexRadio->Connect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(LinkEventEditorBase::OnIncludeByIndexRadioButtonClicked), NULL, this);
m_okButton->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(LinkEventEditorBase::OnOkButtonClicked), NULL, this);
m_cancelButton->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(LinkEventEditorBase::OnCancelButtonClicked), NULL, this);
}
LinkEventEditorBase::~LinkEventEditorBase()
{
m_eventsComboBox->Disconnect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(LinkEventEditorBase::OnEventsComboBoxTextChanged), NULL, this);
m_includeAllEventsRadio->Disconnect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(LinkEventEditorBase::OnIncludeAllEventsRadioButtonClicked), NULL, this);
m_includeEventsGroupRadio->Disconnect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(LinkEventEditorBase::OnIncludeEventsGroupRadioButtonClicked), NULL, this);
m_eventsGroupComboBox->Disconnect(wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler(LinkEventEditorBase::OnEventsGroupComboBoxTextChanged), NULL, this);
m_includeEventsByIndexRadio->Disconnect(wxEVT_COMMAND_RADIOBUTTON_SELECTED, wxCommandEventHandler(LinkEventEditorBase::OnIncludeByIndexRadioButtonClicked), NULL, this);
m_okButton->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(LinkEventEditorBase::OnOkButtonClicked), NULL, this);
m_cancelButton->Disconnect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(LinkEventEditorBase::OnCancelButtonClicked), NULL, this);
}

View File

@@ -33,6 +33,9 @@
#include <wx/htmllbox.h>
#include "wx/srchctrl.h"
#include <wx/scrolwin.h>
#include <wx/combobox.h>
#include <wx/arrstr.h>
#include <wx/radiobut.h>
#if wxVERSION_NUMBER >= 2900
#include <wx/persist.h>
#include <wx/persist/toplevel.h>
@@ -153,4 +156,56 @@ public:
virtual ~BaseEventStoreDialog();
};
class LinkEventEditorBase : public wxDialog
{
protected:
wxStaticText* m_staticText160;
wxComboBox* m_eventsComboBox;
wxRadioButton* m_includeAllEventsRadio;
wxRadioButton* m_includeEventsGroupRadio;
wxComboBox* m_eventsGroupComboBox;
wxStaticText* m_eventsGroupsNames;
wxRadioButton* m_includeEventsByIndexRadio;
wxPanel* m_deprecatedPanel;
wxStaticText* m_staticText182;
wxTextCtrl* m_startTextCtrl;
wxStaticText* m_staticText186;
wxTextCtrl* m_endTextCtrl;
wxStaticText* m_staticText194;
wxStaticText* m_staticText196;
wxStaticText* m_staticText198;
wxStdDialogButtonSizer* m_stdBtnSizer172;
wxButton* m_okButton;
wxButton* m_cancelButton;
protected:
virtual void OnEventsComboBoxTextChanged(wxCommandEvent& event) { event.Skip(); }
virtual void OnIncludeAllEventsRadioButtonClicked(wxCommandEvent& event) { event.Skip(); }
virtual void OnIncludeEventsGroupRadioButtonClicked(wxCommandEvent& event) { event.Skip(); }
virtual void OnEventsGroupComboBoxTextChanged(wxCommandEvent& event) { event.Skip(); }
virtual void OnIncludeByIndexRadioButtonClicked(wxCommandEvent& event) { event.Skip(); }
virtual void OnOkButtonClicked(wxCommandEvent& event) { event.Skip(); }
virtual void OnCancelButtonClicked(wxCommandEvent& event) { event.Skip(); }
public:
wxStaticText* GetStaticText160() { return m_staticText160; }
wxComboBox* GetEventsComboBox() { return m_eventsComboBox; }
wxRadioButton* GetIncludeAllEventsRadio() { return m_includeAllEventsRadio; }
wxRadioButton* GetIncludeEventsGroupRadio() { return m_includeEventsGroupRadio; }
wxComboBox* GetEventsGroupComboBox() { return m_eventsGroupComboBox; }
wxStaticText* GetEventsGroupsNames() { return m_eventsGroupsNames; }
wxRadioButton* GetIncludeEventsByIndexRadio() { return m_includeEventsByIndexRadio; }
wxStaticText* GetStaticText182() { return m_staticText182; }
wxTextCtrl* GetStartTextCtrl() { return m_startTextCtrl; }
wxStaticText* GetStaticText186() { return m_staticText186; }
wxTextCtrl* GetEndTextCtrl() { return m_endTextCtrl; }
wxStaticText* GetStaticText194() { return m_staticText194; }
wxStaticText* GetStaticText196() { return m_staticText196; }
wxStaticText* GetStaticText198() { return m_staticText198; }
wxPanel* GetDeprecatedPanel() { return m_deprecatedPanel; }
LinkEventEditorBase(wxWindow* parent, wxWindowID id = wxID_ANY, const wxString& title = _("Edit the link event"), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize(-1,-1), long style = wxDEFAULT_DIALOG_STYLE);
virtual ~LinkEventEditorBase();
};
#endif

File diff suppressed because it is too large Load Diff

View File

@@ -173,68 +173,70 @@ static unsigned char xml_res_file_6[] = {
64,114,2,0,66,223,19,155,231,115,150,187,0,0,0,0,73,69,78,68,174,66,96,
130};
static size_t xml_res_size_7 = 1206;
static size_t xml_res_size_7 = 1242;
static unsigned char xml_res_file_7[] = {
60,63,120,109,108,32,118,101,114,115,105,111,110,61,34,49,46,48,34,32,101,
110,99,111,100,105,110,103,61,34,85,84,70,45,56,34,63,62,10,60,114,101,
115,111,117,114,99,101,32,120,109,108,110,115,61,34,104,116,116,112,58,
47,47,119,119,119,46,119,120,119,105,100,103,101,116,115,46,111,114,103,
47,119,120,120,114,99,34,62,10,32,32,60,111,98,106,101,99,116,32,99,108,
97,115,115,61,34,119,120,66,105,116,109,97,112,34,32,110,97,109,101,61,
34,97,100,100,49,54,34,62,71,68,67,111,114,101,68,105,97,108,111,103,115,
95,100,105,97,108,111,103,115,95,98,105,116,109,97,112,115,46,99,112,112,
36,46,46,95,46,46,95,46,46,95,46,46,95,66,105,110,97,114,105,101,115,95,
79,117,116,112,117,116,95,82,101,108,101,97,115,101,95,87,105,110,100,111,
119,115,95,114,101,115,95,105,99,111,110,115,95,100,101,102,97,117,108,
116,95,97,100,100,49,54,46,112,110,103,60,47,111,98,106,101,99,116,62,10,
32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,105,
116,109,97,112,34,32,110,97,109,101,61,34,100,101,108,101,116,101,49,54,
34,62,71,68,67,111,114,101,68,105,97,108,111,103,115,95,100,105,97,108,
111,103,115,95,98,105,116,109,97,112,115,46,99,112,112,36,46,46,95,46,46,
95,46,46,95,46,46,95,66,105,110,97,114,105,101,115,95,79,117,116,112,117,
116,95,82,101,108,101,97,115,101,95,87,105,110,100,111,119,115,95,114,101,
115,95,105,99,111,110,115,95,100,101,102,97,117,108,116,95,100,101,108,
101,116,101,49,54,46,112,110,103,60,47,111,98,106,101,99,116,62,10,32,32,
60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,105,116,
109,97,112,34,32,110,97,109,101,61,34,100,111,119,110,49,54,34,62,71,68,
67,111,114,101,68,105,97,108,111,103,115,95,100,105,97,108,111,103,115,
95,98,105,116,109,97,112,115,46,99,112,112,36,46,46,95,46,46,95,46,46,95,
46,46,95,66,105,110,97,114,105,101,115,95,79,117,116,112,117,116,95,82,
101,108,101,97,115,101,95,87,105,110,100,111,119,115,95,114,101,115,95,
105,99,111,110,115,95,100,101,102,97,117,108,116,95,100,111,119,110,49,
54,46,112,110,103,60,47,111,98,106,101,99,116,62,10,32,32,60,111,98,106,
101,99,116,32,99,108,97,115,115,61,34,119,120,66,105,116,109,97,112,34,
32,110,97,109,101,61,34,104,101,108,112,49,54,34,62,71,68,67,111,114,101,
47,119,120,120,114,99,34,62,10,32,32,60,33,45,45,32,72,97,110,100,108,101,
114,32,71,101,110,101,114,97,116,105,111,110,32,105,115,32,79,78,32,45,
45,62,10,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,
120,66,105,116,109,97,112,34,32,110,97,109,101,61,34,97,100,100,49,54,34,
62,71,68,67,111,114,101,68,105,97,108,111,103,115,95,100,105,97,108,111,
103,115,95,98,105,116,109,97,112,115,46,99,112,112,36,46,46,95,46,46,95,
46,46,95,46,46,95,66,105,110,97,114,105,101,115,95,79,117,116,112,117,116,
95,82,101,108,101,97,115,101,95,87,105,110,100,111,119,115,95,114,101,115,
95,105,99,111,110,115,95,100,101,102,97,117,108,116,95,97,100,100,49,54,
46,112,110,103,60,47,111,98,106,101,99,116,62,10,32,32,60,111,98,106,101,
99,116,32,99,108,97,115,115,61,34,119,120,66,105,116,109,97,112,34,32,110,
97,109,101,61,34,100,101,108,101,116,101,49,54,34,62,71,68,67,111,114,101,
68,105,97,108,111,103,115,95,100,105,97,108,111,103,115,95,98,105,116,109,
97,112,115,46,99,112,112,36,46,46,95,46,46,95,46,46,95,46,46,95,66,105,
110,97,114,105,101,115,95,79,117,116,112,117,116,95,82,101,108,101,97,115,
101,95,87,105,110,100,111,119,115,95,114,101,115,95,105,99,111,110,115,
95,100,101,102,97,117,108,116,95,104,101,108,112,49,54,46,112,110,103,60,
47,111,98,106,101,99,116,62,10,32,32,60,111,98,106,101,99,116,32,99,108,
97,115,115,61,34,119,120,66,105,116,109,97,112,34,32,110,97,109,101,61,
34,112,114,111,112,101,114,116,105,101,115,49,54,34,62,71,68,67,111,114,
101,68,105,97,108,111,103,115,95,100,105,97,108,111,103,115,95,98,105,116,
109,97,112,115,46,99,112,112,36,46,46,95,46,46,95,46,46,95,46,46,95,66,
105,110,97,114,105,101,115,95,79,117,116,112,117,116,95,82,101,108,101,
97,115,101,95,87,105,110,100,111,119,115,95,114,101,115,95,105,99,111,110,
115,95,100,101,102,97,117,108,116,95,112,114,111,112,101,114,116,105,101,
115,49,54,46,112,110,103,60,47,111,98,106,101,99,116,62,10,32,32,60,111,
98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,105,116,109,97,
112,34,32,110,97,109,101,61,34,114,101,102,114,101,115,104,105,99,111,110,
34,62,71,68,67,111,114,101,68,105,97,108,111,103,115,95,100,105,97,108,
111,103,115,95,98,105,116,109,97,112,115,46,99,112,112,36,46,46,95,46,46,
95,46,46,95,46,46,95,66,105,110,97,114,105,101,115,95,79,117,116,112,117,
116,95,82,101,108,101,97,115,101,95,87,105,110,100,111,119,115,95,114,101,
115,95,114,101,102,114,101,115,104,105,99,111,110,46,112,110,103,60,47,
111,98,106,101,99,116,62,10,32,32,60,111,98,106,101,99,116,32,99,108,97,
115,115,61,34,119,120,66,105,116,109,97,112,34,32,110,97,109,101,61,34,
117,112,49,54,34,62,71,68,67,111,114,101,68,105,97,108,111,103,115,95,100,
95,100,101,102,97,117,108,116,95,100,101,108,101,116,101,49,54,46,112,110,
103,60,47,111,98,106,101,99,116,62,10,32,32,60,111,98,106,101,99,116,32,
99,108,97,115,115,61,34,119,120,66,105,116,109,97,112,34,32,110,97,109,
101,61,34,100,111,119,110,49,54,34,62,71,68,67,111,114,101,68,105,97,108,
111,103,115,95,100,105,97,108,111,103,115,95,98,105,116,109,97,112,115,
46,99,112,112,36,46,46,95,46,46,95,46,46,95,46,46,95,66,105,110,97,114,
105,101,115,95,79,117,116,112,117,116,95,82,101,108,101,97,115,101,95,87,
105,110,100,111,119,115,95,114,101,115,95,105,99,111,110,115,95,100,101,
102,97,117,108,116,95,100,111,119,110,49,54,46,112,110,103,60,47,111,98,
106,101,99,116,62,10,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,
61,34,119,120,66,105,116,109,97,112,34,32,110,97,109,101,61,34,104,101,
108,112,49,54,34,62,71,68,67,111,114,101,68,105,97,108,111,103,115,95,100,
105,97,108,111,103,115,95,98,105,116,109,97,112,115,46,99,112,112,36,46,
46,95,46,46,95,46,46,95,46,46,95,66,105,110,97,114,105,101,115,95,79,117,
116,112,117,116,95,82,101,108,101,97,115,101,95,87,105,110,100,111,119,
115,95,114,101,115,95,105,99,111,110,115,95,100,101,102,97,117,108,116,
95,117,112,49,54,46,112,110,103,60,47,111,98,106,101,99,116,62,10,60,47,
114,101,115,111,117,114,99,101,62,10};
95,104,101,108,112,49,54,46,112,110,103,60,47,111,98,106,101,99,116,62,
10,32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,
105,116,109,97,112,34,32,110,97,109,101,61,34,112,114,111,112,101,114,116,
105,101,115,49,54,34,62,71,68,67,111,114,101,68,105,97,108,111,103,115,
95,100,105,97,108,111,103,115,95,98,105,116,109,97,112,115,46,99,112,112,
36,46,46,95,46,46,95,46,46,95,46,46,95,66,105,110,97,114,105,101,115,95,
79,117,116,112,117,116,95,82,101,108,101,97,115,101,95,87,105,110,100,111,
119,115,95,114,101,115,95,105,99,111,110,115,95,100,101,102,97,117,108,
116,95,112,114,111,112,101,114,116,105,101,115,49,54,46,112,110,103,60,
47,111,98,106,101,99,116,62,10,32,32,60,111,98,106,101,99,116,32,99,108,
97,115,115,61,34,119,120,66,105,116,109,97,112,34,32,110,97,109,101,61,
34,114,101,102,114,101,115,104,105,99,111,110,34,62,71,68,67,111,114,101,
68,105,97,108,111,103,115,95,100,105,97,108,111,103,115,95,98,105,116,109,
97,112,115,46,99,112,112,36,46,46,95,46,46,95,46,46,95,46,46,95,66,105,
110,97,114,105,101,115,95,79,117,116,112,117,116,95,82,101,108,101,97,115,
101,95,87,105,110,100,111,119,115,95,114,101,115,95,114,101,102,114,101,
115,104,105,99,111,110,46,112,110,103,60,47,111,98,106,101,99,116,62,10,
32,32,60,111,98,106,101,99,116,32,99,108,97,115,115,61,34,119,120,66,105,
116,109,97,112,34,32,110,97,109,101,61,34,117,112,49,54,34,62,71,68,67,
111,114,101,68,105,97,108,111,103,115,95,100,105,97,108,111,103,115,95,
98,105,116,109,97,112,115,46,99,112,112,36,46,46,95,46,46,95,46,46,95,46,
46,95,66,105,110,97,114,105,101,115,95,79,117,116,112,117,116,95,82,101,
108,101,97,115,101,95,87,105,110,100,111,119,115,95,114,101,115,95,105,
99,111,110,115,95,100,101,102,97,117,108,116,95,117,112,49,54,46,112,110,
103,60,47,111,98,106,101,99,116,62,10,60,47,114,101,115,111,117,114,99,
101,62,10};
void wxC629BInitBitmapResources()
{
@@ -256,6 +258,6 @@ void wxC629BInitBitmapResources()
XRC_ADD_FILE(wxT("XRC_resource/GDCoreDialogs_dialogs_bitmaps.cpp$.._.._.._.._Binaries_Output_Release_Windows_res_icons_default_properties16.png"), xml_res_file_4, xml_res_size_4, wxT("image/png"));
XRC_ADD_FILE(wxT("XRC_resource/GDCoreDialogs_dialogs_bitmaps.cpp$.._.._.._.._Binaries_Output_Release_Windows_res_refreshicon.png"), xml_res_file_5, xml_res_size_5, wxT("image/png"));
XRC_ADD_FILE(wxT("XRC_resource/GDCoreDialogs_dialogs_bitmaps.cpp$.._.._.._.._Binaries_Output_Release_Windows_res_icons_default_up16.png"), xml_res_file_6, xml_res_size_6, wxT("image/png"));
XRC_ADD_FILE(wxT("XRC_resource/GDCoreDialogs_dialogs_bitmaps.cpp$_Users_florian_Projects_F_GD_Core_GDCore_IDE_Dialogs_GDCoreDialogs_dialogs_bitmaps.xrc"), xml_res_file_7, xml_res_size_7, wxT("text/xml"));
wxXmlResource::Get()->Load(wxT("memory:XRC_resource/GDCoreDialogs_dialogs_bitmaps.cpp$_Users_florian_Projects_F_GD_Core_GDCore_IDE_Dialogs_GDCoreDialogs_dialogs_bitmaps.xrc"));
XRC_ADD_FILE(wxT("XRC_resource/GDCoreDialogs_dialogs_bitmaps.cpp$E__Developpement_GD_Core_GDCore_IDE_Dialogs_GDCoreDialogs_dialogs_bitmaps.xrc"), xml_res_file_7, xml_res_size_7, wxT("text/xml"));
wxXmlResource::Get()->Load(wxT("memory:XRC_resource/GDCoreDialogs_dialogs_bitmaps.cpp$E__Developpement_GD_Core_GDCore_IDE_Dialogs_GDCoreDialogs_dialogs_bitmaps.xrc"));
}

View File

@@ -1,10 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resource xmlns="http://www.wxwidgets.org/wxxrc">
<object class="wxBitmap" name="add16">../../../../Binaries/Output/Release_Windows/res/icons_default/add16.png</object>
<object class="wxBitmap" name="delete16">../../../../Binaries/Output/Release_Windows/res/icons_default/delete16.png</object>
<object class="wxBitmap" name="down16">../../../../Binaries/Output/Release_Windows/res/icons_default/down16.png</object>
<object class="wxBitmap" name="help16">../../../../Binaries/Output/Release_Windows/res/icons_default/help16.png</object>
<object class="wxBitmap" name="properties16">../../../../Binaries/Output/Release_Windows/res/icons_default/properties16.png</object>
<object class="wxBitmap" name="refreshicon">../../../../Binaries/Output/Release_Windows/res/refreshicon.png</object>
<object class="wxBitmap" name="up16">../../../../Binaries/Output/Release_Windows/res/icons_default/up16.png</object>
<!-- Handler Generation is ON -->
<object class="wxBitmap" name="add16">..\..\..\..\Binaries\Output\Release_Windows\res\icons_default\add16.png</object>
<object class="wxBitmap" name="delete16">..\..\..\..\Binaries\Output\Release_Windows\res\icons_default\delete16.png</object>
<object class="wxBitmap" name="down16">..\..\..\..\Binaries\Output\Release_Windows\res\icons_default\down16.png</object>
<object class="wxBitmap" name="help16">..\..\..\..\Binaries\Output\Release_Windows\res\icons_default\help16.png</object>
<object class="wxBitmap" name="properties16">..\..\..\..\Binaries\Output\Release_Windows\res\icons_default\properties16.png</object>
<object class="wxBitmap" name="refreshicon">..\..\..\..\Binaries\Output\Release_Windows\res\refreshicon.png</object>
<object class="wxBitmap" name="up16">..\..\..\..\Binaries\Output\Release_Windows\res\icons_default\up16.png</object>
</resource>

View File

@@ -884,9 +884,8 @@ public:
InstancesInAreaPicker(const LayoutEditorCanvas & editor_) : editor(editor_), ignoreLockedInstances(false) {};
virtual ~InstancesInAreaPicker() {};
virtual void operator()(gd::InitialInstance * instancePtr)
virtual void operator()(gd::InitialInstance & instance)
{
gd::InitialInstance & instance = *instancePtr;
if ( ignoreLockedInstances && instance.IsLocked() ) return;
if ( excludedLayers.find(instance.GetLayer()) != excludedLayers.end() ) return;
@@ -1292,9 +1291,8 @@ public:
};
virtual ~SmallestInstanceUnderCursorPicker() {};
virtual void operator()(gd::InitialInstance * instancePtr)
virtual void operator()(gd::InitialInstance & instance)
{
gd::InitialInstance & instance = *instancePtr;
if ( pickLockedOnly != instance.IsLocked() ) return;
if ( excludedLayers.find(instance.GetLayer()) != excludedLayers.end() ) return;

View File

@@ -31,6 +31,10 @@
#include "GDCore/Project/InitialInstancesContainer.h"
#include "GDCore/Project/Object.h"
#include "GDCore/CommonTools.h"
#include "GDCore/Tools/OpenGLTools.h"
#if !defined(ANDROID) && !defined(MACOS)
#include <GL/glu.h>
#endif
using namespace std;
@@ -181,9 +185,8 @@ public:
{};
virtual ~InstancesRenderer() {};
virtual void operator()(gd::InitialInstance * instancePtr)
virtual void operator()(gd::InitialInstance & instance)
{
gd::InitialInstance & instance = *instancePtr;
gd::Object * associatedObject = editor.GetObjectLinkedToInitialInstance(instance);
if ( !associatedObject ) return;
@@ -262,7 +265,7 @@ void LayoutEditorCanvas::RenderEdittime()
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(layout.GetOpenGLFOV(), static_cast<double>(getSize().x)/static_cast<double>(getSize().y), layout.GetOpenGLZNear(), layout.GetOpenGLZFar());
OpenGLTools::PerspectiveGL(layout.GetOpenGLFOV(), static_cast<double>(getSize().x)/static_cast<double>(getSize().y), layout.GetOpenGLZNear(), layout.GetOpenGLZFar());
glViewport(0,0, getSize().x, getSize().y);

View File

@@ -0,0 +1,155 @@
#if defined(GD_IDE_ONLY) && !defined(GD_NO_WX_GUI)
#include "LinkEventEditor.h"
#include <set>
#include <sstream>
#include "GDCore/IDE/wxTools/SkinHelper.h"
#include "GDCore/Tools/HelpFileAccess.h"
#include "GDCore/Events/Builtin/GroupEvent.h"
#include "GDCore/Events/Builtin/LinkEvent.h"
#include "GDCore/Project/ExternalEvents.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/CommonTools.h"
#include <wx/help.h>
namespace gd
{
LinkEventEditor::LinkEventEditor(wxWindow* parent, LinkEvent & event, const gd::Project & project)
: LinkEventEditorBase(parent),
editedEvent(event),
project(project)
{
//Add all the scenes and external events into the combobox.
for ( std::size_t i = 0; i < project.GetExternalEventsCount(); ++i )
m_eventsComboBox->Append( project.GetExternalEvents(i).GetName() );
for ( std::size_t i = 0; i < project.GetLayoutsCount(); ++i )
m_eventsComboBox->Append( project.GetLayout(i).GetName() );
m_includeAllEventsRadio->SetValue( editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_ALL );
m_includeEventsGroupRadio->SetValue( editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_EVENTS_GROUP );
m_includeEventsByIndexRadio->SetValue( editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_BY_INDEX );
m_eventsComboBox->SetValue( editedEvent.GetTarget() );
if ( editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_EVENTS_GROUP )
{
m_eventsGroupComboBox->SetValue( editedEvent.GetEventsGroupName() );
}
else if ( editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_BY_INDEX )
{
m_startTextCtrl->SetValue( gd::String::From<std::size_t>( editedEvent.GetIncludeStart() + 1 ) );
m_endTextCtrl->SetValue( gd::String::From<std::size_t>( editedEvent.GetIncludeEnd() + 1 ) );
}
//Display the deprecated features if the event was using them
m_includeEventsByIndexRadio->Show( editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_BY_INDEX );
m_deprecatedPanel->Show( editedEvent.GetIncludeConfig() == LinkEvent::INCLUDE_BY_INDEX );
GetSizer()->Fit(this);
EnableControls();
UpdateEventsGroupsList();
}
LinkEventEditor::~LinkEventEditor()
{
}
void LinkEventEditor::OnCancelButtonClicked(wxCommandEvent& event)
{
EndModal(0);
}
void LinkEventEditor::OnOkButtonClicked(wxCommandEvent& event)
{
editedEvent.SetTarget( m_eventsComboBox->GetValue() );
if ( m_includeAllEventsRadio->GetValue() )
{
editedEvent.SetIncludeAllEvents();
}
else if ( m_includeEventsGroupRadio->GetValue() )
{
editedEvent.SetIncludeEventsGroup( m_eventsGroupComboBox->GetValue() );
}
else if ( m_includeEventsByIndexRadio->GetValue() )
{
editedEvent.SetIncludeStartAndEnd(
gd::String( m_startTextCtrl->GetValue() ).To<std::size_t>() - 1,
gd::String( m_endTextCtrl->GetValue() ).To<std::size_t>() - 1
);
}
EndModal(1);
}
void LinkEventEditor::OnEventsComboBoxTextChanged(wxCommandEvent& event)
{
UpdateEventsGroupsList();
}
void LinkEventEditor::OnEventsGroupComboBoxTextChanged(wxCommandEvent& event)
{
}
void LinkEventEditor::OnIncludeEventsGroupRadioButtonClicked(wxCommandEvent& event)
{
EnableControls();
}
void LinkEventEditor::OnIncludeAllEventsRadioButtonClicked(wxCommandEvent& event)
{
EnableControls();
}
void LinkEventEditor::OnIncludeByIndexRadioButtonClicked(wxCommandEvent& event)
{
EnableControls();
}
void LinkEventEditor::EnableControls()
{
m_eventsGroupComboBox->Enable(m_includeEventsGroupRadio->GetValue());
m_startTextCtrl->Enable(m_includeEventsByIndexRadio->GetValue());
m_endTextCtrl->Enable(m_includeEventsByIndexRadio->GetValue());
}
void LinkEventEditor::UpdateEventsGroupsList()
{
wxString oldText = m_eventsGroupComboBox->GetValue();
m_eventsGroupComboBox->Clear();
m_eventsGroupsNames->Show(false);
GetSizer()->Fit(this);
const EventsList * events = nullptr;
if ( project.HasExternalEventsNamed(m_eventsComboBox->GetValue()) )
events = &project.GetExternalEvents(m_eventsComboBox->GetValue()).GetEvents();
else if ( project.HasLayoutNamed(m_eventsComboBox->GetValue()) )
events = &project.GetLayout(m_eventsComboBox->GetValue()).GetEvents();
else
return;
std::set<gd::String> groupsNames;
bool displayNameWarning = false;
for( std::size_t i = 0 ; i < events->GetEventsCount(); ++i )
{
std::shared_ptr<const GroupEvent> groupEvent = std::dynamic_pointer_cast<const GroupEvent>(events->GetEventSmartPtr(i));
if( groupEvent && !groupsNames.insert( groupEvent->GetName() ).second ) //Insert the name in the list. If already in, display the warning label.
displayNameWarning = true;
}
for(auto &groupName : groupsNames)
m_eventsGroupComboBox->Append( groupName );
m_eventsGroupsNames->Show(displayNameWarning);
m_eventsGroupComboBox->SetValue(oldText);
GetSizer()->Fit(this);
}
}
#endif

View File

@@ -0,0 +1,40 @@
#if defined(GD_IDE_ONLY) && !defined(GD_NO_WX_GUI)
#ifndef LINKEVENTEDITOR_H
#define LINKEVENTEDITOR_H
#include "GDCoreDialogs.h"
#include "GDCore/Events/Builtin/LinkEvent.h"
namespace gd { class Project; }
namespace gd
{
class LinkEventEditor : public LinkEventEditorBase
{
public:
LinkEventEditor(wxWindow* parent, LinkEvent & event, const gd::Project & project);
virtual ~LinkEventEditor();
protected:
virtual void OnIncludeByIndexRadioButtonClicked(wxCommandEvent& event);
virtual void OnIncludeAllEventsRadioButtonClicked(wxCommandEvent& event);
virtual void OnCancelButtonClicked(wxCommandEvent& event);
virtual void OnEventsComboBoxTextChanged(wxCommandEvent& event);
virtual void OnEventsGroupComboBoxTextChanged(wxCommandEvent& event);
virtual void OnIncludeEventsGroupRadioButtonClicked(wxCommandEvent& event);
virtual void OnOkButtonClicked(wxCommandEvent& event);
private:
void EnableControls();
void UpdateEventsGroupsList();
LinkEvent & editedEvent;
const gd::Project & project;
};
}
#endif // LINKEVENTEDITOR_H
#endif

View File

@@ -33,7 +33,7 @@ namespace gd
*
* \ingroup IDEdialogs
*/
class ObjectsOnBadLayerDialog: public wxDialog
class GD_CORE_API ObjectsOnBadLayerDialog: public wxDialog
{
public:

View File

@@ -578,8 +578,8 @@ void FlatAuiTabArt::DrawTab(wxDC& dc,
dc.DrawLine(border_points[0].x+1,
border_points[0].y,
border_points[5].x,
border_points[5].y);
border_points[3].x,
border_points[3].y);
}

View File

@@ -112,9 +112,10 @@ void ClassWithObjects::SwapObjects(std::size_t firstObjectIndex, std::size_t sec
if ( firstObjectIndex >= initialObjects.size() || secondObjectIndex >= initialObjects.size() )
return;
std::shared_ptr<gd::Object> temp = initialObjects[firstObjectIndex];
initialObjects[firstObjectIndex] = initialObjects[secondObjectIndex];
initialObjects[secondObjectIndex] = temp;
std::iter_swap(
initialObjects.begin() + firstObjectIndex,
initialObjects.begin() + secondObjectIndex
);
}
void ClassWithObjects::RemoveObject(const gd::String & name)

View File

@@ -31,6 +31,11 @@ public:
virtual ~ExternalEvents() {};
ExternalEvents& operator=(const ExternalEvents & rhs);
/**
* \brief Return a pointer to a new ExternalEvents constructed from this one.
*/
ExternalEvents * Clone() const { return new ExternalEvents(*this); };
/**
* \brief Get external events name
*/
@@ -105,8 +110,8 @@ private:
/**
* \brief Functor testing ExternalEvents' name
*/
struct ExternalEventsHasName : public std::binary_function<std::shared_ptr<gd::ExternalEvents>, gd::String, bool> {
bool operator()(const std::shared_ptr<gd::ExternalEvents> & externalEvents, gd::String name) const { return externalEvents->GetName() == name; }
struct ExternalEventsHasName : public std::binary_function<std::unique_ptr<gd::ExternalEvents>, gd::String, bool> {
bool operator()(const std::unique_ptr<gd::ExternalEvents> & externalEvents, gd::String name) const { return externalEvents->GetName() == name; }
};
}

View File

@@ -102,8 +102,8 @@ private:
/**
* \brief Functor testing ExternalLayout' name
*/
struct ExternalLayoutHasName : public std::binary_function<std::shared_ptr<gd::ExternalLayout>, gd::String, bool> {
bool operator()(const std::shared_ptr<gd::ExternalLayout> & externalLayout, gd::String name) const { return externalLayout->GetName() == name; }
struct ExternalLayoutHasName : public std::binary_function<std::unique_ptr<gd::ExternalLayout>, gd::String, bool> {
bool operator()(const std::unique_ptr<gd::ExternalLayout> & externalLayout, gd::String name) const { return externalLayout->GetName() == name; }
};
}

View File

@@ -8,6 +8,10 @@
#include "GDCore/Project/ResourcesLoader.h"
#include "GDCore/Tools/InvalidImage.h"
#include "GDCore/Project/ResourcesManager.h"
#include <SFML/OpenGL.hpp>
#if !defined(ANDROID) && !defined(MACOS)
#include <GL/glu.h>
#endif
#undef LoadImage //thx windows.h
namespace gd
@@ -42,7 +46,9 @@ std::shared_ptr<SFMLTextureWrapper> ImageManager::GetSFMLTexture(const gd::Strin
{
ImageResource & image = dynamic_cast<ImageResource&>(resourcesManager->GetResource(name));
std::shared_ptr<SFMLTextureWrapper> texture(new SFMLTextureWrapper(ResourcesLoader::Get()->LoadSFMLTexture( image.GetFile() )));
auto texture = std::make_shared<SFMLTextureWrapper>();
ResourcesLoader::Get()->LoadSFMLImage( image.GetFile(), texture->image );
texture->texture.loadFromImage(texture->image);
texture->texture.setSmooth(image.smooth);
alreadyLoadedImages[name] = texture;
@@ -98,9 +104,9 @@ void ImageManager::ReloadImage(const gd::String & name) const
std::cout << "ImageManager: Reload " << name << std::endl;
oldTexture->texture = ResourcesLoader::Get()->LoadSFMLTexture( image.GetFile() );
ResourcesLoader::Get()->LoadSFMLImage( image.GetFile(), oldTexture->image );
oldTexture->texture.loadFromImage(oldTexture->image);
oldTexture->texture.setSmooth(image.smooth);
oldTexture->image = oldTexture->texture.copyToImage();
return;
}
@@ -192,7 +198,8 @@ OpenGLTextureWrapper::OpenGLTextureWrapper(std::shared_ptr<SFMLTextureWrapper> s
#if !defined(ANDROID) //TODO: OpenGL
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, sfmlTexture->image.getSize().x, sfmlTexture->image.getSize().y, GL_RGBA, GL_UNSIGNED_BYTE, sfmlTexture->image.getPixelsPtr());
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sfmlTexture->image.getSize().x, sfmlTexture->image.getSize().y, 0, GL_RGBA, GL_UNSIGNED_BYTE, sfmlTexture->image.getPixelsPtr());
// glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
#endif

View File

@@ -3,9 +3,10 @@
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved.
* This project is released under the MIT License.
*/
#include <iostream>
#include <algorithm>
#include <iostream>
#include <map>
#include "GDCore/Project/InitialInstancesContainer.h"
#include "GDCore/Project/InitialInstance.h"
#include "GDCore/Serialization/SerializerElement.h"
@@ -74,36 +75,26 @@ void InitialInstancesContainer::UnserializeFrom(const SerializerElement & elemen
void InitialInstancesContainer::IterateOverInstances(gd::InitialInstanceFunctor & func)
{
for (std::list<gd::InitialInstance>::iterator it = initialInstances.begin(), end = initialInstances.end(); it != end; ++it)
func(&(*it));
}
namespace
{
struct InstancesZOrderSort
{
bool operator ()(gd::InitialInstance * a, gd::InitialInstance * b) const
{
return a->GetZOrder() < b->GetZOrder();
}
};
for(auto& instance : initialInstances)
func(instance);
}
void InitialInstancesContainer::IterateOverInstancesWithZOrdering(gd::InitialInstanceFunctor & func, const gd::String & layerName)
{
std::vector<gd::InitialInstance*> sortedInstances;
sortedInstances.reserve(initialInstances.size());
for (std::list<gd::InitialInstance>::iterator it = initialInstances.begin(), end = initialInstances.end(); it != end; ++it)
{
if (it->GetLayer() == layerName )
sortedInstances.push_back(&(*it));
}
std::vector<std::reference_wrapper<gd::InitialInstance>> sortedInstances;
std::copy_if(
initialInstances.begin(),
initialInstances.end(),
std::inserter(sortedInstances, sortedInstances.begin()),
[&layerName](InitialInstance & instance) { return instance.GetLayer() == layerName; });
std::sort(sortedInstances.begin(), sortedInstances.end(), gd::InstancesZOrderSort());
for (std::size_t i = 0;i<sortedInstances.size();++i)
func(sortedInstances[i]);
std::sort(
sortedInstances.begin(),
sortedInstances.end(),
[](gd::InitialInstance & a, gd::InitialInstance & b) { return a.GetZOrder() < b.GetZOrder(); });
for(auto& instance : sortedInstances)
func(instance);
}
#if defined(GD_IDE_ONLY)
@@ -115,17 +106,27 @@ gd::InitialInstance & InitialInstancesContainer::InsertNewInitialInstance()
return initialInstances.back();
}
void InitialInstancesContainer::RemoveInstance(const gd::InitialInstance & instance)
void InitialInstancesContainer::RemoveInstanceIf(std::function<bool(const gd::InitialInstance &)> predicat)
{
// Note that we can't use eraseremove idiom here because remove_if would
// move the instances, and the container must guarantee that iterators/pointers
// to instances always remain valid.
for (std::list<gd::InitialInstance>::iterator it = initialInstances.begin(), end = initialInstances.end(); it != end;)
{
if ( &(*it) == &instance )
if (predicat(*it))
it = initialInstances.erase(it);
else
++it;
}
}
void InitialInstancesContainer::RemoveInstance(const gd::InitialInstance & instance)
{
RemoveInstanceIf([&instance](const InitialInstance & currentInstance) {
return &instance == &currentInstance;
});
}
gd::InitialInstance & InitialInstancesContainer::InsertInitialInstance(const gd::InitialInstance & instance)
{
try
@@ -142,52 +143,43 @@ gd::InitialInstance & InitialInstancesContainer::InsertInitialInstance(const gd:
void InitialInstancesContainer::RenameInstancesOfObject(const gd::String & oldName, const gd::String & newName)
{
for (std::list<gd::InitialInstance>::iterator it = initialInstances.begin(), end = initialInstances.end(); it != end; ++it)
for (gd::InitialInstance & instance : initialInstances)
{
if ( (*it).GetObjectName() == oldName )
(*it).SetObjectName(newName);
if ( instance.GetObjectName() == oldName )
instance.SetObjectName(newName);
}
}
void InitialInstancesContainer::RemoveInitialInstancesOfObject(const gd::String & objectName)
{
for (std::list<gd::InitialInstance>::iterator it = initialInstances.begin(), end = initialInstances.end(); it != end;)
{
if ( (*it).GetObjectName() == objectName )
it = initialInstances.erase(it);
else
++it;
}
RemoveInstanceIf([&objectName](const InitialInstance & currentInstance) {
return currentInstance.GetObjectName() == objectName;
});
}
void InitialInstancesContainer::RemoveAllInstancesOnLayer(const gd::String & layerName)
{
for (std::list<gd::InitialInstance>::iterator it = initialInstances.begin(), end = initialInstances.end(); it != end;)
{
if ( (*it).GetLayer() == layerName )
it = initialInstances.erase(it);
else
++it;
}
RemoveInstanceIf([&layerName](const InitialInstance & currentInstance) {
return currentInstance.GetLayer() == layerName;
});
}
void InitialInstancesContainer::MoveInstancesToLayer(const gd::String & fromLayer, const gd::String & toLayer)
{
for (std::list<gd::InitialInstance>::iterator it = initialInstances.begin(), end = initialInstances.end(); it != end; ++it)
for (gd::InitialInstance & instance : initialInstances)
{
if ( (*it).GetLayer() == fromLayer )
(*it).SetLayer(toLayer);
if ( instance.GetLayer() == fromLayer )
instance.SetLayer(toLayer);
}
}
bool InitialInstancesContainer::SomeInstancesAreOnLayer(const gd::String & layerName)
{
for (std::list<gd::InitialInstance>::iterator it = initialInstances.begin(), end = initialInstances.end(); it != end; ++it)
{
if ( (*it).GetLayer() == layerName )
return true;
}
return false;
return std::any_of(
initialInstances.begin(),
initialInstances.end(),
[&layerName](const InitialInstance & currentInstance) { return currentInstance.GetLayer() == layerName; }
);
}
void InitialInstancesContainer::Create(const InitialInstancesContainer & source)
@@ -245,9 +237,8 @@ InitialInstanceFunctor::~InitialInstanceFunctor()
};
void HighestZOrderFinder::operator()(gd::InitialInstance * instancePtr)
void HighestZOrderFinder::operator()(gd::InitialInstance & instance)
{
gd::InitialInstance & instance = *instancePtr;
if ( !layerRestricted || instance.GetLayer() == layerName)
{
if ( firstCall )

View File

@@ -21,8 +21,8 @@ namespace gd
*
* The container is notably able to ensure that pointers
* to the elements of the container are not invalidated when
* a change occurs ( through InsertNewInitialInstance or RemoveInstance
* for example ). <br>
* a change occurs (through InsertNewInitialInstance or RemoveInstance
* for example). <br>
* Thus, the implementations uses a std::list
* for holding the instances. In this way, the container is not required
* to provide a direct access to element based on an index. Instead,
@@ -155,6 +155,8 @@ public:
///@}
private:
void RemoveInstanceIf(std::function<bool(const gd::InitialInstance &)> predicat);
std::list<gd::InitialInstance> initialInstances;
static gd::InitialInstance badPosition;
@@ -172,7 +174,7 @@ public:
InitialInstanceFunctor() {};
virtual ~InitialInstanceFunctor();
virtual void operator()(InitialInstance * instance) = 0;
virtual void operator()(InitialInstance & instance) = 0;
};
/** \brief Tool class picking returning the highest Z order of instances on a layer.
@@ -186,7 +188,7 @@ public:
HighestZOrderFinder() : highestZOrder(0), lowestZOrder(0), firstCall(true), layerRestricted(false) {};
virtual ~HighestZOrderFinder() {};
virtual void operator()(gd::InitialInstance * instance);
virtual void operator()(gd::InitialInstance & instance);
/**
* \brief Restrict to instances on the specified layer.

View File

@@ -148,9 +148,10 @@ void Layout::SwapLayers(std::size_t firstLayerIndex, std::size_t secondLayerInde
if ( firstLayerIndex >= initialLayers.size() || secondLayerIndex >= initialLayers.size() )
return;
gd::Layer temp = initialLayers[firstLayerIndex];
initialLayers[firstLayerIndex] = initialLayers[secondLayerIndex];
initialLayers[secondLayerIndex] = temp;
std::iter_swap(
initialLayers.begin() + firstLayerIndex,
initialLayers.begin() + secondLayerIndex
);
}
void Layout::UpdateBehaviorsSharedData(gd::Project & project)

View File

@@ -457,8 +457,8 @@ private:
* \brief Functor testing layout name.
* \see gd::Layout
*/
struct LayoutHasName : public std::binary_function<std::shared_ptr<Layout>, gd::String, bool> {
bool operator()(const std::shared_ptr<Layout> & layout, gd::String name) const { return layout->GetName() == name; }
struct LayoutHasName : public std::binary_function<std::unique_ptr<Layout>, gd::String, bool> {
bool operator()(const std::unique_ptr<Layout> & layout, gd::String name) const { return layout->GetName() == name; }
};
/**

View File

@@ -37,6 +37,7 @@
#include "GDCore/Tools/VersionWrapper.h"
#include "GDCore/Tools/Log.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Tools/PolymorphicClone.h"
#include "GDCore/Serialization/Serializer.h"
#include "GDCore/Serialization/Splitter.h"
#include "Project.h"
@@ -254,47 +255,45 @@ void Project::SwapLayouts(std::size_t first, std::size_t second)
if ( first >= scenes.size() || second >= scenes.size() )
return;
std::shared_ptr<gd::Layout> firstItem = scenes[first];
std::shared_ptr<gd::Layout> secondItem = scenes[second];
scenes[first] = secondItem;
scenes[second] = firstItem;
std::iter_swap(
scenes.begin() + first,
scenes.begin() + second
);
}
#endif
gd::Layout & Project::InsertNewLayout(const gd::String & name, std::size_t position)
{
std::shared_ptr<gd::Layout> newScene = std::shared_ptr<gd::Layout>(new Layout);
if (position<scenes.size())
scenes.insert(scenes.begin()+position, newScene);
else
scenes.push_back(newScene);
gd::Layout & newlyInsertedLayout = *(*(scenes.emplace(
position < scenes.size() ? scenes.begin() + position : scenes.end(),
new Layout()
)));
newScene->SetName(name);
newlyInsertedLayout.SetName(name);
#if defined(GD_IDE_ONLY)
newScene->UpdateBehaviorsSharedData(*this);
newlyInsertedLayout.UpdateBehaviorsSharedData(*this);
#endif
return *newScene;
return newlyInsertedLayout;
}
gd::Layout & Project::InsertLayout(const gd::Layout & layout, std::size_t position)
{
std::shared_ptr<gd::Layout> newScene = std::shared_ptr<gd::Layout>(new Layout(layout));
if (position<scenes.size())
scenes.insert(scenes.begin()+position, newScene);
else
scenes.push_back(newScene);
gd::Layout & newlyInsertedLayout = *(*(scenes.emplace(
position < scenes.size() ? scenes.begin() + position : scenes.end(),
new Layout(layout)
)));
#if defined(GD_IDE_ONLY)
newScene->UpdateBehaviorsSharedData(*this);
newlyInsertedLayout.UpdateBehaviorsSharedData(*this);
#endif
return *newScene;
return newlyInsertedLayout;
}
void Project::RemoveLayout(const gd::String & name)
{
std::vector< std::shared_ptr<gd::Layout> >::iterator scene = find_if(scenes.begin(), scenes.end(), bind2nd(gd::LayoutHasName(), name));
std::vector< std::unique_ptr<gd::Layout> >::iterator scene = find_if(scenes.begin(), scenes.end(), bind2nd(gd::LayoutHasName(), name));
if ( scene == scenes.end() ) return;
scenes.erase(scene);
@@ -336,27 +335,29 @@ std::size_t Project::GetExternalEventsCount() const
gd::ExternalEvents & Project::InsertNewExternalEvents(const gd::String & name, std::size_t position)
{
std::shared_ptr<gd::ExternalEvents> newExternalEvents(new gd::ExternalEvents);
if (position<externalEvents.size())
externalEvents.insert(externalEvents.begin()+position, newExternalEvents);
else
externalEvents.push_back(newExternalEvents);
gd::ExternalEvents & newlyInsertedExternalEvents = *(*(externalEvents.emplace(
position < externalEvents.size() ? externalEvents.begin() + position : externalEvents.end(),
new gd::ExternalEvents()
)));
newExternalEvents->SetName(name);
return *newExternalEvents;
newlyInsertedExternalEvents.SetName(name);
return newlyInsertedExternalEvents;
}
void Project::InsertExternalEvents(const gd::ExternalEvents & events, std::size_t position)
gd::ExternalEvents & Project::InsertExternalEvents(const gd::ExternalEvents & events, std::size_t position)
{
if (position<externalEvents.size())
externalEvents.insert(externalEvents.begin()+position, std::shared_ptr<gd::ExternalEvents>(new gd::ExternalEvents(events)));
else
externalEvents.push_back(std::shared_ptr<gd::ExternalEvents>(new gd::ExternalEvents(events)));
gd::ExternalEvents & newlyInsertedExternalEvents = *(*(externalEvents.emplace(
position < externalEvents.size() ? externalEvents.begin() + position : externalEvents.end(),
new gd::ExternalEvents(events)
)));
return newlyInsertedExternalEvents;
}
void Project::RemoveExternalEvents(const gd::String & name)
{
std::vector< std::shared_ptr<gd::ExternalEvents> >::iterator events = find_if(externalEvents.begin(), externalEvents.end(), bind2nd(gd::ExternalEventsHasName(), name));
std::vector< std::unique_ptr<gd::ExternalEvents> >::iterator events = find_if(externalEvents.begin(), externalEvents.end(), bind2nd(gd::ExternalEventsHasName(), name));
if ( events == externalEvents.end() ) return;
externalEvents.erase(events);
@@ -367,10 +368,10 @@ void Project::SwapExternalEvents(std::size_t first, std::size_t second)
if ( first >= externalEvents.size() || second >= externalEvents.size() )
return;
std::shared_ptr<gd::ExternalEvents> firstItem = externalEvents[first];
std::shared_ptr<gd::ExternalEvents> secondItem = externalEvents[second];
externalEvents[first] = secondItem;
externalEvents[second] = firstItem;
std::iter_swap(
externalEvents.begin() + first,
externalEvents.begin() + second
);
}
void Project::SwapExternalLayouts(std::size_t first, std::size_t second)
@@ -378,10 +379,10 @@ void Project::SwapExternalLayouts(std::size_t first, std::size_t second)
if ( first >= externalLayouts.size() || second >= externalLayouts.size() )
return;
std::shared_ptr<gd::ExternalLayout> firstItem = externalLayouts[first];
std::shared_ptr<gd::ExternalLayout> secondItem = externalLayouts[second];
externalLayouts[first] = secondItem;
externalLayouts[second] = firstItem;
std::iter_swap(
externalLayouts.begin() + first,
externalLayouts.begin() + second
);
}
#endif
bool Project::HasExternalLayoutNamed(const gd::String & name) const
@@ -420,29 +421,28 @@ std::size_t Project::GetExternalLayoutsCount() const
gd::ExternalLayout & Project::InsertNewExternalLayout(const gd::String & name, std::size_t position)
{
std::shared_ptr<gd::ExternalLayout> newExternalLayout = std::shared_ptr<gd::ExternalLayout>(new gd::ExternalLayout);
if (position<externalLayouts.size())
externalLayouts.insert(externalLayouts.begin()+position, newExternalLayout);
else
externalLayouts.push_back(newExternalLayout);
gd::ExternalLayout & newlyInsertedExternalLayout = *(*(externalLayouts.emplace(
position < externalLayouts.size() ? externalLayouts.begin() + position : externalLayouts.end(),
new gd::ExternalLayout()
)));
newExternalLayout->SetName(name);
return *newExternalLayout;
newlyInsertedExternalLayout.SetName(name);
return newlyInsertedExternalLayout;
}
void Project::InsertExternalLayout(const gd::ExternalLayout & layout, std::size_t position)
gd::ExternalLayout & Project::InsertExternalLayout(const gd::ExternalLayout & layout, std::size_t position)
{
std::shared_ptr<gd::ExternalLayout> newLayout(new gd::ExternalLayout(layout));
gd::ExternalLayout & newlyInsertedExternalLayout = *(*(externalLayouts.emplace(
position < externalLayouts.size() ? externalLayouts.begin() + position : externalLayouts.end(),
new gd::ExternalLayout(layout)
)));
if (position<externalLayouts.size())
externalLayouts.insert(externalLayouts.begin()+position, newLayout);
else
externalLayouts.push_back(newLayout);
return newlyInsertedExternalLayout;
}
void Project::RemoveExternalLayout(const gd::String & name)
{
std::vector< std::shared_ptr<gd::ExternalLayout> >::iterator externalLayout = find_if(externalLayouts.begin(), externalLayouts.end(), bind2nd(gd::ExternalLayoutHasName(), name));
std::vector< std::unique_ptr<gd::ExternalLayout> >::iterator externalLayout = find_if(externalLayouts.begin(), externalLayouts.end(), bind2nd(gd::ExternalLayoutHasName(), name));
if ( externalLayout == externalLayouts.end() ) return;
externalLayouts.erase(externalLayout);
@@ -459,9 +459,8 @@ public:
{};
virtual ~SpriteObjectsPositionUpdater() {};
virtual void operator()(gd::InitialInstance * instancePtr)
virtual void operator()(gd::InitialInstance & instance)
{
gd::InitialInstance & instance = *instancePtr;
gd::Object * object = NULL;
if ( layout.HasObjectNamed(instance.GetObjectName()))
object = &layout.GetObject(instance.GetObjectName());
@@ -689,9 +688,8 @@ void Project::UnserializeFrom(const SerializerElement & element)
{
const SerializerElement & externalLayoutElement = externalLayoutsElement.GetChild(i);
std::shared_ptr<gd::ExternalLayout> newExternalLayout(new gd::ExternalLayout);
newExternalLayout->UnserializeFrom(externalLayoutElement);
externalLayouts.push_back(newExternalLayout);
gd::ExternalLayout & newExternalLayout = InsertNewExternalLayout("", GetExternalLayoutsCount());
newExternalLayout.UnserializeFrom(externalLayoutElement);
}
#if defined(GD_IDE_ONLY)
@@ -701,9 +699,8 @@ void Project::UnserializeFrom(const SerializerElement & element)
{
const SerializerElement & sourceFileElement = externalSourceFilesElement.GetChild(i);
std::shared_ptr<gd::SourceFile> newSourceFile(new gd::SourceFile);
newSourceFile->UnserializeFrom(sourceFileElement);
externalSourceFiles.push_back(newSourceFile);
gd::SourceFile & newSourceFile = InsertNewSourceFile("", "");
newSourceFile.UnserializeFrom(sourceFileElement);
}
#if !defined(GD_NO_WX_GUI)
@@ -844,7 +841,7 @@ void Project::ExposeResources(gd::ArbitraryResourceWorker & worker)
bool Project::HasSourceFile(gd::String name, gd::String language) const
{
vector< std::shared_ptr<SourceFile> >::const_iterator sourceFile =
vector< std::unique_ptr<SourceFile> >::const_iterator sourceFile =
find_if(externalSourceFiles.begin(), externalSourceFiles.end(),
bind2nd(gd::ExternalSourceFileHasName(), name));
@@ -866,7 +863,7 @@ const gd::SourceFile & Project::GetSourceFile(const gd::String & name) const
void Project::RemoveSourceFile(const gd::String & name)
{
std::vector< std::shared_ptr<gd::SourceFile> >::iterator sourceFile =
std::vector< std::unique_ptr<gd::SourceFile> >::iterator sourceFile =
find_if(externalSourceFiles.begin(), externalSourceFiles.end(), bind2nd(gd::ExternalSourceFileHasName(), name));
if ( sourceFile == externalSourceFiles.end() ) return;
@@ -878,16 +875,14 @@ gd::SourceFile & Project::InsertNewSourceFile(const gd::String & name, const gd:
if (HasSourceFile(name, language))
return GetSourceFile(name);
std::shared_ptr<SourceFile> newSourceFile(new SourceFile);
newSourceFile->SetLanguage(language);
newSourceFile->SetFileName(name);
gd::SourceFile & newlyInsertedSourceFile = *(*(externalSourceFiles.emplace(
position < externalSourceFiles.size() ? externalSourceFiles.begin() + position : externalSourceFiles.end(),
new SourceFile()
)));
newlyInsertedSourceFile.SetLanguage(language);
newlyInsertedSourceFile.SetFileName(name);
if (position<externalSourceFiles.size())
externalSourceFiles.insert(externalSourceFiles.begin()+position, newSourceFile);
else
externalSourceFiles.push_back(newSourceFile);
return *newSourceFile;
return newlyInsertedSourceFile;
}
#if !defined(GD_NO_WX_GUI)
@@ -1038,26 +1033,18 @@ void Project::Init(const gd::Project & game)
for (std::size_t i =0;i<game.GetObjects().size();++i)
GetObjects().push_back( std::shared_ptr<gd::Object>(game.GetObjects()[i]->Clone()) );
scenes.clear();
for (std::size_t i =0;i<game.scenes.size();++i)
scenes.push_back( std::shared_ptr<gd::Layout>(new gd::Layout(*game.scenes[i])) );
scenes = gd::Clone(game.scenes);
#if defined(GD_IDE_ONLY)
externalEvents.clear();
for (std::size_t i =0;i<game.externalEvents.size();++i)
externalEvents.push_back( std::shared_ptr<gd::ExternalEvents>(new gd::ExternalEvents(*game.externalEvents[i])) );
externalEvents = gd::Clone(game.externalEvents);
#endif
externalLayouts.clear();
for (std::size_t i =0;i<game.externalLayouts.size();++i)
externalLayouts.push_back( std::shared_ptr<gd::ExternalLayout>(new gd::ExternalLayout(*game.externalLayouts[i])) );
externalLayouts = gd::Clone(game.externalLayouts);
#if defined(GD_IDE_ONLY)
useExternalSourceFiles = game.useExternalSourceFiles;
externalSourceFiles.clear();
for (std::size_t i =0;i<game.externalSourceFiles.size();++i)
externalSourceFiles.push_back( std::shared_ptr<gd::SourceFile>(new gd::SourceFile(*game.externalSourceFiles[i])) );
externalSourceFiles = gd::Clone(game.externalSourceFiles);
#endif
variables = game.GetVariables();

View File

@@ -465,7 +465,7 @@ public:
* \param externalEvents The external events that must be copied and inserted into the project
* \param position Insertion position. Even if the position is invalid, the external events must be inserted at the end of the external events list.
*/
void InsertExternalEvents(const ExternalEvents & externalEvents, std::size_t position);
ExternalEvents & InsertExternalEvents(const ExternalEvents & externalEvents, std::size_t position);
/**
* Must delete external events named "name".
@@ -534,7 +534,7 @@ public:
* \param externalLayout The external layout that must be copied and inserted into the project
* \param position Insertion position. Even if the position is invalid, the external layout must be inserted at the end of the external layout list.
*/
void InsertExternalLayout(const ExternalLayout & externalLayout, std::size_t position);
gd::ExternalLayout & InsertExternalLayout(const ExternalLayout & externalLayout, std::size_t position);
/**
* Must delete external layout named "name".
@@ -664,7 +664,7 @@ public:
* \brief Return a const reference to the vector containing all the source files used by
* the game.
*/
const std::vector < std::shared_ptr<gd::SourceFile> > & GetAllSourceFiles() const { return externalSourceFiles; }
const std::vector < std::unique_ptr<gd::SourceFile> > & GetAllSourceFiles() const { return externalSourceFiles; }
/**
* \brief Return true if the source file with the specified name is used by the game.
@@ -723,9 +723,9 @@ private:
int maxFPS; ///< Maximum Frame Per Seconds, -1 for unlimited
unsigned int minFPS; ///< Minimum Frame Per Seconds ( slow down game if FPS are below this number )
bool verticalSync; ///< If true, must activate vertical synchronization.
std::vector < std::shared_ptr<gd::Layout> > scenes; ///< List of all scenes
std::vector < std::unique_ptr<gd::Layout> > scenes; ///< List of all scenes
gd::VariablesContainer variables; ///< Initial global variables
std::vector < std::shared_ptr<gd::ExternalLayout> > externalLayouts; ///< List of all externals layouts
std::vector < std::unique_ptr<gd::ExternalLayout> > externalLayouts; ///< List of all externals layouts
gd::ResourcesManager resourcesManager; ///< Contains all resources used by the project
std::shared_ptr<gd::ImageManager> imageManager;///< Image manager is accessed thanks to a (smart) ptr as it can be shared with GD C++ Platform projects.
std::vector < gd::String > extensionsUsed; ///< List of extensions used
@@ -733,7 +733,7 @@ private:
gd::String firstLayout;
#if defined(GD_IDE_ONLY)
bool useExternalSourceFiles; ///< True if game used external source files.
std::vector < std::shared_ptr<gd::SourceFile> > externalSourceFiles; ///< List of external source files used.
std::vector < std::unique_ptr<gd::SourceFile> > externalSourceFiles; ///< List of external source files used.
std::vector<ObjectGroup> objectGroups; ///< Global objects groups
gd::String author; ///< Game author name
gd::String packageName; ///< Game package name
@@ -741,7 +741,7 @@ private:
gd::String gameFile; ///< File of the game
gd::String latestCompilationDirectory; ///< File of the game
gd::Platform* currentPlatform; ///< The platform being used to edit the project.
std::vector < std::shared_ptr<gd::ExternalEvents> > externalEvents; ///< List of all externals events
std::vector < std::unique_ptr<gd::ExternalEvents> > externalEvents; ///< List of all externals events
mutable unsigned int GDMajorVersion; ///< The GD major version used the last time the project was saved.
mutable unsigned int GDMinorVersion; ///< The GD minor version used the last time the project was saved.
mutable bool dirty; ///< True to flag the project as being modified.

View File

@@ -15,15 +15,26 @@ namespace gd
ResourcesLoader * ResourcesLoader::_singleton = NULL;
void ResourcesLoader::LoadSFMLImage( const gd::String & filename, sf::Image & image )
{
if (!image.loadFromFile(filename.ToLocale()))
cout << "Failed to load a SFML image: " << filename << endl;
}
sf::Texture ResourcesLoader::LoadSFMLTexture(const gd::String & filename)
{
sf::Texture texture;
if (!texture.loadFromFile(filename.ToLocale()))
cout << "Failed to load a SFML texture: " << filename << endl;
LoadSFMLTexture(filename, texture);
return texture;
}
void ResourcesLoader::LoadSFMLTexture( const gd::String & filename, sf::Texture & texture )
{
if (!texture.loadFromFile(filename.ToLocale()))
cout << "Failed to load a SFML texture: " << filename << endl;
}
std::pair<sf::Font *, char *> ResourcesLoader::LoadFont(const gd::String & filename)
{
sf::Font * font = new sf::Font;

View File

@@ -25,10 +25,13 @@ class GD_CORE_API ResourcesLoader
{
public:
void LoadSFMLImage( const gd::String & filename, sf::Image & image );
/**
* Load a SFML texture.
*/
sf::Texture LoadSFMLTexture( const gd::String & filename );
void LoadSFMLTexture( const gd::String & filename, sf::Texture & texture );
/**
* Load a SFML Font.

View File

@@ -27,6 +27,11 @@ public:
SourceFile();
virtual ~SourceFile();
/**
* \brief Return a pointer to a new SourceFile constructed from this one.
*/
SourceFile * Clone() const { return new SourceFile(*this); };
/**
* \brief Get the filename
*/
@@ -80,8 +85,8 @@ private:
/**
* Functor testing Source Files name
*/
struct ExternalSourceFileHasName : public std::binary_function<std::shared_ptr<SourceFile>, gd::String, bool> {
bool operator()(const std::shared_ptr<SourceFile> & externalEvents, gd::String name) const { return externalEvents->GetFileName() == name; }
struct ExternalSourceFileHasName : public std::binary_function<std::unique_ptr<SourceFile>, gd::String, bool> {
bool operator()(const std::unique_ptr<SourceFile> & externalEvents, gd::String name) const { return externalEvents->GetFileName() == name; }
};
}

View File

@@ -0,0 +1,17 @@
#include <SFML/OpenGL.hpp>
#include <cmath>
namespace OpenGLTools {
void GD_CORE_API PerspectiveGL( GLdouble fovY, GLdouble aspect, GLdouble zNear, GLdouble zFar )
{
const GLdouble pi = 3.1415926535897932384626433832795;
GLdouble fW, fH;
fH = std::tan( fovY / 360 * pi ) * zNear;
fW = fH * aspect;
glFrustum( -fW, fW, -fH, fH, zNear, zFar );
}
}

View File

@@ -0,0 +1,7 @@
#include <SFML/OpenGL.hpp>
namespace OpenGLTools {
void GD_CORE_API PerspectiveGL( GLdouble fovY, GLdouble aspect, GLdouble zNear, GLdouble zFar );
}

View File

@@ -0,0 +1,27 @@
#ifndef GD_CORE_POLYMORPHICCLONE_H
#define GD_CORE_POLYMORPHICCLONE_H
#include <memory>
namespace gd
{
template<class T>
std::unique_ptr<T> Clone(const std::unique_ptr<T> & object)
{
return std::unique_ptr<T>(object->Clone());
}
template<class T>
std::vector<std::unique_ptr<T>> Clone(const std::vector<std::unique_ptr<T>> & vector)
{
std::vector<std::unique_ptr<T>> copy;
for(const auto & element : vector)
copy.push_back(gd::Clone(element));
return copy;
}
}
#endif

View File

@@ -4,8 +4,8 @@
namespace AutoVersion{
//Date Version Types
static const char GDCore_DATE[] = "27";
static const char GDCore_MONTH[] = "06";
static const char GDCore_DATE[] = "15";
static const char GDCore_MONTH[] = "10";
static const char GDCore_YEAR[] = "2016";
//Software Status
@@ -15,12 +15,12 @@ namespace AutoVersion{
//Standard Version Type
static const long GDCore_MAJOR = 4;
static const long GDCore_MINOR = 0;
static const long GDCore_BUILD = 92;
static const long GDCore_BUILD = 93;
static const long GDCore_REVISION = 0;
//Miscellaneous Version Types
#define GDCore_RC_FILEVERSION 4,0,92,0
#define GDCore_RC_FILEVERSION_STRING "4, 0, 92, 0\0"
static const char GDCore_FULLVERSION_STRING[] = "4.0.92.0";
#define GDCore_RC_FILEVERSION 4,0,93,0
#define GDCore_RC_FILEVERSION_STRING "4, 0, 93, 0\0"
static const char GDCore_FULLVERSION_STRING[] = "4.0.93.0";
}
#endif //GDCORE_VERSION_H

View File

@@ -12,6 +12,7 @@
#include "GDCore/Project/Project.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Project/Variable.h"
#include "GDCore/Events/InstructionsList.h"
#include "GDCore/Events/EventsList.h"
#include "GDCore/Events/Event.h"
#include "GDCore/Events/Builtin/GroupEvent.h"
@@ -20,6 +21,29 @@
#include <memory>
TEST_CASE( "Events", "[common][events]" ) {
SECTION("InstructionsList") {
gd::InstructionsList list;
gd::Instruction instr("InstructionType");
list.Insert(instr);
list.Insert(instr);
list.Insert(instr);
REQUIRE( list.size() == 3 );
list[1].SetType("ChangedInstructionType");
REQUIRE( list[0].GetType() == "InstructionType" );
REQUIRE( list[1].GetType() == "ChangedInstructionType" );
gd::InstructionsList list2 = list;
REQUIRE( list2.size() == 3 );
list2[0].SetType("YetAnotherInstructionType");
REQUIRE( list2[0].GetType() == "YetAnotherInstructionType" );
REQUIRE( list2[1].GetType() == "ChangedInstructionType" );
REQUIRE( list[0].GetType() == "InstructionType" );
REQUIRE( list[1].GetType() == "ChangedInstructionType" );
}
SECTION("StandardEvent") {
gd::Instruction instr("InstructionType");
gd::StandardEvent event;
@@ -29,6 +53,10 @@ TEST_CASE( "Events", "[common][events]" ) {
std::shared_ptr<gd::StandardEvent> cloned(event.Clone());
REQUIRE( cloned->GetActions().size() == 1 );
REQUIRE( cloned->GetActions()[0].GetType() == "InstructionType" );
cloned->GetActions()[0].SetType("ChangedInstructionType");
REQUIRE( cloned->GetActions()[0].GetType() == "ChangedInstructionType" );
REQUIRE( event.GetActions()[0].GetType() == "InstructionType" );
}
SECTION("ForEachEvent") {

View File

@@ -0,0 +1,126 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved.
* This project is released under the MIT License.
*/
/**
* @file Tests covering events of GDevelop Core.
*/
#include "catch.hpp"
#include "GDCore/CommonTools.h"
#include "GDCore/Tools/VersionWrapper.h"
#include "GDCore/Project/Project.h"
#include "GDCore/Project/Layout.h"
#include "GDCore/Extensions/Platform.h"
#include "GDCore/Events/CodeGeneration/EventsCodeGenerationContext.h"
#include <memory>
TEST_CASE( "EventsCodeGenerationContext", "[common][events]" ) {
/**
* Generate a tree of contexts with declared objects as below:
* c1 -> c1.object1, c1.object2, c1.empty1 (empty list request)
* / \
* c2.object1 <- c2 c3 -> c3.object1, c1.object2
* / \
* c4 c5 -> c5.object1, c5.empty1 (empty list request), c1.object2
*/
unsigned int maxDepth = 0;
gd::EventsCodeGenerationContext c1(&maxDepth);
c1.ObjectsListNeeded("c1.object1");
c1.ObjectsListNeeded("c1.object2");
c1.EmptyObjectsListNeeded("c1.empty1");
gd::EventsCodeGenerationContext c2;
c2.InheritsFrom(c1);
c2.ObjectsListNeeded("c2.object1");
gd::EventsCodeGenerationContext c3;
c3.InheritsFrom(c1);
c3.ObjectsListNeeded("c3.object1");
c3.ObjectsListNeeded("c1.object2");
gd::EventsCodeGenerationContext c4;
c4.InheritsFrom(c2);
gd::EventsCodeGenerationContext c5;
c5.InheritsFrom(c2);
c5.EmptyObjectsListNeeded("c5.empty1");
c5.ObjectsListNeeded("c5.object1");
c5.ObjectsListNeeded("c1.object2");
SECTION("Parenting") {
REQUIRE( c2.GetParentContext() == &c1 );
REQUIRE( c3.GetParentContext() == &c1 );
REQUIRE( c4.GetParentContext() == &c2 );
REQUIRE( c5.GetParentContext() == &c2 );
}
SECTION("Depth") {
REQUIRE( maxDepth == 2 );
REQUIRE( c1.GetContextDepth() == 0 );
REQUIRE( c2.GetContextDepth() == 1 );
REQUIRE( c3.GetContextDepth() == 1 );
REQUIRE( c4.GetContextDepth() == 2 );
REQUIRE( c5.GetContextDepth() == 2 );
}
SECTION("Object list needed") {
REQUIRE( c1.GetObjectsListsAlreadyDeclared() == std::set<gd::String>() );
REQUIRE( c1.GetObjectsListsToBeDeclared() == std::set<gd::String>({"c1.object1", "c1.object2"}) );
REQUIRE( c1.GetObjectsListsToBeDeclaredEmpty() == std::set<gd::String>({"c1.empty1"}) );
REQUIRE( c1.GetAllObjectsToBeDeclared() == std::set<gd::String>({"c1.object1", "c1.object2", "c1.empty1"}) );
REQUIRE( c2.GetObjectsListsAlreadyDeclared() == std::set<gd::String>({"c1.object1", "c1.object2", "c1.empty1"}) );
REQUIRE( c2.GetObjectsListsToBeDeclared() == std::set<gd::String>({"c2.object1"}) );
REQUIRE( c2.GetObjectsListsToBeDeclaredEmpty() == std::set<gd::String>() );
REQUIRE( c2.GetAllObjectsToBeDeclared() == std::set<gd::String>({"c2.object1"}) );
REQUIRE( c3.GetObjectsListsAlreadyDeclared() == std::set<gd::String>({"c1.object1", "c1.object2", "c1.empty1"}) );
REQUIRE( c3.GetObjectsListsToBeDeclared() == std::set<gd::String>({"c3.object1", "c1.object2"}) );
REQUIRE( c3.GetObjectsListsToBeDeclaredEmpty() == std::set<gd::String>() );
REQUIRE( c3.GetAllObjectsToBeDeclared() == std::set<gd::String>({"c3.object1", "c1.object2"}) );
REQUIRE( c5.GetObjectsListsAlreadyDeclared() == std::set<gd::String>({"c1.object1", "c1.object2", "c1.empty1", "c2.object1"}) );
REQUIRE( c5.GetObjectsListsToBeDeclared() == std::set<gd::String>({"c5.object1", "c1.object2"}) );
REQUIRE( c5.GetObjectsListsToBeDeclaredEmpty() == std::set<gd::String>({"c5.empty1"}) );
REQUIRE( c5.GetAllObjectsToBeDeclared() == std::set<gd::String>({"c5.object1", "c5.empty1", "c1.object2"}) );
}
SECTION("ObjectAlreadyDeclared") {
REQUIRE( c1.ObjectAlreadyDeclared("c1.object1") == false );
REQUIRE( c2.ObjectAlreadyDeclared("c1.object1") == true );
REQUIRE( c3.ObjectAlreadyDeclared("c1.object1") == true );
REQUIRE( c4.ObjectAlreadyDeclared("c1.object1") == true );
REQUIRE( c5.ObjectAlreadyDeclared("c1.object1") == true );
REQUIRE( c2.ObjectAlreadyDeclared("c2.object1") == false );
REQUIRE( c1.ObjectAlreadyDeclared("c2.object1") == false );
REQUIRE( c3.ObjectAlreadyDeclared("c2.object1") == false );
REQUIRE( c4.ObjectAlreadyDeclared("c2.object1") == true );
REQUIRE( c5.ObjectAlreadyDeclared("c2.object1") == true );
REQUIRE( c3.ObjectAlreadyDeclared("some object") == false );
c3.SetObjectDeclared("some object");
REQUIRE( c3.ObjectAlreadyDeclared("some object") == true );
}
SECTION("Object list last depth") {
REQUIRE( c1.GetLastDepthObjectListWasNeeded("c1.object1") == 0 );
REQUIRE( c2.GetLastDepthObjectListWasNeeded("c2.object1") == 1 );
REQUIRE( c3.GetLastDepthObjectListWasNeeded("c3.object1") == 1 );
REQUIRE( c4.GetLastDepthObjectListWasNeeded("c2.object1") == 1 );
REQUIRE( c5.GetLastDepthObjectListWasNeeded("c1.object2") == 2 );
REQUIRE( c5.GetLastDepthObjectListWasNeeded("c2.object1") == 1 );
REQUIRE( c5.GetLastDepthObjectListWasNeeded("c5.object1") == 2 );
}
SECTION("SetCurrentObject") {
REQUIRE( c3.GetCurrentObject() == "" );
c3.SetCurrentObject("current object");
REQUIRE( c3.GetCurrentObject() == "current object" );
c3.SetNoCurrentObject();
REQUIRE( c3.GetCurrentObject() == "" );
}
}

View File

@@ -0,0 +1,262 @@
/*
* GDevelop Core
* Copyright 2008-2016 Florian Rival (Florian.Rival@gmail.com). All rights reserved.
* This project is released under the MIT License.
*/
/**
* @file Tests covering events of GDevelop Core.
*/
#include "catch.hpp"
#include <algorithm>
#include <initializer_list>
#include <map>
#include "GDCore/CommonTools.h"
#include "GDCore/Tools/VersionWrapper.h"
#include "GDCore/Project/InitialInstancesContainer.h"
void AddNewInitialInstance(gd::InitialInstancesContainer & container, const gd::String & objectName, const gd::String & layer, int zorder)
{
auto &i = container.InsertNewInitialInstance();
i.SetObjectName(objectName);
i.SetLayer(layer);
i.SetZOrder(zorder);
}
gd::InitialInstance MakeInstance(const gd::String & objectName, const gd::String & layer, int zorder)
{
gd::InitialInstance i;
i.SetObjectName(objectName);
i.SetLayer(layer);
i.SetZOrder(zorder);
return i;
}
class ZOrderCheckFunctor : public gd::InitialInstanceFunctor
{
public:
ZOrderCheckFunctor(const gd::String & layer) :
layer(layer),
lastZOrder(-1000),
isOk(true)
{ }
void operator()(gd::InitialInstance & instance)
{
//Check if the instances are correctly filtered and sorted
if(instance.GetLayer() != layer || lastZOrder > instance.GetZOrder())
isOk = false;
lastZOrder = instance.GetZOrder();
}
bool IsOk() const { return isOk; }
private:
gd::String layer;
int lastZOrder;
bool isOk;
};
class AllInstancesFunctor : public gd::InitialInstanceFunctor
{
public:
void operator()(gd::InitialInstance & instance)
{
allInitialInstances.push_back(instance);
}
bool Compare(const std::initializer_list<gd::InitialInstance> & expectedInstances)
{
return allInitialInstances.size() == expectedInstances.size() &&
std::is_permutation(
allInitialInstances.cbegin(),
allInitialInstances.cend(),
expectedInstances.begin(),
[](const gd::InitialInstance & i1, const gd::InitialInstance & i2) -> bool
{
return i1.GetObjectName() == i2.GetObjectName() && i1.GetLayer() == i2.GetLayer() && i1.GetZOrder() == i2.GetZOrder();
});
}
private:
std::vector<gd::InitialInstance> allInitialInstances;
};
TEST_CASE( "InitialInstancesContainer", "[common][instances]" ) {
gd::InitialInstancesContainer container;
AddNewInitialInstance(container, "object1", "layer1", 10);
AddNewInitialInstance(container, "object1", "layer2", 10);
AddNewInitialInstance(container, "object1", "layer1", 14);
AddNewInitialInstance(container, "object2", "layer1", 12);
AddNewInitialInstance(container, "object2", "layer1", 10);
AddNewInitialInstance(container, "object3", "layer2", 11);
AddNewInitialInstance(container, "object3", "layer2", 9);
SECTION("IterateOverInstances") {
AllInstancesFunctor func;
container.IterateOverInstances(func);
REQUIRE( func.Compare(
{
MakeInstance("object1", "layer1", 10),
MakeInstance("object1", "layer2", 10),
MakeInstance("object1", "layer1", 14),
MakeInstance("object2", "layer1", 12),
MakeInstance("object2", "layer1", 10),
MakeInstance("object3", "layer2", 11),
MakeInstance("object3", "layer2", 9)
}
) == true );
}
SECTION("IterateOverInstancesWithZOrdering") {
ZOrderCheckFunctor func("layer1");
container.IterateOverInstancesWithZOrdering(func, "layer1");
REQUIRE( func.IsOk() == true );
}
SECTION("RemoveInstance") {
auto & i = container.InsertNewInitialInstance();
i.SetObjectName("new");
auto & i2 = container.InsertNewInitialInstance();
i2.SetObjectName("newtwo");
auto & i3 = container.InsertNewInitialInstance();
i3.SetObjectName("newthree");
{
AllInstancesFunctor func;
container.IterateOverInstances(func);
REQUIRE( func.Compare(
{
MakeInstance("object1", "layer1", 10),
MakeInstance("object1", "layer2", 10),
MakeInstance("object1", "layer1", 14),
MakeInstance("object2", "layer1", 12),
MakeInstance("object2", "layer1", 10),
MakeInstance("object3", "layer2", 11),
MakeInstance("object3", "layer2", 9),
MakeInstance("new", "", 0),
MakeInstance("newtwo", "", 0),
MakeInstance("newthree", "", 0)
}
) == true );
}
// Delete a few objects to make sure that pointers/references to
// the other objects stay the same.
container.RemoveInstance(i);
container.RemoveInstance(i2);
{
AllInstancesFunctor func;
container.IterateOverInstances(func);
REQUIRE( func.Compare(
{
MakeInstance("object1", "layer1", 10),
MakeInstance("object1", "layer2", 10),
MakeInstance("object1", "layer1", 14),
MakeInstance("object2", "layer1", 12),
MakeInstance("object2", "layer1", 10),
MakeInstance("object3", "layer2", 11),
MakeInstance("object3", "layer2", 9),
MakeInstance("newthree", "", 0)
}
) == true );
}
container.RemoveInstance(i3);
{
AllInstancesFunctor func;
container.IterateOverInstances(func);
REQUIRE( func.Compare(
{
MakeInstance("object1", "layer1", 10),
MakeInstance("object1", "layer2", 10),
MakeInstance("object1", "layer1", 14),
MakeInstance("object2", "layer1", 12),
MakeInstance("object2", "layer1", 10),
MakeInstance("object3", "layer2", 11),
MakeInstance("object3", "layer2", 9)
}
) == true );
}
}
SECTION("RemoveAllInstancesOnLayer") {
container.RemoveAllInstancesOnLayer("layer1");
AllInstancesFunctor func;
container.IterateOverInstances(func);
REQUIRE( func.Compare(
{
MakeInstance("object1", "layer2", 10),
MakeInstance("object3", "layer2", 11),
MakeInstance("object3", "layer2", 9)
}
) == true );
}
SECTION("RemoveInitialInstancesOfObject") {
container.RemoveInitialInstancesOfObject("object2");
AllInstancesFunctor func;
container.IterateOverInstances(func);
REQUIRE( func.Compare(
{
MakeInstance("object1", "layer1", 10),
MakeInstance("object1", "layer2", 10),
MakeInstance("object1", "layer1", 14),
MakeInstance("object3", "layer2", 11),
MakeInstance("object3", "layer2", 9)
}
) == true );
}
SECTION("MoveInstancesToLayer") {
container.MoveInstancesToLayer("layer1", "layer3");
AllInstancesFunctor func;
container.IterateOverInstances(func);
REQUIRE( func.Compare(
{
MakeInstance("object1", "layer3", 10),
MakeInstance("object1", "layer2", 10),
MakeInstance("object1", "layer3", 14),
MakeInstance("object2", "layer3", 12),
MakeInstance("object2", "layer3", 10),
MakeInstance("object3", "layer2", 11),
MakeInstance("object3", "layer2", 9)
}
) == true );
}
SECTION("RenameInstancesOfObject") {
container.RenameInstancesOfObject("object1", "object4");
container.RenameInstancesOfObject("object2", "object5");
AllInstancesFunctor func;
container.IterateOverInstances(func);
REQUIRE( func.Compare(
{
MakeInstance("object4", "layer1", 10),
MakeInstance("object4", "layer2", 10),
MakeInstance("object4", "layer1", 14),
MakeInstance("object5", "layer1", 12),
MakeInstance("object5", "layer1", 10),
MakeInstance("object3", "layer2", 11),
MakeInstance("object3", "layer2", 9)
}
) == true );
}
SECTION("SomeInstancesAreOnLayer") {
REQUIRE( container.SomeInstancesAreOnLayer("layer1") == true );
REQUIRE( container.SomeInstancesAreOnLayer("layer2") == true );
REQUIRE( container.SomeInstancesAreOnLayer("layer3") == false );
REQUIRE( container.SomeInstancesAreOnLayer("layer5") == false );
}
}

View File

@@ -0,0 +1,329 @@
/**
GDevelop - Anchor Behavior Extension
Copyright (c) 2016 Victor Levasseur (victorlevasseur52@gmail.com)
This project is released under the MIT License.
*/
#include <memory>
#include <iostream>
#include <set>
#include "AnchorBehavior.h"
#include "GDCore/Tools/Localization.h"
#include "GDCpp/Extensions/Builtin/MathematicalTools.h"
#include "GDCpp/Runtime/Project/Layout.h"
#include "GDCpp/Runtime/Serialization/SerializerElement.h"
#include "GDCpp/Runtime/RuntimeScene.h"
#include "GDCpp/Runtime/RuntimeObject.h"
#include "GDCpp/Runtime/RuntimeGame.h"
#include "GDCpp/Runtime/CommonTools.h"
#include <SFML/Window.hpp>
#include "GDCore/CommonTools.h"
#include <iostream>
#include <cmath>
#include <algorithm>
#if defined(GD_IDE_ONLY)
#include <map>
#include "GDCore/IDE/Dialogs/PropertyDescriptor.h"
#endif
AnchorBehavior::AnchorBehavior() :
m_relativeToOriginalWindowSize(true),
m_leftEdgeAnchor(ANCHOR_HORIZONTAL_NONE),
m_rightEdgeAnchor(ANCHOR_HORIZONTAL_NONE),
m_topEdgeAnchor(ANCHOR_VERTICAL_NONE),
m_bottomEdgeAnchor(ANCHOR_VERTICAL_NONE),
m_invalidDistances(true),
m_leftEdgeDistance(0.f),
m_rightEdgeDistance(0.f),
m_topEdgeDistance(0.f),
m_bottomEdgeDistance(0.f)
{
}
void AnchorBehavior::OnActivate()
{
m_invalidDistances = true;
}
namespace
{
sf::Vector2f mapFloatPixelToCoords(const sf::Vector2f& point, const sf::RenderTarget & target, const sf::View& view)
{
// First, convert from viewport coordinates to homogeneous coordinates
sf::Vector2f normalized;
sf::IntRect viewport = target.getViewport(view);
normalized.x = -1.f + 2.f * (point.x - static_cast<float>(viewport.left)) / static_cast<float>(viewport.width);
normalized.y = 1.f - 2.f * (point.y - static_cast<float>(viewport.top)) / static_cast<float>(viewport.height);
// Then transform by the inverse of the view matrix
return view.getInverseTransform().transformPoint(normalized);
}
sf::Vector2f mapCoordsToFloatPixel(const sf::Vector2f & point, const sf::RenderTarget & target, const sf::View & view)
{
//Note: almost the same as RenderTarget::mapCoordsToPixel except that the result is sf::Vector2f
//First, transform the point by the view matrix
sf::Vector2f normalized = view.getTransform().transformPoint(point);
//Then convert to viewport coordinates
sf::Vector2f pixel;
sf::IntRect viewport = target.getViewport(view);
pixel.x = ( normalized.x + 1.f) / 2.f * static_cast<float>(viewport.width) + static_cast<float>(viewport.left);
pixel.y = (-normalized.y + 1.f) / 2.f * static_cast<float>(viewport.height) + static_cast<float>(viewport.top);
return pixel;
}
}
void AnchorBehavior::DoStepPreEvents(RuntimeScene & scene)
{
}
void AnchorBehavior::DoStepPostEvents(RuntimeScene & scene)
{
const RuntimeLayer & layer = scene.GetRuntimeLayer(object->GetLayer());
const RuntimeCamera & firstCamera = layer.GetCamera(0);
if(m_invalidDistances)
{
sf::Vector2u windowSize = m_relativeToOriginalWindowSize ?
sf::Vector2u(scene.game->getWindowOriginalWidth(), scene.game->getWindowOriginalHeight()) :
scene.renderWindow->getSize();
//Calculate the distances from the window's bounds.
sf::Vector2f topLeftPixel = mapCoordsToFloatPixel(
sf::Vector2f(object->GetDrawableX(), object->GetDrawableY()),
*(scene.renderWindow),
firstCamera.GetSFMLView());
sf::Vector2f bottomRightPixel = mapCoordsToFloatPixel(
sf::Vector2f(object->GetDrawableX() + object->GetWidth(), object->GetDrawableY() + object->GetHeight()),
*(scene.renderWindow),
firstCamera.GetSFMLView());
//Left edge
if(m_leftEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_LEFT)
m_leftEdgeDistance = topLeftPixel.x;
else if(m_leftEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_RIGHT)
m_leftEdgeDistance = static_cast<float>(windowSize.x) - topLeftPixel.x;
else if(m_leftEdgeAnchor == ANCHOR_HORIZONTAL_PROPORTIONAL)
m_leftEdgeDistance = topLeftPixel.x / windowSize.x;
//Right edge
if(m_rightEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_LEFT)
m_rightEdgeDistance = bottomRightPixel.x;
else if(m_rightEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_RIGHT)
m_rightEdgeDistance = static_cast<float>(windowSize.x) - bottomRightPixel.x;
else if(m_rightEdgeAnchor == ANCHOR_HORIZONTAL_PROPORTIONAL)
m_rightEdgeDistance = bottomRightPixel.x / windowSize.x;
//Top edge
if(m_topEdgeAnchor == ANCHOR_VERTICAL_WINDOW_TOP)
m_topEdgeDistance = topLeftPixel.y;
else if(m_topEdgeAnchor == ANCHOR_VERTICAL_WINDOW_BOTTOM)
m_topEdgeDistance = static_cast<float>(windowSize.y) - topLeftPixel.y;
else if(m_topEdgeAnchor == ANCHOR_VERTICAL_PROPORTIONAL)
m_topEdgeDistance = topLeftPixel.y / static_cast<float>(windowSize.y);
//Bottom edge
if(m_bottomEdgeAnchor == ANCHOR_VERTICAL_WINDOW_TOP)
m_bottomEdgeDistance = bottomRightPixel.y;
else if(m_bottomEdgeAnchor == ANCHOR_VERTICAL_WINDOW_BOTTOM)
m_bottomEdgeDistance = static_cast<float>(windowSize.y) - bottomRightPixel.y;
else if(m_bottomEdgeAnchor == ANCHOR_VERTICAL_PROPORTIONAL)
m_bottomEdgeDistance = bottomRightPixel.y / static_cast<float>(windowSize.y);
m_invalidDistances = false;
}
else
{
sf::Vector2u windowSize = scene.renderWindow->getSize();
//Move and resize the object if needed
sf::Vector2f topLeftPixel;
sf::Vector2f bottomRightPixel;
//Left edge
if(m_leftEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_LEFT)
topLeftPixel.x = m_leftEdgeDistance;
else if(m_leftEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_RIGHT)
topLeftPixel.x = static_cast<float>(windowSize.x) - m_leftEdgeDistance;
else if(m_leftEdgeAnchor == ANCHOR_HORIZONTAL_PROPORTIONAL)
topLeftPixel.x = m_leftEdgeDistance * static_cast<float>(windowSize.x);
//Top edge
if(m_topEdgeAnchor == ANCHOR_VERTICAL_WINDOW_TOP)
topLeftPixel.y = m_topEdgeDistance;
else if(m_topEdgeAnchor == ANCHOR_VERTICAL_WINDOW_BOTTOM)
topLeftPixel.y = static_cast<float>(windowSize.y) - m_topEdgeDistance;
else if(m_topEdgeAnchor == ANCHOR_VERTICAL_PROPORTIONAL)
topLeftPixel.y = m_topEdgeDistance * static_cast<float>(windowSize.y);
//Right edge
if(m_rightEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_LEFT)
bottomRightPixel.x = m_rightEdgeDistance;
else if(m_rightEdgeAnchor == ANCHOR_HORIZONTAL_WINDOW_RIGHT)
bottomRightPixel.x = static_cast<float>(windowSize.x) - m_rightEdgeDistance;
else if(m_rightEdgeAnchor == ANCHOR_HORIZONTAL_PROPORTIONAL)
bottomRightPixel.x = m_rightEdgeDistance * static_cast<float>(windowSize.x);
//Bottom edge
if(m_bottomEdgeAnchor == ANCHOR_VERTICAL_WINDOW_TOP)
bottomRightPixel.y = m_bottomEdgeDistance;
else if(m_bottomEdgeAnchor == ANCHOR_VERTICAL_WINDOW_BOTTOM)
bottomRightPixel.y = static_cast<float>(windowSize.y) - m_bottomEdgeDistance;
else if(m_bottomEdgeAnchor == ANCHOR_VERTICAL_PROPORTIONAL)
bottomRightPixel.y = m_bottomEdgeDistance * static_cast<float>(windowSize.y);
sf::Vector2f topLeftCoord = mapFloatPixelToCoords(topLeftPixel, (*scene.renderWindow), firstCamera.GetSFMLView());
sf::Vector2f bottomRightCoord = mapFloatPixelToCoords(bottomRightPixel, (*scene.renderWindow), firstCamera.GetSFMLView());
//Move and resize the object according to the anchors
if(m_rightEdgeAnchor != ANCHOR_HORIZONTAL_NONE)
object->SetWidth(bottomRightCoord.x - topLeftCoord.x);
if(m_bottomEdgeAnchor != ANCHOR_VERTICAL_NONE)
object->SetHeight(bottomRightCoord.y - topLeftCoord.y);
if(m_leftEdgeAnchor != ANCHOR_HORIZONTAL_NONE)
object->SetX(topLeftCoord.x + object->GetX() - object->GetDrawableX());
if(m_topEdgeAnchor != ANCHOR_VERTICAL_NONE)
object->SetY(topLeftCoord.y + object->GetY() - object->GetDrawableY());
}
}
void AnchorBehavior::UnserializeFrom(const gd::SerializerElement & element)
{
m_relativeToOriginalWindowSize = element.GetBoolAttribute("relativeToOriginalWindowSize");
m_leftEdgeAnchor = static_cast<HorizontalAnchor>(element.GetIntAttribute("leftEdgeAnchor"));
m_rightEdgeAnchor = static_cast<HorizontalAnchor>(element.GetIntAttribute("rightEdgeAnchor"));
m_topEdgeAnchor = static_cast<VerticalAnchor>(element.GetIntAttribute("topEdgeAnchor"));
m_bottomEdgeAnchor = static_cast<VerticalAnchor>(element.GetIntAttribute("bottomEdgeAnchor"));
}
#if defined(GD_IDE_ONLY)
void AnchorBehavior::SerializeTo(gd::SerializerElement & element) const
{
element.SetAttribute("relativeToOriginalWindowSize", m_relativeToOriginalWindowSize);
element.SetAttribute("leftEdgeAnchor", static_cast<int>(m_leftEdgeAnchor));
element.SetAttribute("rightEdgeAnchor", static_cast<int>(m_rightEdgeAnchor));
element.SetAttribute("topEdgeAnchor", static_cast<int>(m_topEdgeAnchor));
element.SetAttribute("bottomEdgeAnchor", static_cast<int>(m_bottomEdgeAnchor));
}
namespace
{
gd::String GetAnchorAsString(AnchorBehavior::HorizontalAnchor anchor)
{
if(anchor == AnchorBehavior::ANCHOR_HORIZONTAL_WINDOW_LEFT)
return _("Window left");
else if(anchor == AnchorBehavior::ANCHOR_HORIZONTAL_WINDOW_RIGHT)
return _("Window right");
else if(anchor == AnchorBehavior::ANCHOR_HORIZONTAL_PROPORTIONAL)
return _("Proportional");
else
return _("No anchor");
}
gd::String GetAnchorAsString(AnchorBehavior::VerticalAnchor anchor)
{
if(anchor == AnchorBehavior::ANCHOR_VERTICAL_WINDOW_TOP)
return _("Window top");
else if(anchor == AnchorBehavior::ANCHOR_VERTICAL_WINDOW_BOTTOM)
return _("Window bottom");
else if(anchor == AnchorBehavior::ANCHOR_VERTICAL_PROPORTIONAL)
return _("Proportional");
else
return _("No anchor");
}
}
std::map<gd::String, gd::PropertyDescriptor> AnchorBehavior::GetProperties(gd::Project & project) const
{
std::map<gd::String, gd::PropertyDescriptor> properties;
properties[_("Relative to original window size")]
.SetValue(m_relativeToOriginalWindowSize ? "true" : "false")
.SetType("Boolean");
properties[_("Left edge anchor")]
.SetValue(GetAnchorAsString(m_leftEdgeAnchor))
.SetType("Choice")
.AddExtraInfo(_("No anchor"))
.AddExtraInfo(_("Window left"))
.AddExtraInfo(_("Window right"))
.AddExtraInfo(_("Proportional"));
properties[_("Right edge anchor")]
.SetValue(GetAnchorAsString(m_rightEdgeAnchor))
.SetType("Choice")
.AddExtraInfo(_("No anchor"))
.AddExtraInfo(_("Window left"))
.AddExtraInfo(_("Window right"))
.AddExtraInfo(_("Proportional"));
properties[_("Top edge anchor")]
.SetValue(GetAnchorAsString(m_topEdgeAnchor))
.SetType("Choice")
.AddExtraInfo(_("No anchor"))
.AddExtraInfo(_("Window top"))
.AddExtraInfo(_("Window bottom"))
.AddExtraInfo(_("Proportional"));
properties[_("Bottom edge anchor")]
.SetValue(GetAnchorAsString(m_bottomEdgeAnchor))
.SetType("Choice")
.AddExtraInfo(_("No anchor"))
.AddExtraInfo(_("Window top"))
.AddExtraInfo(_("Window bottom"))
.AddExtraInfo(_("Proportional"));
return properties;
}
namespace
{
AnchorBehavior::HorizontalAnchor GetHorizontalAnchorFromString(const gd::String & value)
{
if(value == _("Window left"))
return AnchorBehavior::ANCHOR_HORIZONTAL_WINDOW_LEFT;
else if(value == _("Window right"))
return AnchorBehavior::ANCHOR_HORIZONTAL_WINDOW_RIGHT;
else if(value == _("Proportional"))
return AnchorBehavior::ANCHOR_HORIZONTAL_PROPORTIONAL;
else
return AnchorBehavior::ANCHOR_HORIZONTAL_NONE;
}
AnchorBehavior::VerticalAnchor GetVerticalAnchorFromString(const gd::String & value)
{
if(value == _("Window top"))
return AnchorBehavior::ANCHOR_VERTICAL_WINDOW_TOP;
else if(value == _("Window bottom"))
return AnchorBehavior::ANCHOR_VERTICAL_WINDOW_BOTTOM;
else if(value == _("Proportional"))
return AnchorBehavior::ANCHOR_VERTICAL_PROPORTIONAL;
else
return AnchorBehavior::ANCHOR_VERTICAL_NONE;
}
}
bool AnchorBehavior::UpdateProperty(const gd::String & name, const gd::String & value, gd::Project & project)
{
if ( name == _("Relative to original window size") )
m_relativeToOriginalWindowSize = (value == "1");
else if ( name == _("Left edge anchor") )
m_leftEdgeAnchor = GetHorizontalAnchorFromString(value);
else if ( name == _("Right edge anchor") )
m_rightEdgeAnchor = GetHorizontalAnchorFromString(value);
else if ( name == _("Top edge anchor") )
m_topEdgeAnchor = GetVerticalAnchorFromString(value);
else if ( name == _("Bottom edge anchor") )
m_bottomEdgeAnchor = GetVerticalAnchorFromString(value);
else
return false;
return true;
}
#endif

View File

@@ -0,0 +1,83 @@
/**
GDevelop - Anchor Behavior Extension
Copyright (c) 2016 Victor Levasseur (victorlevasseur52@gmail.com)
This project is released under the MIT License.
*/
#ifndef ANCHORBEHAVIOR_H
#define ANCHORBEHAVIOR_H
#include "GDCpp/Runtime/Project/Behavior.h"
#include "GDCpp/Runtime/Project/Object.h"
#include <SFML/Graphics/RenderTarget.hpp>
#include <SFML/Graphics/View.hpp>
#include <SFML/System/Vector2.hpp>
#include <vector>
namespace gd { class Layout; }
class RuntimeScene;
namespace gd { class SerializerElement; }
class RuntimeScenePlatformData;
/**
* \brief Allow to anchor objects to the window's bounds.
*/
class GD_EXTENSION_API AnchorBehavior : public Behavior
{
public:
enum HorizontalAnchor
{
ANCHOR_HORIZONTAL_NONE = 0,
ANCHOR_HORIZONTAL_WINDOW_LEFT = 1,
ANCHOR_HORIZONTAL_WINDOW_RIGHT = 2,
ANCHOR_HORIZONTAL_PROPORTIONAL = 3
};
enum VerticalAnchor
{
ANCHOR_VERTICAL_NONE = 0,
ANCHOR_VERTICAL_WINDOW_TOP = 1,
ANCHOR_VERTICAL_WINDOW_BOTTOM = 2,
ANCHOR_VERTICAL_PROPORTIONAL = 3
};
AnchorBehavior();
virtual ~AnchorBehavior() {};
virtual Behavior* Clone() const override { return new AnchorBehavior(*this); }
/**
* \brief Unserialize the behavior
*/
virtual void UnserializeFrom(const gd::SerializerElement & element) override;
#if defined(GD_IDE_ONLY)
/**
* \brief Serialize the behavior
*/
virtual void SerializeTo(gd::SerializerElement & element) const override;
virtual std::map<gd::String, gd::PropertyDescriptor> GetProperties(gd::Project & project) const override;
virtual bool UpdateProperty(const gd::String & name, const gd::String & value, gd::Project & project) override;
#endif
virtual void OnActivate() override;
private:
virtual void DoStepPreEvents(RuntimeScene & scene) override;
virtual void DoStepPostEvents(RuntimeScene & scene) override;
bool m_relativeToOriginalWindowSize; ///< True if the original size of the game window must be used.
HorizontalAnchor m_leftEdgeAnchor;
HorizontalAnchor m_rightEdgeAnchor;
VerticalAnchor m_topEdgeAnchor;
VerticalAnchor m_bottomEdgeAnchor;
bool m_invalidDistances;
//Distances (in window's units) from the XXX edge of the object to side of the window the edge is anchored on.
//Note: If the edge anchor is set to PROPORTIONAL, then it contains the ratio of the distance to the window size.
float m_leftEdgeDistance;
float m_rightEdgeDistance;
float m_topEdgeDistance;
float m_bottomEdgeDistance;
};
#endif // ANCHORBEHAVIOR_H

View File

@@ -0,0 +1,25 @@
cmake_minimum_required(VERSION 2.6)
cmake_policy(SET CMP0015 NEW)
project(AnchorBehavior)
gd_add_extension_includes()
#Defines
###
gd_add_extension_definitions(AnchorBehavior)
#The targets
###
include_directories(.)
file(GLOB source_files *)
gd_add_extension_target(AnchorBehavior "${source_files}")
gdcpp_add_runtime_extension_target(AnchorBehavior_Runtime "${source_files}")
#Linker files for the IDE extension
###
gd_extension_link_libraries(AnchorBehavior)
#Linker files for the GD C++ Runtime extension
###
gdcpp_runtime_extension_link_libraries(AnchorBehavior_Runtime)

View File

@@ -0,0 +1,68 @@
/**
GDevelop - Anchor Behavior Extension
Copyright (c) 2016 Victor Levasseur (victorlevasseur52@gmail.com)
This project is released under the MIT License.
*/
#include "GDCpp/Extensions/ExtensionBase.h"
#include "GDCpp/Runtime/Project/BehaviorsSharedData.h"
#include "GDCore/Tools/Version.h"
#include "AnchorBehavior.h"
void DeclareAnchorBehaviorExtension(gd::PlatformExtension & extension)
{
extension.SetExtensionInformation("AnchorBehavior",
_("Anchor"),
_("Anchor objects to the window's bounds."),
"Victor Levasseur",
"Open source (MIT License)");
gd::BehaviorMetadata & aut = extension.AddBehavior("AnchorBehavior",
_("Anchor"),
"Anchor",
_("Behavior that anchors objects to the window's bounds."),
"",
"CppPlatform/Extensions/AnchorIcon.png",
"AnchorBehavior",
std::shared_ptr<gd::Behavior>(new AnchorBehavior),
std::shared_ptr<gd::BehaviorsSharedData>(new gd::BehaviorsSharedData));
#if defined(GD_IDE_ONLY)
aut.SetIncludeFile("AnchorBehavior/AnchorBehavior.h");
#endif
}
/**
* \brief This class declares information about the extension.
*/
class AnchorBehaviorCppExtension : public ExtensionBase
{
public:
/**
* Constructor of an extension declares everything the extension contains: objects, actions, conditions and expressions.
*/
AnchorBehaviorCppExtension()
{
DeclareAnchorBehaviorExtension(*this);
GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION();
};
};
#if defined(ANDROID)
extern "C" ExtensionBase * CreateGDCppAnchorBehaviorExtension() {
return new AnchorBehaviorCppExtension;
}
#elif !defined(EMSCRIPTEN)
/**
* Used by GDevelop to create the extension class
* -- Do not need to be modified. --
*/
extern "C" ExtensionBase * GD_EXTENSION_API CreateGDExtension() {
return new AnchorBehaviorCppExtension;
}
#endif

View File

@@ -0,0 +1,48 @@
/**
GDevelop - Anchor Behavior Extension
Copyright (c) 2016 Victor Levasseur (victorlevasseur52@gmail.com)
This project is released under the MIT License.
*/
#if defined(GD_IDE_ONLY)
#include "GDCore/Extensions/PlatformExtension.h"
#include "GDCore/Tools/Localization.h"
#include "GDCore/Tools/Version.h"
#include <iostream>
void DeclareAnchorBehaviorExtension(gd::PlatformExtension & extension);
/**
* \brief This class declares information about the JS extension.
*/
class AnchorBehaviorJsExtension : public gd::PlatformExtension
{
public:
/**
* \brief Constructor of an extension declares everything the extension contains: objects, actions, conditions and expressions.
*/
AnchorBehaviorJsExtension()
{
DeclareAnchorBehaviorExtension(*this);
GetBehaviorMetadata("AnchorBehavior::AnchorBehavior").SetIncludeFile("AnchorBehavior/anchorruntimebehavior.js");
GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION();
};
};
#if defined(EMSCRIPTEN)
extern "C" gd::PlatformExtension * CreateGDJSAnchorBehaviorExtension() {
return new AnchorBehaviorJsExtension;
}
#else
/**
* Used by GDevelop to create the extension class
* -- Do not need to be modified. --
*/
extern "C" gd::PlatformExtension * GD_EXTENSION_API CreateGDJSExtension() {
return new AnchorBehaviorJsExtension;
}
#endif
#endif

View File

@@ -0,0 +1,162 @@
/**
GDevelop - Anchor Behavior Extension
Copyright (c) 2013-2016 Florian Rival (Florian.Rival@gmail.com)
*/
/**
* @class AnchorRuntimeBehavior
* @constructor
*/
gdjs.AnchorRuntimeBehavior = function(runtimeScene, behaviorData, owner)
{
gdjs.RuntimeBehavior.call(this, runtimeScene, behaviorData, owner);
this._relativeToOriginalWindowSize = !!behaviorData.relativeToOriginalWindowSize;
this._leftEdgeAnchor = behaviorData.leftEdgeAnchor;
this._rightEdgeAnchor = behaviorData.rightEdgeAnchor;
this._topEdgeAnchor = behaviorData.topEdgeAnchor;
this._bottomEdgeAnchor = behaviorData.bottomEdgeAnchor;
this._invalidDistances = true;
this._leftEdgeDistance = 0;
this._rightEdgeDistance = 0;
this._topEdgeDistance = 0;
this._bottomEdgeDistance = 0;
};
gdjs.AnchorRuntimeBehavior.prototype = Object.create( gdjs.RuntimeBehavior.prototype );
gdjs.AnchorRuntimeBehavior.thisIsARuntimeBehaviorConstructor = "AnchorBehavior::AnchorBehavior";
gdjs.AnchorRuntimeBehavior.HorizontalAnchor = {
NONE: 0,
WINDOW_LEFT: 1,
WINDOW_RIGHT: 2,
PROPORTIONAL: 3
};
gdjs.AnchorRuntimeBehavior.VerticalAnchor = {
NONE: 0,
WINDOW_TOP: 1,
WINDOW_BOTTOM: 2,
PROPORTIONAL: 3
};
gdjs.AnchorRuntimeBehavior.prototype.onActivate = function() {
this._invalidDistances = true;
};
gdjs.AnchorRuntimeBehavior.prototype.doStepPreEvents = function(runtimeScene) {
};
gdjs.AnchorRuntimeBehavior.prototype.doStepPostEvents = function(runtimeScene) {
var game = runtimeScene.getGame();
var rendererWidth = game.getRenderer().getCurrentWidth();
var rendererHeight = game.getRenderer().getCurrentHeight();
var layer = runtimeScene.getLayer(this.owner.getLayer());
if(this._invalidDistances)
{
if (this._relativeToOriginalWindowSize) {
rendererWidth = game.getOriginalWidth();
rendererHeight = game.getOriginalHeight();
}
//Calculate the distances from the window's bounds.
var topLeftPixel = layer.convertCoords(
this.owner.getDrawableX(),
this.owner.getDrawableY()
);
//Left edge
if(this._leftEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.WINDOW_LEFT)
this._leftEdgeDistance = topLeftPixel[0];
else if(this._leftEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.WINDOW_RIGHT)
this._leftEdgeDistance = rendererWidth - topLeftPixel[0];
else if(this._leftEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.PROPORTIONAL)
this._leftEdgeDistance = topLeftPixel[0] / rendererWidth;
//Top edge
if(this._topEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.WINDOW_TOP)
this._topEdgeDistance = topLeftPixel[1];
else if(this._topEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.WINDOW_BOTTOM)
this._topEdgeDistance = rendererHeight - topLeftPixel[1];
else if(this._topEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.PROPORTIONAL)
this._topEdgeDistance = topLeftPixel[1] / rendererHeight;
var bottomRightPixel = layer.convertCoords(
this.owner.getDrawableX() + this.owner.getWidth(),
this.owner.getDrawableY() + this.owner.getHeight()
);
//Right edge
if(this._rightEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.WINDOW_LEFT)
this._rightEdgeDistance = bottomRightPixel[0];
else if(this._rightEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.WINDOW_RIGHT)
this._rightEdgeDistance = rendererWidth - bottomRightPixel[0];
else if(this._rightEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.PROPORTIONAL)
this._rightEdgeDistance = bottomRightPixel[0] / rendererWidth;
//Bottom edge
if(this._bottomEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.WINDOW_TOP)
this._bottomEdgeDistance = bottomRightPixel[1];
else if(this._bottomEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.WINDOW_BOTTOM)
this._bottomEdgeDistance = rendererHeight - bottomRightPixel[1];
else if(this._bottomEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.PROPORTIONAL)
this._bottomEdgeDistance = bottomRightPixel[1] / rendererHeight;
this._invalidDistances = false;
}
else
{
//Move and resize the object if needed
var leftPixel = 0;
var topPixel = 0;
var rightPixel = 0;
var bottomPixel = 0;
//Left edge
if(this._leftEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.WINDOW_LEFT)
leftPixel = this._leftEdgeDistance;
else if(this._leftEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.WINDOW_RIGHT)
leftPixel = rendererWidth - this._leftEdgeDistance;
else if(this._leftEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.PROPORTIONAL)
leftPixel = this._leftEdgeDistance * rendererWidth;
//Top edge
if(this._topEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.WINDOW_TOP)
topPixel = this._topEdgeDistance;
else if(this._topEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.WINDOW_BOTTOM)
topPixel = rendererHeight - this._topEdgeDistance;
else if(this._topEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.PROPORTIONAL)
topPixel = this._topEdgeDistance * rendererHeight;
//Right edge
if(this._rightEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.WINDOW_LEFT)
rightPixel = this._rightEdgeDistance;
else if(this._rightEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.WINDOW_RIGHT)
rightPixel = rendererWidth - this._rightEdgeDistance;
else if(this._rightEdgeAnchor === gdjs.AnchorRuntimeBehavior.HorizontalAnchor.PROPORTIONAL)
rightPixel = this._rightEdgeDistance * rendererWidth;
//Bottom edge
if(this._bottomEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.WINDOW_TOP)
bottomPixel = this._bottomEdgeDistance;
else if(this._bottomEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.WINDOW_BOTTOM)
bottomPixel = rendererHeight - this._bottomEdgeDistance;
else if(this._bottomEdgeAnchor === gdjs.AnchorRuntimeBehavior.VerticalAnchor.PROPORTIONAL)
bottomPixel = this._bottomEdgeDistance * rendererHeight;
var topLeftCoord = layer.convertInverseCoords(leftPixel, topPixel);
var bottomRightCoord = layer.convertInverseCoords(rightPixel, bottomPixel);
//Move and resize the object according to the anchors
if(this._rightEdgeAnchor != gdjs.AnchorRuntimeBehavior.HorizontalAnchor.NONE)
this.owner.setWidth(bottomRightCoord[0] - topLeftCoord[0]);
if(this._bottomEdgeAnchor != gdjs.AnchorRuntimeBehavior.VerticalAnchor.NONE)
this.owner.setHeight(bottomRightCoord[1] - topLeftCoord[1]);
if(this._leftEdgeAnchor != gdjs.AnchorRuntimeBehavior.HorizontalAnchor.NONE)
this.owner.setX(topLeftCoord[0] + this.owner.getX() - this.owner.getDrawableX());
if(this._topEdgeAnchor != gdjs.AnchorRuntimeBehavior.VerticalAnchor.NONE)
this.owner.setY(topLeftCoord[1] + this.owner.getY() - this.owner.getDrawableY());
}
};

View File

@@ -10,6 +10,7 @@ include(CMakeUtils.txt) #Functions to factor common tasks done in CMakeLists.txt
#Add all the CMakeLists:
ADD_SUBDIRECTORY(AdMobObject)
IF (NOT EMSCRIPTEN) #Only add some extensions when compiling with emscripten.
ADD_SUBDIRECTORY(AnchorBehavior)
ADD_SUBDIRECTORY(AdvancedXML)
ADD_SUBDIRECTORY(AES)
ADD_SUBDIRECTORY(Box3DObject)
@@ -21,6 +22,7 @@ ADD_SUBDIRECTORY(DestroyOutsideBehavior)
ADD_SUBDIRECTORY(DraggableBehavior)
IF (NOT EMSCRIPTEN)
ADD_SUBDIRECTORY(Function)
ADD_SUBDIRECTORY(Inventory)
ADD_SUBDIRECTORY(Light)
ADD_SUBDIRECTORY(LinkedObjects)
ADD_SUBDIRECTORY(Network)
@@ -34,6 +36,7 @@ ADD_SUBDIRECTORY(PlatformBehavior)
IF (NOT EMSCRIPTEN)
ADD_SUBDIRECTORY(PrimitiveDrawing)
ADD_SUBDIRECTORY(SoundObject)
ADD_SUBDIRECTORY(SystemInfo)
ADD_SUBDIRECTORY(TextEntryObject)
ENDIF()
ADD_SUBDIRECTORY(TextObject)

View File

@@ -1,53 +0,0 @@
<html><!-- Created using the cpp_pretty_printer from the dlib C++ library. See http://dlib.net for updates. --><head><title>dlib C++ Library - 3d_point_cloud_ex.cpp</title></head><body bgcolor='white'><pre>
<font color='#009900'>// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
</font><font color='#009900'>/*
This is an example illustrating the use of the perspective_window tool
in the dlib C++ Library. It is a simple tool for displaying 3D point
clouds on the screen.
*/</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>gui_widgets.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>image_transforms.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>cmath<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> dlib;
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> std;
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>int</u></font> <b><a name='main'></a>main</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// Let's make a point cloud that looks like a 3D spiral.
</font> std::vector<font color='#5555FF'>&lt;</font>perspective_window::overlay_dot<font color='#5555FF'>&gt;</font> points;
dlib::rand rnd;
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>double</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> <font color='#979000'>20</font>; i<font color='#5555FF'>+</font><font color='#5555FF'>=</font><font color='#979000'>0.001</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// Get a point on a spiral
</font> dlib::vector<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>double</u></font><font color='#5555FF'>&gt;</font> <font color='#BB00BB'>val</font><font face='Lucida Console'>(</font><font color='#BB00BB'>sin</font><font face='Lucida Console'>(</font>i<font face='Lucida Console'>)</font>,<font color='#BB00BB'>cos</font><font face='Lucida Console'>(</font>i<font face='Lucida Console'>)</font>,i<font color='#5555FF'>/</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Now add some random noise to it
</font> dlib::vector<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>double</u></font><font color='#5555FF'>&gt;</font> <font color='#BB00BB'>temp</font><font face='Lucida Console'>(</font>rnd.<font color='#BB00BB'>get_random_gaussian</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,
rnd.<font color='#BB00BB'>get_random_gaussian</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,
rnd.<font color='#BB00BB'>get_random_gaussian</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
val <font color='#5555FF'>+</font><font color='#5555FF'>=</font> temp<font color='#5555FF'>/</font><font color='#979000'>20</font>;
<font color='#009900'>// Pick a color based on how far we are along the spiral
</font> rgb_pixel color <font color='#5555FF'>=</font> <font color='#BB00BB'>colormap_jet</font><font face='Lucida Console'>(</font>i,<font color='#979000'>0</font>,<font color='#979000'>20</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// And add the point to the list of points we will display
</font> points.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font>perspective_window::<font color='#BB00BB'>overlay_dot</font><font face='Lucida Console'>(</font>val, color<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// Now finally display the point cloud.
</font> perspective_window win;
win.<font color='#BB00BB'>set_title</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>perspective_window 3D point cloud</font>"<font face='Lucida Console'>)</font>;
win.<font color='#BB00BB'>add_overlay</font><font face='Lucida Console'>(</font>points<font face='Lucida Console'>)</font>;
win.<font color='#BB00BB'>wait_until_closed</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------
</font>
</pre></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,328 +0,0 @@
<html><!-- Created using the cpp_pretty_printer from the dlib C++ library. See http://dlib.net for updates. --><head><title>dlib C++ Library - assignment_learning_ex.cpp</title></head><body bgcolor='white'><pre>
<font color='#009900'>// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
</font><font color='#009900'>/*
This is an example illustrating the use of the dlib machine learning tools for
learning to solve the assignment problem.
Many tasks in computer vision or natural language processing can be thought of
as assignment problems. For example, in a computer vision application where
you are trying to track objects moving around in video, you likely need to solve
an association problem every time you get a new video frame. That is, each new
frame will contain objects (e.g. people, cars, etc.) and you will want to
determine which of these objects are actually things you have seen in previous
frames.
The assignment problem can be optimally solved using the well known Hungarian
algorithm. However, this algorithm requires the user to supply some function
which measures the "goodness" of an individual association. In many cases the
best way to measure this goodness isn't obvious and therefore machine learning
methods are used.
The remainder of this example will show you how to learn a goodness function
which is optimal, in a certain sense, for use with the Hungarian algorithm. To
do this, we will make a simple dataset of example associations and use them to
train a supervised machine learning method.
Finally, note that there is a whole example program dedicated to assignment
learning problems where you are trying to make an object tracker. So if that is
what you are interested in then take a look at the <a href="learning_to_track_ex.cpp.html">learning_to_track_ex.cpp</a>
example program.
*/</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>iostream<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>svm_threaded.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> std;
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> dlib;
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>/*
In an association problem, we will talk about the "Left Hand Set" (LHS) and the
"Right Hand Set" (RHS). The task will be to learn to map all elements of LHS to
unique elements of RHS. If an element of LHS can't be mapped to a unique element of
RHS for some reason (e.g. LHS is bigger than RHS) then it can also be mapped to the
special -1 output, indicating no mapping to RHS.
So the first step is to define the type of elements in each of these sets. In the
code below we will use column vectors in both LHS and RHS. However, in general,
they can each contain any type you like. LHS can even contain a different type
than RHS.
*/</font>
<font color='#0000FF'>typedef</font> dlib::matrix<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>double</u></font>,<font color='#979000'>0</font>,<font color='#979000'>1</font><font color='#5555FF'>&gt;</font> column_vector;
<font color='#009900'>// This type represents a pair of LHS and RHS. That is, sample_type::first
</font><font color='#009900'>// contains a left hand set and sample_type::second contains a right hand set.
</font><font color='#0000FF'>typedef</font> std::pair<font color='#5555FF'>&lt;</font>std::vector<font color='#5555FF'>&lt;</font>column_vector<font color='#5555FF'>&gt;</font>, std::vector<font color='#5555FF'>&lt;</font>column_vector<font color='#5555FF'>&gt;</font> <font color='#5555FF'>&gt;</font> sample_type;
<font color='#009900'>// This type will contain the association information between LHS and RHS. That is,
</font><font color='#009900'>// it will determine which elements of LHS map to which elements of RHS.
</font><font color='#0000FF'>typedef</font> std::vector<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>long</u></font><font color='#5555FF'>&gt;</font> label_type;
<font color='#009900'>// In this example, all our LHS and RHS elements will be 3-dimensional vectors.
</font><font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> num_dims <font color='#5555FF'>=</font> <font color='#979000'>3</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='make_data'></a>make_data</b> <font face='Lucida Console'>(</font>
std::vector<font color='#5555FF'>&lt;</font>sample_type<font color='#5555FF'>&gt;</font><font color='#5555FF'>&amp;</font> samples,
std::vector<font color='#5555FF'>&lt;</font>label_type<font color='#5555FF'>&gt;</font><font color='#5555FF'>&amp;</font> labels
<font face='Lucida Console'>)</font>;
<font color='#009900'>/*!
ensures
- This function creates a training dataset of 5 example associations.
- #samples.size() == 5
- #labels.size() == 5
- for all valid i:
- #samples[i].first == a left hand set
- #samples[i].second == a right hand set
- #labels[i] == a set of integers indicating how to map LHS to RHS. To be
precise:
- #samples[i].first.size() == #labels[i].size()
- for all valid j:
-1 &lt;= #labels[i][j] &lt; #samples[i].second.size()
(A value of -1 indicates that #samples[i].first[j] isn't associated with anything.
All other values indicate the associating element of #samples[i].second)
- All elements of #labels[i] which are not equal to -1 are unique. That is,
multiple elements of #samples[i].first can't associate to the same element
in #samples[i].second.
!*/</font>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'>struct</font> <b><a name='feature_extractor'></a>feature_extractor</b>
<b>{</b>
<font color='#009900'>/*!
Recall that our task is to learn the "goodness of assignment" function for
use with the Hungarian algorithm. The dlib tools assume this function
can be written as:
match_score(l,r) == dot(w, PSI(l,r)) + bias
where l is an element of LHS, r is an element of RHS, w is a parameter vector,
bias is a scalar value, and PSI() is a user supplied feature extractor.
This feature_extractor is where we implement PSI(). How you implement this
is highly problem dependent.
!*/</font>
<font color='#009900'>// The type of feature vector returned from get_features(). This must be either
</font> <font color='#009900'>// a dlib::matrix or a sparse vector.
</font> <font color='#0000FF'>typedef</font> column_vector feature_vector_type;
<font color='#009900'>// The types of elements in the LHS and RHS sets
</font> <font color='#0000FF'>typedef</font> column_vector lhs_element;
<font color='#0000FF'>typedef</font> column_vector rhs_element;
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <b><a name='num_features'></a>num_features</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#0000FF'>const</font>
<b>{</b>
<font color='#009900'>// Return the dimensionality of feature vectors produced by get_features()
</font> <font color='#0000FF'>return</font> num_dims;
<b>}</b>
<font color='#0000FF'><u>void</u></font> <b><a name='get_features'></a>get_features</b> <font face='Lucida Console'>(</font>
<font color='#0000FF'>const</font> lhs_element<font color='#5555FF'>&amp;</font> left,
<font color='#0000FF'>const</font> rhs_element<font color='#5555FF'>&amp;</font> right,
feature_vector_type<font color='#5555FF'>&amp;</font> feats
<font face='Lucida Console'>)</font> <font color='#0000FF'>const</font>
<font color='#009900'>/*!
ensures
- #feats == PSI(left,right)
(i.e. This function computes a feature vector which, in some sense,
captures information useful for deciding if matching left to right
is "good").
!*/</font>
<b>{</b>
<font color='#009900'>// Let's just use the squared difference between each vector as our features.
</font> <font color='#009900'>// However, it should be emphasized that how to compute the features here is very
</font> <font color='#009900'>// problem dependent.
</font> feats <font color='#5555FF'>=</font> <font color='#BB00BB'>squared</font><font face='Lucida Console'>(</font>left <font color='#5555FF'>-</font> right<font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>;
<font color='#009900'>// We need to define serialize() and deserialize() for our feature extractor if we want
</font><font color='#009900'>// to be able to serialize and deserialize our learned models. In this case the
</font><font color='#009900'>// implementation is empty since our feature_extractor doesn't have any state. But you
</font><font color='#009900'>// might define more complex feature extractors which have state that needs to be saved.
</font><font color='#0000FF'><u>void</u></font> <b><a name='serialize'></a>serialize</b> <font face='Lucida Console'>(</font><font color='#0000FF'>const</font> feature_extractor<font color='#5555FF'>&amp;</font> , std::ostream<font color='#5555FF'>&amp;</font> <font face='Lucida Console'>)</font> <b>{</b><b>}</b>
<font color='#0000FF'><u>void</u></font> <b><a name='deserialize'></a>deserialize</b> <font face='Lucida Console'>(</font>feature_extractor<font color='#5555FF'>&amp;</font> , std::istream<font color='#5555FF'>&amp;</font> <font face='Lucida Console'>)</font> <b>{</b><b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>int</u></font> <b><a name='main'></a>main</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>try</font>
<b>{</b>
<font color='#009900'>// Get a small bit of training data.
</font> std::vector<font color='#5555FF'>&lt;</font>sample_type<font color='#5555FF'>&gt;</font> samples;
std::vector<font color='#5555FF'>&lt;</font>label_type<font color='#5555FF'>&gt;</font> labels;
<font color='#BB00BB'>make_data</font><font face='Lucida Console'>(</font>samples, labels<font face='Lucida Console'>)</font>;
structural_assignment_trainer<font color='#5555FF'>&lt;</font>feature_extractor<font color='#5555FF'>&gt;</font> trainer;
<font color='#009900'>// This is the common SVM C parameter. Larger values encourage the
</font> <font color='#009900'>// trainer to attempt to fit the data exactly but might overfit.
</font> <font color='#009900'>// In general, you determine this parameter by cross-validation.
</font> trainer.<font color='#BB00BB'>set_c</font><font face='Lucida Console'>(</font><font color='#979000'>10</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// This trainer can use multiple CPU cores to speed up the training.
</font> <font color='#009900'>// So set this to the number of available CPU cores.
</font> trainer.<font color='#BB00BB'>set_num_threads</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Do the training and save the results in assigner.
</font> assignment_function<font color='#5555FF'>&lt;</font>feature_extractor<font color='#5555FF'>&gt;</font> assigner <font color='#5555FF'>=</font> trainer.<font color='#BB00BB'>train</font><font face='Lucida Console'>(</font>samples, labels<font face='Lucida Console'>)</font>;
<font color='#009900'>// Test the assigner on our data. The output will indicate that it makes the
</font> <font color='#009900'>// correct associations on all samples.
</font> cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Test the learned assignment function: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> samples.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// Predict the assignments for the LHS and RHS in samples[i].
</font> std::vector<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>long</u></font><font color='#5555FF'>&gt;</font> predicted_assignments <font color='#5555FF'>=</font> <font color='#BB00BB'>assigner</font><font face='Lucida Console'>(</font>samples[i]<font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>true labels: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#BB00BB'>trans</font><font face='Lucida Console'>(</font><font color='#BB00BB'>mat</font><font face='Lucida Console'>(</font>labels[i]<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>predicted labels: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#BB00BB'>trans</font><font face='Lucida Console'>(</font><font color='#BB00BB'>mat</font><font face='Lucida Console'>(</font>predicted_assignments<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<font color='#009900'>// We can also use this tool to compute the percentage of assignments predicted correctly.
</font> cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>training accuracy: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#BB00BB'>test_assignment_function</font><font face='Lucida Console'>(</font>assigner, samples, labels<font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#009900'>// Since testing on your training data is a really bad idea, we can also do 5-fold cross validation.
</font> <font color='#009900'>// Happily, this also indicates that all associations were made correctly.
</font> <font color='#BB00BB'>randomize_samples</font><font face='Lucida Console'>(</font>samples, labels<font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>cv accuracy: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font color='#BB00BB'>cross_validate_assignment_trainer</font><font face='Lucida Console'>(</font>trainer, samples, labels, <font color='#979000'>5</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#009900'>// Finally, the assigner can be serialized to disk just like most dlib objects.
</font> <font color='#BB00BB'>serialize</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>assigner.dat</font>"<font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> assigner;
<font color='#009900'>// recall from disk
</font> <font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>assigner.dat</font>"<font face='Lucida Console'>)</font> <font color='#5555FF'>&gt;</font><font color='#5555FF'>&gt;</font> assigner;
<b>}</b>
<font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>std::exception<font color='#5555FF'>&amp;</font> e<font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>EXCEPTION THROWN</font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> e.<font color='#BB00BB'>what</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> <b><a name='make_data'></a>make_data</b> <font face='Lucida Console'>(</font>
std::vector<font color='#5555FF'>&lt;</font>sample_type<font color='#5555FF'>&gt;</font><font color='#5555FF'>&amp;</font> samples,
std::vector<font color='#5555FF'>&lt;</font>label_type<font color='#5555FF'>&gt;</font><font color='#5555FF'>&amp;</font> labels
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// Make four different vectors. We will use them to make example assignments.
</font> column_vector <font color='#BB00BB'>A</font><font face='Lucida Console'>(</font>num_dims<font face='Lucida Console'>)</font>, <font color='#BB00BB'>B</font><font face='Lucida Console'>(</font>num_dims<font face='Lucida Console'>)</font>, <font color='#BB00BB'>C</font><font face='Lucida Console'>(</font>num_dims<font face='Lucida Console'>)</font>, <font color='#BB00BB'>D</font><font face='Lucida Console'>(</font>num_dims<font face='Lucida Console'>)</font>;
A <font color='#5555FF'>=</font> <font color='#979000'>1</font>,<font color='#979000'>0</font>,<font color='#979000'>0</font>;
B <font color='#5555FF'>=</font> <font color='#979000'>0</font>,<font color='#979000'>1</font>,<font color='#979000'>0</font>;
C <font color='#5555FF'>=</font> <font color='#979000'>0</font>,<font color='#979000'>0</font>,<font color='#979000'>1</font>;
D <font color='#5555FF'>=</font> <font color='#979000'>0</font>,<font color='#979000'>1</font>,<font color='#979000'>1</font>;
std::vector<font color='#5555FF'>&lt;</font>column_vector<font color='#5555FF'>&gt;</font> lhs;
std::vector<font color='#5555FF'>&lt;</font>column_vector<font color='#5555FF'>&gt;</font> rhs;
label_type mapping;
<font color='#009900'>// In all the assignments to follow, we will only say an element of the LHS
</font> <font color='#009900'>// matches an element of the RHS if the two are equal. So A matches with A,
</font> <font color='#009900'>// B with B, etc. But never A with C, for example.
</font> <font color='#009900'>// ------------------------
</font>
lhs.<font color='#BB00BB'>resize</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>;
lhs[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> A;
lhs[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> B;
lhs[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> C;
rhs.<font color='#BB00BB'>resize</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>;
rhs[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> B;
rhs[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> A;
rhs[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> C;
mapping.<font color='#BB00BB'>resize</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>;
mapping[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font color='#979000'>1</font>; <font color='#009900'>// lhs[0] matches rhs[1]
</font> mapping[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> <font color='#979000'>0</font>; <font color='#009900'>// lhs[1] matches rhs[0]
</font> mapping[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> <font color='#979000'>2</font>; <font color='#009900'>// lhs[2] matches rhs[2]
</font>
samples.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font><font color='#BB00BB'>make_pair</font><font face='Lucida Console'>(</font>lhs,rhs<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
labels.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font>mapping<font face='Lucida Console'>)</font>;
<font color='#009900'>// ------------------------
</font>
lhs[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> C;
lhs[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> A;
lhs[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> B;
rhs[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> A;
rhs[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> B;
rhs[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> D;
mapping[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>; <font color='#009900'>// The -1 indicates that lhs[0] doesn't match anything in rhs.
</font> mapping[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> <font color='#979000'>0</font>; <font color='#009900'>// lhs[1] matches rhs[0]
</font> mapping[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> <font color='#979000'>1</font>; <font color='#009900'>// lhs[2] matches rhs[1]
</font>
samples.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font><font color='#BB00BB'>make_pair</font><font face='Lucida Console'>(</font>lhs,rhs<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
labels.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font>mapping<font face='Lucida Console'>)</font>;
<font color='#009900'>// ------------------------
</font>
lhs[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> A;
lhs[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> B;
lhs[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> C;
rhs.<font color='#BB00BB'>resize</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>;
rhs[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> C;
rhs[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> B;
rhs[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> A;
rhs[<font color='#979000'>3</font>] <font color='#5555FF'>=</font> D;
mapping[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font color='#979000'>2</font>;
mapping[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
mapping[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
samples.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font><font color='#BB00BB'>make_pair</font><font face='Lucida Console'>(</font>lhs,rhs<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
labels.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font>mapping<font face='Lucida Console'>)</font>;
<font color='#009900'>// ------------------------
</font>
lhs.<font color='#BB00BB'>resize</font><font face='Lucida Console'>(</font><font color='#979000'>2</font><font face='Lucida Console'>)</font>;
lhs[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> B;
lhs[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> C;
rhs.<font color='#BB00BB'>resize</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>;
rhs[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> C;
rhs[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> A;
rhs[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> D;
mapping.<font color='#BB00BB'>resize</font><font face='Lucida Console'>(</font><font color='#979000'>2</font><font face='Lucida Console'>)</font>;
mapping[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>;
mapping[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
samples.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font><font color='#BB00BB'>make_pair</font><font face='Lucida Console'>(</font>lhs,rhs<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
labels.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font>mapping<font face='Lucida Console'>)</font>;
<font color='#009900'>// ------------------------
</font>
lhs.<font color='#BB00BB'>resize</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>;
lhs[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> D;
lhs[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> B;
lhs[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> C;
<font color='#009900'>// rhs will be empty. So none of the items in lhs can match anything.
</font> rhs.<font color='#BB00BB'>resize</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font>;
mapping.<font color='#BB00BB'>resize</font><font face='Lucida Console'>(</font><font color='#979000'>3</font><font face='Lucida Console'>)</font>;
mapping[<font color='#979000'>0</font>] <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>;
mapping[<font color='#979000'>1</font>] <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>;
mapping[<font color='#979000'>2</font>] <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1</font>;
samples.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font><font color='#BB00BB'>make_pair</font><font face='Lucida Console'>(</font>lhs,rhs<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
labels.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font>mapping<font face='Lucida Console'>)</font>;
<b>}</b>
</pre></body></html>

File diff suppressed because one or more lines are too long

View File

@@ -1,310 +0,0 @@
<html><!-- Created using the cpp_pretty_printer from the dlib C++ library. See http://dlib.net for updates. --><head><title>dlib C++ Library - bayes_net_ex.cpp</title></head><body bgcolor='white'><pre>
<font color='#009900'>// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
</font><font color='#009900'>/*
This is an example illustrating the use of the Bayesian Network
inference utilities found in the dlib C++ library.
In this example all the nodes in the Bayesian network are
boolean variables. That is, they take on either the value
0 or the value 1.
The network contains 4 nodes and looks as follows:
B C
\\ //
\/ \/
A
||
\/
D
The probabilities of each node are summarized below. (The probability
of each node being 0 is not listed since it is just P(X=0) = 1-p(X=1) )
p(B=1) = 0.01
p(C=1) = 0.001
p(A=1 | B=0, C=0) = 0.01
p(A=1 | B=0, C=1) = 0.5
p(A=1 | B=1, C=0) = 0.9
p(A=1 | B=1, C=1) = 0.99
p(D=1 | A=0) = 0.2
p(D=1 | A=1) = 0.5
*/</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>bayes_utils.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>graph_utils.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>graph.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>directed_graph.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>iostream<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> dlib;
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> std;
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>int</u></font> <b><a name='main'></a>main</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>try</font>
<b>{</b>
<font color='#009900'>// There are many useful convenience functions in this namespace. They all
</font> <font color='#009900'>// perform simple access or modify operations on the nodes of a bayesian network.
</font> <font color='#009900'>// You don't have to use them but they are convenient and they also will check for
</font> <font color='#009900'>// various errors in your bayesian network when your application is built with
</font> <font color='#009900'>// the DEBUG or ENABLE_ASSERTS preprocessor definitions defined. So their use
</font> <font color='#009900'>// is recommended. In fact, most of the global functions used in this example
</font> <font color='#009900'>// program are from this namespace.
</font> <font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> bayes_node_utils;
<font color='#009900'>// This statement declares a bayesian network called bn. Note that a bayesian network
</font> <font color='#009900'>// in the dlib world is just a directed_graph object that contains a special kind
</font> <font color='#009900'>// of node called a bayes_node.
</font> directed_graph<font color='#5555FF'>&lt;</font>bayes_node<font color='#5555FF'>&gt;</font>::kernel_1a_c bn;
<font color='#009900'>// Use an enum to make some more readable names for our nodes.
</font> <font color='#0000FF'>enum</font> <b><a name='nodes'></a>nodes</b>
<b>{</b>
A <font color='#5555FF'>=</font> <font color='#979000'>0</font>,
B <font color='#5555FF'>=</font> <font color='#979000'>1</font>,
C <font color='#5555FF'>=</font> <font color='#979000'>2</font>,
D <font color='#5555FF'>=</font> <font color='#979000'>3</font>
<b>}</b>;
<font color='#009900'>// The next few blocks of code setup our bayesian network.
</font>
<font color='#009900'>// The first thing we do is tell the bn object how many nodes it has
</font> <font color='#009900'>// and also add the three edges. Again, we are using the network
</font> <font color='#009900'>// shown in ASCII art at the top of this file.
</font> bn.<font color='#BB00BB'>set_number_of_nodes</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>;
bn.<font color='#BB00BB'>add_edge</font><font face='Lucida Console'>(</font>A, D<font face='Lucida Console'>)</font>;
bn.<font color='#BB00BB'>add_edge</font><font face='Lucida Console'>(</font>B, A<font face='Lucida Console'>)</font>;
bn.<font color='#BB00BB'>add_edge</font><font face='Lucida Console'>(</font>C, A<font face='Lucida Console'>)</font>;
<font color='#009900'>// Now we inform all the nodes in the network that they are binary
</font> <font color='#009900'>// nodes. That is, they only have two possible values.
</font> <font color='#BB00BB'>set_node_num_values</font><font face='Lucida Console'>(</font>bn, A, <font color='#979000'>2</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_node_num_values</font><font face='Lucida Console'>(</font>bn, B, <font color='#979000'>2</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_node_num_values</font><font face='Lucida Console'>(</font>bn, C, <font color='#979000'>2</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_node_num_values</font><font face='Lucida Console'>(</font>bn, D, <font color='#979000'>2</font><font face='Lucida Console'>)</font>;
assignment parent_state;
<font color='#009900'>// Now we will enter all the conditional probability information for each node.
</font> <font color='#009900'>// Each node's conditional probability is dependent on the state of its parents.
</font> <font color='#009900'>// To specify this state we need to use the assignment object. This assignment
</font> <font color='#009900'>// object allows us to specify the state of each nodes parents.
</font>
<font color='#009900'>// Here we specify that p(B=1) = 0.01
</font> <font color='#009900'>// parent_state is empty in this case since B is a root node.
</font> <font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, B, <font color='#979000'>1</font>, parent_state, <font color='#979000'>0.01</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Here we specify that p(B=0) = 1-0.01
</font> <font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, B, <font color='#979000'>0</font>, parent_state, <font color='#979000'>1</font><font color='#5555FF'>-</font><font color='#979000'>0.01</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Here we specify that p(C=1) = 0.001
</font> <font color='#009900'>// parent_state is empty in this case since B is a root node.
</font> <font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, C, <font color='#979000'>1</font>, parent_state, <font color='#979000'>0.001</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Here we specify that p(C=0) = 1-0.001
</font> <font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, C, <font color='#979000'>0</font>, parent_state, <font color='#979000'>1</font><font color='#5555FF'>-</font><font color='#979000'>0.001</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// This is our first node that has parents. So we set the parent_state
</font> <font color='#009900'>// object to reflect that A has both B and C as parents.
</font> parent_state.<font color='#BB00BB'>add</font><font face='Lucida Console'>(</font>B, <font color='#979000'>1</font><font face='Lucida Console'>)</font>;
parent_state.<font color='#BB00BB'>add</font><font face='Lucida Console'>(</font>C, <font color='#979000'>1</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Here we specify that p(A=1 | B=1, C=1) = 0.99
</font> <font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, A, <font color='#979000'>1</font>, parent_state, <font color='#979000'>0.99</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Here we specify that p(A=0 | B=1, C=1) = 1-0.99
</font> <font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, A, <font color='#979000'>0</font>, parent_state, <font color='#979000'>1</font><font color='#5555FF'>-</font><font color='#979000'>0.99</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Here we use the [] notation because B and C have already
</font> <font color='#009900'>// been added into parent state.
</font> parent_state[B] <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
parent_state[C] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
<font color='#009900'>// Here we specify that p(A=1 | B=1, C=0) = 0.9
</font> <font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, A, <font color='#979000'>1</font>, parent_state, <font color='#979000'>0.9</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, A, <font color='#979000'>0</font>, parent_state, <font color='#979000'>1</font><font color='#5555FF'>-</font><font color='#979000'>0.9</font><font face='Lucida Console'>)</font>;
parent_state[B] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
parent_state[C] <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
<font color='#009900'>// Here we specify that p(A=1 | B=0, C=1) = 0.5
</font> <font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, A, <font color='#979000'>1</font>, parent_state, <font color='#979000'>0.5</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, A, <font color='#979000'>0</font>, parent_state, <font color='#979000'>1</font><font color='#5555FF'>-</font><font color='#979000'>0.5</font><font face='Lucida Console'>)</font>;
parent_state[B] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
parent_state[C] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
<font color='#009900'>// Here we specify that p(A=1 | B=0, C=0) = 0.01
</font> <font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, A, <font color='#979000'>1</font>, parent_state, <font color='#979000'>0.01</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, A, <font color='#979000'>0</font>, parent_state, <font color='#979000'>1</font><font color='#5555FF'>-</font><font color='#979000'>0.01</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Here we set probabilities for node D.
</font> <font color='#009900'>// First we clear out parent state so that it doesn't have any of
</font> <font color='#009900'>// the assignments for the B and C nodes used above.
</font> parent_state.<font color='#BB00BB'>clear</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
parent_state.<font color='#BB00BB'>add</font><font face='Lucida Console'>(</font>A,<font color='#979000'>1</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Here we specify that p(D=1 | A=1) = 0.5
</font> <font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, D, <font color='#979000'>1</font>, parent_state, <font color='#979000'>0.5</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, D, <font color='#979000'>0</font>, parent_state, <font color='#979000'>1</font><font color='#5555FF'>-</font><font color='#979000'>0.5</font><font face='Lucida Console'>)</font>;
parent_state[A] <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
<font color='#009900'>// Here we specify that p(D=1 | A=0) = 0.2
</font> <font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, D, <font color='#979000'>1</font>, parent_state, <font color='#979000'>0.2</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_node_probability</font><font face='Lucida Console'>(</font>bn, D, <font color='#979000'>0</font>, parent_state, <font color='#979000'>1</font><font color='#5555FF'>-</font><font color='#979000'>0.2</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// We have now finished setting up our bayesian network. So let's compute some
</font> <font color='#009900'>// probability values. The first thing we will do is compute the prior probability
</font> <font color='#009900'>// of each node in the network. To do this we will use the join tree algorithm which
</font> <font color='#009900'>// is an algorithm for performing exact inference in a bayesian network.
</font>
<font color='#009900'>// First we need to create an undirected graph which contains set objects at each node and
</font> <font color='#009900'>// edge. This long declaration does the trick.
</font> <font color='#0000FF'>typedef</font> dlib::set<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font color='#5555FF'>&gt;</font>::compare_1b_c set_type;
<font color='#0000FF'>typedef</font> graph<font color='#5555FF'>&lt;</font>set_type, set_type<font color='#5555FF'>&gt;</font>::kernel_1a_c join_tree_type;
join_tree_type join_tree;
<font color='#009900'>// Now we need to populate the join_tree with data from our bayesian network. The next
</font> <font color='#009900'>// function calls do this. Explaining exactly what they do is outside the scope of this
</font> <font color='#009900'>// example. Just think of them as filling join_tree with information that is useful
</font> <font color='#009900'>// later on for dealing with our bayesian network.
</font> <font color='#BB00BB'>create_moral_graph</font><font face='Lucida Console'>(</font>bn, join_tree<font face='Lucida Console'>)</font>;
<font color='#BB00BB'>create_join_tree</font><font face='Lucida Console'>(</font>join_tree, join_tree<font face='Lucida Console'>)</font>;
<font color='#009900'>// Now that we have a proper join_tree we can use it to obtain a solution to our
</font> <font color='#009900'>// bayesian network. Doing this is as simple as declaring an instance of
</font> <font color='#009900'>// the bayesian_network_join_tree object as follows:
</font> bayesian_network_join_tree <font color='#BB00BB'>solution</font><font face='Lucida Console'>(</font>bn, join_tree<font face='Lucida Console'>)</font>;
<font color='#009900'>// now print out the probabilities for each node
</font> cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Using the join tree algorithm:\n</font>";
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(A=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>A<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(A=0) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>A<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(B=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>B<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(B=0) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>B<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>C<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(C=0) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>C<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(D=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>D<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(D=0) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>D<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>\n\n\n</font>";
<font color='#009900'>// Now to make things more interesting let's say that we have discovered that the C
</font> <font color='#009900'>// node really has a value of 1. That is to say, we now have evidence that
</font> <font color='#009900'>// C is 1. We can represent this in the network using the following two function
</font> <font color='#009900'>// calls.
</font> <font color='#BB00BB'>set_node_value</font><font face='Lucida Console'>(</font>bn, C, <font color='#979000'>1</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_node_as_evidence</font><font face='Lucida Console'>(</font>bn, C<font face='Lucida Console'>)</font>;
<font color='#009900'>// Now we want to compute the probabilities of all the nodes in the network again
</font> <font color='#009900'>// given that we now know that C is 1. We can do this as follows:
</font> bayesian_network_join_tree <font color='#BB00BB'>solution_with_evidence</font><font face='Lucida Console'>(</font>bn, join_tree<font face='Lucida Console'>)</font>;
<font color='#009900'>// now print out the probabilities for each node
</font> cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Using the join tree algorithm:\n</font>";
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(A=1 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution_with_evidence.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>A<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(A=0 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution_with_evidence.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>A<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(B=1 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution_with_evidence.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>B<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(B=0 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution_with_evidence.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>B<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(C=1 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution_with_evidence.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>C<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(C=0 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution_with_evidence.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>C<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(D=1 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution_with_evidence.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>D<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(D=0 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution_with_evidence.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>D<font face='Lucida Console'>)</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>\n\n\n</font>";
<font color='#009900'>// Note that when we made our solution_with_evidence object we reused our join_tree object.
</font> <font color='#009900'>// This saves us the time it takes to calculate the join_tree object from scratch. But
</font> <font color='#009900'>// it is important to note that we can only reuse the join_tree object if we haven't changed
</font> <font color='#009900'>// the structure of our bayesian network. That is, if we have added or removed nodes or
</font> <font color='#009900'>// edges from our bayesian network then we must recompute our join_tree. But in this example
</font> <font color='#009900'>// all we did was change the value of a bayes_node object (we made node C be evidence)
</font> <font color='#009900'>// so we are ok.
</font>
<font color='#009900'>// Next this example will show you how to use the bayesian_network_gibbs_sampler object
</font> <font color='#009900'>// to perform approximate inference in a bayesian network. This is an algorithm
</font> <font color='#009900'>// that doesn't give you an exact solution but it may be necessary to use in some
</font> <font color='#009900'>// instances. For example, the join tree algorithm used above, while fast in many
</font> <font color='#009900'>// instances, has exponential runtime in some cases. Moreover, inference in bayesian
</font> <font color='#009900'>// networks is NP-Hard for general networks so sometimes the best you can do is
</font> <font color='#009900'>// find an approximation.
</font> <font color='#009900'>// However, it should be noted that the gibbs sampler does not compute the correct
</font> <font color='#009900'>// probabilities if the network contains a deterministic node. That is, if any
</font> <font color='#009900'>// of the conditional probability tables in the bayesian network have a probability
</font> <font color='#009900'>// of 1.0 for something the gibbs sampler should not be used.
</font>
<font color='#009900'>// This Gibbs sampler algorithm works by randomly sampling possibles values of the
</font> <font color='#009900'>// network. So to use it we should set the network to some initial state.
</font>
<font color='#BB00BB'>set_node_value</font><font face='Lucida Console'>(</font>bn, A, <font color='#979000'>0</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_node_value</font><font face='Lucida Console'>(</font>bn, B, <font color='#979000'>0</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_node_value</font><font face='Lucida Console'>(</font>bn, D, <font color='#979000'>0</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// We will leave the C node with a value of 1 and keep it as an evidence node.
</font>
<font color='#009900'>// First create an instance of the gibbs sampler object
</font> bayesian_network_gibbs_sampler sampler;
<font color='#009900'>// To use this algorithm all we do is go into a loop for a certain number of times
</font> <font color='#009900'>// and each time through we sample the bayesian network. Then we count how
</font> <font color='#009900'>// many times a node has a certain state. Then the probability of that node
</font> <font color='#009900'>// having that state is just its count/total times through the loop.
</font>
<font color='#009900'>// The following code illustrates the general procedure.
</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> A_count <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> B_count <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> C_count <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> D_count <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
<font color='#009900'>// The more times you let the loop run the more accurate the result will be. Here we loop
</font> <font color='#009900'>// 2000 times.
</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>long</u></font> rounds <font color='#5555FF'>=</font> <font color='#979000'>2000</font>;
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>long</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> rounds; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font>
<b>{</b>
sampler.<font color='#BB00BB'>sample_graph</font><font face='Lucida Console'>(</font>bn<font face='Lucida Console'>)</font>;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>node_value</font><font face='Lucida Console'>(</font>bn, A<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>A_count;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>node_value</font><font face='Lucida Console'>(</font>bn, B<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>B_count;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>node_value</font><font face='Lucida Console'>(</font>bn, C<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>C_count;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>node_value</font><font face='Lucida Console'>(</font>bn, D<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>D_count;
<b>}</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Using the approximate Gibbs Sampler algorithm:\n</font>";
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(A=1 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>double</u></font><font face='Lucida Console'>)</font>A_count<font color='#5555FF'>/</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>double</u></font><font face='Lucida Console'>)</font>rounds <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(B=1 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>double</u></font><font face='Lucida Console'>)</font>B_count<font color='#5555FF'>/</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>double</u></font><font face='Lucida Console'>)</font>rounds <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(C=1 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>double</u></font><font face='Lucida Console'>)</font>C_count<font color='#5555FF'>/</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>double</u></font><font face='Lucida Console'>)</font>rounds <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(D=1 | C=1) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>double</u></font><font face='Lucida Console'>)</font>D_count<font color='#5555FF'>/</font><font face='Lucida Console'>(</font><font color='#0000FF'><u>double</u></font><font face='Lucida Console'>)</font>rounds <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>std::exception<font color='#5555FF'>&amp;</font> e<font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>exception thrown: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> e.<font color='#BB00BB'>what</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>hit enter to terminate</font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cin.<font color='#BB00BB'>get</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
</pre></body></html>

View File

@@ -1,86 +0,0 @@
<html><!-- Created using the cpp_pretty_printer from the dlib C++ library. See http://dlib.net for updates. --><head><title>dlib C++ Library - bayes_net_from_disk_ex.cpp</title></head><body bgcolor='white'><pre>
<font color='#009900'>// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
</font><font color='#009900'>/*
This is an example illustrating the use of the Bayesian Network
inference utilities found in the dlib C++ library. In this example
we load a saved Bayesian Network from disk.
*/</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>bayes_utils.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>graph_utils.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>graph.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>directed_graph.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>iostream<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>fstream<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> dlib;
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> std;
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>int</u></font> <b><a name='main'></a>main</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font> argc, <font color='#0000FF'><u>char</u></font><font color='#5555FF'>*</font><font color='#5555FF'>*</font> argv<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>try</font>
<b>{</b>
<font color='#009900'>// This statement declares a bayesian network called bn. Note that a bayesian network
</font> <font color='#009900'>// in the dlib world is just a directed_graph object that contains a special kind
</font> <font color='#009900'>// of node called a bayes_node.
</font> directed_graph<font color='#5555FF'>&lt;</font>bayes_node<font color='#5555FF'>&gt;</font>::kernel_1a_c bn;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>argc <font color='#5555FF'>!</font><font color='#5555FF'>=</font> <font color='#979000'>2</font><font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>You must supply a file name on the command line. The file should </font>"
<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>contain a serialized Bayesian Network</font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#0000FF'>return</font> <font color='#979000'>1</font>;
<b>}</b>
ifstream <font color='#BB00BB'>fin</font><font face='Lucida Console'>(</font>argv[<font color='#979000'>1</font>],ios::binary<font face='Lucida Console'>)</font>;
<font color='#009900'>// Note that the saved networks produced by the <a href="bayes_net_gui_ex.cpp.html">bayes_net_gui_ex.cpp</a> example can be deserialized
</font> <font color='#009900'>// into a network. So you can make your networks using that GUI if you like.
</font> cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Loading the network from disk...</font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>bn, fin<font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Number of nodes in the network: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> bn.<font color='#BB00BB'>number_of_nodes</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#009900'>// Let's compute some probability values using the loaded network using the join tree (aka. Junction
</font> <font color='#009900'>// Tree) algorithm.
</font>
<font color='#009900'>// First we need to create an undirected graph which contains set objects at each node and
</font> <font color='#009900'>// edge. This long declaration does the trick.
</font> <font color='#0000FF'>typedef</font> graph<font color='#5555FF'>&lt;</font>dlib::set<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font color='#5555FF'>&gt;</font>::compare_1b_c, dlib::set<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font color='#5555FF'>&gt;</font>::compare_1b_c<font color='#5555FF'>&gt;</font>::kernel_1a_c join_tree_type;
join_tree_type join_tree;
<font color='#009900'>// Now we need to populate the join_tree with data from our bayesian network. The next two
</font> <font color='#009900'>// function calls do this. Explaining exactly what they do is outside the scope of this
</font> <font color='#009900'>// example. Just think of them as filling join_tree with information that is useful
</font> <font color='#009900'>// later on for dealing with our bayesian network.
</font> <font color='#BB00BB'>create_moral_graph</font><font face='Lucida Console'>(</font>bn, join_tree<font face='Lucida Console'>)</font>;
<font color='#BB00BB'>create_join_tree</font><font face='Lucida Console'>(</font>join_tree, join_tree<font face='Lucida Console'>)</font>;
<font color='#009900'>// Now we have a proper join_tree we can use it to obtain a solution to our
</font> <font color='#009900'>// bayesian network. Doing this is as simple as declaring an instance of
</font> <font color='#009900'>// the bayesian_network_join_tree object as follows:
</font> bayesian_network_join_tree <font color='#BB00BB'>solution</font><font face='Lucida Console'>(</font>bn, join_tree<font face='Lucida Console'>)</font>;
<font color='#009900'>// now print out the probabilities for each node
</font> cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Using the join tree algorithm:\n</font>";
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> bn.<font color='#BB00BB'>number_of_nodes</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// print out the probability distribution for node i.
</font> cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>p(node </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> i <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font>"<font color='#CC0000'>) = </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> solution.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>i<font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
<font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>exception<font color='#5555FF'>&amp;</font> e<font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>exception thrown: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> e.<font color='#BB00BB'>what</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#0000FF'>return</font> <font color='#979000'>1</font>;
<b>}</b>
<b>}</b>
</pre></body></html>

View File

@@ -1,991 +0,0 @@
<html><!-- Created using the cpp_pretty_printer from the dlib C++ library. See http://dlib.net for updates. --><head><title>dlib C++ Library - bayes_net_gui_ex.cpp</title></head><body bgcolor='white'><pre>
<font color='#009900'>// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
</font><font color='#009900'>/*
This is a rather involved example illustrating the use of the GUI api from
the dlib C++ Library. This program is a fully functional utility for
creating Bayesian Networks. It allows the user to graphically draw the network,
save/load the network to/from disk, and also to calculate the posterior
probability of any node in the network given a set of evidence.
This is not the first dlib example program you should be looking at. If you
want to see a simpler GUI example please look at the <a href="gui_api_ex.cpp.html">gui_api_ex.cpp</a> or
<a href="image_ex.cpp.html">image_ex.cpp</a> example.
If you want to understand how to use the Bayesian Network utilities in the library
you should definitely look at the <a href="bayes_net_ex.cpp.html">bayes_net_ex.cpp</a> example program. It gives a
comprehensive introduction to creating and manipulating Bayesian Networks. If you
want to see how to load a saved network from disk and use it in a non-GUI application
then look at the <a href="bayes_net_from_disk_ex.cpp.html">bayes_net_from_disk_ex.cpp</a> example.
Now all of that being said, if you have already looked at the other relevant
examples and want to see a more in-depth example then by all means, continue reading. :)
*/</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>gui_widgets.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>sstream<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>string<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>directed_graph.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>string.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>bayes_utils.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>smart_pointers.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>set.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>graph_utils.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>stl_checked.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> std;
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> dlib;
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> dlib::bayes_node_utils;
<font color='#009900'>// ----------------------------------------------------------------------------
</font>
<font color='#0000FF'>typedef</font> directed_graph<font color='#5555FF'>&lt;</font>bayes_node<font color='#5555FF'>&gt;</font>::kernel_1a_c directed_graph_type;
<font color='#0000FF'>typedef</font> directed_graph<font color='#5555FF'>&lt;</font>bayes_node<font color='#5555FF'>&gt;</font>::kernel_1a_c::node_type node_type;
<font color='#0000FF'>typedef</font> graph<font color='#5555FF'>&lt;</font>dlib::set<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font color='#5555FF'>&gt;</font>::compare_1b_c, dlib::set<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font><font color='#5555FF'>&gt;</font>::compare_1b_c<font color='#5555FF'>&gt;</font>::kernel_1a_c join_tree_type;
<font color='#009900'>// ----------------------------------------------------------------------------
</font>
<font color='#0000FF'>class</font> <b><a name='main_window'></a>main_window</b> : <font color='#0000FF'>public</font> drawable_window
<b>{</b>
<font color='#009900'>/*!
INITIAL VALUE
This window starts out hidden and with an empty Bayesian Network
WHAT THIS OBJECT REPRESENTS
This object is the main window of a utility for drawing Bayesian Networks.
It allows you to draw a directed graph and to set the conditional probability
tables up for each node in the network. It also allows you to compute the
posterior probability of each node. And finally, it lets you save and load
networks from file
!*/</font>
<font color='#0000FF'>public</font>:
<b><a name='main_window'></a>main_window</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
~<b><a name='main_window'></a>main_window</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>private</font>:
<font color='#009900'>// Private helper methods
</font>
<font color='#0000FF'><u>void</u></font> <b><a name='initialize_node_cpt_if_necessary'></a>initialize_node_cpt_if_necessary</b> <font face='Lucida Console'>(</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> index <font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='load_selected_node_tables_into_cpt_grid'></a>load_selected_node_tables_into_cpt_grid</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='load_selected_node_tables_into_ppt_grid'></a>load_selected_node_tables_into_ppt_grid</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='no_node_selected'></a>no_node_selected</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Event handlers
</font>
<font color='#0000FF'><u>void</u></font> <b><a name='on_cpt_grid_modified'></a>on_cpt_grid_modified</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> row, <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> col<font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_evidence_toggled'></a>on_evidence_toggled</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_graph_modified'></a>on_graph_modified</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_menu_file_open'></a>on_menu_file_open</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_menu_file_quit'></a>on_menu_file_quit</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_menu_file_save'></a>on_menu_file_save</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_menu_file_save_as'></a>on_menu_file_save_as</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_menu_help_about'></a>on_menu_help_about</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_menu_help_help'></a>on_menu_help_help</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_node_deleted'></a>on_node_deleted</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_node_deselected'></a>on_node_deselected</b> <font face='Lucida Console'>(</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> n <font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_node_selected'></a>on_node_selected</b> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> n<font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_open_file_selected'></a>on_open_file_selected</b> <font face='Lucida Console'>(</font> <font color='#0000FF'>const</font> std::string<font color='#5555FF'>&amp;</font> file_name<font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_save_file_selected'></a>on_save_file_selected</b> <font face='Lucida Console'>(</font> <font color='#0000FF'>const</font> std::string<font color='#5555FF'>&amp;</font> file_name<font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_sel_node_evidence_modified'></a>on_sel_node_evidence_modified</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_sel_node_num_values_modified'></a>on_sel_node_num_values_modified</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_sel_node_text_modified'></a>on_sel_node_text_modified</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='on_window_resized'></a>on_window_resized</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='recalculate_probabilities'></a>recalculate_probabilities</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Member data
</font>
<font color='#0000FF'>const</font> rgb_pixel color_non_evidence;
<font color='#0000FF'>const</font> rgb_pixel color_default_bg;
<font color='#0000FF'>const</font> rgb_pixel color_evidence;
<font color='#0000FF'>const</font> rgb_pixel color_error;
<font color='#0000FF'>const</font> rgb_pixel color_gray;
<font color='#0000FF'><u>bool</u></font> graph_modified_since_last_recalc;
button btn_calculate;
check_box sel_node_is_evidence;
directed_graph_drawer<font color='#5555FF'>&lt;</font>directed_graph_type<font color='#5555FF'>&gt;</font> graph_drawer;
label sel_node_index;
label sel_node_num_values_label;
label sel_node_text_label;
label sel_node_evidence_label;
menu_bar mbar;
named_rectangle selected_node_rect;
tabbed_display tables;
text_field sel_node_num_values;
text_field sel_node_text;
text_field sel_node_evidence;
text_grid cpt_grid;
text_grid ppt_grid;
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> selected_node_index;
<font color='#0000FF'><u>bool</u></font> node_is_selected;
widget_group cpt_group;
widget_group ppt_group;
scoped_ptr<font color='#5555FF'>&lt;</font>bayesian_network_join_tree<font color='#5555FF'>&gt;</font> solution;
join_tree_type join_tree;
<font color='#009900'>// The std_vector_c is an object identical to the std::vector except that it checks
</font> <font color='#009900'>// all its preconditions and throws a dlib::fatal_error if they are violated.
</font> std_vector_c<font color='#5555FF'>&lt;</font>assignment<font color='#5555FF'>&gt;</font> cpt_grid_assignments;
std::string graph_file_name;
<b>}</b>;
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>int</u></font> <b><a name='main'></a>main</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// create our window
</font> main_window my_window;
<font color='#009900'>// tell our window to put itself on the screen
</font> my_window.<font color='#BB00BB'>show</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// wait until the user closes this window before we let the program
</font> <font color='#009900'>// terminate.
</font> my_window.<font color='#BB00BB'>wait_until_closed</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'>#ifdef</font> WIN32
<font color='#009900'>// If you use main() as your entry point when building a program on MS Windows then
</font><font color='#009900'>// there will be a black console window associated with your application. If you
</font><font color='#009900'>// want your application to not have this console window then you need to build
</font><font color='#009900'>// using the WinMain() entry point as shown below and also set your compiler to
</font><font color='#009900'>// produce a "Windows" project instead of a "Console" project. In visual studio
</font><font color='#009900'>// this can be accomplished by going to project-&gt;properties-&gt;general configuration-&gt;
</font><font color='#009900'>// Linker-&gt;System-&gt;SubSystem and selecting Windows instead of Console.
</font><font color='#009900'>//
</font><font color='#0000FF'><u>int</u></font> WINAPI <b><a name='WinMain'></a>WinMain</b> <font face='Lucida Console'>(</font>HINSTANCE, HINSTANCE, PSTR cmds, <font color='#0000FF'><u>int</u></font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#BB00BB'>main</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>return</font> <font color='#979000'>0</font>;
<b>}</b>
<font color='#0000FF'>#endif</font>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// Methods from the main_window object
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
main_window::
<b><a name='main_window'></a>main_window</b><font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font> :
color_non_evidence<font face='Lucida Console'>(</font><font color='#979000'>0</font>,<font color='#979000'>0</font>,<font color='#979000'>0</font><font face='Lucida Console'>)</font>,
color_default_bg<font face='Lucida Console'>(</font><font color='#979000'>255</font>,<font color='#979000'>255</font>,<font color='#979000'>255</font><font face='Lucida Console'>)</font>,
color_evidence<font face='Lucida Console'>(</font><font color='#979000'>100</font>,<font color='#979000'>200</font>,<font color='#979000'>100</font><font face='Lucida Console'>)</font>,
color_error<font face='Lucida Console'>(</font><font color='#979000'>255</font>,<font color='#979000'>0</font>,<font color='#979000'>0</font><font face='Lucida Console'>)</font>,
color_gray<font face='Lucida Console'>(</font><font color='#979000'>210</font>,<font color='#979000'>210</font>,<font color='#979000'>210</font><font face='Lucida Console'>)</font>,
graph_modified_since_last_recalc<font face='Lucida Console'>(</font><font color='#979000'>true</font><font face='Lucida Console'>)</font>,
btn_calculate<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
sel_node_is_evidence<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
graph_drawer<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
sel_node_index<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
sel_node_num_values_label <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
sel_node_text_label<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
sel_node_evidence_label<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
mbar<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
selected_node_rect<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
tables<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
sel_node_num_values<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
sel_node_text<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
sel_node_evidence<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
cpt_grid<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
ppt_grid<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
selected_node_index<font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font>,
node_is_selected<font face='Lucida Console'>(</font><font color='#979000'>false</font><font face='Lucida Console'>)</font>,
cpt_group<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>,
ppt_group<font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// Note that all the GUI widgets take a reference to the window that contains them
</font> <font color='#009900'>// as their constructor argument. This is a universal feature of GUI widgets in the
</font> <font color='#009900'>// dlib library.
</font>
<font color='#BB00BB'>set_title</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Bayesian Network Utility</font>"<font face='Lucida Console'>)</font>;
<font color='#009900'>// position the widget that is responsible for drawing the directed graph, the graph_drawer,
</font> <font color='#009900'>// just below the mbar (menu bar) widget.
</font> graph_drawer.<font color='#BB00BB'>set_pos</font><font face='Lucida Console'>(</font><font color='#979000'>5</font>,mbar.<font color='#BB00BB'>bottom</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>5</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>set_size</font><font face='Lucida Console'>(</font><font color='#979000'>750</font>,<font color='#979000'>400</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// register the event handlers with their respective widgets
</font> btn_calculate.<font color='#BB00BB'>set_click_handler</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::recalculate_probabilities<font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_text_modified_handler</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_cpt_grid_modified<font face='Lucida Console'>)</font>;
graph_drawer.<font color='#BB00BB'>set_graph_modified_handler</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_graph_modified<font face='Lucida Console'>)</font>;
graph_drawer.<font color='#BB00BB'>set_node_deleted_handler</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_node_deleted<font face='Lucida Console'>)</font>;
graph_drawer.<font color='#BB00BB'>set_node_deselected_handler</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_node_deselected<font face='Lucida Console'>)</font>;
graph_drawer.<font color='#BB00BB'>set_node_selected_handler</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_node_selected<font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>set_text_modified_handler</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_sel_node_evidence_modified<font face='Lucida Console'>)</font>;
sel_node_is_evidence.<font color='#BB00BB'>set_click_handler</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_evidence_toggled<font face='Lucida Console'>)</font>;
sel_node_num_values.<font color='#BB00BB'>set_text_modified_handler</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_sel_node_num_values_modified<font face='Lucida Console'>)</font>;
sel_node_text.<font color='#BB00BB'>set_text_modified_handler</font> <font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_sel_node_text_modified<font face='Lucida Console'>)</font>;
<font color='#009900'>// now set the text of some of our buttons and labels
</font> btn_calculate.<font color='#BB00BB'>set_name</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Recalculate posterior probability table</font>"<font face='Lucida Console'>)</font>;
selected_node_rect.<font color='#BB00BB'>set_name</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Selected node</font>"<font face='Lucida Console'>)</font>;
sel_node_evidence_label.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>evidence value:</font>"<font face='Lucida Console'>)</font>;
sel_node_is_evidence.<font color='#BB00BB'>set_name</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>is evidence</font>"<font face='Lucida Console'>)</font>;
sel_node_num_values_label.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Number of values: </font>"<font face='Lucida Console'>)</font>;
sel_node_text_label.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Node label:</font>"<font face='Lucida Console'>)</font>;
<font color='#009900'>// Now setup the tabbed display. It will have two tabs, one for the conditional
</font> <font color='#009900'>// probability table and one for the posterior probability table.
</font> tables.<font color='#BB00BB'>set_number_of_tabs</font><font face='Lucida Console'>(</font><font color='#979000'>2</font><font face='Lucida Console'>)</font>;
tables.<font color='#BB00BB'>set_tab_name</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,"<font color='#CC0000'>Conditional probability table</font>"<font face='Lucida Console'>)</font>;
tables.<font color='#BB00BB'>set_tab_name</font><font face='Lucida Console'>(</font><font color='#979000'>1</font>,"<font color='#CC0000'>Posterior probability table</font>"<font face='Lucida Console'>)</font>;
cpt_group.<font color='#BB00BB'>add</font><font face='Lucida Console'>(</font>cpt_grid,<font color='#979000'>0</font>,<font color='#979000'>0</font><font face='Lucida Console'>)</font>;
ppt_group.<font color='#BB00BB'>add</font><font face='Lucida Console'>(</font>ppt_grid,<font color='#979000'>0</font>,<font color='#979000'>0</font><font face='Lucida Console'>)</font>;
tables.<font color='#BB00BB'>set_tab_group</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,cpt_group<font face='Lucida Console'>)</font>;
tables.<font color='#BB00BB'>set_tab_group</font><font face='Lucida Console'>(</font><font color='#979000'>1</font>,ppt_group<font face='Lucida Console'>)</font>;
<font color='#009900'>// Now setup the menu bar. We will have two menus. A File and Help menu.
</font> mbar.<font color='#BB00BB'>set_number_of_menus</font><font face='Lucida Console'>(</font><font color='#979000'>2</font><font face='Lucida Console'>)</font>;
mbar.<font color='#BB00BB'>set_menu_name</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,"<font color='#CC0000'>File</font>",'<font color='#FF0000'>F</font>'<font face='Lucida Console'>)</font>;
mbar.<font color='#BB00BB'>set_menu_name</font><font face='Lucida Console'>(</font><font color='#979000'>1</font>,"<font color='#CC0000'>Help</font>",'<font color='#FF0000'>H</font>'<font face='Lucida Console'>)</font>;
<font color='#009900'>// add the entries to the File menu.
</font> mbar.<font color='#BB00BB'>menu</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>add_menu_item</font><font face='Lucida Console'>(</font><font color='#BB00BB'>menu_item_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Open</font>", <font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_menu_file_open, '<font color='#FF0000'>O</font>'<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
mbar.<font color='#BB00BB'>menu</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>add_menu_item</font><font face='Lucida Console'>(</font><font color='#BB00BB'>menu_item_separator</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
mbar.<font color='#BB00BB'>menu</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>add_menu_item</font><font face='Lucida Console'>(</font><font color='#BB00BB'>menu_item_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Save</font>", <font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_menu_file_save, '<font color='#FF0000'>S</font>'<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
mbar.<font color='#BB00BB'>menu</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>add_menu_item</font><font face='Lucida Console'>(</font><font color='#BB00BB'>menu_item_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Save As</font>",<font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_menu_file_save_as, '<font color='#FF0000'>a</font>'<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
mbar.<font color='#BB00BB'>menu</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>add_menu_item</font><font face='Lucida Console'>(</font><font color='#BB00BB'>menu_item_separator</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
mbar.<font color='#BB00BB'>menu</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>add_menu_item</font><font face='Lucida Console'>(</font><font color='#BB00BB'>menu_item_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Quit</font>", <font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_menu_file_quit, '<font color='#FF0000'>Q</font>'<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Add the entries to the Help menu.
</font> mbar.<font color='#BB00BB'>menu</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>add_menu_item</font><font face='Lucida Console'>(</font><font color='#BB00BB'>menu_item_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Help</font>", <font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_menu_help_help, '<font color='#FF0000'>e</font>'<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
mbar.<font color='#BB00BB'>menu</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>add_menu_item</font><font face='Lucida Console'>(</font><font color='#BB00BB'>menu_item_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>About</font>", <font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_menu_help_about, '<font color='#FF0000'>A</font>'<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// call our helper functions and window resize event to get the widgets
</font> <font color='#009900'>// to all arrange themselves correctly in our window.
</font> <font color='#BB00BB'>no_node_selected</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>on_window_resized</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
main_window::
~<b><a name='main_window'></a>main_window</b><font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// You should always call close_window() in the destructor of window
</font> <font color='#009900'>// objects to ensure that no events will be sent to this window while
</font> <font color='#009900'>// it is being destructed.
</font> <font color='#BB00BB'>close_window</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// Private methods from the main_window object
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> main_window::
<b><a name='load_selected_node_tables_into_ppt_grid'></a>load_selected_node_tables_into_ppt_grid</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// This function just takes the currently selected graph node and loads
</font> <font color='#009900'>// its posterior probabilities into the ppt_graph widget.
</font> node_type<font color='#5555FF'>&amp;</font> node <font color='#5555FF'>=</font> graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>selected_node_index<font face='Lucida Console'>)</font>;
ppt_grid.<font color='#BB00BB'>set_grid_size</font><font face='Lucida Console'>(</font><font color='#979000'>2</font>,node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// load the top row of the table into the grid. This row is the "title bar" row
</font> <font color='#009900'>// that tells you what each column contains.
</font> <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> col <font color='#5555FF'>=</font> <font color='#979000'>0</font>; col <font color='#5555FF'>&lt;</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>col<font face='Lucida Console'>)</font>
<b>{</b>
ppt_grid.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,col,"<font color='#CC0000'>P(node=</font>" <font color='#5555FF'>+</font> <font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font>col<font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> "<font color='#CC0000'>)</font>"<font face='Lucida Console'>)</font>;
ppt_grid.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,col,<font color='#BB00BB'>rgb_pixel</font><font face='Lucida Console'>(</font><font color='#979000'>150</font>,<font color='#979000'>150</font>,<font color='#979000'>250</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
ppt_grid.<font color='#BB00BB'>set_editable</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,col,<font color='#979000'>false</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// If we have a solution to the network on hand then load the probabilities
</font> <font color='#009900'>// from that into the table
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>solution<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// get the probability distribution for the currently selected node out
</font> <font color='#009900'>// of the solution.
</font> <font color='#0000FF'>const</font> matrix<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>double</u></font>,<font color='#979000'>1</font><font color='#5555FF'>&gt;</font> prob <font color='#5555FF'>=</font> solution<font color='#5555FF'>-</font><font color='#5555FF'>&gt;</font><font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>selected_node_index<font face='Lucida Console'>)</font>;
<font color='#009900'>// now load the probabilities into the ppt_grid so the user can see them.
</font> <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> col <font color='#5555FF'>=</font> <font color='#979000'>0</font>; col <font color='#5555FF'>&lt;</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>col<font face='Lucida Console'>)</font>
<b>{</b>
ppt_grid.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font><font color='#979000'>1</font>,col,<font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font><font color='#BB00BB'>prob</font><font face='Lucida Console'>(</font>col<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
<font color='#009900'>// make the second row of the table non-editable have a color that indicates
</font> <font color='#009900'>// that to the user
</font> <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> col <font color='#5555FF'>=</font> <font color='#979000'>0</font>; col <font color='#5555FF'>&lt;</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>col<font face='Lucida Console'>)</font>
<b>{</b>
ppt_grid.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font><font color='#979000'>1</font>,col,color_gray<font face='Lucida Console'>)</font>;
ppt_grid.<font color='#BB00BB'>set_editable</font><font face='Lucida Console'>(</font><font color='#979000'>1</font>,col,<font color='#979000'>false</font><font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> main_window::
<b><a name='load_selected_node_tables_into_cpt_grid'></a>load_selected_node_tables_into_cpt_grid</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// This function just takes the conditional probability table in the
</font> <font color='#009900'>// currently selected graph node and puts it into the cpt_grid widget.
</font>
node_type<font color='#5555FF'>&amp;</font> node <font color='#5555FF'>=</font> graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>selected_node_index<font face='Lucida Console'>)</font>;
<font color='#BB00BB'>initialize_node_cpt_if_necessary</font><font face='Lucida Console'>(</font>selected_node_index<font face='Lucida Console'>)</font>;
cpt_grid_assignments.<font color='#BB00BB'>clear</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// figure out how many rows there should be in the cpt
</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> cpt_rows <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> node.<font color='#BB00BB'>number_of_parents</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font>
<b>{</b>
cpt_rows <font color='#5555FF'>*</font><font color='#5555FF'>=</font> node.<font color='#BB00BB'>parent</font><font face='Lucida Console'>(</font>i<font face='Lucida Console'>)</font>.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> cpt_cols <font color='#5555FF'>=</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_grid_size</font><font face='Lucida Console'>(</font>cpt_rows<font color='#5555FF'>+</font><font color='#979000'>1</font>, cpt_cols<font color='#5555FF'>+</font> node.<font color='#BB00BB'>number_of_parents</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> num_cols <font color='#5555FF'>=</font> cpt_grid.<font color='#BB00BB'>number_of_columns</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// fill in the top row of the grid that shows which parent node the left hand columns go with
</font> assignment <font color='#BB00BB'>a</font><font face='Lucida Console'>(</font><font color='#BB00BB'>node_first_parent_assignment</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,selected_node_index<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> col <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
a.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>a.<font color='#BB00BB'>move_next</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
cpt_grid.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,col,<font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font>a.<font color='#BB00BB'>element</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>key</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> "<font color='#CC0000'>: </font>" <font color='#5555FF'>+</font> graph_drawer.<font color='#BB00BB'>node_label</font><font face='Lucida Console'>(</font>a.<font color='#BB00BB'>element</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>key</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,col,<font color='#BB00BB'>rgb_pixel</font><font face='Lucida Console'>(</font><font color='#979000'>120</font>,<font color='#979000'>210</font>,<font color='#979000'>210</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_editable</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,col,<font color='#979000'>false</font><font face='Lucida Console'>)</font>;
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>col;
<b>}</b>
<font color='#009900'>// fill in the top row of the grid that shows which probability the right hand columns go with
</font> <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font>col <font color='#5555FF'>=</font> node.<font color='#BB00BB'>number_of_parents</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; col <font color='#5555FF'>&lt;</font> num_cols; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>col<font face='Lucida Console'>)</font>
<b>{</b>
cpt_grid.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,col,"<font color='#CC0000'>P(node=</font>" <font color='#5555FF'>+</font> <font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font>col<font color='#5555FF'>-</font>node.<font color='#BB00BB'>number_of_parents</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>+</font> "<font color='#CC0000'>)</font>"<font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,col,<font color='#BB00BB'>rgb_pixel</font><font face='Lucida Console'>(</font><font color='#979000'>150</font>,<font color='#979000'>150</font>,<font color='#979000'>250</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_editable</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,col,<font color='#979000'>false</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// now loop over all the possible parent assignments for this node
</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> num_values <font color='#5555FF'>=</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> row <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
<font color='#0000FF'>do</font>
<b>{</b>
col <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
<font color='#009900'>// fill in the left side of the grid row that shows what the parent assignment is
</font> a.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>a.<font color='#BB00BB'>move_next</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
cpt_grid.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>row,col,<font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font>a.<font color='#BB00BB'>element</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>value</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>row,col,<font color='#BB00BB'>rgb_pixel</font><font face='Lucida Console'>(</font><font color='#979000'>180</font>,<font color='#979000'>255</font>,<font color='#979000'>255</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_editable</font><font face='Lucida Console'>(</font>row,col,<font color='#979000'>false</font><font face='Lucida Console'>)</font>;
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>col;
<b>}</b>
<font color='#009900'>// fill in the right side of the grid row that shows what the conditional probabilities are
</font> <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> value <font color='#5555FF'>=</font> <font color='#979000'>0</font>; value <font color='#5555FF'>&lt;</font> num_values; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>value<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>const</font> <font color='#0000FF'><u>double</u></font> prob <font color='#5555FF'>=</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>value,a<font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>row,col,<font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font>prob<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>col;
<b>}</b>
<font color='#009900'>// save this assignment so we can use it later to modify the node's
</font> <font color='#009900'>// conditional probability table if the user modifies the cpt_grid
</font> cpt_grid_assignments.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font>a<font face='Lucida Console'>)</font>;
<font color='#5555FF'>+</font><font color='#5555FF'>+</font>row;
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>node_next_parent_assignment</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,selected_node_index,a<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> main_window::
<b><a name='initialize_node_cpt_if_necessary'></a>initialize_node_cpt_if_necessary</b> <font face='Lucida Console'>(</font>
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> index
<font face='Lucida Console'>)</font>
<b>{</b>
node_type<font color='#5555FF'>&amp;</font> node <font color='#5555FF'>=</font> graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>index<font face='Lucida Console'>)</font>;
<font color='#009900'>// if the cpt for this node isn't properly filled out then let's clear it out
</font> <font color='#009900'>// and populate it with some reasonable default values
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>node_cpt_filled_out</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, index<font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>false</font><font face='Lucida Console'>)</font>
<b>{</b>
node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>empty_table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> num_values <font color='#5555FF'>=</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// loop over all the possible parent assignments for this node and fill them out
</font> <font color='#009900'>// with reasonable default values
</font> assignment <font color='#BB00BB'>a</font><font face='Lucida Console'>(</font><font color='#BB00BB'>node_first_parent_assignment</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, index<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>do</font>
<b>{</b>
<font color='#009900'>// set the first value to have probability 1
</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>set_probability</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>, a, <font color='#979000'>1.0</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// set all the other values to have probability 0
</font> <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> value <font color='#5555FF'>=</font> <font color='#979000'>1</font>; value <font color='#5555FF'>&lt;</font> num_values; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>value<font face='Lucida Console'>)</font>
node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>set_probability</font><font face='Lucida Console'>(</font>value, a, <font color='#979000'>0</font><font face='Lucida Console'>)</font>;
<b>}</b> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>node_next_parent_assignment</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, index,a<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> main_window::
<b><a name='no_node_selected'></a>no_node_selected</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// Make it so that no node is selected on the gui. Do this by disabling things
</font> <font color='#009900'>// and clearing out text fields and so forth.
</font>
node_is_selected <font color='#5555FF'>=</font> <font color='#979000'>false</font>;
tables.<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_is_evidence.<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_index.<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_evidence_label.<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_text_label.<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_text.<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_index.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>index:</font>"<font face='Lucida Console'>)</font>;
sel_node_num_values_label.<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_num_values.<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_grid_size</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,<font color='#979000'>0</font><font face='Lucida Console'>)</font>;
ppt_grid.<font color='#BB00BB'>set_grid_size</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>,<font color='#979000'>0</font><font face='Lucida Console'>)</font>;
sel_node_is_evidence.<font color='#BB00BB'>set_unchecked</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_text.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'></font>"<font face='Lucida Console'>)</font>;
sel_node_num_values.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'></font>"<font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'></font>"<font face='Lucida Console'>)</font>;
sel_node_num_values.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>color_default_bg<font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>color_default_bg<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> main_window::
<b><a name='recalculate_probabilities'></a>recalculate_probabilities</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// clear out the current solution
</font> solution.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#BB00BB'>graph_is_connected</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>false</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#BB00BB'>message_box</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Error</font>","<font color='#CC0000'>Your graph has nodes that are completely disconnected from the other nodes.\n</font>"
"<font color='#CC0000'>You must connect them somehow</font>"<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>number_of_nodes</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&gt;</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>graph_modified_since_last_recalc<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// make sure all the cpts are filled out
</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> num_nodes <font color='#5555FF'>=</font> graph_drawer.<font color='#BB00BB'>graph</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>number_of_nodes</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> num_nodes; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#BB00BB'>initialize_node_cpt_if_necessary</font><font face='Lucida Console'>(</font>i<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// remake the join tree for this graph
</font> <font color='#BB00BB'>create_moral_graph</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, join_tree<font face='Lucida Console'>)</font>;
<font color='#BB00BB'>create_join_tree</font><font face='Lucida Console'>(</font>join_tree, join_tree<font face='Lucida Console'>)</font>;
graph_modified_since_last_recalc <font color='#5555FF'>=</font> <font color='#979000'>false</font>;
<b>}</b>
<font color='#009900'>// create a solution to this bayesian network using the join tree algorithm
</font> solution.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font color='#0000FF'>new</font> <font color='#BB00BB'>bayesian_network_join_tree</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, join_tree<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>node_is_selected<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#BB00BB'>load_selected_node_tables_into_ppt_grid</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// Event handling methods from the main_window object
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user selects a file with a saved
</font><font color='#009900'>// bayesian network in it.
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_open_file_selected'></a>on_open_file_selected</b> <font face='Lucida Console'>(</font>
<font color='#0000FF'>const</font> std::string<font color='#5555FF'>&amp;</font> file_name
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>try</font>
<b>{</b>
<font color='#BB00BB'>no_node_selected</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
ifstream <font color='#BB00BB'>fin</font><font face='Lucida Console'>(</font>file_name.<font color='#BB00BB'>c_str</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, ios::binary<font face='Lucida Console'>)</font>;
graph_drawer.<font color='#BB00BB'>load_graph</font><font face='Lucida Console'>(</font>fin<font face='Lucida Console'>)</font>;
graph_file_name <font color='#5555FF'>=</font> file_name;
<font color='#BB00BB'>set_title</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Bayesian Network Utility - </font>" <font color='#5555FF'>+</font> <font color='#BB00BB'>right_substr</font><font face='Lucida Console'>(</font>file_name,"<font color='#CC0000'>\\/</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>...<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#BB00BB'>message_box</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Error</font>", "<font color='#CC0000'>Unable to load graph file </font>" <font color='#5555FF'>+</font> file_name<font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user selects from the menu bar File-&gt;Open
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_menu_file_open'></a>on_menu_file_open</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// display a file chooser window and when the user choses a file
</font> <font color='#009900'>// call the on_open_file_selected() function
</font> <font color='#BB00BB'>open_existing_file_box</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_open_file_selected<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user selects from the menu bar File-&gt;Save
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_menu_file_save'></a>on_menu_file_save</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// if we don't currently have any file name associated with our graph
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>graph_file_name.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// display a file chooser window and when the user choses a file
</font> <font color='#009900'>// call the on_save_file_selected() function
</font> <font color='#BB00BB'>save_file_box</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_save_file_selected<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
<font color='#009900'>// we know what file to open so just do that and save the graph to it
</font> ofstream <font color='#BB00BB'>fout</font><font face='Lucida Console'>(</font>graph_file_name.<font color='#BB00BB'>c_str</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, ios::binary<font face='Lucida Console'>)</font>;
graph_drawer.<font color='#BB00BB'>save_graph</font><font face='Lucida Console'>(</font>fout<font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user choses which file to save the graph to
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_save_file_selected'></a>on_save_file_selected</b> <font face='Lucida Console'>(</font>
<font color='#0000FF'>const</font> std::string<font color='#5555FF'>&amp;</font> file_name
<font face='Lucida Console'>)</font>
<b>{</b>
ofstream <font color='#BB00BB'>fout</font><font face='Lucida Console'>(</font>file_name.<font color='#BB00BB'>c_str</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, ios::binary<font face='Lucida Console'>)</font>;
graph_drawer.<font color='#BB00BB'>save_graph</font><font face='Lucida Console'>(</font>fout<font face='Lucida Console'>)</font>;
graph_file_name <font color='#5555FF'>=</font> file_name;
<font color='#BB00BB'>set_title</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Bayesian Network Utility - </font>" <font color='#5555FF'>+</font> <font color='#BB00BB'>right_substr</font><font face='Lucida Console'>(</font>file_name,"<font color='#CC0000'>\\/</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user selects from the menu bar File-&gt;Save As
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_menu_file_save_as'></a>on_menu_file_save_as</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// display a file chooser window and when the user choses a file
</font> <font color='#009900'>// call the on_save_file_selected() function
</font> <font color='#BB00BB'>save_file_box</font><font face='Lucida Console'>(</font><font color='#5555FF'>*</font><font color='#0000FF'>this</font>, <font color='#5555FF'>&amp;</font>main_window::on_save_file_selected<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user selects from the menu bar File-&gt;Quit
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_menu_file_quit'></a>on_menu_file_quit</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#BB00BB'>close_window</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user selects from the menu bar Help-&gt;Help
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_menu_help_help'></a>on_menu_help_help</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#BB00BB'>message_box</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Help</font>",
"<font color='#CC0000'>To create new nodes right click on the drawing area.\n</font>"
"<font color='#CC0000'>To create edges select the parent node and then shift+left click on the child node.\n</font>"
"<font color='#CC0000'>To remove nodes or edges select them by left clicking and then press the delete key.</font>"<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user selects from the menu bar Help-&gt;About
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_menu_help_about'></a>on_menu_help_about</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#BB00BB'>message_box</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>About</font>","<font color='#CC0000'>This application is the GUI front end to the dlib C++ Library's\n</font>"
"<font color='#CC0000'>Bayesian Network inference utilities\n\n</font>"
"<font color='#CC0000'>Version 1.2\n\n</font>"
"<font color='#CC0000'>See http://dlib.net for updates</font>"<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user modifies the graph_drawer widget. That is,
</font><font color='#009900'>// when the user adds or removes an edge or node in the graph.
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_graph_modified'></a>on_graph_modified</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// make note of the modification
</font> graph_modified_since_last_recalc <font color='#5555FF'>=</font> <font color='#979000'>true</font>;
<font color='#009900'>// clear out the solution object since we will need to recalculate it
</font> <font color='#009900'>// since the graph changed
</font> solution.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user modifies the evidence value for a node
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_sel_node_evidence_modified'></a>on_sel_node_evidence_modified</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// make a reference to the node in the graph that is currently selected
</font> node_type<font color='#5555FF'>&amp;</font> node <font color='#5555FF'>=</font> graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>selected_node_index<font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> value;
<font color='#0000FF'>try</font>
<b>{</b>
<font color='#009900'>// get the numerical value of the new evidence value. Here we are taking
</font> <font color='#009900'>// the string from the text field and casting it to an unsigned long.
</font> value <font color='#5555FF'>=</font> sa <font color='#5555FF'>=</font> <font color='#BB00BB'>trim</font><font face='Lucida Console'>(</font>sel_node_evidence.<font color='#BB00BB'>text</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>string_cast_error<font color='#5555FF'>&amp;</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// if the user put something that isn't an integer into the
</font> <font color='#009900'>// text field then make it have a different background color
</font> <font color='#009900'>// so that they can easily see this.
</font> sel_node_evidence.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>color_error<font face='Lucida Console'>)</font>;
<font color='#0000FF'>return</font>;
<b>}</b>
<font color='#009900'>// validate the input from the user and store it in the selected node
</font> <font color='#009900'>// if it is ok
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>value <font color='#5555FF'>&gt;</font><font color='#5555FF'>=</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
sel_node_evidence.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>color_error<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
node.data.<font color='#BB00BB'>set_value</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>color_default_bg<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// clear out the solution to the graph since we now need
</font> <font color='#009900'>// to recalculate it.
</font> solution.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user modifies the number of evidence values for
</font><font color='#009900'>// a node.
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_sel_node_num_values_modified'></a>on_sel_node_num_values_modified</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// make a reference to the node in the graph that is currently selected
</font> node_type<font color='#5555FF'>&amp;</font> node <font color='#5555FF'>=</font> graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>selected_node_index<font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> num_values;
<font color='#0000FF'>try</font>
<b>{</b>
<font color='#009900'>// get the number of values out of the text field.
</font> num_values <font color='#5555FF'>=</font> sa <font color='#5555FF'>=</font> <font color='#BB00BB'>trim</font><font face='Lucida Console'>(</font>sel_node_num_values.<font color='#BB00BB'>text</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>string_cast_error<font color='#5555FF'>&amp;</font><font face='Lucida Console'>)</font>
<b>{</b>
sel_node_num_values.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>color_error<font face='Lucida Console'>)</font>;
<font color='#0000FF'>return</font>;
<b>}</b>
<font color='#009900'>// validate the input from the user to make sure it is something reasonable
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>num_values <font color='#5555FF'>&lt;</font> <font color='#979000'>2</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> num_values <font color='#5555FF'>&gt;</font> <font color='#979000'>100</font><font face='Lucida Console'>)</font>
<b>{</b>
sel_node_num_values.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>color_error<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
<font color='#009900'>// update the graph
</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>set_num_values</font><font face='Lucida Console'>(</font>num_values<font face='Lucida Console'>)</font>;
graph_modified_since_last_recalc <font color='#5555FF'>=</font> <font color='#979000'>true</font>;
sel_node_num_values.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>color_default_bg<font face='Lucida Console'>)</font>;
<font color='#BB00BB'>on_sel_node_evidence_modified</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// also make sure the evidence value of this node makes sense still
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>node.data.<font color='#BB00BB'>is_evidence</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&amp;</font><font color='#5555FF'>&amp;</font> node.data.<font color='#BB00BB'>value</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&gt;</font><font color='#5555FF'>=</font> num_values<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// just set it to zero
</font> node.data.<font color='#BB00BB'>set_value</font><font face='Lucida Console'>(</font><font color='#979000'>0</font><font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
solution.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// call these functions so that the conditional and posterior probability
</font> <font color='#009900'>// tables get updated
</font> <font color='#BB00BB'>load_selected_node_tables_into_cpt_grid</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>load_selected_node_tables_into_ppt_grid</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user modifies the cpt_grid (i.e. the conditional
</font><font color='#009900'>// probability table widget)
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_cpt_grid_modified'></a>on_cpt_grid_modified</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> row, <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> col<font face='Lucida Console'>)</font>
<b>{</b>
node_type<font color='#5555FF'>&amp;</font> node <font color='#5555FF'>=</font> graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>selected_node_index<font face='Lucida Console'>)</font>;
solution.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>double</u></font> prob;
<font color='#0000FF'>try</font>
<b>{</b>
<font color='#009900'>// get the new value out of the table
</font> prob <font color='#5555FF'>=</font> sa <font color='#5555FF'>=</font> cpt_grid.<font color='#BB00BB'>text</font><font face='Lucida Console'>(</font>row,col<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>string_cast_error<font color='#5555FF'>&amp;</font><font face='Lucida Console'>)</font>
<b>{</b>
cpt_grid.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>row,col,color_error<font face='Lucida Console'>)</font>;
<font color='#0000FF'>return</font>;
<b>}</b>
<font color='#009900'>// validate the value
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>prob <font color='#5555FF'>&lt;</font> <font color='#979000'>0</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> prob <font color='#5555FF'>&gt;</font> <font color='#979000'>1</font><font face='Lucida Console'>)</font>
<b>{</b>
cpt_grid.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>row,col,color_error<font face='Lucida Console'>)</font>;
<font color='#0000FF'>return</font>;
<b>}</b>
<font color='#009900'>// the value of this node that is having its conditional probability
</font> <font color='#009900'>// updated
</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> cur_val <font color='#5555FF'>=</font> col<font color='#5555FF'>-</font>node.<font color='#BB00BB'>number_of_parents</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>set_probability</font><font face='Lucida Console'>(</font>cur_val, cpt_grid_assignments[row<font color='#5555FF'>-</font><font color='#979000'>1</font>], prob<font face='Lucida Console'>)</font>;
<font color='#009900'>// sum the probabilities in the cpt and modify the last one such that they all
</font> <font color='#009900'>// sum to 1. We are excluding either the first or last element from the sum
</font> <font color='#009900'>// because we are going to set it equal to 1-sum below.
</font> <font color='#0000FF'><u>double</u></font> sum <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cur_val <font color='#5555FF'>!</font><font color='#5555FF'>=</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font>
sum <font color='#5555FF'>+</font><font color='#5555FF'>=</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>i, cpt_grid_assignments[row<font color='#5555FF'>-</font><font color='#979000'>1</font>]<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>1</font>; i <font color='#5555FF'>&lt;</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font>
sum <font color='#5555FF'>+</font><font color='#5555FF'>=</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>probability</font><font face='Lucida Console'>(</font>i, cpt_grid_assignments[row<font color='#5555FF'>-</font><font color='#979000'>1</font>]<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// make sure all the probabilities sum to 1
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>sum <font color='#5555FF'>&gt;</font> <font color='#979000'>1.0</font><font face='Lucida Console'>)</font>
<b>{</b>
cpt_grid.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>row,cpt_grid.<font color='#BB00BB'>number_of_columns</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1</font>,color_error<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
<font color='#009900'>// edit one of the other elements in the table to ensure that the probabilities still sum to 1
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>cur_val <font color='#5555FF'>=</font><font color='#5555FF'>=</font> node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>
<b>{</b>
node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>set_probability</font><font face='Lucida Console'>(</font><font color='#979000'>0</font>, cpt_grid_assignments[row<font color='#5555FF'>-</font><font color='#979000'>1</font>], <font color='#979000'>1</font><font color='#5555FF'>-</font>sum<font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>row,node.<font color='#BB00BB'>number_of_parents</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,<font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font color='#5555FF'>-</font>sum<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>set_probability</font><font face='Lucida Console'>(</font>node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1</font>, cpt_grid_assignments[row<font color='#5555FF'>-</font><font color='#979000'>1</font>], <font color='#979000'>1</font><font color='#5555FF'>-</font>sum<font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>row,cpt_grid.<font color='#BB00BB'>number_of_columns</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1</font>,<font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font><font color='#979000'>1</font><font color='#5555FF'>-</font>sum<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
cpt_grid.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>row,cpt_grid.<font color='#BB00BB'>number_of_columns</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1</font>,color_default_bg<font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>row,col,color_default_bg<font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user resizes the main_window. Note that unlike the other
</font><font color='#009900'>// events, this event is part of the drawable_window base class that main_window inherits from.
</font><font color='#009900'>// So you won't see any statements in the constructor that say "register the main_window::on_window_resized function"
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_window_resized'></a>on_window_resized</b> <font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// when you override any of the drawable_window events you have to make sure you
</font> <font color='#009900'>// call the drawable_window's version of them because it needs to process
</font> <font color='#009900'>// the events as well. So we do that here.
</font> drawable_window::<font color='#BB00BB'>on_window_resized</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// The rest of this function positions the widgets on the window
</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> width,height;
<font color='#BB00BB'>get_size</font><font face='Lucida Console'>(</font>width,height<font face='Lucida Console'>)</font>;
<font color='#009900'>// Don't do anything if the user just made the window too small. That is, leave
</font> <font color='#009900'>// the widgets where they are.
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>width <font color='#5555FF'>&lt;</font> <font color='#979000'>500</font> <font color='#5555FF'>|</font><font color='#5555FF'>|</font> height <font color='#5555FF'>&lt;</font> <font color='#979000'>350</font><font face='Lucida Console'>)</font>
<font color='#0000FF'>return</font>;
<font color='#009900'>// Set the size of the probability tables and the drawing area for the graph
</font> graph_drawer.<font color='#BB00BB'>set_size</font><font face='Lucida Console'>(</font>width<font color='#5555FF'>-</font><font color='#979000'>370</font>,height<font color='#5555FF'>-</font><font color='#979000'>10</font><font color='#5555FF'>-</font>mbar.<font color='#BB00BB'>height</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
cpt_grid.<font color='#BB00BB'>set_size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>width<font color='#5555FF'>-</font>graph_drawer.<font color='#BB00BB'>width</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>35</font>,height<font color='#5555FF'>-</font><font color='#979000'>237</font><font face='Lucida Console'>)</font>;
ppt_grid.<font color='#BB00BB'>set_size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>(</font>width<font color='#5555FF'>-</font>graph_drawer.<font color='#BB00BB'>width</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>35</font>,height<font color='#5555FF'>-</font><font color='#979000'>237</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// tell the tabbed display to make itself just the right size to contain
</font> <font color='#009900'>// the two probability tables.
</font> tables.<font color='#BB00BB'>fit_to_contents</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Now position all the widgets in the window. Note that much of the positioning
</font> <font color='#009900'>// is relative to other widgets. This part of the code I just figured out by
</font> <font color='#009900'>// trying stuff and rerunning the program to see if it looked nice.
</font> sel_node_index.<font color='#BB00BB'>set_pos</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>right</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>14</font>,graph_drawer.<font color='#BB00BB'>top</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>18</font><font face='Lucida Console'>)</font>;
sel_node_text_label.<font color='#BB00BB'>set_pos</font><font face='Lucida Console'>(</font>sel_node_index.<font color='#BB00BB'>left</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,sel_node_index.<font color='#BB00BB'>bottom</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>5</font><font face='Lucida Console'>)</font>;
sel_node_text.<font color='#BB00BB'>set_pos</font><font face='Lucida Console'>(</font>sel_node_text_label.<font color='#BB00BB'>right</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>5</font>,sel_node_index.<font color='#BB00BB'>bottom</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
sel_node_num_values_label.<font color='#BB00BB'>set_pos</font><font face='Lucida Console'>(</font>sel_node_index.<font color='#BB00BB'>left</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, sel_node_text.<font color='#BB00BB'>bottom</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>5</font><font face='Lucida Console'>)</font>;
sel_node_num_values.<font color='#BB00BB'>set_pos</font><font face='Lucida Console'>(</font>sel_node_num_values_label.<font color='#BB00BB'>right</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, sel_node_text.<font color='#BB00BB'>bottom</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>5</font><font face='Lucida Console'>)</font>;
sel_node_is_evidence.<font color='#BB00BB'>set_pos</font><font face='Lucida Console'>(</font>sel_node_index.<font color='#BB00BB'>left</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,sel_node_num_values.<font color='#BB00BB'>bottom</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>5</font><font face='Lucida Console'>)</font>;
sel_node_evidence_label.<font color='#BB00BB'>set_pos</font><font face='Lucida Console'>(</font>sel_node_index.<font color='#BB00BB'>left</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,sel_node_is_evidence.<font color='#BB00BB'>bottom</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>5</font><font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>set_pos</font><font face='Lucida Console'>(</font>sel_node_evidence_label.<font color='#BB00BB'>right</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>5</font>,sel_node_is_evidence.<font color='#BB00BB'>bottom</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
tables.<font color='#BB00BB'>set_pos</font><font face='Lucida Console'>(</font>sel_node_index.<font color='#BB00BB'>left</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,sel_node_evidence.<font color='#BB00BB'>bottom</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>5</font><font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>set_width</font><font face='Lucida Console'>(</font>tables.<font color='#BB00BB'>right</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font>sel_node_evidence.<font color='#BB00BB'>left</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>;
sel_node_text.<font color='#BB00BB'>set_width</font><font face='Lucida Console'>(</font>tables.<font color='#BB00BB'>right</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font>sel_node_text.<font color='#BB00BB'>left</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>;
sel_node_num_values.<font color='#BB00BB'>set_width</font><font face='Lucida Console'>(</font>tables.<font color='#BB00BB'>right</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font>sel_node_num_values.<font color='#BB00BB'>left</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>1</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Tell the named rectangle to position itself such that it fits around the
</font> <font color='#009900'>// tabbed display that contains the probability tables and the label at the top of the
</font> <font color='#009900'>// screen.
</font> selected_node_rect.<font color='#BB00BB'>wrap_around</font><font face='Lucida Console'>(</font>sel_node_index.<font color='#BB00BB'>get_rect</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font>
tables.<font color='#BB00BB'>get_rect</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// finally set the button to be at the bottom of the named rectangle
</font> btn_calculate.<font color='#BB00BB'>set_pos</font><font face='Lucida Console'>(</font>selected_node_rect.<font color='#BB00BB'>left</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>, selected_node_rect.<font color='#BB00BB'>bottom</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>+</font><font color='#979000'>5</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called by the graph_drawer widget when the user selects a node
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_node_selected'></a>on_node_selected</b> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> n<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// make a reference to the selected node
</font> node_type<font color='#5555FF'>&amp;</font> node <font color='#5555FF'>=</font> graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font>;
<font color='#009900'>// enable all the widgets related to the selected node
</font> selected_node_index <font color='#5555FF'>=</font> n;
node_is_selected <font color='#5555FF'>=</font> <font color='#979000'>true</font>;
tables.<font color='#BB00BB'>enable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_is_evidence.<font color='#BB00BB'>enable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_index.<font color='#BB00BB'>enable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_evidence_label.<font color='#BB00BB'>enable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_text_label.<font color='#BB00BB'>enable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_text.<font color='#BB00BB'>enable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_num_values_label.<font color='#BB00BB'>enable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_num_values.<font color='#BB00BB'>enable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// make sure the num_values field of the node's cpt is set to something valid.
</font> <font color='#009900'>// So default it to 2 if it isn't set already.
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>num_values</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font> <font color='#979000'>2</font><font face='Lucida Console'>)</font>
<b>{</b>
node.data.<font color='#BB00BB'>table</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.<font color='#BB00BB'>set_num_values</font><font face='Lucida Console'>(</font><font color='#979000'>2</font><font face='Lucida Console'>)</font>;
graph_modified_since_last_recalc <font color='#5555FF'>=</font> <font color='#979000'>true</font>;
<b>}</b>
<font color='#009900'>// setup the evidence check box and input field
</font> sel_node_index.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>index: </font>" <font color='#5555FF'>+</font> <font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font>.data.<font color='#BB00BB'>is_evidence</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
sel_node_is_evidence.<font color='#BB00BB'>set_checked</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>enable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font><font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font>.data.<font color='#BB00BB'>value</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
sel_node_is_evidence.<font color='#BB00BB'>set_unchecked</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'></font>"<font face='Lucida Console'>)</font>;
<b>}</b>
sel_node_num_values.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font><font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font><font color='#BB00BB'>node_num_values</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,n<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
sel_node_text.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>node_label</font><font face='Lucida Console'>(</font>n<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>load_selected_node_tables_into_cpt_grid</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>load_selected_node_tables_into_ppt_grid</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user toggles the "is evidence" check box
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_evidence_toggled'></a>on_evidence_toggled</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>sel_node_is_evidence.<font color='#BB00BB'>is_checked</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>selected_node_index<font face='Lucida Console'>)</font>.data.<font color='#BB00BB'>set_as_evidence</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>enable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font><font color='#BB00BB'>cast_to_string</font><font face='Lucida Console'>(</font>graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>selected_node_index<font face='Lucida Console'>)</font>.data.<font color='#BB00BB'>value</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
graph_drawer.<font color='#BB00BB'>set_node_color</font><font face='Lucida Console'>(</font>selected_node_index, color_evidence<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
graph_drawer.<font color='#BB00BB'>graph_node</font><font face='Lucida Console'>(</font>selected_node_index<font face='Lucida Console'>)</font>.data.<font color='#BB00BB'>set_as_nonevidence</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>disable</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>set_text</font><font face='Lucida Console'>(</font>"<font color='#CC0000'></font>"<font face='Lucida Console'>)</font>;
sel_node_evidence.<font color='#BB00BB'>set_background_color</font><font face='Lucida Console'>(</font>color_default_bg<font face='Lucida Console'>)</font>;
graph_drawer.<font color='#BB00BB'>set_node_color</font><font face='Lucida Console'>(</font>selected_node_index, color_non_evidence<font face='Lucida Console'>)</font>;
<b>}</b>
solution.<font color='#BB00BB'>reset</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user causes no node to be selected
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_node_deselected'></a>on_node_deselected</b> <font face='Lucida Console'>(</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> <font face='Lucida Console'>)</font>
<b>{</b>
<font color='#BB00BB'>no_node_selected</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user causes a node to be deleted
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_node_deleted'></a>on_node_deleted</b> <font face='Lucida Console'>(</font> <font face='Lucida Console'>)</font>
<b>{</b>
<font color='#BB00BB'>no_node_selected</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// This event is called when the user changes the text in the "node label" text field
</font><font color='#0000FF'><u>void</u></font> main_window::
<b><a name='on_sel_node_text_modified'></a>on_sel_node_text_modified</b> <font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// set the selected node's text to match whatever the user just typed in
</font> graph_drawer.<font color='#BB00BB'>set_node_label</font><font face='Lucida Console'>(</font>selected_node_index,sel_node_text.<font color='#BB00BB'>text</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
</pre></body></html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 99 B

File diff suppressed because one or more lines are too long

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -1,368 +0,0 @@
<html><!-- Created using the cpp_pretty_printer from the dlib C++ library. See http://dlib.net for updates. --><head><title>dlib C++ Library - bridge_ex.cpp</title></head><body bgcolor='white'><pre>
<font color='#009900'>// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
</font>
<font color='#009900'>/*
This is an example showing how to use the bridge object from from the
dlib C++ Library to send messages via TCP/IP.
In particular, this example will walk you through four progressively
more complex use cases of the bridge object. Note that this example
program assumes you are already familiar with the pipe object and at
least the contents of the <a href="pipe_ex_2.cpp.html">pipe_ex_2.cpp</a> example program.
*/</font>
<font color='#009900'>// =========== Example program output ===========
</font><font color='#009900'>/*
---- Running example 1 ----
dequeued value: 1
dequeued value: 2
dequeued value: 3
---- Running example 2 ----
dequeued value: 1
dequeued value: 2
dequeued value: 3
---- Running example 3 ----
dequeued int: 1
dequeued int: 2
dequeued struct: 3 some string
---- Running example 4 ----
bridge 1 status: is_connected: true
bridge 1 status: foreign_ip: 127.0.0.1
bridge 1 status: foreign_port: 43156
bridge 2 status: is_connected: true
bridge 2 status: foreign_ip: 127.0.0.1
bridge 2 status: foreign_port: 12345
dequeued int: 1
dequeued int: 2
dequeued struct: 3 some string
bridge 1 status: is_connected: false
bridge 1 status: foreign_ip: 127.0.0.1
bridge 1 status: foreign_port: 12345
*/</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>bridge.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>type_safe_union.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>iostream<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> dlib;
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> std;
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> <b><a name='run_example_1'></a>run_example_1</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='run_example_2'></a>run_example_2</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='run_example_3'></a>run_example_3</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='run_example_4'></a>run_example_4</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>int</u></font> <b><a name='main'></a>main</b><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#BB00BB'>run_example_1</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>run_example_2</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>run_example_3</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#BB00BB'>run_example_4</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> <b><a name='run_example_1'></a>run_example_1</b><font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>\n ---- Running example 1 ---- </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#009900'>/*
The idea of the bridge is basically to allow two different dlib::pipe objects
to be connected together via a TCP connection. This is best illustrated by
the following short example. In it we create two pipes, in and out. When
an object is enqueued into the out pipe it will be automatically sent
through a TCP connection and once received at the other end it will be
inserted into the in pipe.
*/</font>
dlib::pipe<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>int</u></font><font color='#5555FF'>&gt;</font> <font color='#BB00BB'>in</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>, <font color='#BB00BB'>out</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// This bridge will listen on port 12345 for an incoming TCP connection. Then
</font> <font color='#009900'>// it will read data from that connection and put it into the in pipe.
</font> bridge <font color='#BB00BB'>b2</font><font face='Lucida Console'>(</font><font color='#BB00BB'>listen_on_port</font><font face='Lucida Console'>(</font><font color='#979000'>12345</font><font face='Lucida Console'>)</font>, <font color='#BB00BB'>receive</font><font face='Lucida Console'>(</font>in<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// This bridge will initiate a TCP connection and then start dequeuing
</font> <font color='#009900'>// objects from out and transmitting them over the connection.
</font> bridge <font color='#BB00BB'>b1</font><font face='Lucida Console'>(</font><font color='#BB00BB'>connect_to_ip_and_port</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>127.0.0.1</font>", <font color='#979000'>12345</font><font face='Lucida Console'>)</font>, <font color='#BB00BB'>transmit</font><font face='Lucida Console'>(</font>out<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// As an aside, in a real program, each of these bridges and pipes would be in a
</font> <font color='#009900'>// separate application. But to make this example self contained they are both
</font> <font color='#009900'>// right here.
</font>
<font color='#009900'>// Now let's put some things into the out pipe
</font> <font color='#0000FF'><u>int</u></font> value <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
value <font color='#5555FF'>=</font> <font color='#979000'>2</font>;
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
value <font color='#5555FF'>=</font> <font color='#979000'>3</font>;
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
<font color='#009900'>// Now those 3 ints can be dequeued from the in pipe. They will show up
</font> <font color='#009900'>// in the same order they were inserted into the out pipe.
</font> in.<font color='#BB00BB'>dequeue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>dequeued value: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> value <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
in.<font color='#BB00BB'>dequeue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>dequeued value: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> value <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
in.<font color='#BB00BB'>dequeue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>dequeued value: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> value <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> <b><a name='run_example_2'></a>run_example_2</b><font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>\n ---- Running example 2 ---- </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#009900'>/*
This example makes a simple echo server on port 12345. When an object
is inserted into the out pipe it will be sent over a TCP connection, get
put into the echo pipe and then immediately read out of the echo pipe and
sent back over the TCP connection where it will finally be placed into the in
pipe.
*/</font>
dlib::pipe<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>int</u></font><font color='#5555FF'>&gt;</font> <font color='#BB00BB'>in</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>, <font color='#BB00BB'>out</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>, <font color='#BB00BB'>echo</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Just like TCP connections, a bridge can send data both directions. The directionality
</font> <font color='#009900'>// of a pipe is indicated by the receive() and transmit() type decorations. Also, the order
</font> <font color='#009900'>// they are listed doesn't matter.
</font> bridge <font color='#BB00BB'>echo_bridge</font><font face='Lucida Console'>(</font><font color='#BB00BB'>listen_on_port</font><font face='Lucida Console'>(</font><font color='#979000'>12345</font><font face='Lucida Console'>)</font>, <font color='#BB00BB'>receive</font><font face='Lucida Console'>(</font>echo<font face='Lucida Console'>)</font>, <font color='#BB00BB'>transmit</font><font face='Lucida Console'>(</font>echo<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Note that you can also specify the ip and port as a string by using connect_to().
</font> bridge <font color='#BB00BB'>b1</font><font face='Lucida Console'>(</font><font color='#BB00BB'>connect_to</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>127.0.0.1:12345</font>"<font face='Lucida Console'>)</font>, <font color='#BB00BB'>transmit</font><font face='Lucida Console'>(</font>out<font face='Lucida Console'>)</font>, <font color='#BB00BB'>receive</font><font face='Lucida Console'>(</font>in<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>int</u></font> value <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
value <font color='#5555FF'>=</font> <font color='#979000'>2</font>;
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
value <font color='#5555FF'>=</font> <font color='#979000'>3</font>;
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
in.<font color='#BB00BB'>dequeue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>dequeued value: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> value <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
in.<font color='#BB00BB'>dequeue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>dequeued value: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> value <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
in.<font color='#BB00BB'>dequeue</font><font face='Lucida Console'>(</font>value<font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>dequeued value: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> value <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'>struct</font> <b><a name='my_example_object'></a>my_example_object</b>
<b>{</b>
<font color='#009900'>/*
All objects passing through a dlib::bridge must be serializable. This
means there must exist global functions called serialize() and deserialize()
which can convert an object into a bit stream and then reverse the process.
This example object illustrates how this is done.
*/</font>
<font color='#0000FF'><u>int</u></font> value;
std::string str;
<b>}</b>;
<font color='#0000FF'><u>void</u></font> <b><a name='serialize'></a>serialize</b> <font face='Lucida Console'>(</font><font color='#0000FF'>const</font> my_example_object<font color='#5555FF'>&amp;</font> item, std::ostream<font color='#5555FF'>&amp;</font> out<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>/*
serialize() just needs to write the state of item to the output stream.
You can do this however you like. Below, I'm using the serialize functions
for int and std::string which come with dlib. But again, you can do whatever
you want here.
*/</font>
dlib::<font color='#BB00BB'>serialize</font><font face='Lucida Console'>(</font>item.value, out<font face='Lucida Console'>)</font>;
dlib::<font color='#BB00BB'>serialize</font><font face='Lucida Console'>(</font>item.str, out<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'><u>void</u></font> <b><a name='deserialize'></a>deserialize</b> <font face='Lucida Console'>(</font>my_example_object<font color='#5555FF'>&amp;</font> item, std::istream<font color='#5555FF'>&amp;</font> in<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>/*
deserialize() is just the inverse of serialize(). Again, you can do
whatever you want here so long as it correctly reconstructs item. This
also means that deserialize() must always consume as many bytes as serialize()
generates.
*/</font>
dlib::<font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>item.value, in<font face='Lucida Console'>)</font>;
dlib::<font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>item.str, in<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> <b><a name='run_example_3'></a>run_example_3</b><font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>\n ---- Running example 3 ---- </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#009900'>/*
In this example we will just send ints and my_example_object objects
over a TCP connection. Since we are sending more than one type of
object through a pipe we will need to use the type_safe_union.
*/</font>
<font color='#0000FF'>typedef</font> type_safe_union<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>int</u></font>, my_example_object<font color='#5555FF'>&gt;</font> tsu_type;
dlib::pipe<font color='#5555FF'>&lt;</font>tsu_type<font color='#5555FF'>&gt;</font> <font color='#BB00BB'>in</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>, <font color='#BB00BB'>out</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Note that we don't have to start the listening bridge first. If b2
</font> <font color='#009900'>// fails to make a connection it will just keep trying until successful.
</font> bridge <font color='#BB00BB'>b2</font><font face='Lucida Console'>(</font><font color='#BB00BB'>connect_to</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>127.0.0.1:12345</font>"<font face='Lucida Console'>)</font>, <font color='#BB00BB'>receive</font><font face='Lucida Console'>(</font>in<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// We don't have to configure a bridge in it's constructor. If it's
</font> <font color='#009900'>// more convenient we can do so by calling reconfigure() instead.
</font> bridge b1;
b1.<font color='#BB00BB'>reconfigure</font><font face='Lucida Console'>(</font><font color='#BB00BB'>listen_on_port</font><font face='Lucida Console'>(</font><font color='#979000'>12345</font><font face='Lucida Console'>)</font>, <font color='#BB00BB'>transmit</font><font face='Lucida Console'>(</font>out<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
tsu_type msg;
msg <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>msg<font face='Lucida Console'>)</font>;
msg <font color='#5555FF'>=</font> <font color='#979000'>2</font>;
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>msg<font face='Lucida Console'>)</font>;
msg.get<font color='#5555FF'>&lt;</font>my_example_object<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.value <font color='#5555FF'>=</font> <font color='#979000'>3</font>;
msg.get<font color='#5555FF'>&lt;</font>my_example_object<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.str <font color='#5555FF'>=</font> "<font color='#CC0000'>some string</font>";
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>msg<font face='Lucida Console'>)</font>;
<font color='#009900'>// dequeue the three objects we sent and print them on the screen.
</font> <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> <font color='#979000'>3</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font>
<b>{</b>
in.<font color='#BB00BB'>dequeue</font><font face='Lucida Console'>(</font>msg<font face='Lucida Console'>)</font>;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>msg.contains<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>int</u></font><font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>dequeued int: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> msg.get<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>int</u></font><font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>msg.contains<font color='#5555FF'>&lt;</font>my_example_object<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>dequeued struct: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> msg.get<font color='#5555FF'>&lt;</font>my_example_object<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.value <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'> </font>"
<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> msg.get<font color='#5555FF'>&lt;</font>my_example_object<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.str <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<b>}</b>
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> <b><a name='run_example_4'></a>run_example_4</b><font face='Lucida Console'>(</font>
<font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>\n ---- Running example 4 ---- </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#009900'>/*
This final example is the same as example 3 except we will also now be getting
status messages from the bridges. These bridge_status messages tell us the
state of the TCP connection associated with a bridge. Is it connected or not?
Who it is connected to?
The way you get these status messages is by ensuring that your receive pipe is
capable of storing bridge_status objects. If it is then the bridge will
automatically insert bridge_status messages into your receive pipe whenever
there is a status change.
There are only two kinds of status changes. The establishment of a connection
or the closing of a connection. Also, a connection which closes due to you
calling clear(), reconfigure(), or destructing a bridge does not generate a
status message since, in this case, you already know about it and just want
the bridge to destroy itself as quickly as possible.
*/</font>
<font color='#0000FF'>typedef</font> type_safe_union<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>int</u></font>, my_example_object, bridge_status<font color='#5555FF'>&gt;</font> tsu_type;
dlib::pipe<font color='#5555FF'>&lt;</font>tsu_type<font color='#5555FF'>&gt;</font> <font color='#BB00BB'>in</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>, <font color='#BB00BB'>out</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>;
dlib::pipe<font color='#5555FF'>&lt;</font>bridge_status<font color='#5555FF'>&gt;</font> <font color='#BB00BB'>b1_status</font><font face='Lucida Console'>(</font><font color='#979000'>4</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// setup both bridges to have receive pipes capable of holding bridge_status messages.
</font> bridge <font color='#BB00BB'>b1</font><font face='Lucida Console'>(</font><font color='#BB00BB'>listen_on_port</font><font face='Lucida Console'>(</font><font color='#979000'>12345</font><font face='Lucida Console'>)</font>, <font color='#BB00BB'>transmit</font><font face='Lucida Console'>(</font>out<font face='Lucida Console'>)</font>, <font color='#BB00BB'>receive</font><font face='Lucida Console'>(</font>b1_status<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Note that we can also use a hostname with connect_to() instead of supplying an IP address.
</font> bridge <font color='#BB00BB'>b2</font><font face='Lucida Console'>(</font><font color='#BB00BB'>connect_to</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>localhost:12345</font>"<font face='Lucida Console'>)</font>, <font color='#BB00BB'>receive</font><font face='Lucida Console'>(</font>in<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
tsu_type msg;
bridge_status bs;
<font color='#009900'>// Once a connection is established it will generate a status message from each bridge.
</font> <font color='#009900'>// Let's get those and print them.
</font> b1_status.<font color='#BB00BB'>dequeue</font><font face='Lucida Console'>(</font>bs<font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>bridge 1 status: is_connected: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> boolalpha <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> bs.is_connected <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>bridge 1 status: foreign_ip: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> bs.foreign_ip <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>bridge 1 status: foreign_port: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> bs.foreign_port <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
in.<font color='#BB00BB'>dequeue</font><font face='Lucida Console'>(</font>msg<font face='Lucida Console'>)</font>;
bs <font color='#5555FF'>=</font> msg.get<font color='#5555FF'>&lt;</font>bridge_status<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>bridge 2 status: is_connected: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> bs.is_connected <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>bridge 2 status: foreign_ip: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> bs.foreign_ip <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>bridge 2 status: foreign_port: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> bs.foreign_port <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
msg <font color='#5555FF'>=</font> <font color='#979000'>1</font>;
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>msg<font face='Lucida Console'>)</font>;
msg <font color='#5555FF'>=</font> <font color='#979000'>2</font>;
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>msg<font face='Lucida Console'>)</font>;
msg.get<font color='#5555FF'>&lt;</font>my_example_object<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.value <font color='#5555FF'>=</font> <font color='#979000'>3</font>;
msg.get<font color='#5555FF'>&lt;</font>my_example_object<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.str <font color='#5555FF'>=</font> "<font color='#CC0000'>some string</font>";
out.<font color='#BB00BB'>enqueue</font><font face='Lucida Console'>(</font>msg<font face='Lucida Console'>)</font>;
<font color='#009900'>// Read the 3 things we sent over the connection.
</font> <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> <font color='#979000'>3</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font>
<b>{</b>
in.<font color='#BB00BB'>dequeue</font><font face='Lucida Console'>(</font>msg<font face='Lucida Console'>)</font>;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>msg.contains<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>int</u></font><font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>dequeued int: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> msg.get<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>int</u></font><font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<font color='#0000FF'>else</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>msg.contains<font color='#5555FF'>&lt;</font>my_example_object<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>dequeued struct: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> msg.get<font color='#5555FF'>&lt;</font>my_example_object<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.value <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'> </font>"
<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> msg.get<font color='#5555FF'>&lt;</font>my_example_object<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>.str <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<b>}</b>
<font color='#009900'>// cause bridge 1 to shutdown completely. This will close the connection and
</font> <font color='#009900'>// therefore bridge 2 will generate a status message indicating the connection
</font> <font color='#009900'>// just closed.
</font> b1.<font color='#BB00BB'>clear</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
in.<font color='#BB00BB'>dequeue</font><font face='Lucida Console'>(</font>msg<font face='Lucida Console'>)</font>;
bs <font color='#5555FF'>=</font> msg.get<font color='#5555FF'>&lt;</font>bridge_status<font color='#5555FF'>&gt;</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>bridge 1 status: is_connected: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> bs.is_connected <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>bridge 1 status: foreign_ip: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> bs.foreign_ip <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>bridge 1 status: foreign_port: </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> bs.foreign_port <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font><font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
</pre></body></html>

View File

@@ -1,285 +0,0 @@
<html><!-- Created using the cpp_pretty_printer from the dlib C++ library. See http://dlib.net for updates. --><head><title>dlib C++ Library - <a href="bsp_ex.cpp.html">bsp_ex.cpp</a></title></head><body bgcolor='white'><pre>
<font color='#009900'>// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
</font><font color='#009900'>/*
This is an example illustrating the use of the Bulk Synchronous Parallel (BSP)
processing tools from the dlib C++ Library. These tools allow you to easily setup a
number of processes running on different computers which cooperate to compute some
result.
In this example, we will use the BSP tools to find the minimizer of a simple function.
In particular, we will setup a nested grid search where different parts of the grid are
searched in parallel by different processes.
To run this program you should do the following (supposing you want to use three BSP
nodes to do the grid search and, to make things easy, you will run them all on your
current computer):
1. Open three command windows and navigate each to the folder containing the
compiled <a href="bsp_ex.cpp.html">bsp_ex.cpp</a> program. Let's call these window 1, window 2, and window 3.
2. In window 1 execute this command:
./bsp_ex -l12345
This will start a listening BSP node that listens on port 12345. The BSP node
won't do anything until we tell all the nodes to start running in step 4 below.
3. In window 2 execute this command:
./bsp_ex -l12346
This starts another listening BSP node. Note that since we are running this
example all on one computer you need to use different listening port numbers
for each listening node.
4. In window 3 execute this command:
./bsp_ex localhost:12345 localhost:12346
This will start a BSP node that connects to the others and gets them all running.
Additionally, as you will see when we go over the code below, it will also print
the final output of the BSP process, which is the minimizer of our test function.
Once it terminates, all the other BSP nodes will also automatically terminate.
*/</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>cmd_line_parser.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>bsp.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>matrix.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>iostream<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> std;
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> dlib;
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>// These are the functions executed by the BSP nodes. They are defined below.
</font><font color='#0000FF'><u>void</u></font> <b><a name='bsp_job_node_0'></a>bsp_job_node_0</b> <font face='Lucida Console'>(</font>bsp_context<font color='#5555FF'>&amp;</font> bsp, <font color='#0000FF'><u>double</u></font><font color='#5555FF'>&amp;</font> min_value, <font color='#0000FF'><u>double</u></font><font color='#5555FF'>&amp;</font> optimal_x<font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_job_other_nodes'></a>bsp_job_other_nodes</b> <font face='Lucida Console'>(</font>bsp_context<font color='#5555FF'>&amp;</font> bsp, <font color='#0000FF'><u>long</u></font> grid_resolution<font face='Lucida Console'>)</font>;
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>int</u></font> <b><a name='main'></a>main</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font> argc, <font color='#0000FF'><u>char</u></font><font color='#5555FF'>*</font><font color='#5555FF'>*</font> argv<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>try</font>
<b>{</b>
<font color='#009900'>// Use the dlib command_line_parser to parse the command line. See the
</font> <font color='#009900'>// <a href="compress_stream_ex.cpp.html">compress_stream_ex.cpp</a> example program for an introduction to the command line
</font> <font color='#009900'>// parser.
</font> command_line_parser parser;
parser.<font color='#BB00BB'>add_option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>h</font>","<font color='#CC0000'>Display this help message.</font>"<font face='Lucida Console'>)</font>;
parser.<font color='#BB00BB'>add_option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>l</font>","<font color='#CC0000'>Run as a listening BSP node.</font>",<font color='#979000'>1</font><font face='Lucida Console'>)</font>;
parser.<font color='#BB00BB'>parse</font><font face='Lucida Console'>(</font>argc, argv<font face='Lucida Console'>)</font>;
parser.<font color='#BB00BB'>check_option_arg_range</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>l</font>", <font color='#979000'>1</font>, <font color='#979000'>65535</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// Print a help message if the user gives -h on the command line.
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>parser.<font color='#BB00BB'>option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>h</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// display all the command line options
</font> cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Usage: bsp_ex (-l port | &lt;list of hosts&gt;)\n</font>";
parser.<font color='#BB00BB'>print_options</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>return</font> <font color='#979000'>0</font>;
<b>}</b>
<font color='#009900'>// If the command line contained -l
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>parser.<font color='#BB00BB'>option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>l</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// Get the argument to -l
</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>short</u></font> listening_port <font color='#5555FF'>=</font> <font color='#BB00BB'>get_option</font><font face='Lucida Console'>(</font>parser, "<font color='#CC0000'>l</font>", <font color='#979000'>0</font><font face='Lucida Console'>)</font>;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Listening on port </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> listening_port <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#0000FF'>const</font> <font color='#0000FF'><u>long</u></font> grid_resolution <font color='#5555FF'>=</font> <font color='#979000'>100</font>;
<font color='#009900'>// bsp_listen() starts a listening BSP job. This means that it will wait until
</font> <font color='#009900'>// someone calls bsp_connect() and connects to it before it starts running.
</font> <font color='#009900'>// However, once it starts it will call bsp_job_other_nodes() which will then
</font> <font color='#009900'>// do all the real work.
</font> <font color='#009900'>//
</font> <font color='#009900'>// The first argument is the port to listen on. The second argument is the
</font> <font color='#009900'>// function which it should run to do all the work. The other arguments are
</font> <font color='#009900'>// optional and allow you to pass values into the bsp_job_other_nodes()
</font> <font color='#009900'>// routine. In this case, we are passing the grid_resolution to
</font> <font color='#009900'>// bsp_job_other_nodes().
</font> <font color='#BB00BB'>bsp_listen</font><font face='Lucida Console'>(</font>listening_port, bsp_job_other_nodes, grid_resolution<font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>parser.<font color='#BB00BB'>number_of_arguments</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>=</font><font color='#5555FF'>=</font> <font color='#979000'>0</font><font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>You must give some listening BSP nodes as arguments to this program!</font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#0000FF'>return</font> <font color='#979000'>0</font>;
<b>}</b>
<font color='#009900'>// Take the hostname:port strings from the command line and put them into the
</font> <font color='#009900'>// vector of hosts.
</font> std::vector<font color='#5555FF'>&lt;</font>network_address<font color='#5555FF'>&gt;</font> hosts;
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>long</u></font> i <font color='#5555FF'>=</font> <font color='#979000'>0</font>; i <font color='#5555FF'>&lt;</font> parser.<font color='#BB00BB'>number_of_arguments</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>i<font face='Lucida Console'>)</font>
hosts.<font color='#BB00BB'>push_back</font><font face='Lucida Console'>(</font>parser[i]<font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>double</u></font> min_value, optimal_x;
<font color='#009900'>// Calling bsp_connect() does two things. First, it tells all the BSP jobs
</font> <font color='#009900'>// listed in the hosts vector to start running. Second, it starts a locally
</font> <font color='#009900'>// running BSP job that executes bsp_job_node_0() and passes it any arguments
</font> <font color='#009900'>// listed after bsp_job_node_0. So in this case it passes it the 3rd and 4th
</font> <font color='#009900'>// arguments.
</font> <font color='#009900'>//
</font> <font color='#009900'>// Note also that we use dlib::ref() which causes these arguments to be passed
</font> <font color='#009900'>// by reference. This means that bsp_job_node_0() will be able to modify them
</font> <font color='#009900'>// and we will see the results here in main() after bsp_connect() terminates.
</font> <font color='#BB00BB'>bsp_connect</font><font face='Lucida Console'>(</font>hosts, bsp_job_node_0, dlib::<font color='#BB00BB'>ref</font><font face='Lucida Console'>(</font>min_value<font face='Lucida Console'>)</font>, dlib::<font color='#BB00BB'>ref</font><font face='Lucida Console'>(</font>optimal_x<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// bsp_connect() and bsp_listen() block until all the BSP nodes have terminated.
</font> <font color='#009900'>// Therefore, we won't get to this part of the code until the BSP processing
</font> <font color='#009900'>// has finished. But once we do we can print the results like so:
</font> cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>optimal_x: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> optimal_x <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>min_value: </font>"<font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> min_value <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<b>}</b>
<font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>std::exception<font color='#5555FF'>&amp;</font> e<font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>error in main(): </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> e.<font color='#BB00BB'>what</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#009900'>/*
We are going to use the BSP tools to find the minimum of f(x). Note that
it's minimizer is at x == 2.0.
*/</font>
<font color='#0000FF'><u>double</u></font> <b><a name='f'></a>f</b> <font face='Lucida Console'>(</font><font color='#0000FF'><u>double</u></font> x<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>return</font> std::<font color='#BB00BB'>pow</font><font face='Lucida Console'>(</font>x<font color='#5555FF'>-</font><font color='#979000'>2.0</font>, <font color='#979000'>2.0</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_job_node_0'></a>bsp_job_node_0</b> <font face='Lucida Console'>(</font>bsp_context<font color='#5555FF'>&amp;</font> bsp, <font color='#0000FF'><u>double</u></font><font color='#5555FF'>&amp;</font> min_value, <font color='#0000FF'><u>double</u></font><font color='#5555FF'>&amp;</font> optimal_x<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// This function is called by bsp_connect(). In general, any BSP node can do anything
</font> <font color='#009900'>// you want. However, in this example we use this node as a kind of controller for the
</font> <font color='#009900'>// other nodes. In particular, since we are doing a nested grid search, this node's
</font> <font color='#009900'>// job will be to collect results from other nodes and then decide which part of the
</font> <font color='#009900'>// number line subsequent iterations should focus on.
</font> <font color='#009900'>//
</font> <font color='#009900'>// Also, each BSP node has a node ID number. You can determine it by calling
</font> <font color='#009900'>// bsp.node_id(). However, the node spawned by a call to bsp_connect() always has a
</font> <font color='#009900'>// node ID of 0 (hence the name of this function). Additionally, all functions
</font> <font color='#009900'>// executing a BSP task always take a bsp_context as their first argument. This object
</font> <font color='#009900'>// is the interface that allows BSP jobs to communicate with each other.
</font>
<font color='#009900'>// Now let's get down to work. Recall that we are trying to find the x value that
</font> <font color='#009900'>// minimizes the f(x) defined above. The grid search will start out by considering the
</font> <font color='#009900'>// range [-1e100, 1e100] on the number line. It will progressively narrow this window
</font> <font color='#009900'>// until it has located the minimizer of f(x) to within 1e-15 of its true value.
</font> <font color='#0000FF'><u>double</u></font> left <font color='#5555FF'>=</font> <font color='#5555FF'>-</font><font color='#979000'>1e100</font>;
<font color='#0000FF'><u>double</u></font> right <font color='#5555FF'>=</font> <font color='#979000'>1e100</font>;
min_value <font color='#5555FF'>=</font> std::numeric_limits<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>double</u></font><font color='#5555FF'>&gt;</font>::<font color='#BB00BB'>infinity</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'><u>double</u></font> interval_width <font color='#5555FF'>=</font> std::<font color='#BB00BB'>abs</font><font face='Lucida Console'>(</font>right<font color='#5555FF'>-</font>left<font face='Lucida Console'>)</font>;
<font color='#009900'>// keep going until the window is smaller than 1e-15.
</font> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>right<font color='#5555FF'>-</font>left <font color='#5555FF'>&gt;</font> <font color='#979000'>1e</font><font color='#5555FF'>-</font><font color='#979000'>15</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// At the start of each loop, we broadcast the current window to all the other BSP
</font> <font color='#009900'>// nodes. They will each search a separate part of the window and then report back
</font> <font color='#009900'>// the smallest values they found in their respective sub-windows.
</font> <font color='#009900'>//
</font> <font color='#009900'>// Also, you can send/broadcast/receive anything that has global serialize() and
</font> <font color='#009900'>// deserialize() routines defined for it. Dlib comes with serialization functions
</font> <font color='#009900'>// for a lot of types by default, so we don't have to define anything for this
</font> <font color='#009900'>// example program. However, if you want to send an object you defined then you
</font> <font color='#009900'>// will need to write your own serialization functions. See the documentation for
</font> <font color='#009900'>// dlib's serialize() routine or the <a href="bridge_ex.cpp.html">bridge_ex.cpp</a> example program for an example.
</font> bsp.<font color='#BB00BB'>broadcast</font><font face='Lucida Console'>(</font>left<font face='Lucida Console'>)</font>;
bsp.<font color='#BB00BB'>broadcast</font><font face='Lucida Console'>(</font>right<font face='Lucida Console'>)</font>;
<font color='#009900'>// Receive the smallest values found from the other BSP nodes.
</font> <font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>unsigned</u></font> <font color='#0000FF'><u>int</u></font> k <font color='#5555FF'>=</font> <font color='#979000'>1</font>; k <font color='#5555FF'>&lt;</font> bsp.<font color='#BB00BB'>number_of_nodes</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>k<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// The other nodes will send std::pairs of x/f(x) values. So that is what we
</font> <font color='#009900'>// receive.
</font> std::pair<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>double</u></font>,<font color='#0000FF'><u>double</u></font><font color='#5555FF'>&gt;</font> val;
bsp.<font color='#BB00BB'>receive</font><font face='Lucida Console'>(</font>val<font face='Lucida Console'>)</font>;
<font color='#009900'>// save the smallest result.
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>val.second <font color='#5555FF'>&lt;</font> min_value<font face='Lucida Console'>)</font>
<b>{</b>
min_value <font color='#5555FF'>=</font> val.second;
optimal_x <font color='#5555FF'>=</font> val.first;
<b>}</b>
<b>}</b>
<font color='#009900'>// Now narrow the search window by half.
</font> interval_width <font color='#5555FF'>*</font><font color='#5555FF'>=</font> <font color='#979000'>0.5</font>;
left <font color='#5555FF'>=</font> optimal_x <font color='#5555FF'>-</font> interval_width<font color='#5555FF'>/</font><font color='#979000'>2</font>;
right <font color='#5555FF'>=</font> optimal_x <font color='#5555FF'>+</font> interval_width<font color='#5555FF'>/</font><font color='#979000'>2</font>;
<b>}</b>
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
<font color='#0000FF'><u>void</u></font> <b><a name='bsp_job_other_nodes'></a>bsp_job_other_nodes</b> <font face='Lucida Console'>(</font>bsp_context<font color='#5555FF'>&amp;</font> bsp, <font color='#0000FF'><u>long</u></font> grid_resolution<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// This is the BSP job called by bsp_listen(). In these jobs we will receive window
</font> <font color='#009900'>// ranges from the controller node, search our sub-window, and then report back the
</font> <font color='#009900'>// location of the best x value we found.
</font>
<font color='#0000FF'><u>double</u></font> left, right;
<font color='#009900'>// The try_receive() function will either return true with the next message or return
</font> <font color='#009900'>// false if there aren't any more messages in flight between nodes and all other BSP
</font> <font color='#009900'>// nodes are blocked on calls to receive or have terminated. That is, try_receive()
</font> <font color='#009900'>// only returns false if waiting for a message would result in all the BSP nodes
</font> <font color='#009900'>// waiting forever.
</font> <font color='#009900'>//
</font> <font color='#009900'>// Therefore, try_receive() serves both as a message receiving tool as well as an
</font> <font color='#009900'>// implicit form of barrier synchronization. In this case, we use it to know when to
</font> <font color='#009900'>// terminate. That is, we know it is time to terminate if all the messages between
</font> <font color='#009900'>// nodes have been received and all nodes are inactive due to either termination or
</font> <font color='#009900'>// being blocked on a receive call. This will happen once the controller node above
</font> <font color='#009900'>// terminates since it will result in all the other nodes inevitably becoming blocked
</font> <font color='#009900'>// on this try_receive() line with no messages to process.
</font> <font color='#0000FF'>while</font> <font face='Lucida Console'>(</font>bsp.<font color='#BB00BB'>try_receive</font><font face='Lucida Console'>(</font>left<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
bsp.<font color='#BB00BB'>receive</font><font face='Lucida Console'>(</font>right<font face='Lucida Console'>)</font>;
<font color='#009900'>// Compute a sub-window range for us to search. We use our node's ID value and the
</font> <font color='#009900'>// total number of nodes to select a subset of the [left, right] window. We will
</font> <font color='#009900'>// store the grid points from our sub-window in values_to_check.
</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>double</u></font> l <font color='#5555FF'>=</font> <font face='Lucida Console'>(</font>bsp.<font color='#BB00BB'>node_id</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1</font><font face='Lucida Console'>)</font><font color='#5555FF'>/</font><font face='Lucida Console'>(</font>bsp.<font color='#BB00BB'>number_of_nodes</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1.0</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>const</font> <font color='#0000FF'><u>double</u></font> r <font color='#5555FF'>=</font> bsp.<font color='#BB00BB'>node_id</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>/</font><font face='Lucida Console'>(</font>bsp.<font color='#BB00BB'>number_of_nodes</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font><font color='#5555FF'>-</font><font color='#979000'>1.0</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>const</font> <font color='#0000FF'><u>double</u></font> width <font color='#5555FF'>=</font> right<font color='#5555FF'>-</font>left;
<font color='#009900'>// Select grid_resolution number of points which are linearly spaced throughout our
</font> <font color='#009900'>// sub-window.
</font> <font color='#0000FF'>const</font> matrix<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>double</u></font><font color='#5555FF'>&gt;</font> values_to_check <font color='#5555FF'>=</font> <font color='#BB00BB'>linspace</font><font face='Lucida Console'>(</font>left<font color='#5555FF'>+</font>l<font color='#5555FF'>*</font>width, left<font color='#5555FF'>+</font>r<font color='#5555FF'>*</font>width, grid_resolution<font face='Lucida Console'>)</font>;
<font color='#009900'>// Search all the points in values_to_check and figure out which one gives the
</font> <font color='#009900'>// minimum value of f().
</font> <font color='#0000FF'><u>double</u></font> best_x <font color='#5555FF'>=</font> <font color='#979000'>0</font>;
<font color='#0000FF'><u>double</u></font> best_val <font color='#5555FF'>=</font> std::numeric_limits<font color='#5555FF'>&lt;</font><font color='#0000FF'><u>double</u></font><font color='#5555FF'>&gt;</font>::<font color='#BB00BB'>infinity</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>for</font> <font face='Lucida Console'>(</font><font color='#0000FF'><u>long</u></font> j <font color='#5555FF'>=</font> <font color='#979000'>0</font>; j <font color='#5555FF'>&lt;</font> values_to_check.<font color='#BB00BB'>size</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>; <font color='#5555FF'>+</font><font color='#5555FF'>+</font>j<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'><u>double</u></font> temp <font color='#5555FF'>=</font> <font color='#BB00BB'>f</font><font face='Lucida Console'>(</font><font color='#BB00BB'>values_to_check</font><font face='Lucida Console'>(</font>j<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>temp <font color='#5555FF'>&lt;</font> best_val<font face='Lucida Console'>)</font>
<b>{</b>
best_val <font color='#5555FF'>=</font> temp;
best_x <font color='#5555FF'>=</font> <font color='#BB00BB'>values_to_check</font><font face='Lucida Console'>(</font>j<font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
<font color='#009900'>// Report back the identity of the best point we found in our sub-window. Note
</font> <font color='#009900'>// that the second argument to send(), the 0, is the node ID to send to. In this
</font> <font color='#009900'>// case we send our results back to the controller node.
</font> bsp.<font color='#BB00BB'>send</font><font face='Lucida Console'>(</font><font color='#BB00BB'>make_pair</font><font face='Lucida Console'>(</font>best_x, best_val<font face='Lucida Console'>)</font>, <font color='#979000'>0</font><font face='Lucida Console'>)</font>;
<b>}</b>
<b>}</b>
<font color='#009900'>// ----------------------------------------------------------------------------------------
</font>
</pre></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,248 +0,0 @@
<html><!-- Created using the cpp_pretty_printer from the dlib C++ library. See http://dlib.net for updates. --><head><title>dlib C++ Library - compress_stream_ex.cpp</title></head><body bgcolor='white'><pre>
<font color='#009900'>// The contents of this file are in the public domain. See LICENSE_FOR_EXAMPLE_PROGRAMS.txt
</font><font color='#009900'>/*
This is an example illustrating the use of the compress_stream and
cmd_line_parser components from the dlib C++ Library.
This example implements a simple command line compression utility.
The output from the program when the -h option is given is:
Usage: compress_stream_ex (-c|-d|-l) --in input_file --out output_file
Options:
-c Indicates that we want to compress a file.
-d Indicates that we want to decompress a file.
--in &lt;arg&gt; This option takes one argument which specifies the name of the
file we want to compress/decompress.
--out &lt;arg&gt; This option takes one argument which specifies the name of the
output file.
Miscellaneous Options:
-h Display this help message.
-l &lt;arg&gt; Set the compression level [1-3], 3 is max compression, default
is 2.
*/</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>compress_stream.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>dlib<font color='#5555FF'>/</font>cmd_line_parser.h<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>iostream<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>fstream<font color='#5555FF'>&gt;</font>
<font color='#0000FF'>#include</font> <font color='#5555FF'>&lt;</font>string<font color='#5555FF'>&gt;</font>
<font color='#009900'>// I am making a typedefs for the versions of compress_stream I want to use.
</font><font color='#0000FF'>typedef</font> dlib::compress_stream::kernel_1da cs1;
<font color='#0000FF'>typedef</font> dlib::compress_stream::kernel_1ea cs2;
<font color='#0000FF'>typedef</font> dlib::compress_stream::kernel_1ec cs3;
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> std;
<font color='#0000FF'>using</font> <font color='#0000FF'>namespace</font> dlib;
<font color='#0000FF'><u>int</u></font> <b><a name='main'></a>main</b><font face='Lucida Console'>(</font><font color='#0000FF'><u>int</u></font> argc, <font color='#0000FF'><u>char</u></font><font color='#5555FF'>*</font><font color='#5555FF'>*</font> argv<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>try</font>
<b>{</b>
command_line_parser parser;
<font color='#009900'>// first I will define the command line options I want.
</font> <font color='#009900'>// Add a -c option and tell the parser what the option is for.
</font> parser.<font color='#BB00BB'>add_option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>c</font>","<font color='#CC0000'>Indicates that we want to compress a file.</font>"<font face='Lucida Console'>)</font>;
parser.<font color='#BB00BB'>add_option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>d</font>","<font color='#CC0000'>Indicates that we want to decompress a file.</font>"<font face='Lucida Console'>)</font>;
<font color='#009900'>// add a --in option that takes 1 argument
</font> parser.<font color='#BB00BB'>add_option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>in</font>","<font color='#CC0000'>This option takes one argument which specifies the name of the file we want to compress/decompress.</font>",<font color='#979000'>1</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// add a --out option that takes 1 argument
</font> parser.<font color='#BB00BB'>add_option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>out</font>","<font color='#CC0000'>This option takes one argument which specifies the name of the output file.</font>",<font color='#979000'>1</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// In the code below, we use the parser.print_options() method to print all our
</font> <font color='#009900'>// options to the screen. We can tell it that we would like some options to be
</font> <font color='#009900'>// grouped together by calling set_group_name() before adding those options. In
</font> <font color='#009900'>// general, you can make as many groups as you like by calling set_group_name().
</font> <font color='#009900'>// However, here we make only one named group.
</font> parser.<font color='#BB00BB'>set_group_name</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>Miscellaneous Options</font>"<font face='Lucida Console'>)</font>;
parser.<font color='#BB00BB'>add_option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>h</font>","<font color='#CC0000'>Display this help message.</font>"<font face='Lucida Console'>)</font>;
parser.<font color='#BB00BB'>add_option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>l</font>","<font color='#CC0000'>Set the compression level [1-3], 3 is max compression, default is 2.</font>",<font color='#979000'>1</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// now I will parse the command line
</font> parser.<font color='#BB00BB'>parse</font><font face='Lucida Console'>(</font>argc,argv<font face='Lucida Console'>)</font>;
<font color='#009900'>// Now I will use the parser to validate some things about the command line.
</font> <font color='#009900'>// If any of the following checks fail then an exception will be thrown and it will
</font> <font color='#009900'>// contain a message that tells the user what the problem was.
</font>
<font color='#009900'>// First I want to check that none of the options were given on the command line
</font> <font color='#009900'>// more than once. To do this I define an array that contains the options
</font> <font color='#009900'>// that shouldn't appear more than once and then I just call check_one_time_options()
</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>char</u></font><font color='#5555FF'>*</font> one_time_opts[] <font color='#5555FF'>=</font> <b>{</b>"<font color='#CC0000'>c</font>", "<font color='#CC0000'>d</font>", "<font color='#CC0000'>in</font>", "<font color='#CC0000'>out</font>", "<font color='#CC0000'>h</font>", "<font color='#CC0000'>l</font>"<b>}</b>;
parser.<font color='#BB00BB'>check_one_time_options</font><font face='Lucida Console'>(</font>one_time_opts<font face='Lucida Console'>)</font>;
<font color='#009900'>// Here I'm checking that the user didn't pick both the c and d options at the
</font> <font color='#009900'>// same time.
</font> parser.<font color='#BB00BB'>check_incompatible_options</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>c</font>", "<font color='#CC0000'>d</font>"<font face='Lucida Console'>)</font>;
<font color='#009900'>// Here I'm checking that the argument to the l option is an integer in the range 1 to 3.
</font> <font color='#009900'>// That is, it should be convertible to an int by dlib::string_assign and be either
</font> <font color='#009900'>// 1, 2, or 3. Note that if you wanted to allow floating point values in the range 1 to
</font> <font color='#009900'>// 3 then you could give a range 1.0 to 3.0 or explicitly supply a type of float or double
</font> <font color='#009900'>// to the template argument of the check_option_arg_range() function.
</font> parser.<font color='#BB00BB'>check_option_arg_range</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>l</font>", <font color='#979000'>1</font>, <font color='#979000'>3</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// The 'l' option is a sub-option of the 'c' option. That is, you can only select the
</font> <font color='#009900'>// compression level when compressing. This command below checks that the listed
</font> <font color='#009900'>// sub options are always given in the presence of their parent options.
</font> <font color='#0000FF'>const</font> <font color='#0000FF'><u>char</u></font><font color='#5555FF'>*</font> c_sub_opts[] <font color='#5555FF'>=</font> <b>{</b>"<font color='#CC0000'>l</font>"<b>}</b>;
parser.<font color='#BB00BB'>check_sub_options</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>c</font>", c_sub_opts<font face='Lucida Console'>)</font>;
<font color='#009900'>// check if the -h option was given on the command line
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>parser.<font color='#BB00BB'>option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>h</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// display all the command line options
</font> cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Usage: compress_stream_ex (-c|-d|-l) --in input_file --out output_file\n</font>";
<font color='#009900'>// This function prints out a nicely formatted list of
</font> <font color='#009900'>// all the options the parser has
</font> parser.<font color='#BB00BB'>print_options</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<font color='#0000FF'>return</font> <font color='#979000'>0</font>;
<b>}</b>
<font color='#009900'>// Figure out what the compression level should be. If the user didn't supply
</font> <font color='#009900'>// this command line option then a value of 2 will be used.
</font> <font color='#0000FF'><u>int</u></font> compression_level <font color='#5555FF'>=</font> <font color='#BB00BB'>get_option</font><font face='Lucida Console'>(</font>parser,"<font color='#CC0000'>l</font>",<font color='#979000'>2</font><font face='Lucida Console'>)</font>;
<font color='#009900'>// make sure one of the c or d options was given
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font>parser.<font color='#BB00BB'>option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>c</font>"<font face='Lucida Console'>)</font> <font color='#5555FF'>&amp;</font><font color='#5555FF'>&amp;</font> <font color='#5555FF'>!</font>parser.<font color='#BB00BB'>option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>d</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Error in command line:\n You must specify either the c option or the d option.\n</font>";
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>\nTry the -h option for more information.</font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#0000FF'>return</font> <font color='#979000'>0</font>;
<b>}</b>
string in_file;
string out_file;
<font color='#009900'>// check if the user told us the input file and if they did then
</font> <font color='#009900'>// get the file name
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>parser.<font color='#BB00BB'>option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>in</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
in_file <font color='#5555FF'>=</font> parser.<font color='#BB00BB'>option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>in</font>"<font face='Lucida Console'>)</font>.<font color='#BB00BB'>argument</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Error in command line:\n You must specify an input file.\n</font>";
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>\nTry the -h option for more information.</font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#0000FF'>return</font> <font color='#979000'>0</font>;
<b>}</b>
<font color='#009900'>// check if the user told us the output file and if they did then
</font> <font color='#009900'>// get the file name
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>parser.<font color='#BB00BB'>option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>out</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
out_file <font color='#5555FF'>=</font> parser.<font color='#BB00BB'>option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>out</font>"<font face='Lucida Console'>)</font>.<font color='#BB00BB'>argument</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>;
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Error in command line:\n You must specify an output file.\n</font>";
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>\nTry the -h option for more information.</font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<font color='#0000FF'>return</font> <font color='#979000'>0</font>;
<b>}</b>
<font color='#009900'>// open the files we will be reading from and writing to
</font> ifstream <font color='#BB00BB'>fin</font><font face='Lucida Console'>(</font>in_file.<font color='#BB00BB'>c_str</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,ios::binary<font face='Lucida Console'>)</font>;
ofstream <font color='#BB00BB'>fout</font><font face='Lucida Console'>(</font>out_file.<font color='#BB00BB'>c_str</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font>,ios::binary<font face='Lucida Console'>)</font>;
<font color='#009900'>// make sure the files opened correctly
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font>fin<font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Error opening file </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> in_file <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>.\n</font>";
<font color='#0000FF'>return</font> <font color='#979000'>0</font>;
<b>}</b>
<font color='#0000FF'>if</font> <font face='Lucida Console'>(</font><font color='#5555FF'>!</font>fout<font face='Lucida Console'>)</font>
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Error creating file </font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> out_file <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>.\n</font>";
<font color='#0000FF'>return</font> <font color='#979000'>0</font>;
<b>}</b>
<font color='#009900'>// now perform the actual compression or decompression.
</font> <font color='#0000FF'>if</font> <font face='Lucida Console'>(</font>parser.<font color='#BB00BB'>option</font><font face='Lucida Console'>(</font>"<font color='#CC0000'>c</font>"<font face='Lucida Console'>)</font><font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// save the compression level to the output file
</font> <font color='#BB00BB'>serialize</font><font face='Lucida Console'>(</font>compression_level, fout<font face='Lucida Console'>)</font>;
<font color='#0000FF'>switch</font> <font face='Lucida Console'>(</font>compression_level<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>case</font> <font color='#979000'>1</font>:
<b>{</b>
cs1 compressor;
compressor.<font color='#BB00BB'>compress</font><font face='Lucida Console'>(</font>fin,fout<font face='Lucida Console'>)</font>;
<b>}</b><font color='#0000FF'>break</font>;
<font color='#0000FF'>case</font> <font color='#979000'>2</font>:
<b>{</b>
cs2 compressor;
compressor.<font color='#BB00BB'>compress</font><font face='Lucida Console'>(</font>fin,fout<font face='Lucida Console'>)</font>;
<b>}</b><font color='#0000FF'>break</font>;
<font color='#0000FF'>case</font> <font color='#979000'>3</font>:
<b>{</b>
cs3 compressor;
compressor.<font color='#BB00BB'>compress</font><font face='Lucida Console'>(</font>fin,fout<font face='Lucida Console'>)</font>;
<b>}</b><font color='#0000FF'>break</font>;
<b>}</b>
<b>}</b>
<font color='#0000FF'>else</font>
<b>{</b>
<font color='#009900'>// obtain the compression level from the input file
</font> <font color='#BB00BB'>deserialize</font><font face='Lucida Console'>(</font>compression_level, fin<font face='Lucida Console'>)</font>;
<font color='#0000FF'>switch</font> <font face='Lucida Console'>(</font>compression_level<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#0000FF'>case</font> <font color='#979000'>1</font>:
<b>{</b>
cs1 compressor;
compressor.<font color='#BB00BB'>decompress</font><font face='Lucida Console'>(</font>fin,fout<font face='Lucida Console'>)</font>;
<b>}</b><font color='#0000FF'>break</font>;
<font color='#0000FF'>case</font> <font color='#979000'>2</font>:
<b>{</b>
cs2 compressor;
compressor.<font color='#BB00BB'>decompress</font><font face='Lucida Console'>(</font>fin,fout<font face='Lucida Console'>)</font>;
<b>}</b><font color='#0000FF'>break</font>;
<font color='#0000FF'>case</font> <font color='#979000'>3</font>:
<b>{</b>
cs3 compressor;
compressor.<font color='#BB00BB'>decompress</font><font face='Lucida Console'>(</font>fin,fout<font face='Lucida Console'>)</font>;
<b>}</b><font color='#0000FF'>break</font>;
<font color='#0000FF'>default</font>:
<b>{</b>
cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> "<font color='#CC0000'>Error in compressed file, invalid compression level</font>" <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b><font color='#0000FF'>break</font>;
<b>}</b>
<b>}</b>
<b>}</b>
<font color='#0000FF'>catch</font> <font face='Lucida Console'>(</font>exception<font color='#5555FF'>&amp;</font> e<font face='Lucida Console'>)</font>
<b>{</b>
<font color='#009900'>// Note that this will catch any cmd_line_parse_error exceptions and print
</font> <font color='#009900'>// the default message.
</font> cout <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> e.<font color='#BB00BB'>what</font><font face='Lucida Console'>(</font><font face='Lucida Console'>)</font> <font color='#5555FF'>&lt;</font><font color='#5555FF'>&lt;</font> endl;
<b>}</b>
<b>}</b>
</pre></body></html>

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More