车站和站台绘制辅助线

This commit is contained in:
joylink_zhaoerwei 2023-06-19 16:40:39 +08:00
parent 6b735a094c
commit 5570e88878
2 changed files with 51 additions and 0 deletions

View File

@ -1,5 +1,7 @@
import { FederatedPointerEvent, Point } from 'pixi.js'; import { FederatedPointerEvent, Point } from 'pixi.js';
import { import {
AbsorbableLine,
AbsorbablePosition,
GraphicDrawAssistant, GraphicDrawAssistant,
GraphicInteractionPlugin, GraphicInteractionPlugin,
JlDrawApp, JlDrawApp,
@ -67,6 +69,22 @@ export class PlatformDraw extends GraphicDrawAssistant<
} }
} }
function buildAbsorbablePositions(platform: Platform): AbsorbablePosition[] {
const aps: AbsorbablePosition[] = [];
const platforms = platform.queryStore.queryByType<Platform>(Platform.Type);
const { width, height } = platform.getGraphicApp().canvas;
platforms.forEach((other) => {
if (other.id == platform.id) {
return;
}
const ps = other.datas.transform.position;
const xs = new AbsorbableLine({ x: 0, y: ps.y }, { x: width, y: ps.y });
const ys = new AbsorbableLine({ x: ps.x, y: 0 }, { x: ps.x, y: height });
aps.push(xs, ys);
});
return aps;
}
export class platformInteraction extends GraphicInteractionPlugin<Platform> { export class platformInteraction extends GraphicInteractionPlugin<Platform> {
static Name = 'platform_transform'; static Name = 'platform_transform';
constructor(app: JlDrawApp) { constructor(app: JlDrawApp) {
@ -85,10 +103,18 @@ export class platformInteraction extends GraphicInteractionPlugin<Platform> {
g.cursor = 'pointer'; g.cursor = 'pointer';
g.scalable = true; g.scalable = true;
g.rotatable = true; g.rotatable = true;
g.on('selected', this.onSelected, this);
} }
unbind(g: Platform): void { unbind(g: Platform): void {
g.eventMode = 'none'; g.eventMode = 'none';
g.scalable = false; g.scalable = false;
g.rotatable = false; g.rotatable = false;
g.off('selected', this.onSelected, this);
}
onSelected(): void {
const platform = this.app.selectedGraphics[0] as Platform;
this.app.setOptions({
absorbablePositions: buildAbsorbablePositions(platform),
});
} }
} }

View File

@ -1,5 +1,7 @@
import { FederatedPointerEvent, Point } from 'pixi.js'; import { FederatedPointerEvent, Point } from 'pixi.js';
import { import {
AbsorbableLine,
AbsorbablePosition,
GraphicDrawAssistant, GraphicDrawAssistant,
GraphicInteractionPlugin, GraphicInteractionPlugin,
JlDrawApp, JlDrawApp,
@ -54,6 +56,21 @@ export class StationDraw extends GraphicDrawAssistant<
} }
} }
function buildAbsorbablePositions(station: Station): AbsorbablePosition[] {
const aps: AbsorbablePosition[] = [];
const stations = station.queryStore.queryByType<Station>(Station.Type);
const { width } = station.getGraphicApp().canvas;
stations.forEach((other) => {
if (other.id == station.id) {
return;
}
const ps = other.datas.transform.position;
const xs = new AbsorbableLine({ x: 0, y: ps.y }, { x: width, y: ps.y });
aps.push(xs);
});
return aps;
}
export class stationInteraction extends GraphicInteractionPlugin<Station> { export class stationInteraction extends GraphicInteractionPlugin<Station> {
static Name = 'station_transform'; static Name = 'station_transform';
constructor(app: JlDrawApp) { constructor(app: JlDrawApp) {
@ -82,6 +99,7 @@ export class stationInteraction extends GraphicInteractionPlugin<Station> {
g.kilometerGraph.draggable = true; g.kilometerGraph.draggable = true;
g.kilometerGraph.selectable = true; g.kilometerGraph.selectable = true;
g.kilometerGraph.transformSave = true; g.kilometerGraph.transformSave = true;
g.on('selected', this.onSelected, this);
} }
unbind(g: Station): void { unbind(g: Station): void {
g.eventMode = 'none'; g.eventMode = 'none';
@ -95,5 +113,12 @@ export class stationInteraction extends GraphicInteractionPlugin<Station> {
g.kilometerGraph.draggable = false; g.kilometerGraph.draggable = false;
g.kilometerGraph.selectable = false; g.kilometerGraph.selectable = false;
g.kilometerGraph.transformSave = false; g.kilometerGraph.transformSave = false;
g.off('selected', this.onSelected, this);
}
onSelected(): void {
const station = this.app.selectedGraphics[0] as Station;
this.app.setOptions({
absorbablePositions: buildAbsorbablePositions(station),
});
} }
} }