WAZEPT Segments

Facilitates the standardization of segments

当前为 2020-06-24 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         WAZEPT Segments
// @version      2020.06.02
// @description  Facilitates the standardization of segments
// @author       J0N4S13 ([email protected])
// @include 	   /^https:\/\/(www|beta)\.waze\.com\/(?!user\/)(.{2,6}\/)?editor.*$/
// @exclude        https://www.waze.com/user/*editor/*
// @exclude        https://www.waze.com/*/user/*editor/*
// @grant        none
// @namespace https://greasyfork.org/users/218406
// ==/UserScript==

(function() {
    var version = GM_info.script.version;
    setTimeout(function() {var myVar = setInterval(myTimer ,500);}, 2000);
    var indexselected = "";
    var valueselected = "";
    var array_data = {};
    var array_roads = {'<img src="https://dl.dropboxusercontent.com/s/b6okbz2mstwhauk/Untitled-10.png" height="18" width="18">': "Segmento de Estacionamento",
                                   '<img src="https://dl.dropboxusercontent.com/s/wrmouj57afh1ysd/transferir.png" height="18" width="18">': "Segmento de Rua Secundária",
                                   '<img src="https://dl.dropboxusercontent.com/s/dclmik8vs3j3d5s/x-12-512.png" height="18" width="18">': "Segmento de Rua Principal",
                                   '<img src="https://dl.dropboxusercontent.com/s/4h6hjirwycrhvp2/94-512.png" height="18" width="18">': "Segmento de Estrada Municipal",
                                   '<img src="https://dl.dropboxusercontent.com/s/q3qwa65aazgwxn8/portugal-1489214_960_720.png" height="18" width="18">': "Segmento de Estrada Nacional",
                                   '<img src="https://dl.dropboxusercontent.com/s/78xugquz11k5bbo/H25.png" height="18" width="18">': "Segmento de Via Reservada a Automoveis e Motociclos",
                                   '<img src="https://dl.dropboxusercontent.com/s/bvn94z1ytak6yb4/H24.png" height="18" width="18">': "Segmento de Autoestrada",
                                   '🚗': "Dados de Portagens",
                                   '🌍': "Rotundas"};

    function receivedata() {
        return new Promise(resolve => {
            var url_data = "https://spreadsheets.google.com/feeds/list/1s_vcC-ENS7JdkVmVH2QceGMA058tan2UUPlQGd6AhwU/1/public/values?alt=json";

            $.getJSON(url_data, function(data) {

                var entry = data.feed.entry;

                $(entry).each(function(){
                    var elem = [this.gsx$bloqueio.$t]
                    array_data[ this.gsx$funcionalidade.$t ] = elem;
                });
            });
            var timer = setInterval(check_data, 100);

            function check_data() {
                if(eval("array_data['SEG_ESTACIONAMENTO'] !== undefined"))
                {
                    clearInterval(timer);
                    resolve('true');
                }
            }

        });
    }

    function optionsUser() {

        var $auto_link;
        var $settings = $('<li><a href="#sidepanel-LAND" data-toggle="tab" aria-expanded="true">LAND</a></li>');
        $("#user-tabs ul").append($settings);

        var $home = $('<div id="sidepanel-LAND" class="tab-pane"><b>WME Landmark</b><br><br><b><i>Definições</i></b><br><br>');
        var div_sidepnale = document.createElement("div");
        div_sidepnale.id = "sidepanel-LAND";
        div_sidepnale.className = "tab-pane";

        var label_home = document.createElement("label");
        label_home.innerHTML = 'WAZEPT Landmark (Version: ' + version + ")";
        label_home.style.cssText = 'font-size: 15px;color:blue;';
        div_sidepnale.appendChild(label_home);

        $("div.tab-content")[0].prepend(div_sidepnale);
    }

    async function dataCall() {
        var result = await receivedata();
        //optionsUser();
    }

    setTimeout(() => {
        dataCall();
    }, 500);

    function myTimer() {
        var n_bloqueio;
        var nivel;
        var lvl_atual;
        var lvl_max;

        var typeData = null;
        if(eval("W.selectionManager.getSelectedFeatures()[0] !== undefined"))
            typeData = W.selectionManager.getSelectedFeatures()[0].model.type;

        if(typeData == "segment")
        {

            if (!$("#signsroad").length) {
                var signsroad = document.createElement("div");
                signsroad.id = 'signsroad';

                $.each(array_roads, function(emoji , title) {

                    // The sign background
                    var addsign = document.createElement("div");
                    addsign.id = 'sign_' + emoji;

                    // Get width/height of sign background img
                    addsign.style.cssText = 'cursor:pointer;float:left;width:34px;height:34px;';
                    // Credits for some of these parts go to t0cableguy & Rickzabel
                    addsign.onclick = function() {

                        indexselected = emoji;

                        if(indexselected == '<img src="https://dl.dropboxusercontent.com/s/b6okbz2mstwhauk/Untitled-10.png" height="18" width="18">')
                        {
                            defineRoadType(20);
                            defineSpeed("30");
                            defineLockRankRoad(array_data['SEG_ESTACIONAMENTO'][0]);
                            defineStreetRoad("");
                        }

                        if(indexselected == '<img src="https://dl.dropboxusercontent.com/s/wrmouj57afh1ysd/transferir.png" height="18" width="18">')
                        {
                            defineRoadType(1);
                            defineSpeed("50");
                            defineLockRankRoad(array_data['SEG_SECUNDARIA'][0]);
                        }

                        if(indexselected == '<img src="https://dl.dropboxusercontent.com/s/dclmik8vs3j3d5s/x-12-512.png" height="18" width="18">')
                        {
                            defineRoadType(2);
                            defineSpeed("50");
                            defineLockRankRoad(array_data['SEG_PRINCIPAL'][0]);
                        }

                        if(indexselected == '<img src="https://dl.dropboxusercontent.com/s/4h6hjirwycrhvp2/94-512.png" height="18" width="18">')
                        {
                            defineRoadType(7);
                            defineSpeed("90");
                            defineLockRankRoad(array_data['SEG_MUNICIPAL'][0]);
                        }

                        if(indexselected == '<img src="https://dl.dropboxusercontent.com/s/q3qwa65aazgwxn8/portugal-1489214_960_720.png" height="18" width="18">')
                        {
                            defineRoadType(6);
                            defineSpeed("90");
                            defineLockRankRoad(array_data['SEG_NACIONAL'][0]);
                        }

                        if(indexselected == '<img src="https://dl.dropboxusercontent.com/s/78xugquz11k5bbo/H25.png" height="18" width="18">')
                        {
                            defineRoadType(3);
                            defineSpeed("100");
                            defineLockRankRoad(array_data['SEG_RESERVADA'][0]);
                        }

                        if(indexselected == '<img src="https://dl.dropboxusercontent.com/s/bvn94z1ytak6yb4/H24.png" height="18" width="18">')
                        {
                            defineRoadType(3);
                            defineSpeed("120");
                            defineLockRankRoad(array_data['SEG_AUTOESTRADA'][0]);
                        }

                        if(indexselected == '🌍')
                        {
                            let coords = [];
                            let segsfeitos = [];
                            let segmentos = W.selectionManager.getSelectedFeatures()[0].model.getRoundabout().attributes.segIDs;
                            let primeiro = W.selectionManager.getSelectedFeatures()[0].model.attributes.id;
                            let segmento = primeiro;
                            let feitos = 0;

                            do{
                                let seg = W.selectionManager.model.segments.getObjectById(segmento);
                                let geo = seg.geometry.components
                                for (let i=0; i<geo.length - 1; i++) {
                                    let linha = [geo[i].x, geo[i].y];
                                    coords.push(linha);
                                }

                                W.selectionManager.model.nodes.getObjectById(seg.attributes.toNodeID).attributes.segIDs.forEach(function(aux){
                                    if(aux != segmento && segmentos.includes(aux) && !segsfeitos.includes(aux))
                                    {
                                        segsfeitos.push(segmento);
                                        segmento = aux;
                                    }
                                });
                                feitos++;
                            } while (feitos < segmentos.length)

                                let AddLandmark= require("Waze/Action/AddLandmark");
                            var wazefeatureVectorLandmark = require("Waze/Feature/Vector/Landmark");

                            var poi = new wazefeatureVectorLandmark();
                            var geometry = new OpenLayers.Geometry.Polygon();

                            var TabLine2 = [];

                            for (var n=0; n < coords.length; n++)
                            {
                                var point = new OpenLayers.Geometry.Point(coords[n][0] ,coords[n][1]);
                                TabLine2.push(point);
                            }


                            var LineString2 = new OpenLayers.Geometry.LinearRing(TabLine2);
                            poi.geometry = new OpenLayers.Geometry.Polygon(LineString2);
                            poi.attributes.categories = new Array("FARM","JUNCTION_INTERCHANGE");

                            let rank = array_data['LD_ROTUNDA'][0];
                            rank--;
                            let bloquear;
                            if(W.loginManager.user.rank >= rank)
                                bloquear = rank;
                            else
                                bloquear = W.loginManager.user.rank;
                            poi.attributes.lockRank = bloquear;

                            W.model.actionManager.add(new AddLandmark(poi));

                        }

                        if(indexselected == '🚗')
                        {

                            let myRoad = W.selectionManager.getSelectedFeatures()[0].model.attributes;

                            var from = "";
                            var to = "";
                            var sentido = "";

                            if(myRoad.fwdDirection == true && myRoad.revDirection == true)
                            {
                                $( "#divSentidos" ).show();
                            }
                            else
                            {
                                if(myRoad.fwdDirection == true) //A to B
                                {
                                    from = myRoad.fromNodeID;
                                    to = myRoad.toNodeID;
                                    sentido = "TRUE";
                                }

                                else if(myRoad.revDirection == true)//B to A
                                {
                                    from = myRoad.toNodeID;
                                    to = myRoad.fromNodeID;
                                    sentido = "FALSE";
                                }
                                var $temp = $("<input>");
                                $("body").append($temp);
                                $temp.val(sentido + "|" + $('a[class=permalink]').attr('href') + "|" + from + "|" + to).select();
                                document.execCommand("copy");
                                $temp.remove();
                            }

                        }

                    }
                    if($('span[class=full-address]').text().indexOf('Portugal') != -1 || emoji == "🚗")
                    {
                        var emojivalue = document.createElement("div");
                        emojivalue.id = 'emoji_' + emoji;
                        emojivalue.style.cssText = 'text-align:center;font-size:14px;visibility:visible;';
                        emojivalue.innerHTML = emoji;
                        emojivalue.title = title;
                        addsign.appendChild(emojivalue);
                        signsroad.appendChild(addsign);
                    }
                });

                var btnAB = document.createElement("button");
                btnAB.innerHTML = 'A->B';
                btnAB.id = 'btnAB';
                btnAB.style.cssText = 'height: 20px;font-size:11px';

                btnAB.onclick = function() {
                    let myRoad = W.selectionManager.getSelectedFeatures()[0].model.attributes;
                    if(myRoad.fwdDirection == true) //A to B
                    {
                        var $temp = $("<input>");
                        $("body").append($temp);
                        $temp.val("TRUE" + "|" + $('a[class=permalink]').attr('href') + "|" + myRoad.fromNodeID + "|" + myRoad.toNodeID).select();
                        document.execCommand("copy");
                        $temp.remove();
                    }
                }

                var btnBA = document.createElement("button");
                btnBA.innerHTML = 'B->A';
                btnBA.id = 'btnBA';
                btnBA.style.cssText = 'height: 20px;font-size:11px';

                btnBA.onclick =  function() {
                    let myRoad = W.selectionManager.getSelectedFeatures()[0].model.attributes;
                    if(myRoad.revDirection == true) //B to A
                    {
                        var $temp = $("<input>");
                        $("body").append($temp);
                        $temp.val("FALSE" + "|" + $('a[class=permalink]').attr('href') + "|" + myRoad.toNodeID + "|" + myRoad.fromNodeID).select();
                        document.execCommand("copy");
                        $temp.remove();
                    }
                }

                var divSentidos = document.createElement("div");
                divSentidos.id = 'divSentidos';
                divSentidos.appendChild(btnAB);
                divSentidos.appendChild(btnBA);

                var divLandmarkScript = document.createElement("div");
                divLandmarkScript.id = 'divLandmarkScript';
                divLandmarkScript.style.cssText = 'float:left;';
                divLandmarkScript.appendChild(signsroad);
                divLandmarkScript.appendChild(divSentidos);

                $("div #segment-edit-general").prepend(divLandmarkScript);
                $( "#divSentidos" ).hide();
            }
        }
    }

    function getSelectedVenue() {
        const features = WazeWrap.getSelectedFeatures();
        // Be sure to check for features.length === 1, in case multiple venues are currently selected.
        return features.length === 1 && features[0].model.type === 'venue'
            ? features[0].model : undefined;
    }

    function defineSpeed (speed) {
        let UpdateObject= require("Waze/Action/UpdateObject");
        $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) {
            var seg_id = segment.model.getID();
            var seg = W.model.segments.getObjectById(seg_id);
            if(segment.model.attributes.fwdMaxSpeed == null && segment.model.attributes.fwdMaxSpeed == null)
                W.model.actionManager.add(new UpdateObject(seg, {'fwdMaxSpeed': speed, 'revMaxSpeed': speed}));
            else if(segment.model.attributes.fwdMaxSpeed == null)
                W.model.actionManager.add(new UpdateObject(seg, {'fwdMaxSpeed': speed}));
            else if(segment.model.attributes.fwdMaxSpeed == null)
                W.model.actionManager.add(new UpdateObject(seg, {'revMaxSpeed': speed}));
        });
    }

    function defineRoadType (type) {
        let UpdateObject= require("Waze/Action/UpdateObject");
        $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) {
            var seg_id = segment.model.getID();
            var seg = W.model.segments.getObjectById(seg_id);
            W.model.actionManager.add(new UpdateObject(seg, {'roadType': type}));
        });
    }

    function defineLockRankRoad (rank) {
        let UpdateObject= require("Waze/Action/UpdateObject");
        rank--;
        var bloquear;
        if(W.loginManager.user.rank >= rank)
            bloquear = rank;
        else
            bloquear = W.loginManager.user.rank;
        $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) {
            let lock = segment.model.attributes.lockRank;
            var seg_id = segment.model.getID();
            var seg = W.model.segments.getObjectById(seg_id);
            if(lock < bloquear)
                W.model.actionManager.add(new UpdateObject(seg, {'lockRank': bloquear}));
        });
    }

    function defineStreetRoad(street) {
        let UpdateFeatureAddress = require("Waze/Action/UpdateFeatureAddress");
        $.each(W.selectionManager.getSelectedFeatures(), function(i, segment) {
            var seg_id = segment.model.getID();
            if(seg_id == "-100")
            {
                $("input[id=empty-street]").prop('checked', true).change().focusout();
                $("input[id=empty-city]").prop('checked', true).change().focusout();
                $(".save-button.waze-btn.waze-btn-blue.waze-btn-smaller").trigger('click');
            }
            else
            {
                var seg = W.model.segments.getObjectById(seg_id);
                var address = segment.model.getAddress().attributes;
                var newAddressAtts = {
                    streetName: street,
                    emptyStreet: street==""?true:false,
                    cityName: "",
                    emptyCity: true,
                    countryID: address.country.id
                };
                W.model.actionManager.add(new UpdateFeatureAddress(seg, newAddressAtts,{streetIDField:"primaryStreetID"}));
            }
        });
    }

})();