Tuesday, January 5, 2016

Alterando uma extensão do ThingWorx - Update I

Fala Pessoal,

Continuo minha luta para fazer uma extensão para o ThingWorx. Tem sido uma experiência bacana: quanto mais eu penso em adicionar funcionalidades, as dificuldades vão aparecendo e eu vou descobrindo melhor como o mecanismo de extensões funciona.

Meu último post antes de falar de autenticação foi sobre a alteração do código de runtime para que a extensão funcionasse. E funcionou só que com um porém: não consegui fazer com que a atualização fosse dinâmica, ou seja, a possibilidade de escolher campos diferentes a serem plotados no mapa.

Minha versão anterior dependia de que o a propriedade fosse definida na criação do Mashup e não em tempo de execução.

Bom, depois de uma pergunta aqui e outra ali e alguns fios de cabelo a menos cheguei em uma versão de código que faz o que quero.

A API (se é que posso chamá-la assim) possui um método chamado updatePropertyInfo.Esse método captura as mudanças de valor na propriedade. Eu já tinha usado antes sem saber para que serve (resultado de CRTL+C, CTRL+V), mas aos poucos vou entendendo.

Também tive que declarar algumas variáveis como globais, fora do bloco if, ou seja, se uma variável não estiver declarada no bloco abaixo ela foi declarada globalmente.

O código ficou assim.

if (updatePropertyInfo.TargetProperty === 'CustomLayerDataField'){
    customLayerDataField = updatePropertyInfo.ActualDataRows;
    return;
}
if (updatePropertyInfo.TargetProperty === 'CustomLayerData'){
    customLayerDataRows = updatePropertyInfo.ActualDataRows;
    var nRows = customLayerDataRows.length;
    var heatmapData=[];
    for (var rowNumber = 0; rowNumber < nRows; rowNumber++) {
        var row = customLayerDataRows[rowNumber];
        heatmapData[rowNumber] = 
{location: new google.maps.LatLng(parseFloat(row[this.getProperty('CustomLayerLocationField')].latitude) , parseFloat(row[this.getProperty('CustomLayerLocationField')].longitude)), weight: parseFloat(row[customLayerDataField[0].SelectedValue])};
    }  
    var heatMapDissipating = this.getProperty('heatMapDissipating');
    var heatMapGradient = this.getProperty('heatMapGradient');
    var heatMapOpacity= this.getProperty('heatMapOpacity')
    var heatMapRadius=this.getProperty('heatMapRadius')
    var heatmap = new google.maps.visualization.HeatmapLayer({
            data: heatmapData,
            dissipating: heatMapDissipating,
            opacity: heatMapOpacity,
            radius: heatMapRadius
        });
    heatmap.setMap(this.map); 
    return;
}

E o resultado:
Mapa para Temperatura
Mapa para Chuvas
 Ainda são apenas testes preliminares e não a aplicação final mas vou atualizando vocês conforme eu evoluir!

Keep it Up!
Ewerton




No comments:

Post a Comment