Remove vertex

This commit is contained in:
portree_kid
2020-05-31 20:53:38 +02:00
parent 2a7c8a735f
commit 23cc742c93
5 changed files with 126 additions and 221 deletions
+1 -1
View File
@@ -227,7 +227,7 @@
} else if (o instanceof L.Polyline) {
console.log(o)
//_latlngs[""0""].__vertex.glueindex
var latLngs = o.getLatLngs().map(l => ({lat: l.lat, lng: l.lng, index: l.__vertex.glueindex}));
var latLngs = o.getLatLngs().map(l => ({lat: l.lat, lng: l.lng, index: l.glueindex}));
return { 'start': Number(o['begin']), 'end': Number(o['end']), '_leaflet_id': o._leaflet_id, 'type': 'poly', 'isPushBackRoute': o.options.attributes.isPushBackRoute, latLngs: latLngs };
} else {
console.log('Unknown Type ')
+76 -24
View File
@@ -399,34 +399,83 @@
})
return parkings
},
refreshLookup(index) {
//element.__vertex
this.featureLookup[index] = this.featureLookup[index].filter(item => {
return !(item instanceof L.Editable.VertexMarker && item.editor.__vertex === undefined)
}
);
this.featureLookup[index].forEach((element, i) => {
if (element instanceof L.Polyline) {
element.editor.refresh();
element.editor.reset();
}
});
},
removeNode (index) {
if(this.featureLookup[index]===undefined) {
console.error("Lookup " + index + " failed ");
return;
}
this.featureLookup[index].forEach((element, i) => {
if (element instanceof L.Polyline) {
// element.latlngs.forEach();
element._latlngs.forEach((e1, index1) => {
console.log(e1);
e1.__vertex.removeFrom(element.editor.editLayer);
element._latlngs.splice(index1,1);
if (element._latlngs.length==1) {
this.featureLookup[index].splice(i,1);
this.featureLookup[element._latlngs[0].__vertex.glueindex].forEach((otherEnd, j) => {
console.log(j + ' ' + otherEnd);
if(element === otherEnd){
this.featureLookup[element._latlngs[0].__vertex.glueindex].splice(j,1);
}
});
try {
this.featureLookup[index].forEach((element, i) => {
if (element instanceof L.Polyline) {
console.log('Poly : ' + i + ' ' + element.attributes);
// Complete poly with be removed
if ( element._latlngs.length <= 3 ) {
if(Number(element.begin) !== index) {
this.featureLookup[Number(element.begin)] = this.featureLookup[Number(element.begin)].filter(item => item !== element);
this.refreshLookup(Number(element.begin))
}
if(Number(element.end) !== index) {
this.featureLookup[Number(element.end)] = this.featureLookup[Number(element.end)].filter(item => item !== element);
this.refreshLookup(Number(element.end))
}
element.removeFrom(this.groundnetLayerGroup);
}
});
} else if (element instanceof L.RunwayNode) {
this.featureLookup[index] = this.featureLookup[index].filter(item => item !== element);
element.removeFrom(this.groundnetLayerGroup);
}
});
else {
element.getLatLngs().forEach((e1, index1) => {
console.log(index1 + ' ' + e1);
if (e1.attributes.index===index) {
var splitOffNodes = element.getLatLngs().splice(index1);
element.editor.refresh();
element.editor.reset();
splitOffNodes.splice(0, 1);
if( splitOffNodes.length>1) {
var polyline = new L.Polyline(splitOffNodes, { attributes: {} }).addTo(layerGroup);
extendTaxiSegment(polyline);
polyline.addListeners();
polyline.setEditlayer(this);
polyline.enableEdit();
polyline.editor.refresh();
polyline.editor.reset();
polyline.addTo(this.groundnetLayerGroup);
polyline.end = element.end;
// Remove from end lookup
this.featureLookup[element.options.attributes.end] = this.featureLookup[element.options.attributes.end].filter(item => item !== element);
// push to the end lookup
this.featureLookup[element.options.attributes.end].push(polyline);
}
if(element.getLatLngs().length === 1) {
this.featureLookup[index] = this.featureLookup[index].filter(item => item !== element);
element.removeFrom(this.groundnetLayerGroup);
}
// element.editor.splitShape(element._latlngs, index1);
console.log('Removed');
}
});
}
} else if (element instanceof L.RunwayNode) {
console.log('Runway : ' + i + ' ' + element.attributes);
this.featureLookup[index] = this.featureLookup[index].filter(item => item !== element);
element.removeFrom(this.groundnetLayerGroup);
} else {
console.warn('WTF' + element);
}
});
} catch (error) {
console.error(error);
}
},
drawPolyline () {
var polyLine = this.$parent.mapObject.editTools.startPolyline()
@@ -616,8 +665,8 @@
}
} else if (element instanceof L.Polyline) {
element._latlngs.forEach(element => {
if(element.__vertex && Number(element.__vertex.glueindex) === Number(nIndex)){
latlng = element.__vertex.latlng;
if(element.__vertex && Number(element.glueindex) === Number(nIndex)){
latlng = element.latlng;
}
});
}
@@ -669,9 +718,12 @@
// console.log(layer._latlngs)
layer._latlngs.forEach(latlng => {
if (latlng.__vertex) {
if (Number.isNaN(latlng.glueindex)) {
console.warn('No glueindex : ' + latlng.__vertex);
}
let distance = latlng.distanceTo(eventLatlng)
if (distance > 0 && distance < snap) {
layers.push({d: distance, l: layer, latlng: latlng.__vertex.latlng, glueindex: latlng.__vertex.glueindex})
layers.push({d: distance, l: layer, latlng: latlng.__vertex.latlng, glueindex: latlng.glueindex})
}
}
})
-152
View File
@@ -1,152 +0,0 @@
/* eslint-disable */
var L = require('leaflet');
const store = require('../store');
L.TaxiwaySegment = L.Polyline.extend({
begin: String,
end: String,
bidirectional: Boolean,
updateBeginVertex: function (latlng) {
if (this._latlngs[0].__vertex) {
this._latlngs[0].__vertex.setLatLng(latlng);
}
},
updateEndVertex: function (latlng) {
if (this._latlngs[1].__vertex) {
this._latlngs[1].__vertex.setLatLng(latlng);
}
},
updateMiddle: function () {
this._latlngs.forEach(element => {
if (element.__vertex.middleMarker) {
element.__vertex.middleMarker.updateLatLng();
}
});
},
extensions: function (editLayer) {
this._latlngs[0].__vertex.glueindex = this.begin;
this._latlngs.slice(-1)[0].__vertex.glueindex = this.end;
if (typeof this.featureLookup[this.begin] === 'undefined') {
this.featureLookup[this.begin] = new Array();
}
if (typeof this.featureLookup[this.end] === 'undefined') {
this.featureLookup[this.end] = new Array();
}
this.featureLookup[this.begin].push(this);
this.featureLookup[this.end].push(this);
},
addListeners: function () {
this.on('click', function (event) {
console.log("Click : " + event.target);
store.default.dispatch('setArc', event.target.options.attributes);
store.default.watch( function (state) {
return state.Editable.data.arc;
},
() => {
console.log(this)
}
,
{
deep: true //add this if u need to watch object properties change etc.
});
});
this.on('editable:drawing:move', function (event) {
console.log(event.target);
if (dragIndex >= 0) {
this.follow(dragIndex, event);
}
});
this.on('editable:vertex:clicked', function (event) {
console.log(this.featureLookup[event.vertex.glueindex]);
store.default.dispatch('setNode', event.vertex.latlng.attributes)
event.vertex._icon.style['background-color'] = 'red';
});
var dragIndex = -1;
this.on('editable:vertex:dragstart', function (event) {
console.log("Event Target : ", event.target);
console.log("Middle Marker : ", event.vertex == event.vertex.middleMarker);
console.log("Middle Marker : ", event.vertex.glueindex == undefined);
if (event.vertex.glueindex == undefined)
return;
dragIndex = event.vertex.glueindex;
});
this.on('editable:vertex:dragend', function (event) {
console.log("Dragend : ", event.vertex);
if (dragIndex > 0) {
this.featureLookup[dragIndex].forEach(element => {
if (element instanceof L.ParkingSpot) {
//element.setLatLng(event);
console.log(element);
}
});
}
dragIndex = -1;
});
},
/**
*
*/
follow(dragIndex, event) {
this.featureLookup[dragIndex].forEach(element => {
if (element !== event.target) {
if (element instanceof L.RunwayNode) {
element.setLatLng(event.latlng);
}
else if (element instanceof L.HoldNode) {
element.setLatLng(event.latlng);
}
else if (element instanceof L.ParkingSpot) {
// element.disableEdit();
element.setLatLng(event.latlng);
// element.enableEdit();
// element.extensions();
element.updateMiddleMarker();
element.updateVertexFromDirection();
}
else if (element instanceof L.TaxiwaySegment) {
if (element.begin === dragIndex) {
element.getLatLngs()[0].update(event.latlng);
element.setLatLngs(element.getLatLngs());
element.updateBeginVertex(event.latlng);
element.updateMiddle();
}
if (element.end === dragIndex) {
element.getLatLngs()[element.getLatLngs().length - 1].update(event.latlng);
element.setLatLngs(element.getLatLngs());
element.updateEndVertex(event.latlng);
element.updateMiddle();
}
} else if (element instanceof L.Editable.VertexMarker) {
console.log(element);
element.setLatLng(event.latlng);
element.latlngs.forEach((latlng, index) => {
console.log(latlng);
if (latlng.__vertex === element) {
latlng.update(event.latlng);
}
});
element.editor.feature.setLatLngs(element.latlngs);
element.editor.feature.updateMiddle();
}
}
})
},
updateStyle() {
var style = {};
if (this.options.attributes.isPushBackRoute) {
style.color = 'magenta';
}
console.log("isPushBackRoute ", this.options.attributes.isPushBackRoute);
this.setStyle(style);
if (!this.bidirectional) {
this.setText(' ► ', { repeat: true, attributes: { fill: 'red', size: 20 } })
}
}
});
+38 -32
View File
@@ -29,8 +29,8 @@ exports.extendTaxiSegment = function (taxiwaySegment) {
};
taxiwaySegment.__proto__.extensions = function (editLayer) {
this.editLayer = editLayer;
this._latlngs[0].__vertex.glueindex = this.begin;
this._latlngs.slice(-1)[0].__vertex.glueindex = this.end;
this._latlngs[0].glueindex = this.begin;
this._latlngs.slice(-1)[0].glueindex = this.end;
if (typeof this.featureLookup[this.begin] === 'undefined') {
this.featureLookup[this.begin] = new Array();
}
@@ -71,7 +71,6 @@ exports.extendTaxiSegment = function (taxiwaySegment) {
,
{
deep: true //add this if u need to watch object properties change etc.
}
);
});
@@ -89,44 +88,50 @@ exports.extendTaxiSegment = function (taxiwaySegment) {
if(taxiwaySegment.options.attributes === undefined) {
taxiwaySegment.options.attributes = {direction: 'bi-directional'};
}
// Glue to another node
if (closest) {
event.latlng.__vertex['glueindex'] = Number(closest.glueindex);
event.latlng['glueindex'] = Number(closest.glueindex);
event.latlng.__vertex.setLatLng(closest.latlng);
event.latlng.attributes = {index: event.latlng.__vertex.glueindex, isOnRunway: 0};
this.editLayer.featureLookup[event.latlng.__vertex.glueindex].push(event.latlng.__vertex);
if (taxiwaySegment.options.attributes.start === undefined) {
taxiwaySegment.options.attributes.start = event.latlng.__vertex['glueindex']
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.__vertex['glueindex']
taxiwaySegment.options.attributes.end = event.latlng['glueindex']
}
if(taxiwaySegment.getLatLngs().length===1) {
taxiwaySegment.begin = closest.glueindex;
}
taxiwaySegment.end = closest.glueindex;
console.log(`Closest : ${closest}`)
} else {
event.vertex['glueindex'] = ++this.editLayer.groundnetLayerGroup.maxId;
event.vertex.latlng.attributes = {index: event.vertex.glueindex, isOnRunway: 0};
this.editLayer.featureLookup[event.vertex.glueindex] = [];
this.editLayer.featureLookup[event.vertex.glueindex].push(event.vertex);
this.editLayer.featureLookup[event.vertex.glueindex].push(taxiwaySegment);
if (taxiwaySegment.options.attributes.start === undefined) {
taxiwaySegment.options.attributes.start = event.vertex['glueindex']
} else {
taxiwaySegment.options.attributes.end = event.vertex['glueindex']
}
event.vertex.editor.enable();
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 ||
Number(taxiwaySegment.getLatLngs()[taxiwaySegment.getLatLngs().length-1].glueindex) !== taxiwaySegment.options.attributes.end ) {
taxiwaySegment.options.attributes.end = event.vertex.latlng['glueindex']
taxiwaySegment.end = event.vertex.latlng.glueindex;
}*/
}
});
this.on('editable:vertex:deleted', event => {
console.log(event)
console.log('editable:vertex:deleted' + event)
});
this.on('editable:vertex:rawclick', event => {
event.cancel()
console.log(event)
});
this.on('editable:vertex:clicked', function (event) {
console.log(this.featureLookup[event.vertex.glueindex]);
if (this.edit) {
}
store.default.dispatch('setNode', event.vertex.latlng.attributes)
if(event.vertex._icon!=null) {
event.vertex._icon.style['background-color'] = 'red';
@@ -175,15 +180,15 @@ exports.extendTaxiSegment = function (taxiwaySegment) {
this.on('editable:vertex:dragstart', function (event) {
console.log("Event Target : ", event.target);
console.log("Middle Marker : ", event.vertex == event.vertex.middleMarker);
console.log("Middle Marker : ", event.vertex.glueindex == undefined);
if(event.vertex.glueindex == undefined)
console.log("Middle Marker : ", event.vertex.latlng.glueindex == undefined);
if(event.vertex.latlng.glueindex == undefined)
return;
dragIndex = event.vertex.glueindex;
dragIndex = event.vertex.latlng.glueindex;
});
this.on('editable:vertex:dragend', function (event) {
console.log("Dragend : ", event.vertex);
if (dragIndex > 0) {
this.featureLookup[dragIndex].forEach(element => {
event.target.featureLookup[dragIndex].forEach(element => {
if (element instanceof L.ParkingSpot) {
//element.setLatLng(event);
console.log(element);
@@ -214,7 +219,7 @@ exports.extendTaxiSegment = function (taxiwaySegment) {
element.updateMiddleMarker();
element.updateVertexFromDirection();
}
else if (element instanceof L.Polyline) {
else if (element instanceof L.Polyline) {
if (Number(element.begin) === Number(dragIndex)) {
element.getLatLngs()[0].update(event.latlng);
element.setLatLngs(element.getLatLngs());
@@ -227,7 +232,8 @@ exports.extendTaxiSegment = function (taxiwaySegment) {
element.updateEndVertex(event.latlng);
element.updateMiddle();
}
} else if (element instanceof L.Editable.VertexMarker) {
} else if (element instanceof L.Editable.VertexMarker &&
element !== event.vertex) {
console.log(element);
element.setLatLng(event.latlng);
element.latlngs.forEach((latlng, index) => {
+11 -12
View File
@@ -3,7 +3,6 @@ const fs = require('fs');
const path = require('path');
const markers = require('./MagneticVertex');
const TaxiwaySegment = require('./TaxiwaySegment');
const parkingSpot = require('./ParkingSpot.js');
@@ -92,34 +91,34 @@ exports.writeGroundnetXML = function (fDir, icao, featureList) {
});
// New segments
featureList.filter(o => o instanceof L.Polyline).filter(n => n).forEach(arcElement => {
// element._latlngs.forEach(latlng => { nodes[latlng.__vertex.glueindex] = mapVertexNode(latlng) });
// element._latlngs.forEach(latlng => { nodes[latlng.glueindex] = mapVertexNode(latlng) });
var startIndex = -1;
console.debug(arcElement.options.attributes);
var currentArc = arcElement.options.attributes;
arcElement._latlngs.forEach( latlng => {
if (latlng.__vertex !== undefined && latlng.__vertex.glueindex !== undefined) {
nodes[latlng.__vertex.glueindex] = mapVertexNode(latlng);
if (latlng !== undefined && latlng.glueindex !== undefined) {
nodes[latlng.glueindex] = mapVertexNode(latlng);
if (startIndex >= 0) {
if (featureLookup[startIndex] == undefined) {
featureLookup[startIndex] = [];
}
if (featureLookup[latlng.__vertex.glueindex] == undefined) {
featureLookup[latlng.__vertex.glueindex] = [];
if (featureLookup[latlng.glueindex] == undefined) {
featureLookup[latlng.glueindex] = [];
}
if( currentArc.direction === 'bi-directional' || currentArc.direction === 'forward' ){
arc = { '@begin': startIndex, '@end': String(latlng.__vertex.glueindex) };
arc = { '@begin': startIndex, '@end': String(latlng.glueindex) };
styleArc(currentArc, arc);
arcList.push(arc);
featureLookup[startIndex][latlng.__vertex.glueindex] = arc;
featureLookup[startIndex][latlng.glueindex] = arc;
}
if( currentArc.direction === 'bi-directional' || currentArc.direction === 'backward' ){
arc = { '@begin': String(latlng.__vertex.glueindex), '@end': startIndex };
arc = { '@begin': String(latlng.glueindex), '@end': startIndex };
styleArc(currentArc, arc);
arcList.push(arc);
featureLookup[latlng.__vertex.glueindex][startIndex] = arc;
featureLookup[latlng.glueindex][startIndex] = arc;
}
}
startIndex = latlng.__vertex.glueindex;
startIndex = latlng.glueindex;
}
});
});
@@ -237,7 +236,7 @@ var mapVertexNode = function (l) {
if (l instanceof L.LatLng) {
console.debug(l);
// <Parking index="0" type="gate" name="GA_Parking" lat="S9 25.739923" lon="E160 2.927602" heading="67" radius="44" airlineCodes="" />
return { '@index': String(l.__vertex.glueindex), '@lat': convertLat(l), '@lon': convertLon(l), '@isOnRunway': '0', '@holdPointType': l.attributes['holdPointType'] };
return { '@index': String(l.glueindex), '@lat': convertLat(l), '@lon': convertLon(l), '@isOnRunway': '0', '@holdPointType': l.attributes['holdPointType'] };
}
}