openct-tasks/_common/modules/pemFioi/map/blockly_map.js

194 lines
7.5 KiB
JavaScript

var getContext = function(display, infos) {
var map_strings = {
en: {
categories: {
map: 'Carte'
},
label: {
clearMap: 'clearMap()',
addLocation: 'addLocation(%1, %2, %3)',
addRoad: 'addRoad(%1, %2, %3, %4, %5)',
geoDistance: 'geoDistance(%1, %2, %3, %4)',
getLatitude: 'getLatitude(%1)',
getLongitude: 'getLongitude(%1)',
getNeighbors: 'getNeighbors(%1)',
shortestPath: 'shortestPath(%1, %2)',
echo: 'afficher(%1)'
},
code: {
clearMap: 'clearMap',
addLocation: 'addLocation',
addRoad: 'addRoad',
geoDistance: 'geoDistance',
getLatitude: 'getLatitude',
getLongitude: 'getLongitude',
getNeighbors: 'getNeighbors',
shortestPath: 'shortestPath',
echo: 'afficher'
},
description: {
clearMap: 'Delete everything from the map (roads and locations)',
addLocation: 'Draw a pin with a 1 or 2 letter label at the given coordinates',
addRoad: 'Draw a road (a straight line) between the two locations, with given opacity (between 0 and 1)',
geoDistance: 'returns the geo distance between the two locations, in km.',
getLatitude: 'Returns the latitude of the city',
getLongitude: 'Returns the longitude of the city',
getNeighbors: 'Returns the list of neighbors of the city',
shortestPath: 'Returns the shortest path between the two cities, using geoDistance',
echo: 'Afficher'
},
startingBlockName: "Program",
constantLabel: {
},
messages: {
}
}
}
var context = quickAlgoContext(display, infos)
var strings = context.setLocalLanguageStrings(map_strings)
var map;
var logger;
var conceptBaseUrl = window.location.protocol + '//'
+ 'static4.castor-informatique.fr/help/index.html';
context.conceptList = [
{id: 'map_introduction', name: 'La proglet gogleMaps', url: conceptBaseUrl+'#map_introduction'},
{id: 'map_clearMap', name: 'Effacer la carte', url: conceptBaseUrl+'#map_mapDisplay'},
{id: 'map_addLocation', name: 'Mettre en évidence un point de la carte', url: conceptBaseUrl+'#map_mapDisplay'},
{id: 'map_addRoad', name: 'Tracer une ligne droite', url: conceptBaseUrl+'#map_mapDisplay'},
{id: 'map_getLatitude', name: 'Table des latitudes', url: conceptBaseUrl+'#map_geoData'},
{id: 'map_getLongitude', name: 'Table des longitudes', url: conceptBaseUrl+'#map_geoData'},
{id: 'map_getNeighbors', name: 'Table des voisins', url: conceptBaseUrl+'#map_geoData'},
{id: 'map_geoDistance', name: 'Distance entre deux points', url: conceptBaseUrl+'#map_geoComputing'},
{id: 'map_shortestPath', name: 'Chemin entre deux villes', url: conceptBaseUrl+'#map_geoComputing'}
];
context.reset = function(taskInfos) {
if(!context.display) return
if(!map) {
var options = $.extend({ parent: $('#grid')[0] }, infos.mapConfig);
map = new Map(options);
logger = new Logger({
parent: $('#gridContainer')
});
}
map.clearMap();
}
context.setScale = function(scale) {}
context.updateScale = function() {}
context.resetDisplay = function() {}
context.unload = function() {}
context.onExecutionEnd = function() {}
var typeData = {
'Number': { bType: 'input_value', vType: 'math_number', fName: 'NUM', defVal: 0 },
'String': { bType: 'input_value', vType: 'text', fName: 'TEXT', defVal: '' },
}
context.customBlocks = {
map: {
map: [
{ name: 'clearMap' },
{ name: 'addLocation',
params: ['Number', 'Number', 'String'],
params_names: ['longitude', 'latitude', 'label']
},
{ name: 'addRoad',
params: ['Number', 'Number', 'Number', 'Number', 'Number'],
params_names: ['longitude1', 'latitude1', 'longitude2', 'latitude2', 'opacity']
},
{ name: 'geoDistance',
yieldsValue: true,
params: ['Number', 'Number', 'Number', 'Number'],
params_names: ['longitude1', 'latitude1', 'longitude2', 'latitude2']
},
{ name: 'getLatitude',
yieldsValue: true,
params: ['String'],
params_names: ['cityName']
},
{ name: 'getLongitude',
yieldsValue: true,
params: ['String'],
params_names: ['cityName']
},
{ name: 'getNeighbors',
yieldsValue: true,
params: ['String'],
params_names: ['cityName']
},
{ name: 'shortestPath',
yieldsValue: true,
params: ['String', 'String'],
params_names: ['cityName1', 'cityName2']
},
{ name: 'echo',
params: ['String'],
params_names: ['value']
}
]
}
}
context.map = {
echo: function(msg, callback) {
logger.put(msg);
callback();
}
}
for (var category in context.customBlocks.map) {
for (var iBlock = 0; iBlock < context.customBlocks.map[category].length; iBlock++) {
(function() {
var block = context.customBlocks.map[category][iBlock];
if (block.params) {
block.blocklyJson = { inputsInline: true, args0: {} }
var blockArgs = block.blocklyJson.args0;
block.blocklyXml = '<block type="' + block.name + '">';
for (var iParam = 0; iParam < block.params.length; iParam++) {
var paramData = typeData[block.params[iParam]] || { bType: 'input_value' };
blockArgs[iParam] = { type: paramData.bType, name: "PARAM_" + iParam }
block.blocklyXml +=
'<value name="PARAM_' + iParam + '"><shadow type="' + paramData.vType + '">' +
'<field name="' + paramData.fName + '">' + paramData.defVal + '</field>' +
'</shadow></value>';
}
block.blocklyXml += '</block>';
}
if(context.map[block.name]) {
return;
}
context.map[block.name] = function() {
var callback = arguments[arguments.length - 1];
if(map) {
context.waitDelay(callback, map[block.name].apply(map, arguments))
} else {
callback();
}
}
})();
}
}
return context;
}
if(window.quickAlgoLibraries) {
quickAlgoLibraries.register('map', getContext);
} else {
if(!window.quickAlgoLibrariesList) { window.quickAlgoLibrariesList = []; }
window.quickAlgoLibrariesList.push(['map', getContext]);
}