Oleg Sh 43a4b44a22 Change script location.
Split js code.
Added cache and changed loading mechanism for js sources.
2023-11-06 19:16:50 +02:00

131 lines
3.7 KiB
JavaScript

/**
* Default handler.
* Select using mouse, drag.
*
*/
function FindConnectedComponentNew(graph, app)
{
BaseAlgorithm.apply(this, arguments);
this.connectedComponentNumber = 0;
this.component = {};
this.selectedObjects = [];
}
// inheritance.
FindConnectedComponentNew.prototype = Object.create(BaseAlgorithm.prototype);
FindConnectedComponentNew.prototype.getName = function(local)
{
return g_findConnectedComponent; //local == "ru" ? "Найти компоненты связности" : "Find connected components";
}
FindConnectedComponentNew.prototype.getId = function()
{
return "OlegSh.ConnectedComponent";
}
// @return message for user.
FindConnectedComponentNew.prototype.getMessage = function(local)
{
return (this.graph.hasDirectEdge() ? g_sickConnectedComponent : g_connectedComponent) + this.connectedComponentNumber;
}
FindConnectedComponentNew.prototype.result = function(resultCallback)
{
this.calculate(true);
var result = {};
result["version"] = 1;
this.selectedObjects = this.component;
return result;
}
FindConnectedComponentNew.prototype.calculate = function(fillUpText = false)
{
this.connectedComponentNumber = 0;
this.component = {};
var tempVertices = this.graph.vertices.slice();
connectedVertex = getVertexToVertexArray(this.graph, true);
var connectedComponentNumber = 0;
while (tempVertices.length > 0)
{
connectedComponentNumber++;
var stack = [];
stack.push(tempVertices[0]);
tempVertices.splice(0, 1);
indexInStack = 0;
for (i = 0; i < stack.length; i++)
{
var stackElement = stack[i];
this.component[stackElement.id] = connectedComponentNumber;
if (fillUpText)
{
stackElement.upText = connectedComponentNumber;
}
if (connectedVertex.hasOwnProperty(stackElement.id))
{
for (j = 0; j < connectedVertex[stackElement.id].length; j++)
{
var nextVertex = connectedVertex[stackElement.id][j];
var connectedEdge = this.graph.FindEdgeAny(stackElement.id, nextVertex.id);
if (stack.indexOf(nextVertex) < 0)
{
stack.push(nextVertex);
tempVertices.splice(tempVertices.indexOf(nextVertex), 1);
if (connectedEdge)
{
this.component[connectedEdge.id] = connectedComponentNumber;
}
}
else if (connectedEdge && !(connectedEdge.id in this.component))
{
this.component[connectedEdge.id] = connectedComponentNumber;
}
}
}
}
}
this.connectedComponentNumber = connectedComponentNumber;
//var result = {};
//result["version"] = 1;
//this.selectedObjects = this.component;
return this.connectedComponentNumber;
}
FindConnectedComponentNew.prototype.getObjectSelectedGroup = function(object)
{
return (object.id in this.selectedObjects) ? this.selectedObjects[object.id] : 0;
}
FindConnectedComponentNew.prototype.getPriority = function()
{
return 0;
}
// Algorithm support multi graph
FindConnectedComponentNew.prototype.IsSupportMultiGraph = function()
{
return true;
}
// Factory for connected components.
function CreateConnectedComponetsNew(graph, app)
{
return new FindConnectedComponentNew(graph)
}
// Gerister connected component.
RegisterAlgorithm (CreateConnectedComponetsNew);