WME True Segment Length

Displays geodesic segment length in feet & meters

  1. // ==UserScript==
  2. // @name WME True Segment Length
  3. // @namespace https://greasyfork.org/users/30701-justins83-waze
  4. // @version 2024.06.21.01
  5. // @description Displays geodesic segment length in feet & meters
  6. // @author JustinS83
  7. // @include https://www.waze.com/editor*
  8. // @include https://www.waze.com/*/editor*
  9. // @include https://beta.waze.com/*
  10. // @exclude https://www.waze.com/user/editor*
  11. // @grant none
  12. // @require https://greasyfork.org/scripts/24851-wazewrap/code/WazeWrap.js
  13. // @license GPLv3
  14. // ==/UserScript==
  15.  
  16. /* global W */
  17. /* global OL */
  18. /* ecmaVersion 2017 */
  19. /* global $ */
  20. /* global _ */
  21. /* global WazeWrap */
  22. /* eslint curly: ["warn", "multi-or-nest"] */
  23.  
  24. (function() {
  25.  
  26. function bootstrap(tries=1) {
  27.  
  28. if (W &&
  29. W.map &&
  30. W.model &&
  31. $ && WazeWrap.Ready)
  32. init();
  33. else if (tries < 1000)
  34. setTimeout(function () {bootstrap(++tries);}, 200);
  35. }
  36.  
  37. bootstrap();
  38.  
  39. function init(){
  40. W.selectionManager.events.register("selectionchanged", null, waitAndUpdate);
  41. W.model.actionManager.events.register("afteraction",null, updateDisplay);
  42. W.model.actionManager.events.register("afterundoaction",null, updateDisplay);
  43. W.model.actionManager.events.register("afterclearactions",null, updateDisplay);
  44. W.model.actionManager.events.register("noActions",null, waitAndUpdate);
  45. console.log("WME True Segment Length" + GM_info.script.version);
  46. }
  47.  
  48. async function waitAndUpdate(){
  49. await new Promise(r => setTimeout(r, 150));
  50. updateDisplay();
  51. }
  52.  
  53. function updateDisplay(){
  54. var count = WazeWrap.getSelectedDataModelObjects().length;
  55. var metersLength = 0;
  56. var bold = false;
  57.  
  58. if(count > 0){
  59. for(let i=0;i<count;i++){
  60. let seg = WazeWrap.getSelectedDataModelObjects()[i];
  61. if(seg.type === "segment"){
  62. metersLength += WazeWrap.Geometry.calculateDistance(seg.getOLGeometry().components);
  63. if(!seg.isUnchanged())
  64. bold = true;
  65. }
  66. }
  67. if(metersLength >0){
  68. var isUSA = (typeof W.model.countries.objects[235] !== 'undefined');
  69. var ftLength = Math.round(metersLength * 3.28084 *100)/100;
  70. var milesLength = Math.round(ftLength/5280 *1000)/1000;
  71.  
  72. if(WazeWrap.getSelectedDataModelObjects()[0].attributes.id < 0){ //segment has not yet been saved
  73. var list = $('#segment-edit-general > div > ul')[0];
  74. var newItem = document.createElement("LI");
  75. var textnode = document.createTextNode("Length: " + metersLength +" m");
  76. newItem.appendChild(textnode);
  77. list.insertBefore(newItem, list.childNodes[0]);
  78.  
  79. if(isUSA){
  80. newItem = document.createElement("LI");
  81. textnode = document.createTextNode(`Length: ${ftLength} ft (${milesLength} miles)`);
  82. newItem.appendChild(textnode);
  83. list.insertBefore(newItem, list.childNodes[0]);
  84. }
  85. }
  86. else{
  87. try
  88. {
  89. $('#segment-edit-general > div > ul > li:nth-child(1) > span')[1].innerHTML = (Math.round(metersLength*100)/100) + " m";
  90. if($('#segment-edit-general > div > ul > li:nth-child(1) > span').length === 2 && isUSA)
  91. $('#segment-edit-general > div > ul > li:nth-child(1)').append(`<br/><span class="name">Length: </span><span class="value">${ftLength} ft</span><span class="value"> (${milesLength} miles)</span>`);
  92. if(bold){
  93. $('#segment-edit-general > div > ul > li:nth-child(1) > span').css('font-weight', "bold");
  94. if(isUSA)
  95. $('#segment-edit-general > div > ul > li:nth-child(2) > span').css('font-weight', "bold");
  96. }
  97. }
  98. catch(ex)
  99. {
  100.  
  101. }
  102. }
  103. }
  104. }
  105. }
  106.  
  107. })();