drawio-offline
Version:
diagrams.net desktop
469 lines (407 loc) • 12.9 kB
JavaScript
/**
* Text extraction plugin.
*/
Draw.loadPlugin(function(ui)
{
var defaultDelay = 2000;
var defaultMax = 50;
var graph = ui.editor.graph;
// Adds resource for action
mxResources.parse('randomLabel=Random Label...');
// Adds action
ui.actions.addAction('randomLabel', function()
{
var cells = graph.getSelectionCells().slice();
if (cells.length > 0)
{
var delay = parseInt(prompt('Delay (ms)', defaultDelay));
var max = parseInt(prompt('Cycles', defaultMax));
var counter = 0;
function schedule()
{
var jitter = 1 + 0.3 * (Math.random() - 0.5);
window.setTimeout(function()
{
for (var i = 0; i < cells.length; i++)
{
graph.labelChanged(cells[i], 'Test ' + Math.round(Math.random() * 100));
}
if (ui.dialog != null)
{
console.log('randomLabel halted');
}
else
{
if (counter++ < max && ui.dialog == null)
{
console.log('randomLabel', counter);
schedule();
}
else
{
console.log('randomLabel halted');
}
}
}, delay * jitter);
}
schedule();
}
else
{
ui.alert(mxResources.get('nothingIsSelected'));
}
});
// Adds resource for action
mxResources.parse('swapChildren=Swap children...');
// Adds action
ui.actions.addAction('swapChildren', function()
{
var cells = graph.getSelectionCells().slice();
if (cells.length > 1)
{
var delay = parseInt(prompt('Delay (ms)', defaultDelay));
var max = parseInt(prompt('Cycles', defaultMax));
var counter = 0;
function schedule()
{
var jitter = 1 + 0.3 * (Math.random() - 0.5);
window.setTimeout(function()
{
// assuming parent is the first cell selected
var parentA = cells[0];
var parentB = cells[1];
var childrenA = parentA.children;
var childrenB = parentB.children;
var numberA = childrenA.length;
var numberB = childrenB.length;
if (childrenA != null && childrenA.length > 1 || childrenB != null && childrenB.length > 1)
{
graph.getModel().beginUpdate();
try
{
// permute children
var passes = Math.floor(Math.random() * numberA) + 1;
console.log(counter + " - swapping " + passes + " children from parent A to parent B");
for (var i = 0; i < passes; i++)
{
// which child to select from parent A
var k = Math.floor(Math.random() * numberA);
// where to insert it to parent B
var l = Math.floor(Math.random() * (numberB + 1));
graph.model.add(parentB, childrenA[k], l);
numberA -= 1;
numberB += 1;
}
var passes = Math.floor(Math.random() * numberB) + 1;
console.log(counter + " - swapping " + passes + " children from parent B to parent A");
for (var i = 0; i < passes; i++)
{
// which child to select from parent A
var k = Math.floor(Math.random() * numberB);
// where to insert it to parent B
var l = Math.floor(Math.random() * (numberA + 1));
graph.model.add(parentA, childrenB[k], l);
numberA += 1;
numberB -= 1;
}
}
finally
{
graph.getModel().endUpdate();
}
}
if (ui.dialog != null)
{
console.log('swapChildren halted');
}
else
{
if (counter++ < max && ui.dialog == null)
{
console.log('swapChildren', counter);
schedule();
}
else
{
console.log('swapChildren halted');
}
}
}, delay * jitter);
}
schedule();
}
else
{
ui.alert(mxResources.get('nothingIsSelected'));
}
});
// Adds resource for action
mxResources.parse('placeChildren=Place children...');
// Adds action
ui.actions.addAction('placeChildren', function()
{
var graph = ui.editor.graph;
var cells = graph.getSelectionCells().slice();
if (cells.length > 1)
{
var counter = 0;
var delay = parseInt(prompt('Delay (ms)', defaultDelay));
var max = parseInt(prompt('Cycles', defaultMax));
function schedule()
{
var jitter = 1 + 0.3 * (Math.random() - 0.5);
window.setTimeout(function()
{
// assuming parent is the first cell selected
var parentA = cells[0];
var parentB = cells[1];
var childrenA = parentA.children;
var childrenB = parentB.children;
var numberA = (childrenA != null)? childrenA.length: 0;
var numberB = (childrenB != null)? childrenB.length: 0;
var n = 0;
if (childrenA != null && childrenA.length > 1 || childrenB != null && childrenB.length > 1)
{
graph.getModel().beginUpdate();
try
{
// first, remove a few children from each parent
childrenA = parentA.children;
childrenB = parentB.children;
numberA = (childrenA != null)? childrenA.length: 0;
numberB = (childrenB != null)? childrenB.length: 0;
// 1st parent
n = Math.floor(Math.random() * 4); // how many to delete? at least 1 should remain
n = Math.min(n, Math.max(0, numberA - 2));
console.log(counter + " - removing " + n + " children from parent A");
for (var i = 0; i < n; i++)
{
childrenA = parentA.children;
numberA = (childrenA != null)? childrenA.length: 0;
if (numberA > 0)
{
var k = Math.floor(Math.random() * numberA);
parentA.remove(k);
}
}
// 2nd parent
n = Math.floor(Math.random() * 4); // how many to delete? at least 1 should remain
n = Math.min(n, Math.max(0, numberB - 2));
console.log(counter + " - removing " + n + " children from parent B");
for (var i = 0; i < n; i++)
{
childrenB = parentB.children;
numberB = (childrenB != null)? childrenB.length: 0;
if (numberB > 0)
{
var k = Math.floor(Math.random() * numberB);
parentB.remove(k);
}
}
// second, insert a few children to each parent
childrenA = parentA.children;
childrenB = parentB.children;
numberA = (childrenA != null)? childrenA.length: 0;
numberB = (childrenB != null)? childrenB.length: 0;
// 1st parent
n = Math.floor(Math.random() * 4); // how many to insert?
console.log(counter + " - inserting " + n + " children into parent A");
for (var i = 0; i < n; i++)
{
childrenA = parentA.children;
numberA = (childrenA != null)? childrenA.length: 0;
if (numberA > 0)
{
var k = Math.floor(Math.random() * numberA);
var x = Math.floor(Math.random() * 200);
var y = Math.floor(Math.random() * 50);
var number = Math.floor(Math.random() * 9000 + 1000);
var child = graph.insertVertex(parentA, null, number.toString(), x, y, 120, 30);
parentA.insert(child, k);
}
}
// 2nd parent
n = Math.floor(Math.random() * 4); // how many to insert?
console.log(counter + " - inserting " + n + " children into parent B");
for (var i = 0; i < n; i++)
{
childrenB = parentB.children;
numberB = (childrenB != null)? childrenB.length: 0;
if (numberB > 0)
{
var k = Math.floor(Math.random() * numberB);
var x = Math.floor(Math.random() * 200);
var y = Math.floor(Math.random() * 50);
var number = Math.floor(Math.random() * 9000 + 1000);
var child = graph.insertVertex(parentB, null, number.toString(), x, y, 120, 30);
parentB.insert(child, k);
}
}
// third, shuffle children in each parent
childrenA = parentA.children;
childrenB = parentB.children;
numberA = (childrenA != null)? childrenA.length: 0;
numberB = (childrenB != null)? childrenB.length: 0;
// 1st parent
n = Math.floor(Math.random() * numberA); // how many to shuffle?
console.log(counter + " - moving " + n + " children inside parent A");
for (var i = 0; i < n; i++)
{
childrenA = parentA.children;
numberA = (childrenA != null)? childrenA.length: 0;
if (numberA > 0)
{
var k = Math.floor(Math.random() * numberA); // from index
var l = Math.floor(Math.random() * numberA); // to index
var child = parentA.getChildAt(k);
parentA.insert(child, l);
}
}
// 2nd parent
n = Math.floor(Math.random() * numberB); // how many to shuffle?
console.log(counter + " - moving " + n + " children inside parent B");
for (var i = 0; i < n; i++)
{
childrenB = parentB.children;
numberB = (childrenB != null)? childrenB.length: 0;
if (numberB > 0)
{
var k = Math.floor(Math.random() * numberB); // from index
var l = Math.floor(Math.random() * numberB); // to index
var child = parentB.getChildAt(k);
parentB.insert(child, l);
}
}
// fourth, exchange a few children between both parents
childrenA = parentA.children;
childrenB = parentB.children;
numberA = (childrenA != null)? childrenA.length: 0;
numberB = (childrenB != null)? childrenB.length: 0;
// permute children
var passes = Math.floor(Math.random() * numberA) + 1;
console.log(counter + " - swapping " + passes + " children from parent A to parent B");
for (var i = 0; i < passes; i++)
{
// which child to select from parent A
var k = Math.floor(Math.random() * numberA);
// where to insert it to parent B
var l = Math.floor(Math.random() * (numberB + 1));
graph.model.add(parentB, childrenA[k], l);
numberA -= 1;
numberB += 1;
}
var passes = Math.floor(Math.random() * numberB) + 1;
console.log(counter + " - swapping " + passes + " children from parent B to parent A");
for (var i = 0; i < passes; i++)
{
// which child to select from parent A
var k = Math.floor(Math.random() * numberB);
// where to insert it to parent B
var l = Math.floor(Math.random() * (numberA + 1));
graph.model.add(parentA, childrenB[k], l);
numberA += 1;
numberB -= 1;
}
}
finally
{
graph.getModel().endUpdate();
}
}
if (ui.dialog != null)
{
console.log('placeChildren halted');
}
else
{
if (counter++ < max && ui.dialog == null)
{
console.log('placeChildren', counter);
schedule();
}
else
{
console.log('placeChildren halted');
}
}
}, delay * jitter);
}
schedule();
}
else
{
ui.alert(mxResources.get('nothingIsSelected'));
}
});
// Adds resource for action
mxResources.parse('reorderChildren=Reorder children...');
// Adds action
ui.actions.addAction('reorderChildren', function()
{
var cells = graph.getSelectionCells().slice();
if (cells.length > 0)
{
var delay = parseInt(prompt('Delay (ms)', defaultDelay));
var max = parseInt(prompt('Cycles', defaultMax));
var counter = 0;
function schedule()
{
var jitter = 1 + 0.3 * (Math.random() - 0.5);
window.setTimeout(function()
{
// assuming parent is the first cell selected
var parent = cells[0];
var children = parent.children;
if (children != null && children.length > 1)
{
graph.getModel().beginUpdate();
try
{
// permute children
var number = children.length;
var passes = Math.floor(Math.random() * number) + 1;
console.log(counter + " - reordering in " + passes + " passes");
for (var i = 0; i < passes; i++)
{
var k = Math.floor(Math.random() * number);
graph.orderCells(true, [children[k]]);
}
}
finally
{
graph.getModel().endUpdate();
}
}
if (ui.dialog != null)
{
console.log('reorderChildren halted');
}
else
{
if (counter++ < max && ui.dialog == null)
{
console.log('reorderChildren', counter);
schedule();
}
else
{
console.log('reorderChildren halted');
}
}
}, delay * jitter);
}
schedule();
}
else
{
ui.alert(mxResources.get('nothingIsSelected'));
}
});
var menu = ui.menus.get('extras');
var oldFunct = menu.funct;
menu.funct = function(menu, parent)
{
oldFunct.apply(this, arguments);
ui.menus.addMenuItems(menu, ['-', 'randomLabel', 'reorderChildren', 'swapChildren', 'placeChildren'], parent);
};
});