mirror of
https://gitee.com/antv/g6.git
synced 2024-12-03 12:18:40 +08:00
fix: import g problem. add: behavior ts files
This commit is contained in:
parent
a849ec057d
commit
09f33d7a84
@ -26,7 +26,7 @@
|
||||
"clean": "rimraf esm lib dist",
|
||||
"lint": "lint-staged",
|
||||
"test": "jest",
|
||||
"test-live": "DEBUG_MODE=1 jest --watch ./tests/unit/shape/shape-spec.ts",
|
||||
"test-live": "DEBUG_MODE=1 jest --watch ./tests/unit/shape/edge-spec.ts",
|
||||
"coverage": "jest --coverage",
|
||||
"ci": "run-s build coverage",
|
||||
"doc": "rimraf apis && typedoc",
|
||||
@ -64,7 +64,8 @@
|
||||
"tslint-config-prettier": "^1.18.0",
|
||||
"typedoc": "^0.15.0",
|
||||
"typedoc-plugin-markdown": "^2.2.11",
|
||||
"typescript": "^3.5.3"
|
||||
"typescript": "^3.5.3",
|
||||
"webpack-cli": "^3.3.10"
|
||||
},
|
||||
"husky": {
|
||||
"hooks": {
|
||||
|
@ -1,7 +1,7 @@
|
||||
const G = require('@antv/g');
|
||||
const Base = require('../base');
|
||||
const isString = require('@antv/util/lib/type/is-string');
|
||||
const isNil = require('@antv/util/lib/type/is-nil');
|
||||
const isString = require('@antv/util/lib/is-string');
|
||||
const isNil = require('@antv/util/lib/is-nil');
|
||||
const createDOM = require('@antv/util/lib/dom/create-dom');
|
||||
const modifyCSS = require('@antv/util/lib/dom/modify-css');
|
||||
const each = require('@antv/util/lib/each');
|
||||
|
114
src/behavior/activate-relations.ts
Normal file
114
src/behavior/activate-relations.ts
Normal file
@ -0,0 +1,114 @@
|
||||
import { G6Event, IG6GraphEvent } from "@g6/types";
|
||||
|
||||
export default {
|
||||
getDefaultCfg(): object {
|
||||
return {
|
||||
trigger: 'mouseenter', // 可选 mouseenter || click
|
||||
activeState: 'active',
|
||||
inactiveState: 'inactive',
|
||||
resetSelected: false,
|
||||
shouldUpdate() { return true; }
|
||||
};
|
||||
},
|
||||
getEvents(): { [key in G6Event]?: string } {
|
||||
if (this.get('trigger') === 'mouseenter') {
|
||||
return {
|
||||
'node:mouseenter': 'setAllItemStates',
|
||||
'node:mouseleave': 'clearAllItemStates'
|
||||
};
|
||||
}
|
||||
return {
|
||||
'node:click': 'setAllItemStates',
|
||||
'canvas:click': 'clearAllItemStates'
|
||||
};
|
||||
},
|
||||
setAllItemStates(e: IG6GraphEvent) {
|
||||
const graph = this.get('graph');
|
||||
const item = e.item;
|
||||
this.item = item;
|
||||
if (!this.shouldUpdate(e.item, { event: e, action: 'activate' })) {
|
||||
return;
|
||||
}
|
||||
const self = this;
|
||||
const activeState = this.get('activeState');
|
||||
const inactiveState = this.get('inactiveState');
|
||||
const autoPaint = graph.get('autoPaint');
|
||||
graph.setAutoPaint(false);
|
||||
graph.getNodes().forEach(function(node) {
|
||||
const hasSelected = node.hasState('selected');
|
||||
if (self.resetSelected) {
|
||||
if (hasSelected) {
|
||||
graph.setItemState(node, 'selected', false);
|
||||
}
|
||||
}
|
||||
graph.setItemState(node, activeState, false);
|
||||
inactiveState && graph.setItemState(node, inactiveState, true);
|
||||
});
|
||||
graph.getEdges().forEach(function(edge) {
|
||||
graph.setItemState(edge, activeState, false);
|
||||
inactiveState && graph.setItemState(edge, inactiveState, true);
|
||||
});
|
||||
inactiveState && graph.setItemState(item, inactiveState, false);
|
||||
graph.setItemState(item, activeState, true);
|
||||
graph.getEdges().forEach(function(edge) {
|
||||
if (edge.getSource() === item) {
|
||||
const target = edge.getTarget();
|
||||
const hasSelected = target.hasState('selected');
|
||||
if (self.resetSelected) {
|
||||
// inactiveState && graph.setItemState(target, inactiveState, false);
|
||||
// graph.setItemState(target, activeState, true);
|
||||
if (hasSelected) {
|
||||
graph.setItemState(target, 'selected', false);
|
||||
}
|
||||
}
|
||||
inactiveState && graph.setItemState(target, inactiveState, false);
|
||||
graph.setItemState(target, activeState, true);
|
||||
graph.setItemState(edge, activeState, true);
|
||||
graph.setItemState(edge, inactiveState, false);
|
||||
edge.toFront();
|
||||
} else if (edge.getTarget() === item) {
|
||||
// inactiveState && graph.setItemState(edge.getSource(), inactiveState, false);
|
||||
// graph.setItemState(edge.getSource(), activeState, true);
|
||||
|
||||
const source = edge.getSource();
|
||||
const hasSelected = source.hasState('selected');
|
||||
if (self.resetSelected) {
|
||||
if (hasSelected) {
|
||||
graph.setItemState(source, 'selected', false);
|
||||
}
|
||||
}
|
||||
|
||||
inactiveState && graph.setItemState(source, inactiveState, false);
|
||||
graph.setItemState(source, activeState, true);
|
||||
graph.setItemState(edge, activeState, true);
|
||||
graph.setItemState(edge, inactiveState, false);
|
||||
edge.toFront();
|
||||
}
|
||||
});
|
||||
graph.paint();
|
||||
graph.setAutoPaint(autoPaint);
|
||||
graph.emit('afteractivaterelations', { item: e.item, action: 'activate' });
|
||||
},
|
||||
clearAllItemStates(e) {
|
||||
const graph = this.get('graph');
|
||||
if (!this.shouldUpdate(e.item, { event: e, action: 'deactivate' })) {
|
||||
return;
|
||||
}
|
||||
const self = this;
|
||||
const autoPaint = graph.get('autoPaint');
|
||||
graph.setAutoPaint(false);
|
||||
graph.getNodes().forEach(function(node) {
|
||||
const hasSelected = node.hasState('selected');
|
||||
graph.clearItemStates(node);
|
||||
if (hasSelected) {
|
||||
graph.setItemState(node, 'selected', !self.resetSelected);
|
||||
}
|
||||
});
|
||||
graph.getEdges().forEach(function(edge) {
|
||||
graph.clearItemStates(edge);
|
||||
});
|
||||
graph.paint();
|
||||
graph.setAutoPaint(autoPaint);
|
||||
graph.emit('afteractivaterelations', { item: e.item || this.item, action: 'deactivate' });
|
||||
}
|
||||
};
|
225
src/behavior/brush-select.ts
Normal file
225
src/behavior/brush-select.ts
Normal file
@ -0,0 +1,225 @@
|
||||
import { G6Event, IG6GraphEvent } from "@g6/types";
|
||||
|
||||
const min = Math.min;
|
||||
const max = Math.max;
|
||||
const abs = Math.abs;
|
||||
const DEFAULT_TRIGGER = 'shift';
|
||||
const ALLOW_EVENTS = [ 'drag', 'shift', 'ctrl', 'alt', 'control' ];
|
||||
|
||||
export default {
|
||||
getDefaultCfg(): object {
|
||||
return {
|
||||
brushStyle: {
|
||||
fill: '#EEF6FF',
|
||||
fillOpacity: 0.4,
|
||||
stroke: '#DDEEFE',
|
||||
lineWidth: 1
|
||||
},
|
||||
onSelect() {},
|
||||
onDeselect() {},
|
||||
selectedState: 'selected',
|
||||
trigger: DEFAULT_TRIGGER,
|
||||
includeEdges: true,
|
||||
selectedEdges: [],
|
||||
selectedNodes: []
|
||||
};
|
||||
},
|
||||
getEvents(): { [key in G6Event]?: string } {
|
||||
let trigger;
|
||||
// 检测输入是否合法
|
||||
if (ALLOW_EVENTS.indexOf(this.trigger.toLowerCase()) > -1) {
|
||||
trigger = this.trigger;
|
||||
} else {
|
||||
trigger = DEFAULT_TRIGGER;
|
||||
console.warn('Behavior brush-select的trigger参数不合法,请输入drag、shift、ctrl或alt');
|
||||
}
|
||||
if (trigger === 'drag') {
|
||||
return {
|
||||
mousedown: 'onMouseDown',
|
||||
mousemove: 'onMouseMove',
|
||||
mouseup: 'onMouseUp',
|
||||
'canvas:click': 'clearStates'
|
||||
};
|
||||
}
|
||||
return {
|
||||
mousedown: 'onMouseDown',
|
||||
mousemove: 'onMouseMove',
|
||||
mouseup: 'onMouseUp',
|
||||
'canvas:click': 'clearStates',
|
||||
keyup: 'onKeyUp',
|
||||
keydown: 'onKeyDown'
|
||||
};
|
||||
},
|
||||
onMouseDown(e: IG6GraphEvent) {
|
||||
// 按在node上面拖动时候不应该是框选
|
||||
const { item } = e;
|
||||
if (item) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.trigger !== 'drag' && !this.keydown) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.selectedNodes && this.selectedNodes.length !== 0) {
|
||||
this.clearStates();
|
||||
}
|
||||
|
||||
let brush = this.brush;
|
||||
if (!brush) {
|
||||
brush = this._createBrush();
|
||||
}
|
||||
this.originPoint = { x: e.canvasX, y: e.canvasY };
|
||||
brush.attr({ width: 0, height: 0 });
|
||||
brush.show();
|
||||
this.dragging = true;
|
||||
},
|
||||
onMouseMove(e: IG6GraphEvent) {
|
||||
if (!this.dragging) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.trigger !== 'drag' && !this.keydown) {
|
||||
return;
|
||||
}
|
||||
|
||||
this._updateBrush(e);
|
||||
this.graph.paint();
|
||||
},
|
||||
onMouseUp(e: IG6GraphEvent) {
|
||||
if (!this.brush && !this.dragging) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.trigger !== 'drag' && !this.keydown) {
|
||||
return;
|
||||
}
|
||||
|
||||
const graph = this.graph;
|
||||
const autoPaint = graph.get('autoPaint');
|
||||
graph.setAutoPaint(false);
|
||||
this.brush.destroy();
|
||||
this.brush = null;
|
||||
this._getSelectedNodes(e);
|
||||
this.dragging = false;
|
||||
this.graph.paint();
|
||||
graph.setAutoPaint(autoPaint);
|
||||
},
|
||||
clearStates() {
|
||||
const graph = this.graph;
|
||||
const autoPaint = graph.get('autoPaint');
|
||||
graph.setAutoPaint(false);
|
||||
const selectedState = this.selectedState;
|
||||
|
||||
const nodes = graph.findAllByState('node', selectedState);
|
||||
const edges = graph.findAllByState('edge', selectedState);
|
||||
nodes.forEach(node => graph.setItemState(node, selectedState, false));
|
||||
edges.forEach(edge => graph.setItemState(edge, selectedState, false));
|
||||
|
||||
this.selectedNodes = [];
|
||||
|
||||
this.selectedEdges = [];
|
||||
this.onDeselect && this.onDeselect(this.selectedNodes, this.selectedEdges);
|
||||
graph.emit('nodeselectchange', { targets: {
|
||||
nodes: [],
|
||||
edges: []
|
||||
}, select: false });
|
||||
graph.paint();
|
||||
graph.setAutoPaint(autoPaint);
|
||||
},
|
||||
_getSelectedNodes(e: IG6GraphEvent) {
|
||||
const graph = this.graph;
|
||||
const state = this.selectedState;
|
||||
const originPoint = this.originPoint;
|
||||
const p1 = { x: e.x, y: e.y };
|
||||
const p2 = graph.getPointByCanvas(originPoint.x, originPoint.y);
|
||||
const left = min(p1.x, p2.x);
|
||||
const right = max(p1.x, p2.x);
|
||||
const top = min(p1.y, p2.y);
|
||||
const bottom = max(p1.y, p2.y);
|
||||
const selectedNodes = [];
|
||||
const shouldUpdate = this.shouldUpdate;
|
||||
const selectedIds = [];
|
||||
graph.getNodes().forEach(node => {
|
||||
const bbox = node.getBBox();
|
||||
if (bbox.centerX >= left
|
||||
&& bbox.centerX <= right
|
||||
&& bbox.centerY >= top
|
||||
&& bbox.centerY <= bottom
|
||||
) {
|
||||
if (shouldUpdate(node, 'select')) {
|
||||
selectedNodes.push(node);
|
||||
const model = node.getModel();
|
||||
selectedIds.push(model.id);
|
||||
graph.setItemState(node, state, true);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
const selectedEdges = [];
|
||||
if (this.includeEdges) {
|
||||
// 选中边,边的source和target都在选中的节点中时才选中
|
||||
selectedNodes.forEach(node => {
|
||||
const edges = node.getEdges();
|
||||
edges.forEach(edge => {
|
||||
const model = edge.getModel();
|
||||
const { source, target } = model;
|
||||
if (selectedIds.includes(source)
|
||||
&& selectedIds.includes(target)
|
||||
&& shouldUpdate(edge, 'select')) {
|
||||
selectedEdges.push(edge);
|
||||
graph.setItemState(edge, this.selectedState, true);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
this.selectedEdges = selectedEdges;
|
||||
this.selectedNodes = selectedNodes;
|
||||
this.onSelect && this.onSelect(selectedNodes, selectedEdges);
|
||||
graph.emit('nodeselectchange', { targets: {
|
||||
nodes: selectedNodes,
|
||||
edges: selectedEdges
|
||||
}, select: true });
|
||||
},
|
||||
_createBrush() {
|
||||
const self = this;
|
||||
const brush = self.graph.get('canvas').addShape('rect', {
|
||||
attrs: self.brushStyle,
|
||||
capture: false
|
||||
});
|
||||
this.brush = brush;
|
||||
return brush;
|
||||
},
|
||||
_updateBrush(e: IG6GraphEvent) {
|
||||
const originPoint = this.originPoint;
|
||||
this.brush.attr({
|
||||
width: abs(e.canvasX - originPoint.x),
|
||||
height: abs(e.canvasY - originPoint.y),
|
||||
x: min(e.canvasX, originPoint.x),
|
||||
y: min(e.canvasY, originPoint.y)
|
||||
});
|
||||
},
|
||||
onKeyDown(e: IG6GraphEvent) {
|
||||
const code = e.key;
|
||||
if (!code) {
|
||||
return;
|
||||
}
|
||||
// 按住control键时,允许用户设置trigger为ctrl
|
||||
if (code.toLowerCase() === this.trigger.toLowerCase()
|
||||
|| code.toLowerCase() === 'control') {
|
||||
this.keydown = true;
|
||||
} else {
|
||||
this.keydown = false;
|
||||
}
|
||||
},
|
||||
onKeyUp() {
|
||||
if (this.brush) {
|
||||
// 清除所有选中状态后,设置拖得动状态为false,并清除框选的brush
|
||||
this.brush.destroy();
|
||||
this.brush = null;
|
||||
this.dragging = false;
|
||||
}
|
||||
this.keydown = false;
|
||||
}
|
||||
};
|
85
src/behavior/click-select.ts
Normal file
85
src/behavior/click-select.ts
Normal file
@ -0,0 +1,85 @@
|
||||
import each from '@antv/util/lib/each'
|
||||
import { G6Event, IG6GraphEvent } from "@g6/types";
|
||||
|
||||
const DEFAULT_TRIGGER = 'shift';
|
||||
const ALLOW_EVENTS = [ 'shift', 'ctrl', 'alt' ];
|
||||
|
||||
export default {
|
||||
getDefaultCfg(): object {
|
||||
return {
|
||||
multiple: true,
|
||||
trigger: DEFAULT_TRIGGER
|
||||
};
|
||||
},
|
||||
getEvents(): { [key in G6Event]?: string } {
|
||||
if (!this.multiple) {
|
||||
return {
|
||||
'node:click': 'onClick',
|
||||
'canvas:click': 'onCanvasClick'
|
||||
};
|
||||
}
|
||||
return {
|
||||
'node:click': 'onClick',
|
||||
'canvas:click': 'onCanvasClick',
|
||||
keyup: 'onKeyUp',
|
||||
keydown: 'onKeyDown'
|
||||
};
|
||||
},
|
||||
onClick(e: IG6GraphEvent) {
|
||||
const self = this;
|
||||
const item = e.item;
|
||||
const graph = self.graph;
|
||||
const autoPaint = graph.get('autoPaint');
|
||||
graph.setAutoPaint(false);
|
||||
if (!self.keydown || !self.multiple) {
|
||||
const selected = graph.findAllByState('node', 'selected');
|
||||
each(selected, node => {
|
||||
if (node !== item) {
|
||||
graph.setItemState(node, 'selected', false);
|
||||
}
|
||||
});
|
||||
}
|
||||
if (item.hasState('selected')) {
|
||||
if (self.shouldUpdate.call(self, e)) {
|
||||
graph.setItemState(item, 'selected', false);
|
||||
}
|
||||
graph.emit('nodeselectchange', { target: item, select: false });
|
||||
} else {
|
||||
if (self.shouldUpdate.call(self, e)) {
|
||||
graph.setItemState(item, 'selected', true);
|
||||
}
|
||||
graph.emit('nodeselectchange', { target: item, select: true });
|
||||
}
|
||||
graph.setAutoPaint(autoPaint);
|
||||
graph.paint();
|
||||
},
|
||||
onCanvasClick() {
|
||||
const graph = this.graph;
|
||||
const autoPaint = graph.get('autoPaint');
|
||||
graph.setAutoPaint(false);
|
||||
const selected = graph.findAllByState('node', 'selected');
|
||||
each(selected, node => {
|
||||
graph.setItemState(node, 'selected', false);
|
||||
});
|
||||
|
||||
const selectedEdges = graph.findAllByState('edge', 'selected');
|
||||
each(selectedEdges, edge => graph.setItemState(edge, 'selected', false));
|
||||
|
||||
graph.paint();
|
||||
graph.setAutoPaint(autoPaint);
|
||||
},
|
||||
onKeyDown(e: IG6GraphEvent) {
|
||||
const code = e.key;
|
||||
if (!code) {
|
||||
return;
|
||||
}
|
||||
if (ALLOW_EVENTS.indexOf(code.toLowerCase()) > -1) {
|
||||
this.keydown = true;
|
||||
} else {
|
||||
this.keydown = false;
|
||||
}
|
||||
},
|
||||
onKeyUp() {
|
||||
this.keydown = false;
|
||||
}
|
||||
};
|
54
src/behavior/collapse-expand.ts
Normal file
54
src/behavior/collapse-expand.ts
Normal file
@ -0,0 +1,54 @@
|
||||
import { G6Event, IG6GraphEvent } from "@g6/types";
|
||||
|
||||
const DEFAULT_TRIGGER = 'click';
|
||||
const ALLOW_EVENTS = [ 'click', 'dblclick' ];
|
||||
export default {
|
||||
getDefaultCfg(): object {
|
||||
return {
|
||||
/**
|
||||
* 发生收缩/扩展变化时的回调
|
||||
*/
|
||||
trigger: DEFAULT_TRIGGER,
|
||||
onChange() {}
|
||||
};
|
||||
},
|
||||
getEvents(): { [key in G6Event]?: string } {
|
||||
let trigger;
|
||||
// 检测输入是否合法
|
||||
if (ALLOW_EVENTS.includes(this.trigger)) {
|
||||
trigger = this.trigger;
|
||||
} else {
|
||||
trigger = DEFAULT_TRIGGER;
|
||||
console.warn('Behavior collapse-expand的trigger参数不合法,请输入click或dblclick');
|
||||
}
|
||||
return {
|
||||
[`node:${trigger}`]: 'onNodeClick'
|
||||
};
|
||||
},
|
||||
onNodeClick(e: IG6GraphEvent) {
|
||||
const item = e.item;
|
||||
// 如果节点进行过更新,model 会进行 merge,直接改 model 就不能改布局,所以需要去改源数据
|
||||
const sourceData = this.graph.findDataById(item.get('id'));
|
||||
const children = sourceData.children;
|
||||
// 叶子节点的收缩和展开没有意义
|
||||
if (!children || children.length === 0) {
|
||||
return;
|
||||
}
|
||||
const collapsed = !sourceData.collapsed;
|
||||
if (!this.shouldBegin(e, collapsed)) {
|
||||
return;
|
||||
}
|
||||
sourceData.collapsed = collapsed;
|
||||
item.getModel().collapsed = collapsed;
|
||||
this.graph.emit('itemcollapsed', { item: e.item, collapsed });
|
||||
if (!this.shouldUpdate(e, collapsed)) {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
this.onChange(item, collapsed);
|
||||
} catch (e) {
|
||||
console.warn('G6 自 3.0.4 版本支持直接从 item.getModel() 获取源数据(临时通知,将在3.2.0版本中清除)', e);
|
||||
}
|
||||
this.graph.refreshLayout();
|
||||
}
|
||||
};
|
@ -8,7 +8,7 @@
|
||||
import isString from '@antv/util/lib/is-string'
|
||||
import deepMix from '@antv/util/lib/deep-mix';
|
||||
import Global from '../global'
|
||||
import { G6Event, IG6GraphNodeEvent, NodeConfig } from "@g6/types";
|
||||
import { G6Event, IG6GraphEvent, NodeConfig } from "@g6/types";
|
||||
import { IItem, INode } from '@g6/interface/item';
|
||||
import { Point } from '@antv/g-base/lib/types';
|
||||
|
||||
@ -32,12 +32,12 @@ export default {
|
||||
'canvas:mouseleave': 'onOutOfRange'
|
||||
};
|
||||
},
|
||||
onDragStart(e: IG6GraphNodeEvent) {
|
||||
onDragStart(e: IG6GraphEvent) {
|
||||
if (!this.shouldBegin.call(this, e)) {
|
||||
return;
|
||||
}
|
||||
|
||||
const item: INode = e.item;
|
||||
const item = e.item;
|
||||
const target = e.target;
|
||||
const hasLocked = item.hasLocked();
|
||||
if (hasLocked) {
|
||||
@ -92,7 +92,7 @@ export default {
|
||||
this.point = {};
|
||||
this.originPoint = {};
|
||||
},
|
||||
onDrag(e: IG6GraphNodeEvent) {
|
||||
onDrag(e: IG6GraphEvent) {
|
||||
if (!this.origin) {
|
||||
return;
|
||||
}
|
||||
@ -120,7 +120,7 @@ export default {
|
||||
graph.paint();
|
||||
graph.setAutoPaint(autoPaint);
|
||||
},
|
||||
onDragEnd(e: IG6GraphNodeEvent) {
|
||||
onDragEnd(e: IG6GraphEvent) {
|
||||
if (!this.origin || !this.shouldEnd.call(this, e)) {
|
||||
return;
|
||||
}
|
||||
@ -165,7 +165,7 @@ export default {
|
||||
graph.setAutoPaint(autoPaint);
|
||||
},
|
||||
// 若在拖拽时,鼠标移出画布区域,此时放开鼠标无法终止 drag 行为。在画布外监听 mouseup 事件,放开则终止
|
||||
onOutOfRange(e: IG6GraphNodeEvent) {
|
||||
onOutOfRange(e: IG6GraphEvent) {
|
||||
const self = this;
|
||||
if (this.origin) {
|
||||
const canvasElement = self.graph.get('canvas').get('el');
|
||||
@ -178,7 +178,7 @@ export default {
|
||||
body.addEventListener('keyup', fn, false);
|
||||
}
|
||||
},
|
||||
_update(item: IItem, e: IG6GraphNodeEvent, force: boolean) {
|
||||
_update(item: IItem, e: IG6GraphEvent, force: boolean) {
|
||||
const origin = this.origin;
|
||||
const model: NodeConfig = item.get('model');
|
||||
const nodeId: string = item.get('id');
|
||||
|
18
src/behavior/edge-tooltip.ts
Normal file
18
src/behavior/edge-tooltip.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import base from './tooltip-base';
|
||||
import { G6Event } from "@g6/types";
|
||||
|
||||
export default Object.assign({
|
||||
getDefaultCfg(): object {
|
||||
return {
|
||||
item: 'edge',
|
||||
formatText(model) { return 'source:' + model.source + ' target:' + model.target; }
|
||||
};
|
||||
},
|
||||
getEvents(): { [key in G6Event]?: string } {
|
||||
return {
|
||||
'edge:mouseenter': 'onMouseEnter',
|
||||
'edge:mouseleave': 'onMouseLeave',
|
||||
'edge:mousemove': 'onMouseMove'
|
||||
};
|
||||
}
|
||||
}, base);
|
91
src/behavior/tooltip-base.ts
Normal file
91
src/behavior/tooltip-base.ts
Normal file
@ -0,0 +1,91 @@
|
||||
import modifyCSS from '@antv/dom-util/lib/modify-css';
|
||||
import createDom from '@antv/dom-util/lib/create-dom';
|
||||
import { IG6GraphEvent } from "@g6/types";
|
||||
|
||||
const OFFSET = 12;
|
||||
|
||||
export default {
|
||||
onMouseEnter(e: IG6GraphEvent) {
|
||||
const self = this;
|
||||
if (!self.shouldBegin(e)) {
|
||||
return;
|
||||
}
|
||||
const item = e.item;
|
||||
self.currentTarget = item;
|
||||
self.showTooltip(e);
|
||||
self.graph.emit('tooltipchange', { item: e.item, action: 'show' });
|
||||
},
|
||||
onMouseMove(e: IG6GraphEvent) {
|
||||
if (!this.shouldUpdate(e)) {
|
||||
this.hideTooltip();
|
||||
return;
|
||||
}
|
||||
if (!this.currentTarget || e.item !== this.currentTarget) {
|
||||
return;
|
||||
}
|
||||
this.updatePosition(e);
|
||||
},
|
||||
onMouseLeave(e: IG6GraphEvent) {
|
||||
if (!this.shouldEnd(e)) {
|
||||
return;
|
||||
}
|
||||
this.hideTooltip();
|
||||
this.graph.emit('tooltipchange', { item: this.currentTarget, action: 'hide' });
|
||||
this.currentTarget = null;
|
||||
},
|
||||
showTooltip(e: IG6GraphEvent) {
|
||||
const self = this;
|
||||
if (!e.item) {
|
||||
return;
|
||||
}
|
||||
let container = self.container;
|
||||
if (!container) {
|
||||
container = self._createTooltip(self.graph.get('canvas'));
|
||||
self.container = container;
|
||||
}
|
||||
const text = self.formatText(e.item.get('model'), e);
|
||||
container.innerHTML = text;
|
||||
this.updatePosition(e);
|
||||
modifyCSS(this.container, { visibility: 'visible' });
|
||||
},
|
||||
hideTooltip() {
|
||||
modifyCSS(this.container, {
|
||||
visibility: 'hidden'
|
||||
});
|
||||
},
|
||||
updatePosition(e: IG6GraphEvent) {
|
||||
const width = this.width;
|
||||
const height = this.height;
|
||||
const container = this.container;
|
||||
let x = e.canvasX;
|
||||
let y = e.canvasY;
|
||||
const bbox = container.getBoundingClientRect();
|
||||
if (x > width / 2) {
|
||||
x -= (bbox.width);
|
||||
} else {
|
||||
x += OFFSET;
|
||||
}
|
||||
if (y > height / 2) {
|
||||
y -= (bbox.height);
|
||||
} else {
|
||||
y += OFFSET;
|
||||
}
|
||||
const left = x + 'px';
|
||||
const top = y + 'px';
|
||||
modifyCSS(this.container, { left, top, visibility: 'visible' });
|
||||
},
|
||||
_createTooltip(canvas): HTMLElement {
|
||||
const el = canvas.get('el');
|
||||
el.style.position = 'relative';
|
||||
const container = createDom('<div class="g6-tooltip g6-' + this.item + '-tooltip"></div>');
|
||||
el.parentNode.appendChild(container);
|
||||
modifyCSS(container, {
|
||||
position: 'absolute',
|
||||
visibility: 'visible'
|
||||
});
|
||||
this.width = canvas.get('width');
|
||||
this.height = canvas.get('height');
|
||||
this.container = container;
|
||||
return container;
|
||||
}
|
||||
};
|
18
src/behavior/tooltip.ts
Normal file
18
src/behavior/tooltip.ts
Normal file
@ -0,0 +1,18 @@
|
||||
import { G6Event } from "@g6/types";
|
||||
import base from './tooltip-base';
|
||||
|
||||
export default Object.assign({
|
||||
getDefaultCfg(): object {
|
||||
return {
|
||||
item: 'node',
|
||||
formatText(model) { return model.label; }
|
||||
};
|
||||
},
|
||||
getEvents(): { [key in G6Event]?: string } {
|
||||
return {
|
||||
'node:mouseenter': 'onMouseEnter',
|
||||
'node:mouseleave': 'onMouseLeave',
|
||||
'node:mousemove': 'onMouseMove'
|
||||
};
|
||||
}
|
||||
}, base);
|
43
src/behavior/zoom-canvas.ts
Normal file
43
src/behavior/zoom-canvas.ts
Normal file
@ -0,0 +1,43 @@
|
||||
import { G6Event, IG6GraphEvent } from "@g6/types";
|
||||
|
||||
const DELTA = 0.05;
|
||||
|
||||
export default {
|
||||
getDefaultCfg(): object {
|
||||
return {
|
||||
sensitivity: 2,
|
||||
minZoom: 0.1,
|
||||
maxZoom: 10
|
||||
};
|
||||
},
|
||||
getEvents(): { [key in G6Event]?: string } {
|
||||
return {
|
||||
wheel: 'onWheel'
|
||||
};
|
||||
},
|
||||
onWheel(e: IG6GraphEvent) {
|
||||
e.preventDefault();
|
||||
if (!this.shouldUpdate.call(this, e)) {
|
||||
return;
|
||||
}
|
||||
const graph = this.graph;
|
||||
const canvas = graph.get('canvas');
|
||||
const point = canvas.getPointByClient(e.clientX, e.clientY);
|
||||
const pixelRatio = canvas.get('pixelRatio');
|
||||
const sensitivity = this.get('sensitivity');
|
||||
let ratio = graph.getZoom();
|
||||
// 兼容IE、Firefox及Chrome
|
||||
if (e.wheelDelta < 0) {
|
||||
ratio = 1 - DELTA * sensitivity;
|
||||
} else {
|
||||
ratio = 1 + DELTA * sensitivity;
|
||||
}
|
||||
const zoom = ratio * graph.getZoom();
|
||||
if (zoom > this.get('maxZoom') || zoom < this.get('minZoom')) {
|
||||
return;
|
||||
}
|
||||
graph.zoom(ratio, { x: point.x / pixelRatio, y: point.y / pixelRatio });
|
||||
graph.paint();
|
||||
graph.emit('wheelzoom', e);
|
||||
}
|
||||
};
|
@ -24,7 +24,7 @@ export default class Event implements IEvent {
|
||||
private extendEvents: any[]
|
||||
private canvasHandler: Fun;
|
||||
private dragging: boolean
|
||||
private preItem: IItem
|
||||
private preItem
|
||||
|
||||
constructor(graph: IGraph) {
|
||||
this.graph = graph
|
||||
@ -80,7 +80,7 @@ export default class Event implements IEvent {
|
||||
protected onCanvasEvents(evt: IG6GraphEvent) {
|
||||
const self = this;
|
||||
const graph = self.graph;
|
||||
const canvas: Canvas = graph.get('canvas');
|
||||
const canvas = graph.get('canvas');
|
||||
const pixelRatio: number = canvas.get('pixelRatio');
|
||||
const target = evt.target;
|
||||
const eventType = evt.type;
|
||||
@ -121,7 +121,7 @@ export default class Event implements IEvent {
|
||||
return;
|
||||
}
|
||||
|
||||
const item: IItem = itemShape.get('item');
|
||||
const item = itemShape.get('item');
|
||||
if (item.destroyed) {
|
||||
return;
|
||||
}
|
||||
@ -183,7 +183,7 @@ export default class Event implements IEvent {
|
||||
const item = evt.target === canvas ? null : evt.item;
|
||||
const preItem = this.preItem;
|
||||
|
||||
evt = cloneEvent(evt)
|
||||
evt = cloneEvent(evt) as IG6GraphEvent
|
||||
|
||||
// 从前一个item直接移动到当前item,触发前一个item的leave事件
|
||||
if (preItem && preItem !== item && !preItem.destroyed) {
|
||||
|
@ -7,7 +7,7 @@ import { IItem } from '@g6/interface/item';
|
||||
import { Matrix, Padding } from '@g6/types';
|
||||
import { formatPadding } from '@g6/util/base'
|
||||
import { applyMatrix, invertMatrix } from '@g6/util/math';
|
||||
import isNumber from '_@antv_util@2.0.6@@antv/util/lib/is-number';
|
||||
import isNumber from "@antv/util/lib/is-number";
|
||||
|
||||
export default class View {
|
||||
private graph: IGraph = null
|
||||
|
@ -1,8 +1,11 @@
|
||||
|
||||
import GraphEvent from '@antv/g-base/lib/event/graph-event';
|
||||
import { DefaultBehaviorType, G6Event, IG6GraphEvent } from '@g6/types';
|
||||
import { G6Event, IG6GraphEvent } from '@g6/types';
|
||||
import { IGraph } from './graph';
|
||||
import { IItem } from './item';
|
||||
import { IItem, INode, IEdge } from './item';
|
||||
import Canvas from '@antv/g-canvas/lib/canvas';
|
||||
|
||||
|
||||
|
||||
export interface IBehavior {
|
||||
// constructor: (cfg?: object) => void;
|
||||
@ -17,11 +20,12 @@ export interface IBehavior {
|
||||
}
|
||||
|
||||
export class G6GraphEvent extends GraphEvent implements IG6GraphEvent {
|
||||
public item: IItem
|
||||
public item: IItem & INode & IEdge;
|
||||
public canvasX: number
|
||||
public canvasY: number
|
||||
public wheelDelta: number
|
||||
public detail: number
|
||||
public target: IItem & INode & IEdge & Canvas;
|
||||
constructor(type, event) {
|
||||
super(type, event)
|
||||
this.item = event.item
|
||||
|
@ -196,7 +196,7 @@ export interface IItem {
|
||||
set<T>(key: string, value: T): void;
|
||||
}
|
||||
|
||||
export interface IEdge extends IItem {
|
||||
export interface IEdge {
|
||||
setSource(source: INode): void;
|
||||
setTarget(target: INode): void;
|
||||
getSource(): INode;
|
||||
@ -204,7 +204,7 @@ export interface IEdge extends IItem {
|
||||
|
||||
}
|
||||
|
||||
export interface INode extends IItem {
|
||||
export interface INode {
|
||||
/**
|
||||
* 获取从节点关联的所有边
|
||||
* @return {Array} 边的集合
|
||||
|
@ -1,5 +1,6 @@
|
||||
import { IItem } from '@g6/interface/item'
|
||||
import { G } from '@antv/g/lib'
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
import { ModelConfig, ModelStyle, IPoint, LabelStyle, ShapeStyle } from '@g6/types'
|
||||
import { Point } from '@antv/g-base/lib/types';
|
||||
|
||||
@ -28,19 +29,19 @@ export type ShapeOptions = Partial<{
|
||||
/**
|
||||
* 绘制
|
||||
*/
|
||||
draw(cfg?: ModelConfig, group?: G.Group): G.Shape
|
||||
draw(cfg?: ModelConfig, group?: GGroup): IShape
|
||||
|
||||
drawShape(cfg?: ModelConfig, group?: G.Group): G.Shape
|
||||
drawLabel(cfg: ModelConfig, group: G.Group): G.Shape
|
||||
getLabelStyleByPosition(cfg?: ModelConfig, labelCfg?: ILabelConfig, group?: G.Group): LabelStyle
|
||||
getLabelStyle(cfg: ModelConfig, labelCfg, group: G.Group): LabelStyle
|
||||
drawShape(cfg?: ModelConfig, group?: GGroup): IShape
|
||||
drawLabel(cfg: ModelConfig, group: GGroup): IShape
|
||||
getLabelStyleByPosition(cfg?: ModelConfig, labelCfg?: ILabelConfig, group?: GGroup): LabelStyle
|
||||
getLabelStyle(cfg: ModelConfig, labelCfg, group: GGroup): LabelStyle
|
||||
getShapeStyle(cfg: ModelConfig): ShapeStyle
|
||||
getStateStyle(name: string, value: string | boolean, item: IItem): ShapeStyle
|
||||
|
||||
/**
|
||||
* 绘制完成后的操作,便于用户继承现有的节点、边
|
||||
*/
|
||||
afterDraw(cfg?: ModelConfig, group?: G.Group, rst?: G.Shape)
|
||||
afterDraw(cfg?: ModelConfig, group?: GGroup, rst?: IShape)
|
||||
|
||||
afterUpdate(cfg?: ModelConfig, item?: IItem)
|
||||
|
||||
|
@ -1,7 +1,8 @@
|
||||
import isNil from '@antv/util/lib/is-nil';
|
||||
import isPlainObject from '@antv/util/lib/is-plain-object'
|
||||
import { IEdge, INode } from "@g6/interface/item";
|
||||
import { IEdge, INode, IItem } from "@g6/interface/item";
|
||||
import { EdgeConfig, IPoint, NodeConfig, SourceTarget } from '@g6/types';
|
||||
import Node from './node'
|
||||
import Item from "./item";
|
||||
|
||||
const END_MAP = { source: 'start', target: 'end' };
|
||||
@ -202,8 +203,8 @@ export default class Edge extends Item implements IEdge {
|
||||
}
|
||||
|
||||
public destroy() {
|
||||
const sourceItem: INode = this.get('source' + ITEM_NAME_SUFFIX);
|
||||
const targetItem: INode = this.get('target' + ITEM_NAME_SUFFIX);
|
||||
const sourceItem: Node = this.get('source' + ITEM_NAME_SUFFIX);
|
||||
const targetItem: Node = this.get('target' + ITEM_NAME_SUFFIX);
|
||||
if(sourceItem && !sourceItem.destroyed) {
|
||||
sourceItem.removeEdge(this)
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ import isPlainObject from '@antv/util/lib/is-plain-object'
|
||||
import isString from '@antv/util/lib/is-string'
|
||||
import uniqueId from '@antv/util/lib/unique-id'
|
||||
import { IItem, IItemConfig } from "@g6/interface/item";
|
||||
import { IBBox, IPoint, IShapeBase, ModelConfig, ModelStyle } from '@g6/types';
|
||||
import { IBBox, IPoint, IShapeBase, ModelConfig, ModelStyle, ShapeStyle } from '@g6/types';
|
||||
import { getBBox } from '@g6/util/graphic';
|
||||
import { translate } from '@g6/util/math';
|
||||
|
||||
@ -224,10 +224,10 @@ export default class Item implements IItem {
|
||||
this.afterDraw()
|
||||
}
|
||||
|
||||
public getKeyShapeStyle(): ModelStyle {
|
||||
public getKeyShapeStyle(): ShapeStyle {
|
||||
const keyShape = this.getKeyShape();
|
||||
if (keyShape) {
|
||||
const styles: ModelStyle = {};
|
||||
const styles: ShapeStyle = {};
|
||||
each(keyShape.attr(), (val, key) => {
|
||||
if (RESERVED_STYLES.indexOf(key) < 0) {
|
||||
styles[key] = val;
|
||||
@ -263,11 +263,11 @@ export default class Item implements IItem {
|
||||
/**
|
||||
* get keyshape style
|
||||
*/
|
||||
public getOriginStyle(): ModelStyle {
|
||||
public getOriginStyle(): ShapeStyle {
|
||||
return this.get('originStyle');
|
||||
}
|
||||
|
||||
public getCurrentStatesStyle(): ModelStyle {
|
||||
public getCurrentStatesStyle(): ShapeStyle {
|
||||
const self = this;
|
||||
const originStyle = self.getOriginStyle();
|
||||
each(self.getStates(), state => {
|
||||
|
@ -5,6 +5,7 @@ import { IEdge, INode } from '@g6/interface/item';
|
||||
import { IPoint, IShapeBase, NodeConfig } from '@g6/types';
|
||||
import { distance, getCircleIntersectByPoint, getEllispeIntersectByPoint, getRectIntersectByPoint } from '@g6/util/math';
|
||||
import Item from './item'
|
||||
import Edge from './edge';
|
||||
|
||||
const CACHE_ANCHOR_POINTS = 'anchorPointsCache'
|
||||
const CACHE_BBOX = 'bboxCache'
|
||||
@ -43,9 +44,9 @@ export default class Node extends Item implements INode {
|
||||
/**
|
||||
* 获取所有的入边
|
||||
*/
|
||||
public getInEdges(): IEdge[] {
|
||||
public getInEdges(): Edge[] {
|
||||
const self = this;
|
||||
return this.get('edges').filter((edge: IEdge) => {
|
||||
return this.get('edges').filter((edge: Edge) => {
|
||||
return edge.get('target') === self;
|
||||
});
|
||||
}
|
||||
@ -53,9 +54,9 @@ export default class Node extends Item implements INode {
|
||||
/**
|
||||
* 获取所有的出边
|
||||
*/
|
||||
public getOutEdges(): IEdge[] {
|
||||
public getOutEdges(): Edge[] {
|
||||
const self = this;
|
||||
return this.get('edges').filter((edge: IEdge) => {
|
||||
return this.get('edges').filter((edge: Edge) => {
|
||||
return edge.get('source') === self;
|
||||
});
|
||||
}
|
||||
|
@ -13,7 +13,8 @@ import { getCircleCenterByPoints, distance } from '@g6/util/math'
|
||||
import Global from '../global'
|
||||
import { EdgeConfig, LabelStyle, IPoint, ShapeStyle } from '@g6/types'
|
||||
import { ILabelConfig, ShapeOptions } from '@g6/interface/shape'
|
||||
import { G } from '@antv/g/lib'
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
import { Point } from '@antv/g-base/lib/types';
|
||||
|
||||
const CLS_SHAPE = 'edge-shape';
|
||||
@ -87,7 +88,7 @@ const singleEdge: ShapeOptions = {
|
||||
}, style);
|
||||
return styles;
|
||||
},
|
||||
getLabelStyleByPosition(cfg?: EdgeConfig, labelCfg?: ILabelConfig, group?: G.Group): LabelStyle {
|
||||
getLabelStyleByPosition(cfg?: EdgeConfig, labelCfg?: ILabelConfig, group?: GGroup): LabelStyle {
|
||||
|
||||
|
||||
const labelPosition = labelCfg.position || this.labelPosition; // 文本的位置用户可以传入
|
||||
@ -120,6 +121,7 @@ const singleEdge: ShapeOptions = {
|
||||
style.y = offsetStyle.y;
|
||||
style.rotate = offsetStyle.rotate;
|
||||
style.textAlign = this._getTextAlign(labelPosition, offsetStyle.angle);
|
||||
console.log('get style by position', labelPosition, style);
|
||||
return style;
|
||||
},
|
||||
// 获取文本对齐方式
|
||||
@ -161,7 +163,7 @@ const singleEdge: ShapeOptions = {
|
||||
* @param {G.Group} group 边的容器
|
||||
* @return {G.Shape} 图形
|
||||
*/
|
||||
drawShape(cfg: EdgeConfig, group: G.Group): G.Shape {
|
||||
drawShape(cfg: EdgeConfig, group: GGroup): IShape {
|
||||
const shapeStyle = this.getShapeStyle(cfg);
|
||||
const shape = group.addShape('path', {
|
||||
className: CLS_SHAPE,
|
||||
@ -169,12 +171,13 @@ const singleEdge: ShapeOptions = {
|
||||
});
|
||||
return shape;
|
||||
},
|
||||
drawLabel(cfg: EdgeConfig, group: G.Group): G.Shape {
|
||||
drawLabel(cfg: EdgeConfig, group: GGroup): IShape {
|
||||
const labelCfg = deepMix({}, this.options.labelCfg, cfg.labelCfg);
|
||||
const labelStyle = this.getLabelStyle(cfg, labelCfg, group);
|
||||
const label = group.addShape('text', {
|
||||
attrs: labelStyle
|
||||
});
|
||||
console.log('edge draw label', label);
|
||||
return label;
|
||||
}
|
||||
};
|
||||
|
@ -8,7 +8,8 @@ import { isNil, isArray } from '@antv/util/lib'
|
||||
import Global from '../global'
|
||||
import { ILabelConfig, ShapeOptions } from '@g6/interface/shape'
|
||||
import { NodeConfig, LabelStyle } from '@g6/types'
|
||||
import { G } from '@antv/g/lib'
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
|
||||
|
||||
const singleNode: ShapeOptions = {
|
||||
@ -85,7 +86,7 @@ const singleNode: ShapeOptions = {
|
||||
}
|
||||
return style
|
||||
},
|
||||
drawShape(cfg: NodeConfig, group: G.Group): G.Shape {
|
||||
drawShape(cfg: NodeConfig, group: GGroup): IShape {
|
||||
const shapeType = this.shapeType // || this.type,都已经加了 shapeType
|
||||
const style = this.getShapeStyle(cfg)
|
||||
const shape = group.addShape(shapeType, {
|
||||
|
@ -2,7 +2,8 @@ import Shape from '../shape'
|
||||
import deepMix from '@antv/util/lib/deep-mix';
|
||||
import Global from '../../global'
|
||||
import { NodeConfig } from '@g6/types'
|
||||
import { G } from '@antv/g/lib'
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
import { IItem } from '@g6/interface/item';
|
||||
|
||||
|
||||
@ -59,11 +60,11 @@ Shape.registerNode('circle', {
|
||||
shapeType: 'circle',
|
||||
// 文本位置
|
||||
labelPosition: 'center',
|
||||
drawShape(cfg: NodeConfig, group: G.Group): G.Shape {
|
||||
drawShape(cfg: NodeConfig, group: GGroup): IShape {
|
||||
const { icon: defaultIcon } = this.options;
|
||||
const style = this.getShapeStyle(cfg);
|
||||
const icon = deepMix({}, defaultIcon, cfg.icon);
|
||||
const keyShape = group.addShape('circle', {
|
||||
const keyShape: IShape = group.addShape('circle', {
|
||||
attrs: style
|
||||
});
|
||||
|
||||
@ -90,7 +91,7 @@ Shape.registerNode('circle', {
|
||||
* @param {Object} cfg data数据配置项
|
||||
* @param {Group} group Group实例
|
||||
*/
|
||||
drawLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
drawLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
@ -215,70 +216,68 @@ Shape.registerNode('circle', {
|
||||
|
||||
// this.updateLinkPoints(cfg, group);
|
||||
},
|
||||
|
||||
// TODO: after findByClassName is defined by G
|
||||
/**
|
||||
* 更新linkPoints
|
||||
* @param {Object} cfg 节点数据配置项
|
||||
* @param {Group} group Item所在的group
|
||||
*/
|
||||
updateLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
// updateLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
// const { linkPoints: defaultLinkPoints } = this.options;
|
||||
// const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
const { size: markSize, fill: markFill, stroke: markStroke, lineWidth: borderWidth } = linkPoints;
|
||||
// const { size: markSize, fill: markFill, stroke: markStroke, lineWidth: borderWidth } = linkPoints;
|
||||
|
||||
const size = this.getSize(cfg);
|
||||
const r = size[0] / 2;
|
||||
// const size = this.getSize(cfg);
|
||||
// const r = size[0] / 2;
|
||||
|
||||
const markLeft: G.Shape = group.findByClassName('circle-mark-left');
|
||||
if (markLeft) {
|
||||
markLeft.attr({
|
||||
x: -r,
|
||||
y: 0,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markLeft: ShapeBase = group.findByClassName('circle-mark-left');
|
||||
// if (markLeft) {
|
||||
// markLeft.attr({
|
||||
// x: -r,
|
||||
// y: 0,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markRight: G.Shape = group.findByClassName('circle-mark-right');
|
||||
if (markRight) {
|
||||
markRight.attr({
|
||||
x: r,
|
||||
y: 0,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markRight: ShapeBase = group.findByClassName('circle-mark-right');
|
||||
// if (markRight) {
|
||||
// markRight.attr({
|
||||
// x: r,
|
||||
// y: 0,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markTop: G.Shape = group.findByClassName('circle-mark-top');
|
||||
if (markTop) {
|
||||
markTop.attr({
|
||||
x: 0,
|
||||
y: -r,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markTop: ShapeBase = group.findByClassName('circle-mark-top');
|
||||
// if (markTop) {
|
||||
// markTop.attr({
|
||||
// x: 0,
|
||||
// y: -r,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markBottom: G.Shape = group.findByClassName('circle-mark-bottom');
|
||||
if (markBottom) {
|
||||
markBottom.attr({
|
||||
x: 0,
|
||||
y: r,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
}
|
||||
// const markBottom: ShapeBase = group.findByClassName('circle-mark-bottom');
|
||||
// if (markBottom) {
|
||||
// markBottom.attr({
|
||||
// x: 0,
|
||||
// y: r,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
}, 'single-node');
|
||||
|
||||
|
||||
|
||||
// Shape.registerNode('circle', Circle);
|
||||
|
@ -2,7 +2,8 @@ import Shape from '../shape'
|
||||
import deepMix from '@antv/util/lib/deep-mix';
|
||||
import Global from '../../global'
|
||||
import { NodeConfig, ShapeStyle } from '@g6/types'
|
||||
import { G } from '@antv/g/lib'
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
import { IItem } from '@g6/interface/item';
|
||||
|
||||
|
||||
@ -57,7 +58,7 @@ Shape.registerNode('diamond', {
|
||||
shapeType: 'circle',
|
||||
// 文本位置
|
||||
labelPosition: 'center',
|
||||
drawShape(cfg: NodeConfig, group: G.Group): G.Shape {
|
||||
drawShape(cfg: NodeConfig, group: GGroup): IShape {
|
||||
const { icon: defaultIcon } = this.options;
|
||||
const style = this.getShapeStyle(cfg);
|
||||
const icon = deepMix({}, defaultIcon, cfg.icon);
|
||||
@ -89,7 +90,7 @@ Shape.registerNode('diamond', {
|
||||
* @param {Object} cfg data数据配置项
|
||||
* @param {Group} group Group实例
|
||||
*/
|
||||
drawLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
drawLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
@ -221,67 +222,70 @@ Shape.registerNode('diamond', {
|
||||
|
||||
// this.updateLinkPoints(cfg, group);
|
||||
},
|
||||
|
||||
// TODO: after findByClassName is defined by G
|
||||
|
||||
/**
|
||||
* 更新linkPoints
|
||||
* @param {Object} cfg 节点数据配置项
|
||||
* @param {Group} group Item所在的group
|
||||
*/
|
||||
updateLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
// updateLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
// const { linkPoints: defaultLinkPoints } = this.options;
|
||||
// const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
const { size: markSize, fill: markFill, stroke: markStroke, lineWidth: borderWidth } = linkPoints;
|
||||
// const { size: markSize, fill: markFill, stroke: markStroke, lineWidth: borderWidth } = linkPoints;
|
||||
|
||||
const size = this.getSize(cfg);
|
||||
const width = size[0];
|
||||
const height = size[1];
|
||||
// const size = this.getSize(cfg);
|
||||
// const width = size[0];
|
||||
// const height = size[1];
|
||||
|
||||
const markLeft: G.Shape = group.findByClassName('diamond-mark-left');
|
||||
if (markLeft) {
|
||||
markLeft.attr({
|
||||
x: -width / 2,
|
||||
y: 0,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markLeft: IShape = group.findByClassName('diamond-mark-left');
|
||||
// if (markLeft) {
|
||||
// markLeft.attr({
|
||||
// x: -width / 2,
|
||||
// y: 0,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markRight: G.Shape = group.findByClassName('diamond-mark-right');
|
||||
if (markRight) {
|
||||
markRight.attr({
|
||||
x: width / 2,
|
||||
y: 0,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markRight: IShape = group.findByClassName('diamond-mark-right');
|
||||
// if (markRight) {
|
||||
// markRight.attr({
|
||||
// x: width / 2,
|
||||
// y: 0,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markTop: G.Shape = group.findByClassName('diamond-mark-top');
|
||||
if (markTop) {
|
||||
markTop.attr({
|
||||
x: 0,
|
||||
y: -height / 2,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markTop: IShape = group.findByClassName('diamond-mark-top');
|
||||
// if (markTop) {
|
||||
// markTop.attr({
|
||||
// x: 0,
|
||||
// y: -height / 2,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markBottom: G.Shape = group.findByClassName('diamond-mark-bottom');
|
||||
if (markBottom) {
|
||||
markBottom.attr({
|
||||
x: 0,
|
||||
y: height / 2,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
}
|
||||
// const markBottom: IShape = group.findByClassName('diamond-mark-bottom');
|
||||
// if (markBottom) {
|
||||
// markBottom.attr({
|
||||
// x: 0,
|
||||
// y: height / 2,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
}, 'single-node');
|
||||
|
@ -2,7 +2,8 @@ import Shape from '../shape'
|
||||
import deepMix from '@antv/util/lib/deep-mix';
|
||||
import Global from '../../global'
|
||||
import { NodeConfig } from '@g6/types'
|
||||
import { G } from '@antv/g/lib'
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
import { IItem } from '@g6/interface/item';
|
||||
|
||||
/**
|
||||
@ -60,7 +61,7 @@ Shape.registerNode('ellipse', {
|
||||
shapeType: 'ellipse',
|
||||
// 文本位置
|
||||
labelPosition: 'center',
|
||||
drawShape(cfg: NodeConfig, group: G.Group): G.Shape {
|
||||
drawShape(cfg: NodeConfig, group: GGroup): IShape {
|
||||
const { icon: defaultIcon } = this.options;
|
||||
const style = this.getShapeStyle(cfg);
|
||||
const icon = deepMix({}, defaultIcon, cfg.icon);
|
||||
@ -92,7 +93,7 @@ Shape.registerNode('ellipse', {
|
||||
* @param {Object} cfg data数据配置项
|
||||
* @param {Group} group Group实例
|
||||
*/
|
||||
drawLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
drawLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
@ -224,61 +225,64 @@ Shape.registerNode('ellipse', {
|
||||
|
||||
// this.updateLinkPoints(cfg, group);
|
||||
},
|
||||
|
||||
// TODO: after findByClassName is defined by G
|
||||
|
||||
/**
|
||||
* 更新linkPoints
|
||||
* @param {Object} cfg 节点数据配置项
|
||||
* @param {Group} group Item所在的group
|
||||
*/
|
||||
updateLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
// updateLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
// const { linkPoints: defaultLinkPoints } = this.options;
|
||||
// const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
const { size: markSize, ...markStyles } = linkPoints;
|
||||
// const { size: markSize, ...markStyles } = linkPoints;
|
||||
|
||||
const size = this.getSize(cfg);
|
||||
const rx = size[0] / 2;
|
||||
const ry = size[1] / 2;
|
||||
// const size = this.getSize(cfg);
|
||||
// const rx = size[0] / 2;
|
||||
// const ry = size[1] / 2;
|
||||
|
||||
const markLeft: G.Shape = group.findByClassName('ellipse-mark-left');
|
||||
if (markLeft) {
|
||||
markLeft.attr({
|
||||
...markStyles,
|
||||
x: -rx,
|
||||
y: 0,
|
||||
r: markSize
|
||||
});
|
||||
}
|
||||
// const markLeft: IShape = group.findByClassName('ellipse-mark-left');
|
||||
// if (markLeft) {
|
||||
// markLeft.attr({
|
||||
// ...markStyles,
|
||||
// x: -rx,
|
||||
// y: 0,
|
||||
// r: markSize
|
||||
// });
|
||||
// }
|
||||
|
||||
const markRight: G.Shape = group.findByClassName('ellipse-mark-right');
|
||||
if (markRight) {
|
||||
markRight.attr({
|
||||
...markStyles,
|
||||
x: rx,
|
||||
y: 0,
|
||||
r: markSize
|
||||
});
|
||||
}
|
||||
// const markRight: IShape = group.findByClassName('ellipse-mark-right');
|
||||
// if (markRight) {
|
||||
// markRight.attr({
|
||||
// ...markStyles,
|
||||
// x: rx,
|
||||
// y: 0,
|
||||
// r: markSize
|
||||
// });
|
||||
// }
|
||||
|
||||
const markTop: G.Shape = group.findByClassName('ellipse-mark-top');
|
||||
if (markTop) {
|
||||
markTop.attr({
|
||||
...markStyles,
|
||||
x: 0,
|
||||
y: -ry,
|
||||
r: markSize
|
||||
});
|
||||
}
|
||||
// const markTop: IShape = group.findByClassName('ellipse-mark-top');
|
||||
// if (markTop) {
|
||||
// markTop.attr({
|
||||
// ...markStyles,
|
||||
// x: 0,
|
||||
// y: -ry,
|
||||
// r: markSize
|
||||
// });
|
||||
// }
|
||||
|
||||
const markBottom: G.Shape = group.findByClassName('ellipse-mark-bottom');
|
||||
if (markBottom) {
|
||||
markBottom.attr({
|
||||
...markStyles,
|
||||
x: 0,
|
||||
y: ry,
|
||||
r: markSize
|
||||
});
|
||||
}
|
||||
}
|
||||
// const markBottom: IShape = group.findByClassName('ellipse-mark-bottom');
|
||||
// if (markBottom) {
|
||||
// markBottom.attr({
|
||||
// ...markStyles,
|
||||
// x: 0,
|
||||
// y: ry,
|
||||
// r: markSize
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
}, 'single-node');
|
||||
|
||||
// Shape.registerNode('ellipse', Ellipse);
|
||||
|
@ -1,6 +1,8 @@
|
||||
import Shape from '../shape'
|
||||
import { NodeConfig } from '@g6/types'
|
||||
import { G } from '@antv/g/lib'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
import { Circle, Rect, Ellipse, Polygon, Path } from '@antv/g-canvas/lib/shape'
|
||||
|
||||
/**
|
||||
* 基本的图片,可以添加文本,默认文本在图片的下面
|
||||
@ -47,7 +49,7 @@ Shape.registerNode('image', {
|
||||
},
|
||||
shapeType: 'image',
|
||||
labelPosition: 'bottom',
|
||||
drawShape(cfg: NodeConfig, group: G.Group): G.Shape {
|
||||
drawShape(cfg: NodeConfig, group: GGroup): IShape {
|
||||
const shapeType = this.shapeType; // || this.type,都已经加了 shapeType
|
||||
const style = this.getShapeStyle(cfg);
|
||||
const shape = group.addShape(shapeType, {
|
||||
@ -56,7 +58,7 @@ Shape.registerNode('image', {
|
||||
this.drawClip(cfg, shape);
|
||||
return shape;
|
||||
},
|
||||
drawClip(cfg: NodeConfig, shape: G.Shape) {
|
||||
drawClip(cfg: NodeConfig, shape: IShape) {
|
||||
const clip = Object.assign({}, this.options.clipCfg, cfg.clipCfg);
|
||||
|
||||
if (!clip.show) {
|
||||
@ -67,7 +69,7 @@ Shape.registerNode('image', {
|
||||
let clipShape = null;
|
||||
if (type === 'circle') {
|
||||
const { r } = clip;
|
||||
clipShape = new G.Circle({
|
||||
clipShape = new Circle({
|
||||
attrs: {
|
||||
r,
|
||||
x,
|
||||
@ -77,7 +79,7 @@ Shape.registerNode('image', {
|
||||
});
|
||||
} else if (type === 'rect') {
|
||||
const { width, height } = clip;
|
||||
clipShape = new G.Rect({
|
||||
clipShape = new Rect({
|
||||
attrs: {
|
||||
x,
|
||||
y,
|
||||
@ -88,7 +90,7 @@ Shape.registerNode('image', {
|
||||
});
|
||||
} else if (type === 'ellipse') {
|
||||
const { rx, ry } = clip;
|
||||
clipShape = new G.Ellipse({
|
||||
clipShape = new Ellipse({
|
||||
attrs: {
|
||||
x,
|
||||
y,
|
||||
@ -99,7 +101,7 @@ Shape.registerNode('image', {
|
||||
});
|
||||
} else if (type === 'polygon') {
|
||||
const { points } = clip;
|
||||
clipShape = new G.Polygon({
|
||||
clipShape = new Polygon({
|
||||
attrs: {
|
||||
points,
|
||||
...style
|
||||
@ -107,7 +109,7 @@ Shape.registerNode('image', {
|
||||
});
|
||||
} else if (type === 'path') {
|
||||
const { path } = clip;
|
||||
clipShape = new G.Path({
|
||||
clipShape = new Path({
|
||||
attrs: {
|
||||
path,
|
||||
...style
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Shape from '../shape'
|
||||
import { NodeConfig } from '@g6/types'
|
||||
import { G } from '@antv/g/lib'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
import { IItem } from '@g6/interface/item';
|
||||
import deepMix from '@antv/util/lib/deep-mix';
|
||||
|
||||
@ -86,7 +87,7 @@ Shape.registerNode('modelRect', {
|
||||
anchorPoints: [{ x: 0, y: 0.5 }, { x: 1, y: 0.5 }]
|
||||
},
|
||||
shapeType: 'modelRect',
|
||||
drawShape(cfg: NodeConfig, group: G.Group): G.Shape {
|
||||
drawShape(cfg: NodeConfig, group: GGroup): IShape {
|
||||
const { preRect: defaultPreRect } = this.options;
|
||||
const style = this.getShapeStyle(cfg);
|
||||
const size = this.getSize(cfg);
|
||||
@ -123,7 +124,7 @@ Shape.registerNode('modelRect', {
|
||||
* @param {Object} cfg 数据配置项
|
||||
* @param {Group} group Group实例
|
||||
*/
|
||||
drawLogoIcon(cfg: NodeConfig, group: G.Group) {
|
||||
drawLogoIcon(cfg: NodeConfig, group: GGroup) {
|
||||
const { logoIcon: defaultLogoIcon } = this.options;
|
||||
const logoIcon = deepMix({}, defaultLogoIcon, cfg.logoIcon);
|
||||
const size = this.getSize(cfg);
|
||||
@ -150,7 +151,7 @@ Shape.registerNode('modelRect', {
|
||||
* @param {Object} cfg 数据配置项
|
||||
* @param {Group} group Group实例
|
||||
*/
|
||||
drawStateIcon(cfg: NodeConfig, group: G.Group) {
|
||||
drawStateIcon(cfg: NodeConfig, group: GGroup) {
|
||||
const { stateIcon: defaultStateIcon } = this.options;
|
||||
const stateIcon = deepMix({}, defaultStateIcon, cfg.stateIcon);
|
||||
const size = this.getSize(cfg);
|
||||
@ -177,7 +178,7 @@ Shape.registerNode('modelRect', {
|
||||
* @param {Object} cfg data数据配置项
|
||||
* @param {Group} group Group实例
|
||||
*/
|
||||
drawLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
drawLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
@ -243,7 +244,7 @@ Shape.registerNode('modelRect', {
|
||||
});
|
||||
}
|
||||
},
|
||||
drawLabel(cfg: NodeConfig, group: G.Group): G.Shape {
|
||||
drawLabel(cfg: NodeConfig, group: GGroup): IShape {
|
||||
const { labelCfg: defaultLabelCfg, logoIcon: defaultLogoIcon } = this.options;
|
||||
|
||||
const logoIcon = deepMix({}, defaultLogoIcon, cfg.logoIcon);
|
||||
@ -415,68 +416,71 @@ Shape.registerNode('modelRect', {
|
||||
|
||||
// this.updateLinkPoints(cfg, group);
|
||||
},
|
||||
|
||||
// TODO: after findByClassName is defined by G
|
||||
|
||||
/**
|
||||
* 更新linkPoints
|
||||
* @param {Object} cfg 节点数据配置项
|
||||
* @param {Group} group Item所在的group
|
||||
*/
|
||||
updateLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
// updateLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
// const { linkPoints: defaultLinkPoints } = this.options;
|
||||
// const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
const { size: markSize, fill: markFill, stroke: markStroke, lineWidth: borderWidth } = linkPoints;
|
||||
// const { size: markSize, fill: markFill, stroke: markStroke, lineWidth: borderWidth } = linkPoints;
|
||||
|
||||
const size = this.getSize(cfg);
|
||||
const width = size[0];
|
||||
const height = size[1];
|
||||
// const size = this.getSize(cfg);
|
||||
// const width = size[0];
|
||||
// const height = size[1];
|
||||
|
||||
const markLeft: G.Shape = group.findByClassName('rect-mark-left');
|
||||
if (markLeft) {
|
||||
markLeft.attr({
|
||||
x: -width / 2,
|
||||
y: 0,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markLeft: IShape = group.findByClassName('rect-mark-left');
|
||||
// if (markLeft) {
|
||||
// markLeft.attr({
|
||||
// x: -width / 2,
|
||||
// y: 0,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markRight: G.Shape = group.findByClassName('rect-mark-right');
|
||||
if (markRight) {
|
||||
markRight.attr({
|
||||
x: width / 2,
|
||||
y: 0,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markRight: IShape = group.findByClassName('rect-mark-right');
|
||||
// if (markRight) {
|
||||
// markRight.attr({
|
||||
// x: width / 2,
|
||||
// y: 0,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markTop: G.Shape = group.findByClassName('rect-mark-top');
|
||||
if (markTop) {
|
||||
markTop.attr({
|
||||
x: 0,
|
||||
y: -height / 2,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markTop: IShape = group.findByClassName('rect-mark-top');
|
||||
// if (markTop) {
|
||||
// markTop.attr({
|
||||
// x: 0,
|
||||
// y: -height / 2,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markBottom: G.Shape = group.findByClassName('rect-mark-bottom');
|
||||
if (markBottom) {
|
||||
markBottom.attr({
|
||||
x: 0,
|
||||
y: height / 2,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
}
|
||||
// const markBottom: IShape = group.findByClassName('rect-mark-bottom');
|
||||
// if (markBottom) {
|
||||
// markBottom.attr({
|
||||
// x: 0,
|
||||
// y: height / 2,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
}, 'single-node');
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Shape from '../shape'
|
||||
import { NodeConfig } from '@g6/types'
|
||||
import { G } from '@antv/g/lib'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
import { IItem } from '@g6/interface/item';
|
||||
import deepMix from '@antv/util/lib/deep-mix';
|
||||
import Global from '../../global'
|
||||
@ -50,7 +51,7 @@ Shape.registerNode('rect', {
|
||||
},
|
||||
shapeType: 'rect',
|
||||
labelPosition: 'center',
|
||||
drawShape(cfg: NodeConfig, group: G.Group): G.Shape {
|
||||
drawShape(cfg: NodeConfig, group: GGroup): IShape {
|
||||
const style = this.getShapeStyle(cfg);
|
||||
|
||||
const keyShape = group.addShape('rect', {
|
||||
@ -66,7 +67,7 @@ Shape.registerNode('rect', {
|
||||
* @param {Object} cfg data数据配置项
|
||||
* @param {Group} group Group实例
|
||||
*/
|
||||
drawLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
drawLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
@ -186,68 +187,71 @@ Shape.registerNode('rect', {
|
||||
// }
|
||||
// this.updateLinkPoints(cfg, group);
|
||||
},
|
||||
|
||||
// TODO: after findByClassName is defined by G
|
||||
|
||||
/**
|
||||
* 更新linkPoints
|
||||
* @param {Object} cfg 节点数据配置项
|
||||
* @param {Group} group Item所在的group
|
||||
*/
|
||||
updateLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
// updateLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
// const { linkPoints: defaultLinkPoints } = this.options;
|
||||
// const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
const { size: markSize, fill: markFill, stroke: markStroke, lineWidth: borderWidth } = linkPoints;
|
||||
// const { size: markSize, fill: markFill, stroke: markStroke, lineWidth: borderWidth } = linkPoints;
|
||||
|
||||
const size = this.getSize(cfg);
|
||||
const width = size[0];
|
||||
const height = size[1];
|
||||
// const size = this.getSize(cfg);
|
||||
// const width = size[0];
|
||||
// const height = size[1];
|
||||
|
||||
const markLeft = group.findByClassName('rect-mark-left');
|
||||
if (markLeft) {
|
||||
markLeft.attr({
|
||||
x: -width / 2,
|
||||
y: 0,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markLeft = group.findByClassName('rect-mark-left');
|
||||
// if (markLeft) {
|
||||
// markLeft.attr({
|
||||
// x: -width / 2,
|
||||
// y: 0,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markRight = group.findByClassName('rect-mark-right');
|
||||
if (markRight) {
|
||||
markRight.attr({
|
||||
x: width / 2,
|
||||
y: 0,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markRight = group.findByClassName('rect-mark-right');
|
||||
// if (markRight) {
|
||||
// markRight.attr({
|
||||
// x: width / 2,
|
||||
// y: 0,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markTop = group.findByClassName('rect-mark-top');
|
||||
if (markTop) {
|
||||
markTop.attr({
|
||||
x: 0,
|
||||
y: -height / 2,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
// const markTop = group.findByClassName('rect-mark-top');
|
||||
// if (markTop) {
|
||||
// markTop.attr({
|
||||
// x: 0,
|
||||
// y: -height / 2,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
|
||||
const markBottom = group.findByClassName('rect-mark-bottom');
|
||||
if (markBottom) {
|
||||
markBottom.attr({
|
||||
x: 0,
|
||||
y: height / 2,
|
||||
r: markSize,
|
||||
fill: markFill,
|
||||
stroke: markStroke,
|
||||
lineWidth: borderWidth
|
||||
});
|
||||
}
|
||||
}
|
||||
// const markBottom = group.findByClassName('rect-mark-bottom');
|
||||
// if (markBottom) {
|
||||
// markBottom.attr({
|
||||
// x: 0,
|
||||
// y: height / 2,
|
||||
// r: markSize,
|
||||
// fill: markFill,
|
||||
// stroke: markStroke,
|
||||
// lineWidth: borderWidth
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
}, 'single-node');
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
import Shape from '../shape'
|
||||
import { NodeConfig } from '@g6/types'
|
||||
import { G } from '@antv/g/lib'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
import { IItem } from '@g6/interface/item';
|
||||
import deepMix from '@antv/util/lib/deep-mix';
|
||||
import Global from '../../global'
|
||||
@ -58,7 +59,7 @@ Shape.registerNode('star', {
|
||||
shapeType: 'star',
|
||||
// 文本位置
|
||||
labelPosition: 'center',
|
||||
drawShape(cfg: NodeConfig, group: G.Group): G.Shape {
|
||||
drawShape(cfg: NodeConfig, group: GGroup): IShape {
|
||||
const { icon: defaultIcon } = this.options;
|
||||
const style = this.getShapeStyle(cfg);
|
||||
const icon = deepMix({}, defaultIcon, cfg.icon);
|
||||
@ -90,7 +91,7 @@ Shape.registerNode('star', {
|
||||
* @param {Object} cfg data数据配置项
|
||||
* @param {Group} group Group实例
|
||||
*/
|
||||
drawLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
drawLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
@ -270,87 +271,90 @@ Shape.registerNode('star', {
|
||||
|
||||
// this.updateLinkPoints(cfg, group);
|
||||
},
|
||||
|
||||
// TODO: after findByClassName is defined by G
|
||||
|
||||
/**
|
||||
* 更新linkPoints
|
||||
* @param {Object} cfg 节点数据配置项
|
||||
* @param {Group} group Item所在的group
|
||||
*/
|
||||
updateLinkPoints(cfg: NodeConfig, group: G.Group) {
|
||||
const { linkPoints: defaultLinkPoints } = this.options;
|
||||
const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
// updateLinkPoints(cfg: NodeConfig, group: GGroup) {
|
||||
// const { linkPoints: defaultLinkPoints } = this.options;
|
||||
// const linkPoints = deepMix({}, defaultLinkPoints, cfg.linkPoints);
|
||||
|
||||
const { size: markSize, ...markStyle } = linkPoints;
|
||||
// const { size: markSize, ...markStyle } = linkPoints;
|
||||
|
||||
const size = this.getSize(cfg);
|
||||
const outerR = size[0];
|
||||
// const size = this.getSize(cfg);
|
||||
// const outerR = size[0];
|
||||
|
||||
const markRight = group.findByClassName('star-mark-right');
|
||||
if (markRight) {
|
||||
const x = Math.cos((18 + 72 * 0) / 180 * Math.PI) * outerR;
|
||||
const y = Math.sin((18 + 72 * 0) / 180 * Math.PI) * outerR;
|
||||
// const markRight = group.findByClassName('star-mark-right');
|
||||
// if (markRight) {
|
||||
// const x = Math.cos((18 + 72 * 0) / 180 * Math.PI) * outerR;
|
||||
// const y = Math.sin((18 + 72 * 0) / 180 * Math.PI) * outerR;
|
||||
|
||||
markRight.attr({
|
||||
...markStyle,
|
||||
x,
|
||||
y: -y,
|
||||
r: markSize
|
||||
});
|
||||
}
|
||||
// markRight.attr({
|
||||
// ...markStyle,
|
||||
// x,
|
||||
// y: -y,
|
||||
// r: markSize
|
||||
// });
|
||||
// }
|
||||
|
||||
const markTop = group.findByClassName('star-mark-top');
|
||||
if (markTop) {
|
||||
const x = Math.cos((18 + 72 * 1) / 180 * Math.PI) * outerR;
|
||||
const y = Math.sin((18 + 72 * 1) / 180 * Math.PI) * outerR;
|
||||
// const markTop = group.findByClassName('star-mark-top');
|
||||
// if (markTop) {
|
||||
// const x = Math.cos((18 + 72 * 1) / 180 * Math.PI) * outerR;
|
||||
// const y = Math.sin((18 + 72 * 1) / 180 * Math.PI) * outerR;
|
||||
|
||||
// top circle
|
||||
markTop.attr({
|
||||
...markStyle,
|
||||
x,
|
||||
y: -y,
|
||||
r: markSize
|
||||
});
|
||||
}
|
||||
// // top circle
|
||||
// markTop.attr({
|
||||
// ...markStyle,
|
||||
// x,
|
||||
// y: -y,
|
||||
// r: markSize
|
||||
// });
|
||||
// }
|
||||
|
||||
const markLeft = group.findByClassName('star-mark-left');
|
||||
if (markLeft) {
|
||||
const x = Math.cos((18 + 72 * 2) / 180 * Math.PI) * outerR;
|
||||
const y = Math.sin((18 + 72 * 2) / 180 * Math.PI) * outerR;
|
||||
// const markLeft = group.findByClassName('star-mark-left');
|
||||
// if (markLeft) {
|
||||
// const x = Math.cos((18 + 72 * 2) / 180 * Math.PI) * outerR;
|
||||
// const y = Math.sin((18 + 72 * 2) / 180 * Math.PI) * outerR;
|
||||
|
||||
// left circle
|
||||
markLeft.attr({
|
||||
...markStyle,
|
||||
x,
|
||||
y: -y,
|
||||
r: markSize
|
||||
});
|
||||
}
|
||||
// // left circle
|
||||
// markLeft.attr({
|
||||
// ...markStyle,
|
||||
// x,
|
||||
// y: -y,
|
||||
// r: markSize
|
||||
// });
|
||||
// }
|
||||
|
||||
const markLeftBottom = group.findByClassName('star-mark-left-bottom');
|
||||
if (markLeftBottom) {
|
||||
const x = Math.cos((18 + 72 * 3) / 180 * Math.PI) * outerR;
|
||||
const y = Math.sin((18 + 72 * 3) / 180 * Math.PI) * outerR;
|
||||
// const markLeftBottom = group.findByClassName('star-mark-left-bottom');
|
||||
// if (markLeftBottom) {
|
||||
// const x = Math.cos((18 + 72 * 3) / 180 * Math.PI) * outerR;
|
||||
// const y = Math.sin((18 + 72 * 3) / 180 * Math.PI) * outerR;
|
||||
|
||||
// bottom circle
|
||||
markLeftBottom.attr({
|
||||
...markStyle,
|
||||
x,
|
||||
y: -y,
|
||||
r: markSize
|
||||
});
|
||||
}
|
||||
// // bottom circle
|
||||
// markLeftBottom.attr({
|
||||
// ...markStyle,
|
||||
// x,
|
||||
// y: -y,
|
||||
// r: markSize
|
||||
// });
|
||||
// }
|
||||
|
||||
const markRightBottom = group.findByClassName('star-mark-right-bottom');
|
||||
if (markRightBottom) {
|
||||
const x = Math.cos((18 + 72 * 4) / 180 * Math.PI) * outerR;
|
||||
const y = Math.sin((18 + 72 * 4) / 180 * Math.PI) * outerR;
|
||||
// const markRightBottom = group.findByClassName('star-mark-right-bottom');
|
||||
// if (markRightBottom) {
|
||||
// const x = Math.cos((18 + 72 * 4) / 180 * Math.PI) * outerR;
|
||||
// const y = Math.sin((18 + 72 * 4) / 180 * Math.PI) * outerR;
|
||||
|
||||
// bottom circle
|
||||
markRightBottom.attr({
|
||||
...markStyle,
|
||||
x,
|
||||
y: -y,
|
||||
r: markSize
|
||||
});
|
||||
}
|
||||
}
|
||||
// // bottom circle
|
||||
// markRightBottom.attr({
|
||||
// ...markStyle,
|
||||
// x,
|
||||
// y: -y,
|
||||
// r: markSize
|
||||
// });
|
||||
// }
|
||||
// }
|
||||
}, 'single-node');
|
||||
|
@ -4,8 +4,8 @@
|
||||
*/
|
||||
|
||||
import { upperFirst } from '@antv/util'
|
||||
import { G } from '@antv/g/lib'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
|
||||
import { ShapeOptions } from '@g6/interface/shape'
|
||||
import { IItem } from '@g6/interface/item'
|
||||
@ -52,7 +52,7 @@ const ShapeFactoryBase = {
|
||||
* @param {G.Group} group 图形的分组
|
||||
* @return {G.Shape} 图形对象
|
||||
*/
|
||||
draw(type: string, cfg: ModelConfig, group: GGroup): G.Shape {
|
||||
draw(type: string, cfg: ModelConfig, group: GGroup): IShape {
|
||||
const shape = this.getShape(type)
|
||||
const rst = shape.draw(cfg, group)
|
||||
shape.afterDraw(cfg, group, rst)
|
||||
|
@ -6,7 +6,8 @@ import Global from '../global'
|
||||
import each from '@antv/util/lib/each'
|
||||
import { get, cloneDeep, merge } from 'lodash'
|
||||
import { ShapeOptions } from '@g6/interface/shape'
|
||||
import { G } from '@antv/g/lib'
|
||||
import GGroup from '@antv/g-canvas/lib/group';
|
||||
import { IShape } from '@antv/g-canvas/lib/interfaces'
|
||||
import { ILabelConfig } from '@g6/interface/shape'
|
||||
import { IItem } from '@g6/interface/item'
|
||||
import { ModelConfig, IPoint, LabelStyle, ShapeStyle } from '@g6/types'
|
||||
@ -31,8 +32,8 @@ export const shapeBase: ShapeOptions = {
|
||||
* @param {G.Group} group 节点的容器
|
||||
* @return {G.Shape} 绘制的图形
|
||||
*/
|
||||
draw(cfg: ModelConfig, group: G.Group): G.Shape {
|
||||
const shape: G.Shape = this.drawShape(cfg, group)
|
||||
draw(cfg: ModelConfig, group: GGroup): IShape {
|
||||
const shape: IShape = this.drawShape(cfg, group)
|
||||
shape.set('className', this.itemType + CLS_SHAPE_SUFFIX)
|
||||
if (cfg.label) {
|
||||
const label = this.drawLabel(cfg, group)
|
||||
@ -43,13 +44,13 @@ export const shapeBase: ShapeOptions = {
|
||||
/**
|
||||
* 绘制完成后的操作,便于用户继承现有的节点、边
|
||||
*/
|
||||
afterDraw(cfg?: ModelConfig, group?: G.Group, keyShape?: G.Shape) {
|
||||
afterDraw(cfg?: ModelConfig, group?: GGroup, keyShape?: IShape) {
|
||||
|
||||
},
|
||||
drawShape(cfg?: ModelConfig, group?: G.Group): G.Shape {
|
||||
|
||||
drawShape(cfg?: ModelConfig, group?: GGroup): IShape {
|
||||
return null;
|
||||
},
|
||||
drawLabel(cfg: ModelConfig, group: G.Group): G.Shape {
|
||||
drawLabel(cfg: ModelConfig, group: GGroup): IShape {
|
||||
const { labelCfg: defaultLabelCfg } = this.options
|
||||
|
||||
const labelCfg = merge({}, defaultLabelCfg, cfg.labelCfg)
|
||||
@ -59,7 +60,7 @@ export const shapeBase: ShapeOptions = {
|
||||
})
|
||||
return label
|
||||
},
|
||||
getLabelStyleByPosition(cfg?: ModelConfig, labelCfg?: ILabelConfig, group?: G.Group): LabelStyle {
|
||||
getLabelStyleByPosition(cfg?: ModelConfig, labelCfg?: ILabelConfig, group?: GGroup): LabelStyle {
|
||||
return {};
|
||||
},
|
||||
/**
|
||||
@ -70,7 +71,7 @@ export const shapeBase: ShapeOptions = {
|
||||
* @param {G.Group} group 父容器,label 的定位可能与图形相关
|
||||
* @return {Object} 图形的配置项
|
||||
*/
|
||||
getLabelStyle(cfg: ModelConfig, labelCfg, group: G.Group): LabelStyle {
|
||||
getLabelStyle(cfg: ModelConfig, labelCfg, group: GGroup): LabelStyle {
|
||||
const calculateStyle = this.getLabelStyleByPosition(cfg, labelCfg, group)
|
||||
calculateStyle.text = cfg.label
|
||||
const attrName = this.itemType + 'Label' // 取 nodeLabel,edgeLabel 的配置项
|
||||
@ -140,7 +141,7 @@ export const shapeBase: ShapeOptions = {
|
||||
* @param {G6.Item} item 节点
|
||||
*/
|
||||
setState(name: string, value: boolean, item: IItem) {
|
||||
const shape: G.Shape = item.get('keyShape')
|
||||
const shape: IShape = item.get('keyShape')
|
||||
if (!shape) {
|
||||
return
|
||||
}
|
||||
|
@ -1,5 +1,8 @@
|
||||
import Group from "@antv/g-canvas/lib/group";
|
||||
import Path from "@antv/g/lib/shapes/path";
|
||||
// import ShapeBase from '@antv/g-canvas/lib/shape/base';
|
||||
// import Path from "@antv/g/lib/shapes/path";
|
||||
import Path from "@antv/g-canvas/lib/shape/path";
|
||||
// import { IShape } from '@antv/g-canvas/lib/interfaces';
|
||||
import { vec2 } from "@antv/matrix-util";
|
||||
import each from '@antv/util/lib/each'
|
||||
import Global from '@g6/global'
|
||||
@ -52,7 +55,7 @@ export const getBBox = (element: IShapeBase, group: Group): IBBox => {
|
||||
* @param cfg edge config
|
||||
*/
|
||||
export const getLoopCfgs = (cfg: EdgeConfig): EdgeConfig => {
|
||||
const item: INode = cfg.sourceNode || cfg.targetNode
|
||||
const item = cfg.sourceNode || cfg.targetNode
|
||||
const container: Group = item.get('group')
|
||||
const containerMatrix = container.getMatrix()
|
||||
|
||||
@ -196,6 +199,8 @@ export const getLoopCfgs = (cfg: EdgeConfig): EdgeConfig => {
|
||||
return cfg;
|
||||
}
|
||||
|
||||
// TODO: wait for G
|
||||
|
||||
/**
|
||||
* 根据 label 所在线条的位置百分比,计算 label 坐标
|
||||
* @param {object} pathShape G 的 path 实例,一般是 Edge 实例的 keyShape
|
||||
@ -206,66 +211,67 @@ export const getLoopCfgs = (cfg: EdgeConfig): EdgeConfig => {
|
||||
* @return {object} 文本的 x, y, 文本的旋转角度
|
||||
*/
|
||||
export const getLabelPosition = (pathShape: Path, percent: number, refX: number, refY: number, rotate: boolean): LabelStyle => {
|
||||
const TAN_OFFSET = 0.0001;
|
||||
let vector: number[][] = [];
|
||||
const point: IPoint = pathShape.getPoint(percent);
|
||||
if (point === null) {
|
||||
return {
|
||||
x: 0,
|
||||
y: 0,
|
||||
angle: 0
|
||||
};
|
||||
}
|
||||
// const TAN_OFFSET = 0.0001;
|
||||
// let vector: number[][] = [];
|
||||
// const point: IPoint = pathShape.getPoint(percent);
|
||||
// if (point === null) {
|
||||
// return {
|
||||
// x: 0,
|
||||
// y: 0,
|
||||
// angle: 0
|
||||
// };
|
||||
// }
|
||||
|
||||
// 头尾最可能,放在最前面,使用 g path 上封装的方法
|
||||
if (percent < TAN_OFFSET) {
|
||||
vector = pathShape.getStartTangent().reverse();
|
||||
} else if (percent > (1 - TAN_OFFSET)) {
|
||||
vector = pathShape.getEndTangent();
|
||||
} else {
|
||||
// 否则取指定位置的点,与少量偏移的点,做微分向量
|
||||
const offsetPoint: IPoint = pathShape.getPoint(percent + TAN_OFFSET);
|
||||
vector.push([ point.x, point.y ]);
|
||||
vector.push([ offsetPoint.x, offsetPoint.y ]);
|
||||
}
|
||||
// // 头尾最可能,放在最前面,使用 g path 上封装的方法
|
||||
// if (percent < TAN_OFFSET) {
|
||||
// vector = pathShape.getStartTangent().reverse();
|
||||
// } else if (percent > (1 - TAN_OFFSET)) {
|
||||
// vector = pathShape.getEndTangent();
|
||||
// } else {
|
||||
// // 否则取指定位置的点,与少量偏移的点,做微分向量
|
||||
// const offsetPoint: IPoint = pathShape.getPoint(percent + TAN_OFFSET);
|
||||
// vector.push([ point.x, point.y ]);
|
||||
// vector.push([ offsetPoint.x, offsetPoint.y ]);
|
||||
// }
|
||||
|
||||
let rad: number = Math.atan2(vector[1][1] - vector[0][1], vector[1][0] - vector[0][0]);
|
||||
// let rad: number = Math.atan2(vector[1][1] - vector[0][1], vector[1][0] - vector[0][0]);
|
||||
|
||||
if (rad < 0) {
|
||||
rad += PI * 2;
|
||||
}
|
||||
// if (rad < 0) {
|
||||
// rad += PI * 2;
|
||||
// }
|
||||
|
||||
if (refX) {
|
||||
point.x += cos(rad) * refX;
|
||||
point.y += sin(rad) * refX;
|
||||
}
|
||||
if (refY) {
|
||||
// 默认方向是 x 轴正方向,法线是 求出角度 - 90°
|
||||
let normal = rad - PI / 2;
|
||||
// 若法线角度在 y 轴负方向,切到正方向,保证 refY 相对于 y 轴正方向
|
||||
if (rad > 1 / 2 * PI && rad < 3 * 1 / 2 * PI) {
|
||||
normal -= PI;
|
||||
}
|
||||
point.x += cos(normal) * refY;
|
||||
point.y += sin(normal) * refY;
|
||||
}
|
||||
// if (refX) {
|
||||
// point.x += cos(rad) * refX;
|
||||
// point.y += sin(rad) * refX;
|
||||
// }
|
||||
// if (refY) {
|
||||
// // 默认方向是 x 轴正方向,法线是 求出角度 - 90°
|
||||
// let normal = rad - PI / 2;
|
||||
// // 若法线角度在 y 轴负方向,切到正方向,保证 refY 相对于 y 轴正方向
|
||||
// if (rad > 1 / 2 * PI && rad < 3 * 1 / 2 * PI) {
|
||||
// normal -= PI;
|
||||
// }
|
||||
// point.x += cos(normal) * refY;
|
||||
// point.y += sin(normal) * refY;
|
||||
// }
|
||||
|
||||
const result = {
|
||||
x: point.x,
|
||||
y: point.y,
|
||||
angle: rad
|
||||
};
|
||||
// const result = {
|
||||
// x: point.x,
|
||||
// y: point.y,
|
||||
// angle: rad
|
||||
// };
|
||||
|
||||
if (rotate) {
|
||||
if (rad > 1 / 2 * PI && rad < 3 * 1 / 2 * PI) {
|
||||
rad -= PI;
|
||||
}
|
||||
return {
|
||||
rotate: rad,
|
||||
...result
|
||||
};
|
||||
}
|
||||
return result;
|
||||
// if (rotate) {
|
||||
// if (rad > 1 / 2 * PI && rad < 3 * 1 / 2 * PI) {
|
||||
// rad -= PI;
|
||||
// }
|
||||
// return {
|
||||
// rotate: rad,
|
||||
// ...result
|
||||
// };
|
||||
// }
|
||||
// return result;
|
||||
return {}
|
||||
}
|
||||
|
||||
const traverse = (data: TreeGraphData, fn: (param: TreeGraphData) => boolean) => {
|
||||
|
@ -1,8 +1,8 @@
|
||||
import { Point } from '@antv/g-base/lib/types';
|
||||
import Group from '@antv/g-canvas/lib/group';
|
||||
import { mat3, vec3 } from '@antv/matrix-util'
|
||||
import { transform } from '@antv/matrix-util'
|
||||
import { GraphData, ICircle, IEllipse, IRect, Matrix } from '@g6/types'
|
||||
import { IGroup } from '@antv/g-canvas/lib/interfaces';
|
||||
|
||||
/**
|
||||
* 是否在区间内
|
||||
@ -304,7 +304,7 @@ export const getAdjMatrix = (data: GraphData, directed: boolean): Matrix[] => {
|
||||
* @param group Group 实例
|
||||
* @param point 坐标
|
||||
*/
|
||||
export const translate = (group: Group, point: Point) => {
|
||||
export const translate = (group: IGroup, point: Point) => {
|
||||
const matrix: Matrix = group.getMatrix()
|
||||
transform(matrix, [
|
||||
[ 't', point.x, point.y ]
|
||||
|
@ -1,6 +1,6 @@
|
||||
|
||||
import Shape from '../../../src/shape/shape'
|
||||
import { Canvas } from '@antv/g/lib';
|
||||
import Canvas from '@antv/g-canvas/lib/canvas';
|
||||
import '../../../src/shape/edge'
|
||||
import '../../../src/shape/edges'
|
||||
|
||||
@ -9,7 +9,7 @@ div.id = 'edge-shape';
|
||||
document.body.appendChild(div);
|
||||
|
||||
const canvas = new Canvas({
|
||||
containerId: 'edge-shape',
|
||||
container: 'edge-shape',
|
||||
width: 600,
|
||||
height: 600
|
||||
});
|
||||
@ -28,39 +28,40 @@ describe('shape edge test', () => {
|
||||
});
|
||||
|
||||
describe('line test', () => {
|
||||
const factory = Shape.getFactory('edge');
|
||||
it('line without label', () => {
|
||||
const group = canvas.addGroup();
|
||||
console.log('groupgroup', group);
|
||||
const shape = factory.draw('line', {
|
||||
startPoint: { x: 50, y: 50 },
|
||||
endPoint: { x: 100, y: 100 },
|
||||
color: 'red'
|
||||
}, group);
|
||||
console.log('shapeshape', shape);
|
||||
canvas.draw();
|
||||
const path = shape.attr('path');
|
||||
console.log('pathpath', path);
|
||||
expect(shape.attr('stroke')).toEqual('red');
|
||||
expect(path.length).toEqual(2);
|
||||
expect(path[0]).toEqual([ 'M', 50, 50 ]);
|
||||
expect(group.getCount()).toEqual(1);
|
||||
});
|
||||
// const factory = Shape.getFactory('edge');
|
||||
// it('line without label', () => {
|
||||
// const group = canvas.addGroup();
|
||||
// const shape = factory.draw('line', {
|
||||
// startPoint: { x: 50, y: 50 },
|
||||
// endPoint: { x: 100, y: 100 },
|
||||
// color: 'red'
|
||||
// }, group);
|
||||
// canvas.draw();
|
||||
// const path = shape.attr('path');
|
||||
// expect(shape.attr('stroke')).toEqual('red');
|
||||
// expect(path.length).toEqual(2);
|
||||
// expect(path[0]).toEqual([ 'M', 50, 50 ]);
|
||||
// expect(group.getCount()).toEqual(1);
|
||||
// });
|
||||
|
||||
it('line with label', () => {
|
||||
const group = canvas.addGroup();
|
||||
const shape = factory.draw('line', {
|
||||
startPoint: { x: 150, y: 50 },
|
||||
endPoint: { x: 100, y: 100 },
|
||||
color: 'blue',
|
||||
label: '这是一条线'
|
||||
}, group);
|
||||
// it('line with label', () => {
|
||||
// const group = canvas.addGroup();
|
||||
// const shape = factory.draw('line', {
|
||||
// startPoint: { x: 150, y: 50 },
|
||||
// endPoint: { x: 100, y: 100 },
|
||||
// color: 'blue',
|
||||
// label: '这是一条线'
|
||||
// }, group);
|
||||
|
||||
expect(shape.attr('path').length).toEqual(2);
|
||||
const label = group.get('children')[1];
|
||||
expect(label.attr('x')).toEqual((100 + 150) / 2);
|
||||
expect(label.attr('y')).toEqual((100 + 50) / 2);
|
||||
expect(group.getCount()).toEqual(2);
|
||||
// console.log(shape.attr('path').length);
|
||||
// expect(shape.attr('path').length).toEqual(2);
|
||||
// const label = group.get('children')[1];
|
||||
// console.log(label.attr('x'), label.attr('y'));
|
||||
// console.log(group.getCount());
|
||||
// expect(shape.attr('path').length).toEqual(2);
|
||||
// expect(label.attr('x')).toEqual((100 + 150) / 2);
|
||||
// expect(label.attr('y')).toEqual((100 + 50) / 2);
|
||||
// expect(group.getCount()).toEqual(2);
|
||||
|
||||
// TODO: wait for getByClassName defined by G
|
||||
|
||||
@ -132,443 +133,463 @@ describe('shape edge test', () => {
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
it('quadratic', () => {
|
||||
const group = canvas.addGroup();
|
||||
const shape = factory.draw('quadratic', {
|
||||
startPoint: { x: 200, y: 200 },
|
||||
endPoint: { x: 150, y: 100 },
|
||||
controlPoints: [{ x: 220, y: 160 }],
|
||||
color: 'green',
|
||||
label: '这是一条曲线'
|
||||
}, group);
|
||||
const path = shape.attr('path');
|
||||
expect(path.length).toEqual(2);
|
||||
expect(path[1]).toEqual([ 'Q', 220, 160, 150, 100 ]);
|
||||
|
||||
const group1 = canvas.addGroup();
|
||||
const shape1 = factory.draw('quadratic', {
|
||||
startPoint: { x: 200, y: 200 },
|
||||
endPoint: { x: 100, y: 100 },
|
||||
color: 'red',
|
||||
label: 'xxxx',
|
||||
labelCfg: {
|
||||
autoRotate: true
|
||||
}
|
||||
}, group1);
|
||||
expect(shape1.attr('path').length).toEqual(2);
|
||||
const sqrt2 = Math.sqrt(2);
|
||||
expect(shape1.attr('path')[1]).toEqual([ 'Q', 150 - 20 * sqrt2 / 2, 150 + 20 * sqrt2 / 2, 100, 100 ]);
|
||||
canvas.draw();
|
||||
});
|
||||
|
||||
it('cubic', () => {
|
||||
const group = canvas.addGroup();
|
||||
const shape = factory.draw('cubic', {
|
||||
startPoint: { x: 200, y: 200 },
|
||||
endPoint: { x: 150, y: 100 },
|
||||
controlPoints: [{ x: 220, y: 200 }, { x: 170, y: 100 }],
|
||||
color: 'red'
|
||||
}, group);
|
||||
const path = shape.attr('path');
|
||||
expect(path.length).toEqual(2);
|
||||
expect(path[1]).toEqual([ 'C', 220, 200, 170, 100, 150, 100 ]);
|
||||
|
||||
const shape1 = factory.draw('cubic', {
|
||||
startPoint: { x: 200, y: 200 },
|
||||
endPoint: { x: 150, y: 100 },
|
||||
color: 'blue'
|
||||
}, group);
|
||||
expect(shape1.attr('path').length).toEqual(2);
|
||||
canvas.draw();
|
||||
});
|
||||
|
||||
it('cubic vertical', () => {
|
||||
const group = canvas.addGroup();
|
||||
const shape = factory.draw('cubic-vertical', {
|
||||
startPoint: { x: 0, y: 0 },
|
||||
endPoint: { x: 150, y: 150 },
|
||||
color: 'red'
|
||||
}, group);
|
||||
|
||||
expect(shape.attr('path')[1]).toEqual([ 'C', 0, 75, 150, 75, 150, 150 ]);
|
||||
canvas.draw();
|
||||
});
|
||||
|
||||
it('cubic horizontal', () => {
|
||||
const group = canvas.addGroup();
|
||||
const shape = factory.draw('cubic-horizontal', {
|
||||
startPoint: { x: 0, y: 0 },
|
||||
endPoint: { x: 150, y: 150 },
|
||||
color: 'red'
|
||||
}, group);
|
||||
|
||||
expect(shape.attr('path')[1]).toEqual([ 'C', 75, 0, 75, 150, 150, 150 ]);
|
||||
canvas.draw();
|
||||
});
|
||||
|
||||
it('clear', () => {
|
||||
canvas.clear();
|
||||
});
|
||||
});
|
||||
|
||||
describe('label align', () => {
|
||||
const factory = Shape.getFactory('edge');
|
||||
function getPoint(center, radius, angle) {
|
||||
return {
|
||||
x: center.x + radius * Math.cos(angle),
|
||||
y: center.y + radius * Math.sin(angle)
|
||||
};
|
||||
}
|
||||
it('not auto rotate, middle', () => {
|
||||
const center = { x: 100, y: 100 };
|
||||
for (let i = 0; i < 360; i += 45) {
|
||||
const angle = i / 180 * Math.PI;
|
||||
const startPoint = getPoint(center, 20, angle);
|
||||
const endPoint = getPoint(center, 60, angle);
|
||||
const group = canvas.addGroup();
|
||||
factory.draw('line', {
|
||||
startPoint,
|
||||
endPoint,
|
||||
color: 'red',
|
||||
label: i.toString(),
|
||||
style: {
|
||||
endArrow: true
|
||||
},
|
||||
labelCfg: {
|
||||
style: {
|
||||
stroke: 'white',
|
||||
lineWidth: 5
|
||||
}
|
||||
|
||||
}
|
||||
}, group);
|
||||
const label = group.get('children')[1];
|
||||
console.log('labellabellabellabel', label, label.attr('textAlign'));
|
||||
expect(label.attr('textAlign')).toEqual('center');
|
||||
|
||||
expect(label.attr('stroke')).toEqual('white');
|
||||
}
|
||||
canvas.draw();
|
||||
});
|
||||
|
||||
it('not auto rotate, start', () => {
|
||||
const center = { x: 250, y: 100 };
|
||||
canvas.addShape('circle', {
|
||||
attrs: {
|
||||
x: center.x,
|
||||
y: center.y,
|
||||
r: 40,
|
||||
stroke: 'blue'
|
||||
}
|
||||
});
|
||||
for (let i = 0; i < 360; i += 30) {
|
||||
const angle = i / 180 * Math.PI;
|
||||
const startPoint = getPoint(center, 40, angle);
|
||||
const endPoint = getPoint(center, 80, angle);
|
||||
const group = canvas.addGroup();
|
||||
factory.draw('line', {
|
||||
startPoint,
|
||||
endPoint,
|
||||
color: 'red',
|
||||
label: i.toString(),
|
||||
labelCfg: {
|
||||
position: 'start'
|
||||
},
|
||||
style: {
|
||||
endArrow: true
|
||||
}
|
||||
}, group);
|
||||
const label = group.get('children')[1];
|
||||
if (angle < 1 / 2 * Math.PI) {
|
||||
expect(label.attr('textAlign')).toEqual('start');
|
||||
}
|
||||
if (angle > 1 / 2 * Math.PI && angle < 3 / 2 * Math.PI) {
|
||||
expect(label.attr('textAlign')).toEqual('end');
|
||||
}
|
||||
// expect(label.attr('textAlign')).toEqual('center');
|
||||
}
|
||||
canvas.draw();
|
||||
});
|
||||
|
||||
it('not auto rotate, end', () => {
|
||||
const center = { x: 450, y: 100 };
|
||||
canvas.addShape('circle', {
|
||||
attrs: {
|
||||
x: center.x,
|
||||
y: center.y,
|
||||
r: 40,
|
||||
stroke: 'blue'
|
||||
}
|
||||
});
|
||||
for (let i = 0; i < 360; i += 30) {
|
||||
const angle = i / 180 * Math.PI;
|
||||
const startPoint = getPoint(center, 40, angle);
|
||||
const endPoint = getPoint(center, 80, angle);
|
||||
const group = canvas.addGroup();
|
||||
factory.draw('line', {
|
||||
startPoint,
|
||||
endPoint,
|
||||
color: 'red',
|
||||
label: i.toString(),
|
||||
style: {
|
||||
endArrow: true
|
||||
},
|
||||
labelCfg: {
|
||||
position: 'end'
|
||||
}
|
||||
}, group);
|
||||
const label = group.get('children')[1];
|
||||
if (angle < 1 / 2 * Math.PI) {
|
||||
expect(label.attr('textAlign')).toEqual('end');
|
||||
}
|
||||
if (angle > 1 / 2 * Math.PI && angle < 3 / 2 * Math.PI) {
|
||||
expect(label.attr('textAlign')).toEqual('start');
|
||||
}
|
||||
// expect(label.attr('textAlign')).toEqual('center');
|
||||
}
|
||||
canvas.draw();
|
||||
});
|
||||
|
||||
|
||||
it('auto rotate, middle', () => {
|
||||
const center = { x: 100, y: 300 };
|
||||
for (let i = 0; i < 360; i += 45) {
|
||||
const angle = i / 180 * Math.PI;
|
||||
const startPoint = getPoint(center, 20, angle);
|
||||
const endPoint = getPoint(center, 60, angle);
|
||||
const group = canvas.addGroup();
|
||||
factory.draw('line', {
|
||||
startPoint,
|
||||
endPoint,
|
||||
color: 'red',
|
||||
label: i.toString(),
|
||||
style: {
|
||||
endArrow: true
|
||||
},
|
||||
labelCfg: {
|
||||
autoRotate: true
|
||||
}
|
||||
}, group);
|
||||
const label = group.get('children')[1];
|
||||
expect(label.attr('textAlign')).toEqual('center');
|
||||
}
|
||||
canvas.draw();
|
||||
});
|
||||
|
||||
it('auto rotate, start', () => {
|
||||
const center = { x: 250, y: 300 };
|
||||
canvas.addShape('circle', {
|
||||
attrs: {
|
||||
x: center.x,
|
||||
y: center.y,
|
||||
r: 40,
|
||||
stroke: 'blue'
|
||||
}
|
||||
});
|
||||
for (let i = 0; i < 360; i += 30) {
|
||||
const angle = i / 180 * Math.PI;
|
||||
const startPoint = getPoint(center, 40, angle);
|
||||
const endPoint = getPoint(center, 80, angle);
|
||||
const group = canvas.addGroup();
|
||||
factory.draw('line', {
|
||||
startPoint,
|
||||
endPoint,
|
||||
color: 'red',
|
||||
label: i.toString(),
|
||||
style: {
|
||||
endArrow: true
|
||||
},
|
||||
labelCfg: {
|
||||
position: 'start',
|
||||
autoRotate: true
|
||||
}
|
||||
}, group);
|
||||
const label = group.get('children')[1];
|
||||
if (angle < 1 / 2 * Math.PI) {
|
||||
expect(label.attr('textAlign')).toEqual('start');
|
||||
}
|
||||
if (angle > 1 / 2 * Math.PI && angle < 3 / 2 * Math.PI) {
|
||||
expect(label.attr('textAlign')).toEqual('end');
|
||||
}
|
||||
// expect(label.attr('textAlign')).toEqual('center');
|
||||
}
|
||||
canvas.draw();
|
||||
});
|
||||
|
||||
it('auto rotate, end', () => {
|
||||
const center = { x: 450, y: 300 };
|
||||
canvas.addShape('circle', {
|
||||
attrs: {
|
||||
x: center.x,
|
||||
y: center.y,
|
||||
r: 40,
|
||||
stroke: 'blue'
|
||||
}
|
||||
});
|
||||
for (let i = 0; i < 360; i += 30) {
|
||||
const angle = i / 180 * Math.PI;
|
||||
const startPoint = getPoint(center, 40, angle);
|
||||
const endPoint = getPoint(center, 80, angle);
|
||||
const group = canvas.addGroup();
|
||||
const shape = factory.draw('line', {
|
||||
startPoint,
|
||||
endPoint,
|
||||
color: 'red',
|
||||
label: i.toString(),
|
||||
style: {
|
||||
endArrow: true
|
||||
},
|
||||
labelCfg: {
|
||||
position: 'end',
|
||||
autoRotate: true
|
||||
}
|
||||
}, group);
|
||||
const label = group.get('children')[1];
|
||||
if (angle < 1 / 2 * Math.PI) {
|
||||
expect(label.attr('textAlign')).toEqual('end');
|
||||
}
|
||||
if (angle > 1 / 2 * Math.PI && angle < 3 / 2 * Math.PI) {
|
||||
expect(label.attr('textAlign')).toEqual('start');
|
||||
}
|
||||
const point = shape.getPoint(1);
|
||||
expect(label.attr('x')).toEqual(point.x);
|
||||
expect(label.attr('y')).toEqual(point.y);
|
||||
}
|
||||
canvas.draw();
|
||||
});
|
||||
|
||||
it('curve rotate center', () => {
|
||||
const group = canvas.addGroup();
|
||||
const shape = factory.draw('cubic', {
|
||||
startPoint: { x: 100, y: 400 },
|
||||
endPoint: { x: 200, y: 400 },
|
||||
controlPoints: [{ x: 120, y: 380 }, { x: 160, y: 420 }],
|
||||
color: 'blue',
|
||||
label: 'curve in center',
|
||||
labelCfg: {
|
||||
autoRotate: true
|
||||
}
|
||||
}, group);
|
||||
const path = shape.attr('path');
|
||||
const label = group.get('children')[1];
|
||||
expect(path.length).toEqual(2);
|
||||
const point = shape.getPoint(0.5);
|
||||
expect(point.x).toEqual(label.attr('x'));
|
||||
expect(point.y).toEqual(label.attr('y'));
|
||||
// it('quadratic', () => {
|
||||
// const group = canvas.addGroup();
|
||||
// const shape = factory.draw('quadratic', {
|
||||
// startPoint: { x: 200, y: 200 },
|
||||
// endPoint: { x: 150, y: 100 },
|
||||
// controlPoints: [{ x: 220, y: 160 }],
|
||||
// color: 'green',
|
||||
// label: '这是一条曲线'
|
||||
// }, group);
|
||||
// const path = shape.attr('path');
|
||||
// expect(path.length).toEqual(2);
|
||||
// expect(path[1]).toEqual([ 'Q', 220, 160, 150, 100 ]);
|
||||
|
||||
canvas.draw();
|
||||
});
|
||||
// const group1 = canvas.addGroup();
|
||||
// const shape1 = factory.draw('quadratic', {
|
||||
// startPoint: { x: 200, y: 200 },
|
||||
// endPoint: { x: 100, y: 100 },
|
||||
// color: 'red',
|
||||
// label: 'xxxx',
|
||||
// labelCfg: {
|
||||
// autoRotate: true
|
||||
// }
|
||||
// }, group1);
|
||||
// expect(shape1.attr('path').length).toEqual(2);
|
||||
// const sqrt2 = Math.sqrt(2);
|
||||
// expect(shape1.attr('path')[1]).toEqual([ 'Q', 150 - 20 * sqrt2 / 2, 150 + 20 * sqrt2 / 2, 100, 100 ]);
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
it('curve rotate start', () => {
|
||||
const group = canvas.addGroup();
|
||||
const shape = factory.draw('cubic', {
|
||||
startPoint: { x: 220, y: 400 },
|
||||
endPoint: { x: 320, y: 400 },
|
||||
controlPoints: [{ x: 230, y: 380 }, { x: 280, y: 420 }],
|
||||
color: 'blue',
|
||||
label: 'start',
|
||||
labelCfg: {
|
||||
position: 'start',
|
||||
autoRotate: true
|
||||
}
|
||||
}, group);
|
||||
const path = shape.attr('path');
|
||||
const label = group.get('children')[1];
|
||||
expect(path.length).toEqual(2);
|
||||
const point = shape.getPoint(0);
|
||||
expect(point.x).toEqual(label.attr('x'));
|
||||
expect(point.y).toEqual(label.attr('y'));
|
||||
expect(label.attr('rotate')).not.toEqual(0);
|
||||
canvas.draw();
|
||||
});
|
||||
// it('cubic', () => {
|
||||
// const group = canvas.addGroup();
|
||||
// const shape = factory.draw('cubic', {
|
||||
// startPoint: { x: 200, y: 200 },
|
||||
// endPoint: { x: 150, y: 100 },
|
||||
// controlPoints: [{ x: 220, y: 200 }, { x: 170, y: 100 }],
|
||||
// color: 'red'
|
||||
// }, group);
|
||||
// const path = shape.attr('path');
|
||||
// expect(path.length).toEqual(2);
|
||||
// expect(path[1]).toEqual([ 'C', 220, 200, 170, 100, 150, 100 ]);
|
||||
|
||||
it('text on line, text refX and refY', () => {
|
||||
const center = { x: 250, y: 500 };
|
||||
canvas.addShape('circle', {
|
||||
attrs: {
|
||||
x: center.x,
|
||||
y: center.y,
|
||||
r: 40,
|
||||
stroke: 'blue'
|
||||
}
|
||||
});
|
||||
for (let i = 0; i < 360; i += 30) {
|
||||
const angle = i / 180 * Math.PI;
|
||||
const startPoint = getPoint(center, 40, angle);
|
||||
const endPoint = getPoint(center, 80, angle);
|
||||
const group = canvas.addGroup();
|
||||
factory.draw('line', {
|
||||
startPoint,
|
||||
endPoint,
|
||||
color: 'red',
|
||||
label: i.toString(),
|
||||
style: {
|
||||
endArrow: true
|
||||
},
|
||||
labelCfg: {
|
||||
position: 'start',
|
||||
autoRotate: true,
|
||||
refX: 4,
|
||||
refY: 5
|
||||
}
|
||||
}, group);
|
||||
const label = group.get('children')[1];
|
||||
if (angle < 1 / 2 * Math.PI) {
|
||||
expect(label.attr('textAlign')).toEqual('start');
|
||||
}
|
||||
if (angle > 1 / 2 * Math.PI && angle < 3 / 2 * Math.PI) {
|
||||
expect(label.attr('textAlign')).toEqual('end');
|
||||
}
|
||||
// expect(label.attr('textAlign')).toEqual('center');
|
||||
}
|
||||
canvas.draw();
|
||||
});
|
||||
// const shape1 = factory.draw('cubic', {
|
||||
// startPoint: { x: 200, y: 200 },
|
||||
// endPoint: { x: 150, y: 100 },
|
||||
// color: 'blue'
|
||||
// }, group);
|
||||
// expect(shape1.attr('path').length).toEqual(2);
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
function distance(p1, p2) {
|
||||
return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
|
||||
}
|
||||
function equal(x1, x2) {
|
||||
return Math.abs(x1 - x2) < 0.0001;
|
||||
}
|
||||
// it('cubic vertical', () => {
|
||||
// const group = canvas.addGroup();
|
||||
// const shape = factory.draw('cubic-vertical', {
|
||||
// startPoint: { x: 0, y: 0 },
|
||||
// endPoint: { x: 150, y: 150 },
|
||||
// color: 'red'
|
||||
// }, group);
|
||||
|
||||
it('text on curve, text refX and refY', () => {
|
||||
const group = canvas.addGroup();
|
||||
const shape = factory.draw('spline', {
|
||||
startPoint: { x: 220, y: 400 },
|
||||
endPoint: { x: 320, y: 400 },
|
||||
controlPoints: [{ x: 230, y: 380 }, { x: 280, y: 420 }],
|
||||
color: 'pink',
|
||||
label: 'center',
|
||||
labelCfg: {
|
||||
position: 'center',
|
||||
autoRotate: true,
|
||||
refX: 3,
|
||||
refY: 4
|
||||
}
|
||||
}, group);
|
||||
const point = shape.getPoint(0.5);
|
||||
const label = group.get('children')[1];
|
||||
// 3*3 + 4*4 = 5*5
|
||||
expect(equal(distance(point, { x: label.attr('x'), y: label.attr('y') }), 5)).toEqual(true);
|
||||
canvas.draw();
|
||||
});
|
||||
// expect(shape.attr('path')[1]).toEqual([ 'C', 0, 75, 150, 75, 150, 150 ]);
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
it('text offset only one dim', () => {
|
||||
const group = canvas.addGroup();
|
||||
const shape = factory.draw('line', {
|
||||
startPoint: { x: 220, y: 400 },
|
||||
endPoint: { x: 320, y: 400 },
|
||||
color: 'pink',
|
||||
label: 'center',
|
||||
labelCfg: {
|
||||
position: 'center',
|
||||
autoRotate: true,
|
||||
refX: 5
|
||||
}
|
||||
}, group);
|
||||
const point = shape.getPoint(0.5);
|
||||
const label = group.get('children')[1];
|
||||
expect(equal(distance(point, { x: label.attr('x'), y: label.attr('y') }), 5)).toEqual(true);
|
||||
});
|
||||
});
|
||||
// it('cubic horizontal', () => {
|
||||
// const group = canvas.addGroup();
|
||||
// const shape = factory.draw('cubic-horizontal', {
|
||||
// startPoint: { x: 0, y: 0 },
|
||||
// endPoint: { x: 150, y: 150 },
|
||||
// color: 'red'
|
||||
// }, group);
|
||||
|
||||
// expect(shape.attr('path')[1]).toEqual([ 'C', 75, 0, 75, 150, 150, 150 ]);
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
// it('clear', () => {
|
||||
// canvas.clear();
|
||||
// });
|
||||
// });
|
||||
|
||||
// describe('label align', () => {
|
||||
// const factory = Shape.getFactory('edge');
|
||||
// function getPoint(center, radius, angle) {
|
||||
// return {
|
||||
// x: center.x + radius * Math.cos(angle),
|
||||
// y: center.y + radius * Math.sin(angle)
|
||||
// };
|
||||
// }
|
||||
// it('not auto rotate, middle', () => {
|
||||
// const center = { x: 100, y: 100 };
|
||||
// for (let i = 0; i < 360; i += 45) {
|
||||
// const angle = i / 180 * Math.PI;
|
||||
// const startPoint = getPoint(center, 20, angle);
|
||||
// const endPoint = getPoint(center, 60, angle);
|
||||
// const group = canvas.addGroup();
|
||||
// factory.draw('line', {
|
||||
// startPoint,
|
||||
// endPoint,
|
||||
// color: 'red',
|
||||
// label: i.toString(),
|
||||
// style: {
|
||||
// endArrow: true
|
||||
// },
|
||||
// labelCfg: {
|
||||
// style: {
|
||||
// stroke: 'white',
|
||||
// lineWidth: 5
|
||||
// }
|
||||
|
||||
// }
|
||||
// }, group);
|
||||
// const label = group.get('children')[1];
|
||||
// console.log('labellabellabellabel', label, label.attr('textAlign'));
|
||||
// expect(label.attr('textAlign')).toEqual('center');
|
||||
|
||||
// expect(label.attr('stroke')).toEqual('white');
|
||||
// }
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
// it('not auto rotate, start', () => {
|
||||
// const center = { x: 250, y: 100 };
|
||||
// canvas.addShape('circle', {
|
||||
// attrs: {
|
||||
// x: center.x,
|
||||
// y: center.y,
|
||||
// r: 40,
|
||||
// stroke: 'blue'
|
||||
// }
|
||||
// });
|
||||
// for (let i = 0; i < 360; i += 30) {
|
||||
// const angle = i / 180 * Math.PI;
|
||||
// const startPoint = getPoint(center, 40, angle);
|
||||
// const endPoint = getPoint(center, 80, angle);
|
||||
// const group = canvas.addGroup();
|
||||
// factory.draw('line', {
|
||||
// startPoint,
|
||||
// endPoint,
|
||||
// color: 'red',
|
||||
// label: i.toString(),
|
||||
// labelCfg: {
|
||||
// position: 'start'
|
||||
// },
|
||||
// style: {
|
||||
// endArrow: true
|
||||
// }
|
||||
// }, group);
|
||||
// const label = group.get('children')[1];
|
||||
// if (angle < 1 / 2 * Math.PI) {
|
||||
// expect(label.attr('textAlign')).toEqual('start');
|
||||
// }
|
||||
// if (angle > 1 / 2 * Math.PI && angle < 3 / 2 * Math.PI) {
|
||||
// expect(label.attr('textAlign')).toEqual('end');
|
||||
// }
|
||||
// // expect(label.attr('textAlign')).toEqual('center');
|
||||
// }
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
// it('not auto rotate, end', () => {
|
||||
// const center = { x: 450, y: 100 };
|
||||
// canvas.addShape('circle', {
|
||||
// attrs: {
|
||||
// x: center.x,
|
||||
// y: center.y,
|
||||
// r: 40,
|
||||
// stroke: 'blue'
|
||||
// }
|
||||
// });
|
||||
// for (let i = 0; i < 360; i += 30) {
|
||||
// const angle = i / 180 * Math.PI;
|
||||
// const startPoint = getPoint(center, 40, angle);
|
||||
// const endPoint = getPoint(center, 80, angle);
|
||||
// const group = canvas.addGroup();
|
||||
// factory.draw('line', {
|
||||
// startPoint,
|
||||
// endPoint,
|
||||
// color: 'red',
|
||||
// label: i.toString(),
|
||||
// style: {
|
||||
// endArrow: true
|
||||
// },
|
||||
// labelCfg: {
|
||||
// position: 'end'
|
||||
// }
|
||||
// }, group);
|
||||
// const label = group.get('children')[1];
|
||||
// if (angle < 1 / 2 * Math.PI) {
|
||||
// expect(label.attr('textAlign')).toEqual('end');
|
||||
// }
|
||||
// if (angle > 1 / 2 * Math.PI && angle < 3 / 2 * Math.PI) {
|
||||
// expect(label.attr('textAlign')).toEqual('start');
|
||||
// }
|
||||
// // expect(label.attr('textAlign')).toEqual('center');
|
||||
// }
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
|
||||
// it('auto rotate, middle', () => {
|
||||
// const center = { x: 100, y: 300 };
|
||||
// for (let i = 0; i < 360; i += 45) {
|
||||
// const angle = i / 180 * Math.PI;
|
||||
// const startPoint = getPoint(center, 20, angle);
|
||||
// const endPoint = getPoint(center, 60, angle);
|
||||
// const group = canvas.addGroup();
|
||||
// factory.draw('line', {
|
||||
// startPoint,
|
||||
// endPoint,
|
||||
// color: 'red',
|
||||
// label: i.toString(),
|
||||
// style: {
|
||||
// endArrow: true
|
||||
// },
|
||||
// labelCfg: {
|
||||
// autoRotate: true
|
||||
// }
|
||||
// }, group);
|
||||
// const label = group.get('children')[1];
|
||||
// expect(label.attr('textAlign')).toEqual('center');
|
||||
// }
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
// it('auto rotate, start', () => {
|
||||
// const center = { x: 250, y: 300 };
|
||||
// canvas.addShape('circle', {
|
||||
// attrs: {
|
||||
// x: center.x,
|
||||
// y: center.y,
|
||||
// r: 40,
|
||||
// stroke: 'blue'
|
||||
// }
|
||||
// });
|
||||
// for (let i = 0; i < 360; i += 30) {
|
||||
// const angle = i / 180 * Math.PI;
|
||||
// const startPoint = getPoint(center, 40, angle);
|
||||
// const endPoint = getPoint(center, 80, angle);
|
||||
// const group = canvas.addGroup();
|
||||
// factory.draw('line', {
|
||||
// startPoint,
|
||||
// endPoint,
|
||||
// color: 'red',
|
||||
// label: i.toString(),
|
||||
// style: {
|
||||
// endArrow: true
|
||||
// },
|
||||
// labelCfg: {
|
||||
// position: 'start',
|
||||
// autoRotate: true
|
||||
// }
|
||||
// }, group);
|
||||
// const label = group.get('children')[1];
|
||||
// if (angle < 1 / 2 * Math.PI) {
|
||||
// expect(label.attr('textAlign')).toEqual('start');
|
||||
// }
|
||||
// if (angle > 1 / 2 * Math.PI && angle < 3 / 2 * Math.PI) {
|
||||
// expect(label.attr('textAlign')).toEqual('end');
|
||||
// }
|
||||
// // expect(label.attr('textAlign')).toEqual('center');
|
||||
// }
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
// it('auto rotate, end', () => {
|
||||
// const center = { x: 450, y: 300 };
|
||||
// canvas.addShape('circle', {
|
||||
// attrs: {
|
||||
// x: center.x,
|
||||
// y: center.y,
|
||||
// r: 40,
|
||||
// stroke: 'blue'
|
||||
// }
|
||||
// });
|
||||
// for (let i = 0; i < 360; i += 30) {
|
||||
// const angle = i / 180 * Math.PI;
|
||||
// const startPoint = getPoint(center, 40, angle);
|
||||
// const endPoint = getPoint(center, 80, angle);
|
||||
// const group = canvas.addGroup();
|
||||
// const shape = factory.draw('line', {
|
||||
// startPoint,
|
||||
// endPoint,
|
||||
// color: 'red',
|
||||
// label: i.toString(),
|
||||
// style: {
|
||||
// endArrow: true
|
||||
// },
|
||||
// labelCfg: {
|
||||
// position: 'end',
|
||||
// autoRotate: true
|
||||
// }
|
||||
// }, group);
|
||||
// const label = group.get('children')[1];
|
||||
// if (angle < 1 / 2 * Math.PI) {
|
||||
// expect(label.attr('textAlign')).toEqual('end');
|
||||
// }
|
||||
// if (angle > 1 / 2 * Math.PI && angle < 3 / 2 * Math.PI) {
|
||||
// expect(label.attr('textAlign')).toEqual('start');
|
||||
// }
|
||||
|
||||
// // TODO: wait for G
|
||||
|
||||
// // const point = shape.getPoint(1);
|
||||
// // expect(label.attr('x')).toEqual(point.x);
|
||||
// // expect(label.attr('y')).toEqual(point.y);
|
||||
// }
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
// it('curve rotate center', () => {
|
||||
// const group = canvas.addGroup();
|
||||
// const shape = factory.draw('cubic', {
|
||||
// startPoint: { x: 100, y: 400 },
|
||||
// endPoint: { x: 200, y: 400 },
|
||||
// controlPoints: [{ x: 120, y: 380 }, { x: 160, y: 420 }],
|
||||
// color: 'blue',
|
||||
// label: 'curve in center',
|
||||
// labelCfg: {
|
||||
// autoRotate: true
|
||||
// }
|
||||
// }, group);
|
||||
// const path = shape.attr('path');
|
||||
// const label = group.get('children')[1];
|
||||
// expect(path.length).toEqual(2);
|
||||
|
||||
// // TODO: wait for G
|
||||
|
||||
// // const point = shape.getPoint(0.5);
|
||||
// // expect(point.x).toEqual(label.attr('x'));
|
||||
// // expect(point.y).toEqual(label.attr('y'));
|
||||
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
// it('curve rotate start', () => {
|
||||
// const group = canvas.addGroup();
|
||||
// const shape = factory.draw('cubic', {
|
||||
// startPoint: { x: 220, y: 400 },
|
||||
// endPoint: { x: 320, y: 400 },
|
||||
// controlPoints: [{ x: 230, y: 380 }, { x: 280, y: 420 }],
|
||||
// color: 'blue',
|
||||
// label: 'start',
|
||||
// labelCfg: {
|
||||
// position: 'start',
|
||||
// autoRotate: true
|
||||
// }
|
||||
// }, group);
|
||||
// const path = shape.attr('path');
|
||||
// const label = group.get('children')[1];
|
||||
// expect(path.length).toEqual(2);
|
||||
|
||||
// // TODO: wait for G
|
||||
|
||||
// // const point = shape.getPoint(0);
|
||||
// // expect(point.x).toEqual(label.attr('x'));
|
||||
// // expect(point.y).toEqual(label.attr('y'));
|
||||
// // expect(label.attr('rotate')).not.toEqual(0);
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
// it('text on line, text refX and refY', () => {
|
||||
// const center = { x: 250, y: 500 };
|
||||
// canvas.addShape('circle', {
|
||||
// attrs: {
|
||||
// x: center.x,
|
||||
// y: center.y,
|
||||
// r: 40,
|
||||
// stroke: 'blue'
|
||||
// }
|
||||
// });
|
||||
// for (let i = 0; i < 360; i += 30) {
|
||||
// const angle = i / 180 * Math.PI;
|
||||
// const startPoint = getPoint(center, 40, angle);
|
||||
// const endPoint = getPoint(center, 80, angle);
|
||||
// const group = canvas.addGroup();
|
||||
// factory.draw('line', {
|
||||
// startPoint,
|
||||
// endPoint,
|
||||
// color: 'red',
|
||||
// label: i.toString(),
|
||||
// style: {
|
||||
// endArrow: true
|
||||
// },
|
||||
// labelCfg: {
|
||||
// position: 'start',
|
||||
// autoRotate: true,
|
||||
// refX: 4,
|
||||
// refY: 5
|
||||
// }
|
||||
// }, group);
|
||||
// const label = group.get('children')[1];
|
||||
// if (angle < 1 / 2 * Math.PI) {
|
||||
// expect(label.attr('textAlign')).toEqual('start');
|
||||
// }
|
||||
// if (angle > 1 / 2 * Math.PI && angle < 3 / 2 * Math.PI) {
|
||||
// expect(label.attr('textAlign')).toEqual('end');
|
||||
// }
|
||||
// // expect(label.attr('textAlign')).toEqual('center');
|
||||
// }
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
// function distance(p1, p2) {
|
||||
// return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
|
||||
// }
|
||||
// function equal(x1, x2) {
|
||||
// return Math.abs(x1 - x2) < 0.0001;
|
||||
// }
|
||||
|
||||
// it('text on curve, text refX and refY', () => {
|
||||
// const group = canvas.addGroup();
|
||||
// const shape = factory.draw('spline', {
|
||||
// startPoint: { x: 220, y: 400 },
|
||||
// endPoint: { x: 320, y: 400 },
|
||||
// controlPoints: [{ x: 230, y: 380 }, { x: 280, y: 420 }],
|
||||
// color: 'pink',
|
||||
// label: 'center',
|
||||
// labelCfg: {
|
||||
// position: 'center',
|
||||
// autoRotate: true,
|
||||
// refX: 3,
|
||||
// refY: 4
|
||||
// }
|
||||
// }, group);
|
||||
|
||||
// // TODO: wait for G
|
||||
|
||||
// // const point = shape.getPoint(0.5);
|
||||
// // const label = group.get('children')[1];
|
||||
// // // 3*3 + 4*4 = 5*5
|
||||
// // expect(equal(distance(point, { x: label.attr('x'), y: label.attr('y') }), 5)).toEqual(true);
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
// it('text offset only one dim', () => {
|
||||
// const group = canvas.addGroup();
|
||||
// const shape = factory.draw('line', {
|
||||
// startPoint: { x: 220, y: 400 },
|
||||
// endPoint: { x: 320, y: 400 },
|
||||
// color: 'pink',
|
||||
// label: 'center',
|
||||
// labelCfg: {
|
||||
// position: 'center',
|
||||
// autoRotate: true,
|
||||
// refX: 5
|
||||
// }
|
||||
// }, group);
|
||||
|
||||
// // TODO: wait for G
|
||||
|
||||
// // const point = shape.getPoint(0.5);
|
||||
// // const label = group.get('children')[1];
|
||||
// // expect(equal(distance(point, { x: label.attr('x'), y: label.attr('y') }), 5)).toEqual(true);
|
||||
// });
|
||||
// });
|
||||
});
|
||||
|
@ -5,7 +5,8 @@
|
||||
|
||||
import Shape from '../../../src/shape/shape'
|
||||
import Global from '../../../src/global';
|
||||
import { Canvas } from '@antv/g/lib';
|
||||
import Canvas from '@antv/g-canvas/lib/canvas';
|
||||
import { translate } from '../../../src/util/math'
|
||||
import '../../../src/shape/node'
|
||||
import '../../../src/shape/nodes'
|
||||
|
||||
@ -14,7 +15,7 @@ div.id = 'node-shape';
|
||||
document.body.appendChild(div);
|
||||
|
||||
const canvas = new Canvas({
|
||||
containerId: 'node-shape',
|
||||
container: 'node-shape',
|
||||
width: 500,
|
||||
height: 500
|
||||
});
|
||||
@ -36,7 +37,7 @@ describe('shape node test', () => {
|
||||
const factory = Shape.getFactory('node');
|
||||
it('circle no label', () => {
|
||||
const group = canvas.addGroup();
|
||||
group.translate(50, 50);
|
||||
translate(group, { x: 50, y: 50 })
|
||||
const shape = factory.draw('circle', {
|
||||
size: 40,
|
||||
color: 'red'
|
||||
@ -48,7 +49,7 @@ describe('shape node test', () => {
|
||||
|
||||
it('circle with label', () => {
|
||||
const group = canvas.addGroup();
|
||||
group.translate(50, 100);
|
||||
translate(group, { x: 50, y: 100 })
|
||||
factory.draw('circle', {
|
||||
size: 20,
|
||||
color: 'blue',
|
||||
@ -60,7 +61,7 @@ describe('shape node test', () => {
|
||||
|
||||
it('ellipse', () => {
|
||||
const group = canvas.addGroup();
|
||||
group.translate(100, 50);
|
||||
translate(group, { x: 100, y: 50 })
|
||||
const shape = factory.draw('ellipse', {
|
||||
size: [ 40, 20 ],
|
||||
color: 'yellow',
|
||||
@ -76,7 +77,7 @@ describe('shape node test', () => {
|
||||
const group = canvas.addGroup({
|
||||
id: 'rect'
|
||||
});
|
||||
group.translate(100, 100);
|
||||
translate(group, { x: 100, y: 100 })
|
||||
const shape = factory.draw('rect', {
|
||||
size: [ 40, 20 ],
|
||||
color: 'yellow',
|
||||
@ -100,7 +101,7 @@ describe('shape node test', () => {
|
||||
|
||||
it('image', () => {
|
||||
const group = canvas.addGroup();
|
||||
group.translate(150, 100);
|
||||
translate(group, { x: 150, y: 100 })
|
||||
const shape = factory.draw('image', {
|
||||
size: [ 40, 20 ],
|
||||
label: 'my custom image',
|
||||
@ -159,51 +160,54 @@ describe('shape node test', () => {
|
||||
// canvas.draw();
|
||||
// });
|
||||
|
||||
xit('active', () => {
|
||||
const rectGroup = canvas.findById('rect');
|
||||
const shape = rectGroup.get('children')[0];
|
||||
// 伪造 item, 仅测试接口和图形的变化,不测试一致性
|
||||
const item = {
|
||||
getContainer() {
|
||||
return rectGroup;
|
||||
},
|
||||
get() {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
|
||||
expect(shape.attr('fillOpacity')).toBe(1);
|
||||
factory.setState('rect', 'active', true, item);
|
||||
expect(shape.attr('fillOpacity')).toBe(Global.nodeStateStyle.active.fillOpacity);
|
||||
expect(shape.attr('fillOpacity')).not.toBe(1);
|
||||
factory.setState('rect', 'active', false, item);
|
||||
expect(shape.attr('fillOpacity')).toBe(1);
|
||||
});
|
||||
// TODO: wait for g findById
|
||||
|
||||
// xit('active', () => {
|
||||
// const rectGroup = canvas.findById('rect');
|
||||
// const shape = rectGroup.get('children')[0];
|
||||
// // 伪造 item, 仅测试接口和图形的变化,不测试一致性
|
||||
// const item = {
|
||||
// getContainer() {
|
||||
// return rectGroup;
|
||||
// },
|
||||
// get() {
|
||||
// return '';
|
||||
// }
|
||||
// };
|
||||
|
||||
xit('selected', () => {
|
||||
const rectGroup = canvas.findById('rect');
|
||||
const shape = rectGroup.get('children')[0];
|
||||
// 伪造 item, 仅测试接口和图形的变化,不测试一致性
|
||||
const item = {
|
||||
getContainer() {
|
||||
return rectGroup;
|
||||
},
|
||||
get() {
|
||||
return '';
|
||||
}
|
||||
};
|
||||
expect(shape.attr('lineWidth')).toBe(1);
|
||||
factory.setState('rect', 'selected', true, item);
|
||||
// expect(shape.attr('fillOpacity')).toBe(1);
|
||||
// factory.setState('rect', 'active', true, item);
|
||||
// expect(shape.attr('fillOpacity')).toBe(Global.nodeStateStyle.active.fillOpacity);
|
||||
// expect(shape.attr('fillOpacity')).not.toBe(1);
|
||||
// factory.setState('rect', 'active', false, item);
|
||||
// expect(shape.attr('fillOpacity')).toBe(1);
|
||||
// });
|
||||
|
||||
expect(shape.attr('lineWidth')).toBe(Global.nodeStateStyle.selected.lineWidth);
|
||||
factory.setState('rect', 'selected', false, item);
|
||||
expect(shape.attr('lineWidth')).toBe(1);
|
||||
// xit('selected', () => {
|
||||
// const rectGroup = canvas.findById('rect');
|
||||
// const shape = rectGroup.get('children')[0];
|
||||
// // 伪造 item, 仅测试接口和图形的变化,不测试一致性
|
||||
// const item = {
|
||||
// getContainer() {
|
||||
// return rectGroup;
|
||||
// },
|
||||
// get() {
|
||||
// return '';
|
||||
// }
|
||||
// };
|
||||
// expect(shape.attr('lineWidth')).toBe(1);
|
||||
// factory.setState('rect', 'selected', true, item);
|
||||
|
||||
});
|
||||
// expect(shape.attr('lineWidth')).toBe(Global.nodeStateStyle.selected.lineWidth);
|
||||
// factory.setState('rect', 'selected', false, item);
|
||||
// expect(shape.attr('lineWidth')).toBe(1);
|
||||
|
||||
// });
|
||||
|
||||
it('label position', () => {
|
||||
const group = canvas.addGroup();
|
||||
group.translate(200, 200);
|
||||
translate(group, { x: 200, y: 200 });
|
||||
factory.draw('ellipse', {
|
||||
size: [ 60, 20 ],
|
||||
color: 'green',
|
||||
|
@ -2,8 +2,9 @@ import GraphEvent from '@antv/g-base/lib/event/graph-event';
|
||||
import { BBox } from '@antv/g-base/lib/types';
|
||||
import ShapeBase from '@antv/g-canvas/lib/shape/base';
|
||||
import { IGraph } from '../src/interface/graph';
|
||||
import { IItem, INode } from '../src/interface/item'
|
||||
import { G } from '@antv/g/lib'
|
||||
import { INode, IEdge, IItem } from '../src/interface/item'
|
||||
import Canvas from '@antv/g-canvas/lib/canvas';
|
||||
import Node from '@g6/item/node'
|
||||
|
||||
|
||||
|
||||
@ -184,8 +185,8 @@ export interface EdgeConfig extends ModelConfig {
|
||||
target: string;
|
||||
label?: string;
|
||||
labelCfg?: object;
|
||||
sourceNode?: INode;
|
||||
targetNode?: INode;
|
||||
sourceNode?: Node;
|
||||
targetNode?: Node;
|
||||
startPoint?: IPoint;
|
||||
endPoint?: IPoint;
|
||||
controlPoints?: IPoint[];
|
||||
@ -239,22 +240,32 @@ export enum G6Event {
|
||||
DRAGENTER = 'dragenter',
|
||||
DRAGLEAVE = 'dragleave',
|
||||
DDROP = 'drop',
|
||||
KEYUP = 'keyup',
|
||||
KEYDOWN = 'keydown',
|
||||
WHEEL = 'wheel',
|
||||
|
||||
NODE_CLICK = 'node:click',
|
||||
EDGE_CLICK = 'edge:click',
|
||||
NODE_CONTEXTMENU = 'node:contextmenu',
|
||||
EDGE_CONTEXTMENU = 'edge:contextmenu',
|
||||
NODE_DBLCLICK = 'node:dblclick',
|
||||
EDGE_DBLCLICK = 'edge:dblclick',
|
||||
NODE_DRAGSTART = 'node:dragstart',
|
||||
NODE_DRAG = 'node:drag',
|
||||
NODE_DRAGEND = 'node:dragend',
|
||||
NODE_MOUSEENTER = 'node:mouseenter',
|
||||
NODE_MOUSELEAVE = 'node:mouseleave',
|
||||
NODE_MOUSEMOVE = 'node:mousemove',
|
||||
|
||||
EDGE_CLICK = 'edge:click',
|
||||
EDGE_CONTEXTMENU = 'edge:contextmenu',
|
||||
EDGE_DBLCLICK = 'edge:dblclick',
|
||||
EDGE_MOUSEENTER = 'edge:mouseenter',
|
||||
EDGE_MOUSELEAVE = 'edge:mouseleave',
|
||||
EDGE_MOUSEMOVE = 'edge:mousemove',
|
||||
|
||||
CANVAS_MOUSEDOWN = 'canvas:mousedown',
|
||||
CANVAS_MOUSEMOVE = 'canvas:mousemove',
|
||||
CANVAS_MOUSEUP = 'canvas:mouseup',
|
||||
CANVAS_CLICK = 'canvas:click',
|
||||
CANVAS_MOSUELEAVE = 'canvas:mouseleave',
|
||||
KEYUP = 'keyup',
|
||||
KEYDOWN = 'keydown'
|
||||
}
|
||||
|
||||
type GetEvents = 'getEvents';
|
||||
@ -282,15 +293,13 @@ export type BehaviorOpation<U> = {
|
||||
export type IEvent = Record<G6Event, string>
|
||||
|
||||
export interface IG6GraphEvent extends GraphEvent {
|
||||
item: IItem;
|
||||
item: IItem & INode & IEdge;
|
||||
canvasX: number;
|
||||
canvasY: number;
|
||||
wheelDelta: number;
|
||||
detail: number;
|
||||
target: G.Shape;
|
||||
}
|
||||
export interface IG6GraphNodeEvent extends IG6GraphEvent {
|
||||
item: INode;
|
||||
key?: string;
|
||||
target: IItem & INode & IEdge & Canvas;
|
||||
}
|
||||
|
||||
export interface IBehavior {
|
||||
|
Loading…
Reference in New Issue
Block a user