diff --git a/package-lock.json b/package-lock.json index 1353fee..b52e56c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -243,11 +243,6 @@ "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==" }, - "@types/lodash": { - "version": "4.14.170", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz", - "integrity": "sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q==" - }, "@types/mocha": { "version": "2.2.48", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", @@ -717,15 +712,40 @@ "dev": true }, "graphlabs.core.graphs": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/graphlabs.core.graphs/-/graphlabs.core.graphs-0.1.10.tgz", - "integrity": "sha512-XfcOGKKdSdoUG8rmQ0EpDKoE0Q1SLuVDXS5a/6EZXmfoSGFHGaOsXgqAHJ8gmTlS9fAlWRlMB93qnabkWM8Uig==", + "version": "file:../Core.Graphs", "requires": { "@types/lodash": "^4.14.146", "immutable": "^3.8.1", "lodash": "^4.17.15", "ts-md5": "^1.2.7", "typescript": "^3.7.2" + }, + "dependencies": { + "@types/lodash": { + "version": "4.14.176", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.176.tgz", + "integrity": "sha512-xZmuPTa3rlZoIbtDUyJKZQimJV3bxCmzMIO2c9Pz9afyDro6kr7R79GwcB6mRhuoPmV2p1Vb66WOJH7F886WKQ==" + }, + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "ts-md5": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.9.tgz", + "integrity": "sha512-/Efr7ZfGf8P+d9HXh0PLQD1CDipqD8j9apCFG96pODDoEaFLxXpV4En6tAc6y3fWyfhFGrqtNBRBS+eLVIB2uQ==" + }, + "typescript": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz", + "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==" + } } }, "growl": { @@ -763,11 +783,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "immutable": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz", - "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=" - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -795,11 +810,6 @@ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", "dev": true }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, "lodash._baseassign": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", @@ -1046,11 +1056,6 @@ "has-flag": "^1.0.0" } }, - "ts-md5": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/ts-md5/-/ts-md5-1.2.8.tgz", - "integrity": "sha512-Vt4J3CeMoYKkAArpvLZiPAN5x8GrnII1zJ5EaLfxqmgdK4apAAUGtKL+mXt+bsMhl+euQUdxS9ulDlIPvPo+rA==" - }, "ts-node": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.3.0.tgz", diff --git a/package.json b/package.json index 04e6cc1..30eae10 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "@types/d3": "^5.7.2", "@types/react": "^16.9.2", "d3": "^5.12.0", - "graphlabs.core.graphs": "^0.1.10", + "graphlabs.core.graphs": "file://C://GraphLabs//try//Core.Graphs", "react": "^16.9.0", "typescript": "^3.7.0" }, diff --git a/src/adapters/WritableAdapter.tsx b/src/adapters/WritableAdapter.tsx index 2e79c5d..e97f194 100644 --- a/src/adapters/WritableAdapter.tsx +++ b/src/adapters/WritableAdapter.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import {ReadableAdapter} from "./ReadableAdapter"; import {select} from "d3-selection"; import * as d3 from 'd3'; -import {IVertex, Vertex, Edge, IEdge} from "graphlabs.core.graphs"; +import {IVertex, Vertex, Edge, IEdge, DirectedEdge} from "graphlabs.core.graphs"; import {GeometricEdge, GeometricVertex} from ".."; export class WritableAdapter extends ReadableAdapter { @@ -62,84 +62,168 @@ export class WritableAdapter extends ReadableAdapter { } public addEdge() { - console.log(this.graphVisualizer); super.addEdge(); console.log('vert1' + this.vertexOne); - console.log('vert2' + this.vertexTwo); + console.log('vert2' + this.vertexTwo) let edge: Edge; - if (this.vertexOne.name != '' && this.vertexTwo.name != '' && this.numberOfSelectedVertices() === 2) { - // добавление ребра (именование вручную) - if (this.props.edgeNaming === true) { - let edgeName = prompt('Enter the name of the edge', ''); - if (edgeName !== '' && edgeName !== null) { - // if (this.vertexOne.name != '' && this.vertexTwo.name != '') { + if (!this.props.isDirected) { + console.log('not directed'); + if (this.vertexOne.name != '' && this.vertexTwo.name != '' && this.numberOfSelectedVertices() === 2) { + // добавление ребра (именование вручную) + if (this.props.edgeNaming === true) { + let edgeName = prompt('Enter the name of the edge', ''); + if (edgeName !== '' && edgeName !== null) { edge = new Edge(new Vertex(this.vertexOne.name), new Vertex(this.vertexTwo.name), edgeName); - /* this.props.graph.addEdge(edge); - this.graphVisualizer.geometric.edges.push(new GeometricEdge(edge)); - this.addEdgeToSVG(new GeometricEdge(edge)); - this.updateSvg();*/ - // } + } else { + return; + } } else { - return; + // добавление ребра (автоматическое именование) + if (this.props.namedEdges == true) { + if (this.graphVisualizer.geometric.edges.length != 0) { + let edgeNumbers = []; + for (let i = 0; i < this.graphVisualizer.geometric.edges.length; i++) { + edgeNumbers[i] = Number(this.graphVisualizer.geometric.edges[i].edge.name); + } + let maxNum = Math.max.apply(null, edgeNumbers); + edge = new Edge(new Vertex(this.vertexOne.name), new Vertex(this.vertexTwo.name), (maxNum + 1).toString()); + } else { + edge = new Edge(new Vertex(this.vertexOne.name), new Vertex(this.vertexTwo.name), '0'); + } + } else { + // добавленеи неименованных ребер + edge = new Edge(new Vertex(this.vertexOne.name), new Vertex(this.vertexTwo.name)); + } + + } + // проверка ребра на уникальность (нет ребер с таким же именем и нет ребер между данными двумя вершинами) + let isRepeated2: boolean; + if (this.props.graph.edges.some(e => e.name === edge.name + || (e.vertexOne.name === edge.vertexOne.name && e.vertexTwo.name === edge.vertexTwo.name) + || (e.vertexOne.name === edge.vertexTwo.name && e.vertexTwo.name === edge.vertexOne.name))) { + isRepeated2 = true; + console.log('Repeated edge!'); + } + // добавление ребра в модель, геом.граф и в svg + if (isRepeated2 !== true) { + console.log(edge); + this.props.graph.addEdge(edge); + this.graphVisualizer.geometric.edges.push(new GeometricEdge(edge)); + this.addEdgeToSVG(new GeometricEdge(edge)); + this.updateSvg(); } } else { - // if (this.vertexOne.name != '' && this.vertexTwo.name != '') { + alert('Для добавления ребра необходимо выбрать две вершины!') + } - /* let isRepeated: boolean; - for (let i = 0; i < this.props.graph.edges.length; i++) { - if (this.props.graph.edges[i].vertexOne.name == this.vertexOne.name && this.props.graph.edges[i].vertexTwo.name == this.vertexTwo.name - || this.props.graph.edges[i].vertexOne.name == this.vertexTwo.name && this.props.graph.edges[i].vertexTwo.name == this.vertexOne.name) { - isRepeated = true; - } + this.vertexOne.rename(''); + this.vertexTwo.rename(''); + } + else{ + console.log('Directed'); + if (this.numberOfSelectedVertices() ===0 ) { + alert('Для добавления ребра необходимо выбрать хотя бы одну вершину!') + } + + if (this.vertexOne.name!='' && this.numberOfSelectedVertices() ===1 ) { + console.log('one vertex'); + if (this.props.edgeNaming === true) { + let edgeName = prompt('Введите имя дуги:', ''); + if (edgeName !== '' && edgeName !== null) { + edge = new DirectedEdge(new Vertex(this.vertexOne.name), new Vertex(this.vertexOne.name), edgeName); + } else { + return; } - if (isRepeated == true) { - console.log("Repeated item!"); - } else { */ - // добавление ребра (автоматическое именование) - if (this.props.namedEdges == true) { - if (this.graphVisualizer.geometric.edges.length != 0) { - let edgeNumbers = []; - for (let i = 0; i < this.graphVisualizer.geometric.edges.length; i++) { - edgeNumbers[i] = Number(this.graphVisualizer.geometric.edges[i].edge.name); - } - let maxNum = Math.max.apply(null, edgeNumbers); - edge = new Edge(new Vertex(this.vertexOne.name), new Vertex(this.vertexTwo.name), (maxNum + 1).toString()); - } else { - edge = new Edge(new Vertex(this.vertexOne.name), new Vertex(this.vertexTwo.name), '0'); + } else { + // добавление ребра (автоматическое именование) + console.log('adding'); + if (this.props.namedEdges == true) { + if (this.graphVisualizer.geometric.edges.length != 0) { + let edgeNumbers = []; + for (let i = 0; i < this.graphVisualizer.geometric.edges.length; i++) { + edgeNumbers[i] = Number(this.graphVisualizer.geometric.edges[i].edge.name); } - } else { // добавленеи неименованных ребер - edge = new Edge(new Vertex(this.vertexOne.name), new Vertex(this.vertexTwo.name)); + let maxNum = Math.max.apply(null, edgeNumbers); + edge = new DirectedEdge(new Vertex(this.vertexOne.name), new Vertex(this.vertexOne.name), (maxNum + 1).toString()); + } else { + edge = new DirectedEdge(new Vertex(this.vertexOne.name), new Vertex(this.vertexOne.name), '0'); } - /*console.log(edge); + } else { + // добавленеи неименованных ребер + edge = new DirectedEdge(new Vertex(this.vertexOne.name), new Vertex(this.vertexOne.name)); + } + + let isRepeated2: boolean; + if (this.props.graph.edges.some(e => e.name === edge.name + || (e.vertexOne.name === edge.vertexOne.name && e.vertexTwo.name === edge.vertexOne.name))) { + isRepeated2 = true; + console.log('Repeated edge!'); + } + + if (isRepeated2 !== true) { + console.log(edge); this.props.graph.addEdge(edge); this.graphVisualizer.geometric.edges.push(new GeometricEdge(edge)); this.addEdgeToSVG(new GeometricEdge(edge)); - this.updateSvg();*/ - // } - // } - } - // проверка ребра на уникальность (нет ребер с таким же именем и нет ребер между данными двумя вершинами) - let isRepeated2: boolean; - if (this.props.graph.edges.some(e => e.name === edge.name - || (e.vertexOne.name === edge.vertexOne.name && e.vertexTwo.name === edge.vertexTwo.name) - || (e.vertexOne.name === edge.vertexTwo.name && e.vertexTwo.name === edge.vertexOne.name))) { - isRepeated2 = true; - console.log('Repeated edge!'); + this.updateSvg(); + } + + this.vertexOne.rename(''); + } + } - // добавление ребра в модель, геом.граф и в svg - if (isRepeated2 !== true) { - console.log(edge); - this.props.graph.addEdge(edge); - this.graphVisualizer.geometric.edges.push(new GeometricEdge(edge)); - this.addEdgeToSVG(new GeometricEdge(edge)); - this.updateSvg(); + else + { + // добавление ребра (именование вручную) + if (this.props.edgeNaming === true) { + let edgeName = prompt('Введите имя дуги:', ''); + if (edgeName !== '' && edgeName !== null) { + edge = new DirectedEdge(new Vertex(this.vertexOne.name), new Vertex(this.vertexTwo.name), edgeName); + } else { + return; + } + } else { + // добавление ребра (автоматическое именование) + console.log('adding'); + if (this.props.namedEdges == true) { + if (this.graphVisualizer.geometric.edges.length != 0) { + let edgeNumbers = []; + for (let i = 0; i < this.graphVisualizer.geometric.edges.length; i++) { + edgeNumbers[i] = Number(this.graphVisualizer.geometric.edges[i].edge.name); + } + let maxNum = Math.max.apply(null, edgeNumbers); + edge = new DirectedEdge(new Vertex(this.vertexOne.name), new Vertex(this.vertexTwo.name), (maxNum + 1).toString()); + } else { + edge = new DirectedEdge(new Vertex(this.vertexOne.name), new Vertex(this.vertexTwo.name), '0'); + } + } else { + // добавленеи неименованных ребер + edge = new DirectedEdge(new Vertex(this.vertexOne.name), new Vertex(this.vertexTwo.name)); + } + + let isRepeated2: boolean; + if (this.props.graph.edges.some(e => e.name === edge.name + || (e.vertexOne.name === edge.vertexOne.name && e.vertexTwo.name === edge.vertexTwo.name))) { + isRepeated2 = true; + console.log('Repeated edge!'); + } + + if (isRepeated2 !== true) { + console.log(edge); + this.props.graph.addEdge(edge); + this.graphVisualizer.geometric.edges.push(new GeometricEdge(edge)); + this.addEdgeToSVG(new GeometricEdge(edge)); + this.updateSvg(); + } + + this.vertexOne.rename(''); + this.vertexTwo.rename(''); + + } } + + } - else { - alert('Для добавления ребра необходимо выбрать две вершины!') - } - this.vertexOne.rename(''); - this.vertexTwo.rename(''); } public removeVertex() {