@antv/x6
Version:
JavaScript diagramming library that uses SVG and HTML for rendering
65 lines (57 loc) • 1.65 kB
text/typescript
import { NumberExt } from '../../common'
import type { RouterDefinition } from './index'
import type { PaddingOptions } from './util'
export interface OneSideRouterOptions extends PaddingOptions {
side?: 'left' | 'top' | 'right' | 'bottom'
}
/**
* Routes the edge always to/from a certain side
*/
export const oneSide: RouterDefinition<OneSideRouterOptions> = (
vertices,
options,
edgeView,
) => {
const side = options.side || 'bottom'
const padding = NumberExt.normalizeSides(options.padding || 40)
const sourceBBox = edgeView.sourceBBox
const targetBBox = edgeView.targetBBox
const sourcePoint = sourceBBox.getCenter()
const targetPoint = targetBBox.getCenter()
let coord: 'x' | 'y'
let dim: 'width' | 'height'
let factor
switch (side) {
case 'top':
factor = -1
coord = 'y'
dim = 'height'
break
case 'left':
factor = -1
coord = 'x'
dim = 'width'
break
case 'right':
factor = 1
coord = 'x'
dim = 'width'
break
case 'bottom':
default:
factor = 1
coord = 'y'
dim = 'height'
break
}
// Move the points from the center of the element to outside of it.
sourcePoint[coord] += factor * (sourceBBox[dim] / 2 + padding[side])
targetPoint[coord] += factor * (targetBBox[dim] / 2 + padding[side])
// Make edge orthogonal (at least the first and last vertex).
if (factor * (sourcePoint[coord] - targetPoint[coord]) > 0) {
targetPoint[coord] = sourcePoint[coord]
} else {
sourcePoint[coord] = targetPoint[coord]
}
return [sourcePoint.toJSON(), ...vertices, targetPoint.toJSON()]
}