diff --git a/package-lock.json b/package-lock.json index a94f034..991ac69 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2091,9 +2091,9 @@ "dev": true }, "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", "dev": true }, "acorn-jsx": { @@ -7583,9 +7583,9 @@ "dev": true }, "element-ui": { - "version": "2.13.2", - "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.13.2.tgz", - "integrity": "sha512-r761DRPssMPKDiJZWFlG+4e4vr0cRG/atKr3Eqr8Xi0tQMNbtmYU1QXvFnKiFPFFGkgJ6zS6ASkG+sellcoHlQ==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/element-ui/-/element-ui-2.15.0.tgz", + "integrity": "sha512-9z/1+b7V8fvp08OnKUEW4/BZ72kT+IhuKR9cTMz3XoCTKmEsqLLb32XjbO/DznSFaaiFbOYU93G7WtkvrCAL9A==", "requires": { "async-validator": "~1.8.1", "babel-helper-vue-jsx-merge-props": "^2.0.0", @@ -8013,9 +8013,9 @@ "dev": true }, "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -8302,12 +8302,20 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", + "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, "esrecurse": { diff --git a/package.json b/package.json index e0db463..4863e3a 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,11 @@ "version": "0.0.28", "author": "portree_kid ", "description": "An software to design Flightgear groundnets", - "license": "GPL v3", + "license": "GPL-3.0", + "repository": { + "type" : "git", + "url" : "https://github.com/Portree-Kid/flightgear-airports.git" + }, "main": "./dist/electron/main.js", "scripts": { "build": "node .electron-vue/build.js && electron-builder", @@ -92,7 +96,7 @@ "coordinate-parser": "^1.0.3", "dijkstrajs": "^1.0.1", "electron-debug": "^3.0.1", - "element-ui": "^2.14.1", + "element-ui": "^2.13.2", "file-url": "^3.0.0", "fs": "0.0.1-security", "fs-extra": "^9.0.1", diff --git a/src/renderer/components/PavementLayer.vue b/src/renderer/components/PavementLayer.vue index 3198945..e0118b7 100644 --- a/src/renderer/components/PavementLayer.vue +++ b/src/renderer/components/PavementLayer.vue @@ -5,6 +5,7 @@ import L from 'leaflet' import LEdit from 'leaflet-editable/src/Leaflet.Editable.js' import {readPavement} from '../loaders/pavement_loader' + import * as turf from '@turf/turf' export default { name: 'edit-layer', @@ -75,6 +76,21 @@ this.deferredMountedTo(this.$parent.mapObject) } }, + isOnRunway (latlng) { + var ret = false + this.pavement.eachLayer(l => { + if (l instanceof L.RunwayPolygon) { + console.debug(l) + if (turf.booleanContains(l.turfyRunway, this.latToTurf(latlng))) { + ret = true + } + } + }) + return ret + }, + latToTurf (turfPoint) { + return turf.point([turfPoint.lng, turfPoint.lat]) + }, setVisible (visible) { if (this.pavement !== undefined) { if (visible !== this.visible) { diff --git a/src/renderer/leaflet/Runway.js b/src/renderer/leaflet/Runway.js index 9db8c86..b13121c 100644 --- a/src/renderer/leaflet/Runway.js +++ b/src/renderer/leaflet/Runway.js @@ -12,14 +12,30 @@ You should have received a copy of the GNU General Public License along with FG /* eslint-disable */ +const turf = require('@turf/turf') + L.RunwayPolygon = L.Polygon.extend({ + turfyRunway: [], + + setTurfy: function (runwayPoints) { + var latLngs = runwayPoints.map(this.turfToLatLng); + latLngs.push(latLngs[0]); + this.turfyRunway = turf.polygon([latLngs]); + }, + + turfToLatLng: function (turfPoint) { + return [turfPoint.lng, turfPoint.lat]; + } }); var runwayPoly = function (runwayPoints) { var runwayPoly = new L.RunwayPolygon(runwayPoints); runwayPoly.setStyle({ color: 'grey', fillColor: 'grey', opacity: 0.5, fillOpacity: 0.5, interactive: false }); - + runwayPoly.setTurfy(runwayPoints); + console.debug(runwayPoints); return runwayPoly; } + + module.exports = runwayPoly; \ No newline at end of file diff --git a/src/renderer/loaders/TaxiwaySegmentExtender.js b/src/renderer/loaders/TaxiwaySegmentExtender.js index 7d50ea6..c54f791 100644 --- a/src/renderer/loaders/TaxiwaySegmentExtender.js +++ b/src/renderer/loaders/TaxiwaySegmentExtender.js @@ -159,7 +159,7 @@ const extendTaxiSegment = function (taxiwaySegment) { if (event.target.options.attributes.name !== undefined) { multiarc.name = assign(event.target.options.attributes.name); } - if(event.target.options.attributes.isPushBackRoute) { + if (event.target.options.attributes.isPushBackRoute) { multiarc.isPushBackRoute = assign(event.target.options.attributes.isPushBackRoute); } else { multiarc.isPushBackRoute = false; @@ -195,103 +195,114 @@ const extendTaxiSegment = function (taxiwaySegment) { this.on('editable:middlemarker:mousedown', event => { console.debug('editable:middlemarker:mousedown'); }), - this.on('editable:vertex:new', event => { - console.debug('editable:vertex:new ' + event.vertex.getIndex() + '\t' + event.vertex.getLastIndex() + '\t'); - // Find nearest node - let closest = this.editLayer.closestLayerSnap(event.latlng, 5) - let taxiwaySegment = event.vertex.editor.feature; - if (taxiwaySegment.options.attributes === undefined) { - taxiwaySegment.options.attributes = { direction: 'bi-directional' }; + this.on('editable:vertex:new', event => { + console.debug('editable:vertex:new ' + event.vertex.getIndex() + '\t' + event.vertex.getLastIndex() + '\t'); + // Find nearest node + let isOnRunway = this.editLayer.isOnRunway(event.latlng) + let closest = this.editLayer.closestLayerSnap(event.latlng, 5) + let taxiwaySegment = event.vertex.editor.feature; + if (taxiwaySegment.options.attributes === undefined) { + taxiwaySegment.options.attributes = { direction: 'bi-directional' }; + } + var isOnRunwayNum = 0; + if (isOnRunway) { + isOnRunwayNum = 1; + } + taxiwaySegment.updateStyle(); + if (event.vertex.getIndex() !== 0 && event.vertex.getIndex() !== event.vertex.getLastIndex()) { + var x = taxiwaySegment.getLatLngs().filter(l => l === event.vertex.latlng); + // Somehow the latlng is not in our Segment!? + if (taxiwaySegment.getLatLngs().length < 3 && x.length === 0) { + var fixed = taxiwaySegment.getLatLngs(); + fixed.splice(1, 0, event.vertex.latlng); + taxiwaySegment.setLatLngs(fixed); } - taxiwaySegment.updateStyle(); - if (event.vertex.getIndex() !== 0 && event.vertex.getIndex() !== event.vertex.getLastIndex()) { - var x = taxiwaySegment.getLatLngs().filter(l => l === event.vertex.latlng); - // Somehow the latlng is not in our Segment!? - if (taxiwaySegment.getLatLngs().length < 3 && x.length === 0) { - var fixed = taxiwaySegment.getLatLngs(); - fixed.splice(1, 0, event.vertex.latlng); - taxiwaySegment.setLatLngs(fixed); - } - var nextIndex = ++taxiwaySegment.editLayer.groundnetLayerGroup.maxId; - var splitOffNodes = taxiwaySegment.getLatLngs().splice(-1); - var remainingNodes = taxiwaySegment.getLatLngs(); - if (remainingNodes.length <= 1 || !remainingNodes[1]) { - console.error(remainingNodes); - } - splitOffNodes.unshift(L.latLng(remainingNodes[1].lat, remainingNodes[1].lng, remainingNodes[1].alt)); - remainingNodes[1]['glueindex'] = nextIndex; - remainingNodes[1].attributes = { index: nextIndex, isOnRunway: 0 }; - taxiwaySegment.options.attributes.end = nextIndex; - splitOffNodes[0]['glueindex'] = nextIndex; - splitOffNodes[0].attributes = { index: nextIndex, isOnRunway: 0 }; - taxiwaySegment.setLatLngs(remainingNodes); - //taxiwaySegment.editor.refresh(); - //taxiwaySegment.editor.reset(); - if (splitOffNodes.length > 1) { - var polyline = new L.Polyline(splitOffNodes, { attributes: {} }); - polyline.addTo(taxiwaySegment.editLayer.$parent.$parent.$refs.map.mapObject); - polyline.addTo(taxiwaySegment.editLayer.groundnetLayerGroup); - extendTaxiSegment(polyline); - polyline.addListeners(); - polyline.setEditlayer(taxiwaySegment.editLayer); - polyline.enableEdit(taxiwaySegment.editLayer.$parent.$parent.$refs.map.mapObject); - polyline.editor.refresh(); - //polyline.editor.reset(); - polyline.featureLookup = this.featureLookup; - polyline.options.attributes.name = taxiwaySegment.options.attributes.name; - polyline.options.attributes.direction = taxiwaySegment.options.attributes.direction; - polyline.options.attributes.isPushBackRoute = taxiwaySegment.options.attributes.isPushBackRoute; - polyline.options.attributes.begin = nextIndex; - polyline.options.attributes.end = taxiwaySegment.end; - polyline.updateStyle(); - polyline.begin = nextIndex; - polyline.end = taxiwaySegment.end; - taxiwaySegment.end = nextIndex; - this.editLayer.featureLookup[nextIndex] = []; - this.featureLookup[nextIndex].push(taxiwaySegment); - this.featureLookup[nextIndex].push(polyline); - } else { - console.error('SplitoffNodes Short ', splitOffNodes); - } + var nextIndex = ++taxiwaySegment.editLayer.groundnetLayerGroup.maxId; + var splitOffNodes = taxiwaySegment.getLatLngs().splice(-1); + var remainingNodes = taxiwaySegment.getLatLngs(); + if (remainingNodes.length <= 1 || !remainingNodes[1]) { + console.error('Not enough remaining nodes', remainingNodes); + } + splitOffNodes.unshift(L.latLng(remainingNodes[1].lat, remainingNodes[1].lng, remainingNodes[1].alt)); + remainingNodes[1]['glueindex'] = nextIndex; + remainingNodes[1].attributes = { index: nextIndex, isOnRunway: isOnRunwayNum }; + taxiwaySegment.options.attributes.end = nextIndex; + splitOffNodes[0]['glueindex'] = nextIndex; + splitOffNodes[0].attributes = { index: nextIndex, isOnRunway: isOnRunwayNum }; + taxiwaySegment.setLatLngs(remainingNodes); + //taxiwaySegment.editor.refresh(); + //taxiwaySegment.editor.reset(); + if (splitOffNodes.length > 1) { + var polyline = new L.Polyline(splitOffNodes, { attributes: {} }); + polyline.addTo(taxiwaySegment.editLayer.$parent.$parent.$refs.map.mapObject); + polyline.addTo(taxiwaySegment.editLayer.groundnetLayerGroup); + extendTaxiSegment(polyline); + polyline.addListeners(); + polyline.setEditlayer(taxiwaySegment.editLayer); + polyline.enableEdit(taxiwaySegment.editLayer.$parent.$parent.$refs.map.mapObject); + polyline.editor.refresh(); + //polyline.editor.reset(); + polyline.featureLookup = this.featureLookup; + polyline.options.attributes.name = taxiwaySegment.options.attributes.name; + polyline.options.attributes.direction = taxiwaySegment.options.attributes.direction; + polyline.options.attributes.isPushBackRoute = taxiwaySegment.options.attributes.isPushBackRoute; + polyline.options.attributes.begin = nextIndex; + polyline.options.attributes.end = taxiwaySegment.end; + polyline.updateStyle(); + polyline.begin = nextIndex; + polyline.end = taxiwaySegment.end; + taxiwaySegment.end = nextIndex; + this.editLayer.featureLookup[nextIndex] = []; + this.featureLookup[nextIndex].push(taxiwaySegment); + this.featureLookup[nextIndex].push(polyline); } else { - // Glue to another node - if (closest) { - event.latlng['glueindex'] = Number(closest.glueindex); - event.latlng.__vertex.setLatLng(closest.latlng); - event.latlng.attributes = { index: event.latlng.glueindex, isOnRunway: 0 }; - // Push Vertex to lookup - this.editLayer.featureLookup[event.latlng.glueindex].push(event.latlng.__vertex); - if (taxiwaySegment.options.attributes.begin === undefined) { - taxiwaySegment.options.attributes.begin = event.latlng['glueindex'] - } else { - taxiwaySegment.options.attributes.end = event.latlng['glueindex'] - } - if (taxiwaySegment.getLatLngs().length === 1) { - taxiwaySegment.begin = closest.glueindex; - } - taxiwaySegment.end = closest.glueindex; - console.debug(`Closest : ${closest}`) + console.error('SplitoffNodes Short ', splitOffNodes); + } + } else { + // Glue to another node + if (closest) { + event.latlng['glueindex'] = Number(closest.glueindex); + event.latlng.__vertex.setLatLng(closest.latlng); + event.latlng.attributes = { index: event.latlng.glueindex, isOnRunway: isOnRunwayNum }; + // Push Vertex to lookup + this.editLayer.featureLookup[event.latlng.glueindex].push(event.latlng.__vertex); + if (isOnRunwayNum==1) { + this.editLayer.addRunwayNode(event.latlng, event.latlng['glueindex']) + } + if (taxiwaySegment.options.attributes.begin === undefined) { + taxiwaySegment.options.attributes.begin = event.latlng['glueindex'] } else { - event.vertex.latlng['glueindex'] = ++this.editLayer.groundnetLayerGroup.maxId; - event.vertex.latlng.attributes = { index: event.vertex.latlng.glueindex, isOnRunway: 0 }; - this.editLayer.featureLookup[event.vertex.latlng.glueindex] = []; - this.editLayer.featureLookup[event.vertex.latlng.glueindex].push(event.vertex); - this.editLayer.featureLookup[event.vertex.latlng.glueindex].push(taxiwaySegment); - // taxiwaySegment.editor.refresh(); - //taxiwaySegment.editor.reset(); - if (taxiwaySegment.options.attributes.begin === undefined) { - taxiwaySegment.options.attributes.begin = event.vertex.latlng['glueindex'] - taxiwaySegment.begin = event.vertex.latlng.glueindex; - } else if (taxiwaySegment.options.attributes.end === undefined || - (taxiwaySegment.getLatLngs()[taxiwaySegment.getLatLngs().length - 1].glueindex && - Number(taxiwaySegment.getLatLngs()[taxiwaySegment.getLatLngs().length - 1].glueindex) !== taxiwaySegment.options.attributes.end)) { - taxiwaySegment.options.attributes.end = event.vertex.latlng['glueindex'] - taxiwaySegment.end = Number(event.vertex.latlng.glueindex); - } + taxiwaySegment.options.attributes.end = event.latlng['glueindex'] + } + if (taxiwaySegment.getLatLngs().length === 1) { + taxiwaySegment.begin = closest.glueindex; + } + taxiwaySegment.end = closest.glueindex; + console.debug(`Closest : ${closest}`) + } else { + event.vertex.latlng['glueindex'] = ++this.editLayer.groundnetLayerGroup.maxId; + event.vertex.latlng.attributes = { index: event.vertex.latlng.glueindex, isOnRunway: isOnRunwayNum }; + this.editLayer.featureLookup[event.vertex.latlng.glueindex] = []; + this.editLayer.featureLookup[event.vertex.latlng.glueindex].push(event.vertex); + this.editLayer.featureLookup[event.vertex.latlng.glueindex].push(taxiwaySegment); + if (isOnRunwayNum==1) { + this.editLayer.addRunwayNode(event.latlng, event.vertex.latlng['glueindex']) + } + // taxiwaySegment.editor.refresh(); + //taxiwaySegment.editor.reset(); + if (taxiwaySegment.options.attributes.begin === undefined) { + taxiwaySegment.options.attributes.begin = event.vertex.latlng['glueindex'] + taxiwaySegment.begin = event.vertex.latlng.glueindex; + } else if (taxiwaySegment.options.attributes.end === undefined || + (taxiwaySegment.getLatLngs()[taxiwaySegment.getLatLngs().length - 1].glueindex && + Number(taxiwaySegment.getLatLngs()[taxiwaySegment.getLatLngs().length - 1].glueindex) !== taxiwaySegment.options.attributes.end)) { + taxiwaySegment.options.attributes.end = event.vertex.latlng['glueindex'] + taxiwaySegment.end = Number(event.vertex.latlng.glueindex); } } - //this.splitShape(taxiwaySegment.getLatLngs(), ) - }); + } + //this.splitShape(taxiwaySegment.getLatLngs(), ) + }); this.on('editable:vertex:deleted', event => { console.debug('editable:vertex:deleted') }); diff --git a/src/renderer/utils/check.js b/src/renderer/utils/check.js index d3a0689..c875fd0 100644 --- a/src/renderer/utils/check.js +++ b/src/renderer/utils/check.js @@ -87,7 +87,7 @@ async function checkGroundnet(data) { var directionalGraph = {}; var bidirectionalGraph = {}; - console.log(parkings); + console.debug(parkings); parkings.forEach(element => { directionalGraph[element] = {}; bidirectionalGraph[element] = {}; @@ -99,7 +99,7 @@ async function checkGroundnet(data) { var notOkNodes = []; //debugger; - console.log(edges); + console.debug(edges); if (edges === undefined) { resolve([{ id: -1, message: check_msg.NO_EDGES }]); }