Skip to content

Commit 9801f09

Browse files
authored
Merge pull request #342 from makimenko/editor
Atft fixes
2 parents b89b4fb + edd1fd1 commit 9801f09

34 files changed

+32891
-170
lines changed

package-lock.json

Lines changed: 32393 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
"three": "^0.124.0",
3333
"three.meshline": "^1.3.0",
3434
"uuid": "^8.3.2",
35+
"yaml": "^1.10.0",
3536
"zone.js": "~0.11.3"
3637
},
3738
"devDependencies": {

projects/atft/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "atft",
3-
"version": "1.3.4",
3+
"version": "1.4.0",
44
"description": "Ready-to-use Angular components for Three.js, see https://makimenko.github.io/angular-template-for-threejs/.",
55
"keywords": [
66
"threejs",
@@ -33,9 +33,9 @@
3333
}
3434
],
3535
"peerDependencies": {
36-
"@angular/common": "^11.0.3",
37-
"@angular/core": "^11.0.3",
38-
"three": "^0.123.0"
36+
"@angular/common": "^11.1.2",
37+
"@angular/core": "^11.1.2",
38+
"three": "^0.124.0"
3939
},
4040
"dependencies": {
4141
"tslib": "^2.0.0"

projects/atft/src/lib/actor/data-center/atft-data-center-actor.module.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import {ServerCompactActorComponent} from './server/server-compact-actor.compone
88
import {ServerIconActorComponent} from './server/server-icon-actor.component';
99
import {WorkstationActorComponent} from './server/workstation-actor.component';
1010
import {GridActorComponent} from './layer/grid-actor.component';
11-
import {DagreCompositionComponent, DagreEdgeComponent, DagreLayoutComponent, DagreNodeComponent} from './layout';
11+
import {DagreCompositionComponent, DagreEdgeComponent, DagreLayoutComponent, DagreNodeComponent, DagreYamlParserComponent} from './layout';
1212

1313
@NgModule({
1414
imports: [
@@ -26,7 +26,8 @@ import {DagreCompositionComponent, DagreEdgeComponent, DagreLayoutComponent, Dag
2626
DagreLayoutComponent,
2727
DagreEdgeComponent,
2828
DagreCompositionComponent,
29-
DagreNodeComponent
29+
DagreNodeComponent,
30+
DagreYamlParserComponent
3031
],
3132
exports: [
3233
LayerActorComponent,
@@ -39,7 +40,8 @@ import {DagreCompositionComponent, DagreEdgeComponent, DagreLayoutComponent, Dag
3940
DagreLayoutComponent,
4041
DagreEdgeComponent,
4142
DagreCompositionComponent,
42-
DagreNodeComponent
43+
DagreNodeComponent,
44+
DagreYamlParserComponent
4345
]
4446
})
4547
export class AtftDataCenterActorModule {

projects/atft/src/lib/actor/data-center/layer/grid-actor.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {Component, EventEmitter, Input, Output, ViewChild} from '@angular/core';
22
import {EmptyComponent} from '../../../object/helper';
33
import {provideParent} from '../../../util';
4-
import {GridMeshComponent} from '../../../object';
4+
import { AbstractEmptyDirective, GridMeshComponent } from '../../../object';
55
import * as THREE from 'three';
66
import {RaycasterEmitEvent} from '../../../raycaster';
77

@@ -19,7 +19,7 @@ import {RaycasterEmitEvent} from '../../../raycaster';
1919
></atft-grid-mesh>
2020
`
2121
})
22-
export class GridActorComponent extends EmptyComponent {
22+
export class GridActorComponent extends AbstractEmptyDirective {
2323

2424
@ViewChild('grid', {static: true}) grid: GridMeshComponent;
2525

projects/atft/src/lib/actor/data-center/layer/layer-actor.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Component, EventEmitter, Input, Output } from '@angular/core';
2+
import { AbstractEmptyDirective } from '../../../object';
23
import { EmptyComponent } from '../../../object/helper';
34
import { provideParent } from '../../../util';
45

@@ -15,7 +16,7 @@ import { provideParent } from '../../../util';
1516
</atft-plane-mesh>
1617
`
1718
})
18-
export class LayerActorComponent extends EmptyComponent {
19+
export class LayerActorComponent extends AbstractEmptyDirective {
1920
@Input() label: string;
2021

2122
@Input()

projects/atft/src/lib/actor/data-center/layout/dagre-composition.component.ts

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import {Component, EventEmitter, Injector, Input, OnDestroy, OnInit, Optional, Output, SkipSelf} from '@angular/core';
2-
import {provideParent} from '../../../util';
3-
import {AbstractObject3D, EmptyComponent} from '../../../object';
2+
import * as dagre from 'dagre';
3+
import {AbstractEmptyDirective, AbstractObject3D} from '../../../object';
44
import {RendererService} from '../../../renderer';
5+
import {provideParent} from '../../../util';
56
import {DagreLayoutComponent} from './dagre-layout.component';
7+
import {Subscription} from 'rxjs';
68

79
@Component({
810
selector: 'atft-dagre-composition',
@@ -16,7 +18,7 @@ import {DagreLayoutComponent} from './dagre-layout.component';
1618
</atft-plane-mesh>
1719
`
1820
})
19-
export class DagreCompositionComponent extends EmptyComponent implements OnInit, OnDestroy {
21+
export class DagreCompositionComponent extends AbstractEmptyDirective implements OnInit, OnDestroy {
2022

2123
@Input() label: string;
2224

@@ -39,6 +41,7 @@ export class DagreCompositionComponent extends EmptyComponent implements OnInit,
3941
public color = 0xA0A0A0;
4042
public translateLabelY: number;
4143
protected dagreLayout: DagreLayoutComponent;
44+
protected graphUpdated: Subscription;
4245

4346
constructor(
4447
protected rendererService: RendererService,
@@ -51,6 +54,9 @@ export class DagreCompositionComponent extends EmptyComponent implements OnInit,
5154
if (!this.dagreLayout) {
5255
console.warn('DagreCompositionComponent.constructor: atft-dagre-layout not found!');
5356
}
57+
58+
this.syncGraph = this.syncGraph.bind(this);
59+
this.graphUpdated = this.dagreLayout.updated.subscribe(this.syncGraph);
5460
}
5561

5662
public onSelected() {
@@ -65,12 +71,11 @@ export class DagreCompositionComponent extends EmptyComponent implements OnInit,
6571
this.color = 0xA0A0A0;
6672
}
6773

68-
ngOnInit() {
74+
public ngOnInit() {
6975
super.ngOnInit();
7076
this.addNode();
7177
}
7278

73-
7479
protected addNode() {
7580
if (this.dagreLayout && this.dagreLayout.getGraphModel()) {
7681
// console.log('DagreCompositionComponent.addNode', this.name);
@@ -99,6 +104,9 @@ export class DagreCompositionComponent extends EmptyComponent implements OnInit,
99104
if (this.dagreLayout && this.dagreLayout.getGraphModel()) {
100105
// console.log('DagreCompositionComponent.removeNode', this.name);
101106

107+
// Unsubscribe from graph update events
108+
this.graphUpdated?.unsubscribe();
109+
102110
// Remove from layout
103111
this.dagreLayout.removeChildByName(this.name);
104112

@@ -110,4 +118,28 @@ export class DagreCompositionComponent extends EmptyComponent implements OnInit,
110118
}
111119
}
112120

121+
protected syncGraphNodes(g: dagre.graphlib.Graph) {
122+
// console.log('DagreCompositionComponent.syncGraphNodes');
123+
g.nodes().forEach((name) => {
124+
// console.log('Node ' + name + ': ' + JSON.stringify(g.node(name)));
125+
if (name === this.name) {
126+
const node = g.node(name);
127+
128+
// console.log('DagreCompositionComponent.layout: Update position node', node);
129+
this.translateX = node.x;
130+
this.translateY = node.y;
131+
this.applyTranslation();
132+
133+
this.width = node.width;
134+
this.height = node.height;
135+
}
136+
});
137+
}
138+
139+
protected syncGraph() {
140+
// console.log('DagreCompositionComponent.update');
141+
this.syncGraphNodes(this.dagreLayout.getGraph());
142+
}
143+
144+
113145
}

projects/atft/src/lib/actor/data-center/layout/dagre-edge.component.ts

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import {Component, Injector, Input, OnDestroy, OnInit, Optional, SkipSelf} from '@angular/core';
2-
import {AbstractObject3D, MeshLineConnectorComponent} from '../../../object';
3-
import {provideParent} from '../../../util';
2+
import * as dagre from 'dagre';
43
import * as THREE from 'three';
4+
import {AnimationService} from '../../../animation';
5+
import {AbstractObject3D, MeshLineConnectorComponent} from '../../../object';
56
import {RendererService} from '../../../renderer';
7+
import {provideParent} from '../../../util';
68
import {DagreLayoutComponent} from './dagre-layout.component';
7-
import {AnimationService} from '../../../animation';
9+
import {Subscription} from 'rxjs';
810

911
@Component({
1012
selector: 'atft-dagre-edge',
@@ -19,6 +21,7 @@ export class DagreEdgeComponent extends MeshLineConnectorComponent implements On
1921

2022
public positions: Array<number>;
2123
protected dagreLayout: DagreLayoutComponent;
24+
protected graphUpdated: Subscription;
2225

2326

2427
constructor(
@@ -30,11 +33,14 @@ export class DagreEdgeComponent extends MeshLineConnectorComponent implements On
3033
super(rendererService, parent, animationService);
3134

3235
this.dagreLayout = this.injector.get<DagreLayoutComponent>(DagreLayoutComponent);
36+
3337
if (!this.dagreLayout) {
3438
console.warn('DagreEdgeComponent.constructor: atft-dagre-layout not found!');
3539
}
36-
}
3740

41+
this.syncGraph = this.syncGraph.bind(this);
42+
this.graphUpdated = this.dagreLayout.updated.subscribe(this.syncGraph);
43+
}
3844

3945
protected getLineGeometry(): THREE.BufferGeometry {
4046
if (this.source || this.target) {
@@ -88,6 +94,9 @@ export class DagreEdgeComponent extends MeshLineConnectorComponent implements On
8894
if (this.dagreLayout && this.dagreLayout.getGraphModel()) {
8995
// console.log('DagreNodeComponent.removeNode', this.name);
9096

97+
// Unsubscribe from graph update events
98+
this.graphUpdated?.unsubscribe();
99+
91100
// Remove from layout
92101
this.dagreLayout.removeChildByName(this.name);
93102

@@ -99,5 +108,29 @@ export class DagreEdgeComponent extends MeshLineConnectorComponent implements On
99108
}
100109
}
101110

111+
protected syncGraph() {
112+
// console.log('DagreEdgeComponent.update');
113+
this.syncGraphEdges(this.dagreLayout.getGraph());
114+
}
115+
116+
protected syncGraphEdges(g: dagre.graphlib.Graph) {
117+
// console.log('DagreEdgeComponent.syncGraphEdges');
118+
g.edges().forEach((e) => {
119+
const edge: dagre.GraphEdge = g.edge(e);
120+
// console.log('DagreEdgeComponent.syncGraphEdges: edge', edge);
121+
if (edge.name === this.name) {
122+
this.positions = [];
123+
// console.log('DagreEdgeComponent.syncGraphEdges: edge.points', edge.points);
124+
edge.points.forEach(p => {
125+
if (!Number.isNaN(p.x) && !Number.isNaN(p.y)) {
126+
// console.log('x=' + p.x + ', y=' + p.y);
127+
this.positions.push(p.x, p.y, 0);
128+
}
129+
});
130+
this.updateLineGeometry();
131+
}
132+
});
133+
}
134+
102135

103136
}

0 commit comments

Comments
 (0)