fix:修复释放节点的bug

This commit is contained in:
黎智洲
2021-05-26 21:50:16 +08:00
parent 2a9a108d1c
commit ad9333bd3b
13 changed files with 158 additions and 110 deletions
+7 -2
View File
@@ -102,8 +102,13 @@ import { Container } from "./container";
dragStartY = null;
g6Instance.on('node:dragstart', ev => {
const model = ev.item.getModel(),
dragNode = this.engine.optionsTable[model.SVLayouter].behavior.dragNode;
const model = ev.item.getModel();
if(model.SVModelType === 'pointer') {
return;
}
const dragNode = this.engine.optionsTable[model.SVLayouter].behavior.dragNode;
if(dragNode === false) {
return;
+19 -6
View File
@@ -1,5 +1,6 @@
import { Bound, BoundingRect } from '../Common/boundingRect';
import { Group } from '../Common/group';
import { Vector } from '../Common/vector';
import { Engine } from '../engine';
import { LayoutGroupTable } from '../Model/modelConstructor';
import { Element, Model, Pointer } from '../Model/modelData';
@@ -41,12 +42,24 @@ export class Layouter {
anchor = options.anchor || 0;
let target = item.target,
targetBound: BoundingRect = item.target.getBound(),
anchorPosition = item.target.G6Item.getAnchorPoints()[anchor];
targetBound: BoundingRect = target.getBound(),
anchorPosition = item.target.G6Item.getAnchorPoints()[anchor],
center: [number, number] = [targetBound.x + targetBound.width / 2, targetBound.y + targetBound.height / 2],
pointerPosition: [number, number];
anchorPosition = [anchorPosition.x, anchorPosition.y];
let anchorVector = Vector.subtract(anchorPosition, center),
angle = anchorVector[0] === 0? 0: (Math.PI / 2 - Math.atan(anchorVector[1] / anchorVector[0])),
len = Vector.length(anchorVector) + offset;
anchorVector = Vector.normalize(anchorVector);
pointerPosition = Vector.location(center, anchorVector, len);
item.set({
x: targetBound.x + targetBound.width / 2,
y: targetBound.y - offset
x: pointerPosition[0],
y: pointerPosition[1],
rotation: angle
});
});
}
@@ -56,7 +69,7 @@ export class Layouter {
* @param container
* @param models
*/
private fitCenter(container: Container, group: Group) {
private fitCenter(container: Container, group: Group) {
let width = container.getG6Instance().getWidth(),
height = container.getG6Instance().getHeight(),
viewBound: BoundingRect = group.getBound(),
@@ -151,7 +164,7 @@ export class Layouter {
* @param container
* @param layoutGroupTable
*/
public layoutAll(container: Container, layoutGroupTable: LayoutGroupTable) {
public layoutAll(container: Container, layoutGroupTable: LayoutGroupTable) {
layoutGroupTable.forEach(item => {
item.modelList.forEach(model => {
model.G6Item = model.shadowG6Item;
+17 -11
View File
@@ -72,24 +72,30 @@ export class ViewManager {
*/
private getFreedConstructList(layoutGroupTable: LayoutGroupTable): Model[] {
let freedList: Model[] = [],
freedGroup = null,
freedGroupName = null;
freedGroup: LayoutGroup = null,
freedGroupName: string = null,
removeModels: Model[] = [];
for(let group in layoutGroupTable) {
let freedElements: Model[] = layoutGroupTable[group].element.filter(item => item.freed);
layoutGroupTable.forEach((group, key) => {
let freedElements: Model[] = group.element.filter(item => item.freed);
if(freedElements.length) {
freedGroupName = group;
break;
freedGroupName = key;
freedList = freedElements;
}
}
});
freedGroup = layoutGroupTable[freedGroupName];
freedGroup = layoutGroupTable.get(freedGroupName);
freedList.forEach(fItem => {
freedGroup.element.splice(freedGroup.element.findIndex(item => item.id === fItem.id), 1);
freedGroup.link.splice(freedGroup.link.findIndex(item => item.element.id === fItem.id || item.target.id === fItem.id));
freedGroup.pointer.splice(freedGroup.pointer.findIndex(item => item.target.id === fItem.id));
removeModels.push(...freedGroup.element.splice(freedGroup.element.findIndex(item => item.id === fItem.id), 1));
removeModels.push(...freedGroup.link.splice(freedGroup.link.findIndex(item => item.element.id === fItem.id || item.target.id === fItem.id)));
removeModels.push(...freedGroup.pointer.splice(freedGroup.pointer.findIndex(item => item.target.id === fItem.id)));
});
removeModels.map(model => {
const index = freedGroup.modelList.findIndex(item => item.id === model.id);
freedGroup.modelList.splice(index, 1);
});
return freedList;