import AutoPlace from 'diagram-js/lib/features/auto-place/AutoPlace';
|
|
export default function CustomAutoPlace(eventBus, modeling) {
|
AutoPlace.call(this, eventBus, modeling, 3000);
|
|
eventBus.on('autoPlace', 3000, function(context) {
|
const shape = context.shape;
|
const source = context.source;
|
|
return getNewCustomShapePosition(source, shape);
|
});
|
|
this.append = function(source, shape, hints) {
|
eventBus.fire('autoPlace.start', {
|
source: source,
|
shape: shape
|
});
|
|
// allow others to provide the position
|
var position = eventBus.fire('autoPlace', {
|
source: source,
|
shape: shape
|
});
|
|
console.log('hints', hints, 'position', position);
|
|
var newShape = modeling.appendShape(source, shape, position, source.parent, hints);
|
|
eventBus.fire('autoPlace.end', {
|
source: source,
|
shape: newShape
|
});
|
|
return newShape;
|
};
|
}
|
|
export function asTRBL(bounds) {
|
return {
|
top: bounds.y,
|
right: bounds.x + (bounds.width || 0),
|
bottom: bounds.y + (bounds.height || 0),
|
left: bounds.x
|
};
|
}
|
|
export function roundPoint(point) {
|
return {
|
x: Math.round(point.x),
|
y: Math.round(point.y)
|
};
|
}
|
|
export function getMid(bounds) {
|
return roundPoint({
|
x: bounds.x + (bounds.width || 0) / 2,
|
y: bounds.y + (bounds.height || 0) / 2
|
});
|
}
|
|
export function getNewCustomShapePosition(source, element, hints) {
|
if (!hints) {
|
hints = {};
|
}
|
|
var distance = hints.defaultDistance || 50;
|
|
var sourceMid = getMid(source);
|
var sourceTrbl = asTRBL(source);
|
|
// simply put element right next to source
|
return {
|
x: sourceMid.x,
|
y: sourceTrbl.bottom + distance + element.height / 2
|
};
|
}
|
|
const F = function() {}; // 核心,利用空对象作为中介;
|
F.prototype = AutoPlace.prototype; // 核心,将父类的原型赋值给空对象F;
|
CustomAutoPlace.prototype = new F(); // 核心,将 F的实例赋值给子类;
|
CustomAutoPlace.prototype.constructor = AutoPlace; // 修复子类CustomRenderer的构造器指向,防止原型链的混乱;
|