Add AutoChairPlacementTool for automatic chair placement around tables
This commit is contained in:
@@ -0,0 +1,149 @@
|
|||||||
|
import { Tool } from '../Tool';
|
||||||
|
import { YjsDocument } from '../../crdt/YjsDocument';
|
||||||
|
|
||||||
|
class AutoChairPlacementTool extends Tool {
|
||||||
|
private chairSpacing: number = 60; // Default spacing between chairs
|
||||||
|
private chairsPerSide: number = 2; // Default chairs per side for rectangular tables
|
||||||
|
private chairsAroundRound: number = 8; // Default chairs around round tables
|
||||||
|
|
||||||
|
constructor(yjsDoc: YjsDocument) {
|
||||||
|
super(yjsDoc);
|
||||||
|
this.name = 'AutoChairPlacementTool';
|
||||||
|
}
|
||||||
|
|
||||||
|
onMouseDown(event: MouseEvent): void {
|
||||||
|
// This tool works on selected tables, not on mouse clicks
|
||||||
|
// The actual placement logic would be triggered through a UI action
|
||||||
|
// rather than a mouse click on the canvas
|
||||||
|
}
|
||||||
|
|
||||||
|
onMouseMove(event: MouseEvent): void {
|
||||||
|
// No preview needed for this tool
|
||||||
|
}
|
||||||
|
|
||||||
|
onMouseUp(event: MouseEvent): void {
|
||||||
|
// No action needed on mouse up
|
||||||
|
}
|
||||||
|
|
||||||
|
onKeyUp(event: KeyboardEvent): void {
|
||||||
|
// Handle key up events
|
||||||
|
if (event.key === 'Escape') {
|
||||||
|
this.reset();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
reset(): void {
|
||||||
|
// Reset any state if needed
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place chairs around a rectangular table
|
||||||
|
placeChairsAroundRectangularTable(table: any): void {
|
||||||
|
const { x, y, width, height } = table;
|
||||||
|
const chairWidth = 45;
|
||||||
|
const chairHeight = 45;
|
||||||
|
|
||||||
|
// Calculate chairs per side based on table dimensions
|
||||||
|
const chairsOnLongSides = this.chairsPerSide;
|
||||||
|
const chairsOnShortSides = Math.max(1, Math.floor(this.chairsPerSide * (Math.min(width, height) / Math.max(width, height))));
|
||||||
|
|
||||||
|
// Place chairs on the longer sides (top and bottom)
|
||||||
|
for (let i = 0; i < chairsOnLongSides; i++) {
|
||||||
|
const positionRatio = (i + 1) / (chairsOnLongSides + 1);
|
||||||
|
|
||||||
|
// Top side
|
||||||
|
this.yjsDoc.createElement({
|
||||||
|
id: Date.now().toString() + '_chair_top_' + i,
|
||||||
|
type: 'chair',
|
||||||
|
layerId: 'default',
|
||||||
|
x: x + positionRatio * width - chairWidth / 2,
|
||||||
|
y: y - this.chairSpacing - chairHeight,
|
||||||
|
width: chairWidth,
|
||||||
|
height: chairHeight,
|
||||||
|
properties: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Bottom side
|
||||||
|
this.yjsDoc.createElement({
|
||||||
|
id: Date.now().toString() + '_chair_bottom_' + i,
|
||||||
|
type: 'chair',
|
||||||
|
layerId: 'default',
|
||||||
|
x: x + positionRatio * width - chairWidth / 2,
|
||||||
|
y: y + height + this.chairSpacing,
|
||||||
|
width: chairWidth,
|
||||||
|
height: chairHeight,
|
||||||
|
properties: {}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place chairs on the shorter sides (left and right)
|
||||||
|
for (let i = 0; i < chairsOnShortSides; i++) {
|
||||||
|
const positionRatio = (i + 1) / (chairsOnShortSides + 1);
|
||||||
|
|
||||||
|
// Left side
|
||||||
|
this.yjsDoc.createElement({
|
||||||
|
id: Date.now().toString() + '_chair_left_' + i,
|
||||||
|
type: 'chair',
|
||||||
|
layerId: 'default',
|
||||||
|
x: x - this.chairSpacing - chairWidth,
|
||||||
|
y: y + positionRatio * height - chairHeight / 2,
|
||||||
|
width: chairWidth,
|
||||||
|
height: chairHeight,
|
||||||
|
properties: {}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Right side
|
||||||
|
this.yjsDoc.createElement({
|
||||||
|
id: Date.now().toString() + '_chair_right_' + i,
|
||||||
|
type: 'chair',
|
||||||
|
layerId: 'default',
|
||||||
|
x: x + width + this.chairSpacing,
|
||||||
|
y: y + positionRatio * height - chairHeight / 2,
|
||||||
|
width: chairWidth,
|
||||||
|
height: chairHeight,
|
||||||
|
properties: {}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Place chairs around a round table
|
||||||
|
placeChairsAroundRoundTable(table: any): void {
|
||||||
|
const { centerX, centerY, radius } = table.properties;
|
||||||
|
const chairWidth = 45;
|
||||||
|
const chairHeight = 45;
|
||||||
|
|
||||||
|
// Place chairs in a circle around the table
|
||||||
|
for (let i = 0; i < this.chairsAroundRound; i++) {
|
||||||
|
const angle = (2 * Math.PI * i) / this.chairsAroundRound;
|
||||||
|
const chairX = centerX + (radius + this.chairSpacing) * Math.cos(angle) - chairWidth / 2;
|
||||||
|
const chairY = centerY + (radius + this.chairSpacing) * Math.sin(angle) - chairHeight / 2;
|
||||||
|
|
||||||
|
this.yjsDoc.createElement({
|
||||||
|
id: Date.now().toString() + '_chair_' + i,
|
||||||
|
type: 'chair',
|
||||||
|
layerId: 'default',
|
||||||
|
x: chairX,
|
||||||
|
y: chairY,
|
||||||
|
width: chairWidth,
|
||||||
|
height: chairHeight,
|
||||||
|
properties: {}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set chair spacing
|
||||||
|
setChairSpacing(spacing: number): void {
|
||||||
|
this.chairSpacing = spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set chairs per side for rectangular tables
|
||||||
|
setChairsPerSide(count: number): void {
|
||||||
|
this.chairsPerSide = count;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set chairs around round tables
|
||||||
|
setChairsAroundRound(count: number): void {
|
||||||
|
this.chairsAroundRound = count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export { AutoChairPlacementTool };
|
||||||
Reference in New Issue
Block a user