class CanvasDrawingManager { constructor(app) { this.app = app; } // Main redraw method redraw() { this.app.canvasManager.clearCanvas(); this.app.zoomPanManager.applyTransformations(); // Draw grid if enabled if (this.app.canvasManager.showGrid) { this.app.canvasManager.drawGrid(); } // Draw all elements this.app.designElements.forEach(element => { this.drawElement(element); }); // Highlight selected element const selectedElement = this.app.uiManager.getSelectedElement(); if (selectedElement) { this.app.canvasManager.drawHighlight(selectedElement); } this.app.zoomPanManager.restoreTransformations(); } // Draw individual element drawElement(element) { this.app.ctx.strokeStyle = element.color; this.app.ctx.fillStyle = element.color + '40'; this.app.ctx.lineWidth = 2; if (element.type === 'room') { this.app.roomManager.drawRoom(element); } else if (element.type === 'wall') { this.app.wallManager.drawWall(element); } else if (element.type === 'floor') { this.app.floorManager.drawFloor(element); } else if (element.type === 'door') { this.app.symbolManager.drawDoor(element); } else if (element.type === 'window') { this.app.symbolManager.drawWindow(element); } } // Setup canvas and resize handling setupCanvas() { const resizeCanvas = () => { this.app.canvasManager.resizeCanvas(); this.app.threeJSManager.resizeRenderer(); this.redraw(); }; resizeCanvas(); window.addEventListener('resize', resizeCanvas); this.app.canvasManager.updateGridStatus(); } // Element selection and manipulation isPointInElement(x, y, element) { if (element.type === 'room') { return this.app.roomManager.isPointInRoom(x, y, element); } else if (element.type === 'wall') { return this.app.wallManager.isPointOnWall(x, y, element); } else if (element.type === 'floor') { return this.app.floorManager.isPointInFloor(x, y, element); } else if (element.type === 'door' || element.type === 'window') { return this.app.symbolManager.isPointInSymbol(x, y, element); } return false; } // Helper methods for element manipulation findElementAt(x, y) { for (let i = this.app.designElements.length - 1; i >= 0; i--) { const element = this.app.designElements[i]; if (this.isPointInElement(x, y, element)) { return element; } } return null; } getElementCenter(element) { return { x: (element.startX + element.endX) / 2, y: (element.startY + element.endY) / 2 }; } // Delete selected element deleteElement() { const selectedElement = this.app.uiManager.getSelectedElement(); if (selectedElement) { this.app.designElements = this.app.designElements.filter(el => el.id !== selectedElement.id); this.app.uiManager.clearSelection(); this.redraw(); // Save state to history after deleting element this.app.saveHistory(); } } }