Refactor symbols app: split large files (max 300 lines)

- Split styles.css (1319 lines) into 6 CSS modules:
  - base.css, layout.css, modal.css, text-generator.css, components.css, legend.css
- Split app.js (1219 lines) into 8 JS modules:
  - core.js, custom.js, dxf.js, export.js, legend.js, legend-export.js, path-parser.js, utils.js
- Split symbols.js (870 lines) into 10 JS modules:
  - index.js, schaeden.js, werkzeuge.js, bauteile.js, moebel.js, sanitaer.js, vermessung.js, vermessung-infra.js, vermessung-topo.js, init.js
- Updated index.html to load new modular files

All files now comply with 300-line maximum rule.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
architeur
2025-12-14 21:34:03 +01:00
parent c0ae55a597
commit d707c5001d
28 changed files with 3514 additions and 3411 deletions

File diff suppressed because it is too large Load Diff

146
symbols/js/app/core.js Normal file
View File

@@ -0,0 +1,146 @@
// ============================================
// CORE - Initialisierung und Rendering
// Gutachter Symbolbibliothek v2.0
// ============================================
// ========== GLOBALE VARIABLEN ==========
let currentFilter = 'all';
let currentSearch = '';
let selectedSymbols = new Set();
let legendItems = [];
// ========== INITIALISIERUNG ==========
document.addEventListener('DOMContentLoaded', function() {
renderSymbols();
setupEventListeners();
loadLegendFromStorage();
});
// ========== EVENT LISTENERS ==========
function setupEventListeners() {
// Suche
document.getElementById('searchInput').addEventListener('input', function(e) {
currentSearch = e.target.value.toLowerCase();
renderSymbols();
});
// Filter Pills
document.querySelectorAll('.filter-pill').forEach(pill => {
pill.addEventListener('click', function() {
document.querySelectorAll('.filter-pill').forEach(p => p.classList.remove('active'));
this.classList.add('active');
currentFilter = this.dataset.filter;
renderSymbols();
});
});
// Modal schließen
document.getElementById('legendModal').addEventListener('click', function(e) {
if (e.target === this) {
closeLegendModal();
}
});
// Escape-Taste zum Schließen
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
closeLegendModal();
}
});
}
// ========== SYMBOLE RENDERN ==========
function renderSymbols() {
const container = document.getElementById('symbolGrid');
container.innerHTML = '';
let hasResults = false;
Object.keys(SYMBOLS).forEach(categoryKey => {
const category = SYMBOLS[categoryKey];
// Filter nach Kategorie
if (currentFilter !== 'all' && currentFilter !== categoryKey) {
return;
}
const filteredItems = category.items.filter(item => {
if (!currentSearch) return true;
return item.name.toLowerCase().includes(currentSearch) ||
item.tags.some(tag => tag.toLowerCase().includes(currentSearch));
});
if (filteredItems.length === 0) return;
hasResults = true;
// Kategorie-Header
const categoryHeader = document.createElement('div');
categoryHeader.className = 'category-header';
categoryHeader.innerHTML = `<span>${category.icon} ${category.name}</span><span class="category-count">${filteredItems.length} Symbole</span>`;
container.appendChild(categoryHeader);
// Symbol-Grid für diese Kategorie
const categoryGrid = document.createElement('div');
categoryGrid.className = 'category-grid';
filteredItems.forEach(item => {
const card = createSymbolCard(item, categoryKey);
categoryGrid.appendChild(card);
});
container.appendChild(categoryGrid);
});
if (!hasResults) {
container.innerHTML = '<div class="no-results">Keine Symbole gefunden. Versuchen Sie einen anderen Suchbegriff.</div>';
}
}
// ========== SYMBOL-KARTE ERSTELLEN ==========
function createSymbolCard(item, categoryKey) {
const card = document.createElement('div');
card.className = 'symbol-card';
// Spezielle Klasse für Vermessungssymbole
if (categoryKey.startsWith('vermessung_')) {
card.classList.add('vermessung');
}
const isSelected = selectedSymbols.has(item.id);
if (isSelected) {
card.classList.add('selected');
}
card.innerHTML = `
<div class="symbol-preview">${item.svg}</div>
<div class="symbol-name">${item.name}</div>
<div class="symbol-actions">
<button class="btn-action btn-copy" onclick="copyAsImage('${item.id}')" title="Als Bild kopieren (transparent)">
📋 Kopieren
</button>
<button class="btn-action btn-svg" onclick="downloadSVG('${item.id}')" title="SVG herunterladen">
⬇️ SVG
</button>
<button class="btn-action btn-png" onclick="downloadSymbolPNG('${item.id}')" title="PNG herunterladen">PNG</button>
<button class="btn-action btn-jpg" onclick="downloadSymbolJPG('${item.id}')" title="JPG herunterladen">JPG</button>
<button class="btn-action btn-dxf" onclick="downloadDXF('${item.id}')" title="DXF herunterladen">
📐 DXF
</button>
<button class="btn-action btn-legend ${isSelected ? 'active' : ''}" onclick="toggleLegendSelection('${item.id}')" title="Zur Legende hinzufügen">
📑
</button>
</div>
`;
return card;
}
// ========== SYMBOL FINDEN ==========
function findSymbol(id) {
for (const categoryKey of Object.keys(SYMBOLS)) {
const item = SYMBOLS[categoryKey].items.find(i => i.id === id);
if (item) return item;
}
return null;
}

122
symbols/js/app/custom.js Normal file
View File

@@ -0,0 +1,122 @@
// ============================================
// CUSTOM - Eigene Symbole und UI
// ============================================
// Custom Symbols aus localStorage
var customSymbols = [];
// ========== TEXT-GENERATOR UI ==========
function toggleTextGenerator() {
var generator = document.querySelector('.text-generator');
generator.classList.toggle('collapsed');
}
// ========== CUSTOM SYMBOLS STORAGE ==========
function loadCustomSymbols() {
try {
var stored = localStorage.getItem('customSymbols');
if (stored) {
customSymbols = JSON.parse(stored);
}
} catch (e) {
console.error('Fehler beim Laden der eigenen Symbole:', e);
customSymbols = [];
}
}
function saveCustomSymbols() {
try {
localStorage.setItem('customSymbols', JSON.stringify(customSymbols));
} catch (e) {
console.error('Fehler beim Speichern der eigenen Symbole:', e);
}
}
function openSaveModal() {
var modal = document.getElementById('saveModal');
var nameInput = document.getElementById('symbolName');
var descInput = document.getElementById('symbolDescription');
var state = window.TextGenState ? window.TextGenState.current : {};
var suggestedName = state.text ? state.text.replace(/\n/g, ' ').substring(0, 30) : '';
nameInput.value = suggestedName;
descInput.value = '';
modal.style.display = 'flex';
nameInput.focus();
}
function closeSaveModal() {
var modal = document.getElementById('saveModal');
modal.style.display = 'none';
}
function saveCustomSymbol() {
var nameInput = document.getElementById('symbolName');
var descInput = document.getElementById('symbolDescription');
var name = nameInput.value.trim();
if (!name) {
showNotification('Bitte einen Namen eingeben!', 'error');
return;
}
var svg = window.SvgGenerator ? window.SvgGenerator.generate(window.TextGenState.current) : '';
var newSymbol = {
id: 'custom_' + Date.now(),
name: name,
description: descInput.value.trim(),
svg: svg,
category: 'custom',
tags: ['eigene', 'custom', name.toLowerCase()],
createdAt: new Date().toISOString()
};
customSymbols.push(newSymbol);
saveCustomSymbols();
closeSaveModal();
showNotification('Symbol "' + name + '" gespeichert!');
}
function deleteCustomSymbol(id) {
if (!confirm('Symbol wirklich loeschen?')) return;
customSymbols = customSymbols.filter(function(s) { return s.id !== id; });
saveCustomSymbols();
renderSymbols();
showNotification('Symbol geloescht');
}
function createCustomSymbolCard(symbol) {
var card = document.createElement('div');
card.className = 'symbol-card';
card.innerHTML =
'<button class="btn-delete" onclick="event.stopPropagation(); deleteCustomSymbol(\'' + symbol.id + '\')" title="Loeschen">X</button>' +
'<div class="symbol-preview">' + symbol.svg + '</div>' +
'<div class="symbol-name">' + escapeHtml(symbol.name) + '</div>' +
'<div class="symbol-actions">' +
'<button class="btn-action btn-copy" onclick="copySymbolAsImage(\'' + symbol.id + '\', true)" title="Kopieren">Kopieren</button>' +
'<button class="btn-action btn-svg" onclick="downloadSymbolSVG(\'' + symbol.id + '\', true)" title="SVG">SVG</button>' +
'<button class="btn-action btn-dxf" onclick="downloadSymbolDXF(\'' + symbol.id + '\', true)" title="DXF">DXF</button>' +
'<button class="btn-action btn-legend" onclick="addSymbolToLegend(\'' + symbol.id + '\', true)" title="Legende">+</button>' +
'</div>';
return card;
}
// ========== IMPRESSUM ==========
function openImpressum() {
var modal = document.getElementById('impressumModal');
if (modal) modal.style.display = 'flex';
}
function closeImpressum() {
var modal = document.getElementById('impressumModal');
if (modal) modal.style.display = 'none';
}
// Init beim Laden
document.addEventListener('DOMContentLoaded', function() {
loadCustomSymbols();
});

183
symbols/js/app/dxf.js Normal file
View File

@@ -0,0 +1,183 @@
// ============================================
// DXF - AutoCAD R12 Export
// ============================================
function svgToDxf(svgString, scaleFactor = 1) {
const parser = new DOMParser();
const svg = parser.parseFromString(svgString, 'image/svg+xml').documentElement;
const viewBox = svg.getAttribute('viewBox')?.split(' ').map(Number) || [0, 0, 64, 64];
const height = viewBox[3];
let entities = '';
function flipY(y) {
return (height - y) * scaleFactor;
}
function scaleX(x) {
return x * scaleFactor;
}
function processElement(el) {
const tag = el.tagName?.toLowerCase();
if (!tag) return;
switch(tag) {
case 'line':
const x1 = parseFloat(el.getAttribute('x1') || 0);
const y1 = parseFloat(el.getAttribute('y1') || 0);
const x2 = parseFloat(el.getAttribute('x2') || 0);
const y2 = parseFloat(el.getAttribute('y2') || 0);
entities += createDxfLine(scaleX(x1), flipY(y1), scaleX(x2), flipY(y2));
break;
case 'rect':
const rx = parseFloat(el.getAttribute('x') || 0);
const ry = parseFloat(el.getAttribute('y') || 0);
const rw = parseFloat(el.getAttribute('width') || 0);
const rh = parseFloat(el.getAttribute('height') || 0);
entities += createDxfLine(scaleX(rx), flipY(ry), scaleX(rx + rw), flipY(ry));
entities += createDxfLine(scaleX(rx + rw), flipY(ry), scaleX(rx + rw), flipY(ry + rh));
entities += createDxfLine(scaleX(rx + rw), flipY(ry + rh), scaleX(rx), flipY(ry + rh));
entities += createDxfLine(scaleX(rx), flipY(ry + rh), scaleX(rx), flipY(ry));
break;
case 'circle':
const cx = parseFloat(el.getAttribute('cx') || 0);
const cy = parseFloat(el.getAttribute('cy') || 0);
const r = parseFloat(el.getAttribute('r') || 0);
entities += createDxfCircle(scaleX(cx), flipY(cy), r * scaleFactor);
break;
case 'ellipse':
const ecx = parseFloat(el.getAttribute('cx') || 0);
const ecy = parseFloat(el.getAttribute('cy') || 0);
const erx = parseFloat(el.getAttribute('rx') || 0);
const ery = parseFloat(el.getAttribute('ry') || 0);
entities += createDxfCircle(scaleX(ecx), flipY(ecy), ((erx + ery) / 2) * scaleFactor);
break;
case 'polygon':
case 'polyline':
const points = el.getAttribute('points');
if (points) {
const pts = points.trim().split(/[\s,]+/).map(Number);
for (let i = 0; i < pts.length - 2; i += 2) {
entities += createDxfLine(
scaleX(pts[i]), flipY(pts[i+1]),
scaleX(pts[i+2]), flipY(pts[i+3])
);
}
if (tag === 'polygon' && pts.length >= 4) {
entities += createDxfLine(
scaleX(pts[pts.length-2]), flipY(pts[pts.length-1]),
scaleX(pts[0]), flipY(pts[1])
);
}
}
break;
case 'path':
const d = el.getAttribute('d');
if (d) {
const pathEntities = parseSvgPath(d, scaleX, flipY);
entities += pathEntities;
}
break;
case 'text':
const tx = parseFloat(el.getAttribute('x') || 0);
const ty = parseFloat(el.getAttribute('y') || 0);
const textContent = el.textContent || '';
const fontSize = parseFloat(el.getAttribute('font-size') || 10);
entities += createDxfText(scaleX(tx), flipY(ty), textContent, fontSize * scaleFactor * 0.7);
break;
case 'g':
case 'svg':
Array.from(el.children).forEach(child => processElement(child));
break;
}
}
processElement(svg);
const dxf = [
'0', 'SECTION',
'2', 'HEADER',
'9', '$ACADVER',
'1', 'AC1009',
'9', '$INSBASE',
'10', '0.0',
'20', '0.0',
'30', '0.0',
'9', '$EXTMIN',
'10', '0.0',
'20', '0.0',
'30', '0.0',
'9', '$EXTMAX',
'10', String(height * scaleFactor),
'20', String(height * scaleFactor),
'30', '0.0',
'0', 'ENDSEC',
'0', 'SECTION',
'2', 'TABLES',
'0', 'TABLE',
'2', 'LAYER',
'70', '1',
'0', 'LAYER',
'2', '0',
'70', '0',
'62', '7',
'6', 'CONTINUOUS',
'0', 'ENDTAB',
'0', 'ENDSEC',
'0', 'SECTION',
'2', 'ENTITIES',
entities,
'0', 'ENDSEC',
'0', 'EOF'
].join('\r\n');
return dxf;
}
function createDxfLine(x1, y1, x2, y2) {
return [
'0', 'LINE',
'8', '0',
'10', x1.toFixed(4),
'20', y1.toFixed(4),
'30', '0.0',
'11', x2.toFixed(4),
'21', y2.toFixed(4),
'31', '0.0',
''
].join('\r\n');
}
function createDxfCircle(cx, cy, r) {
return [
'0', 'CIRCLE',
'8', '0',
'10', cx.toFixed(4),
'20', cy.toFixed(4),
'30', '0.0',
'40', r.toFixed(4),
''
].join('\r\n');
}
function createDxfText(x, y, text, height) {
return [
'0', 'TEXT',
'8', '0',
'10', x.toFixed(4),
'20', y.toFixed(4),
'30', '0.0',
'40', height.toFixed(4),
'1', text,
''
].join('\r\n');
}

156
symbols/js/app/export.js Normal file
View File

@@ -0,0 +1,156 @@
// ============================================
// EXPORT - Bild kopieren, SVG/DXF Download
// ============================================
// ========== BILD KOPIEREN (transparent) ==========
async function copyAsImage(id) {
const item = findSymbol(id);
if (!item) return;
try {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const size = 256;
canvas.width = size;
canvas.height = size;
const img = new Image();
const svgBlob = new Blob([item.svg], { type: 'image/svg+xml;charset=utf-8' });
const url = URL.createObjectURL(svgBlob);
await new Promise((resolve, reject) => {
img.onload = resolve;
img.onerror = reject;
img.src = url;
});
ctx.drawImage(img, 0, 0, size, size);
URL.revokeObjectURL(url);
canvas.toBlob(async (blob) => {
try {
await navigator.clipboard.write([
new ClipboardItem({ 'image/png': blob })
]);
showNotification('Bild in Zwischenablage kopiert!');
} catch (err) {
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = item.filename.replace('.svg', '.png');
link.click();
showNotification('PNG heruntergeladen (Kopieren nicht unterstützt)');
}
}, 'image/png');
} catch (err) {
console.error('Fehler beim Bild-Export:', err);
showNotification('Fehler beim Kopieren', 'error');
}
}
// ========== SVG DOWNLOAD ==========
function downloadSVG(id) {
const item = findSymbol(id);
if (!item) return;
const blob = new Blob([item.svg], { type: 'image/svg+xml' });
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = item.filename;
link.click();
URL.revokeObjectURL(url);
showNotification('SVG heruntergeladen!');
}
// ========== DXF DOWNLOAD ==========
function downloadDXF(id) {
const item = findSymbol(id);
if (!item) return;
const dxf = svgToDxf(item.dxfSvg || item.svg, 1);
const blob = new Blob([dxf], { type: 'application/dxf' });
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = item.filename.replace('.svg', '.dxf');
link.click();
URL.revokeObjectURL(url);
showNotification('DXF heruntergeladen!');
}
// ========== PNG/JPG DOWNLOAD ==========
async function downloadSymbolPNG(id) {
var symbol = findSymbol(id);
if (!symbol) return;
try {
var canvas = await svgToCanvas(symbol.svg, 2);
canvas.toBlob(function(blob) {
var link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = symbol.id + '.png';
link.click();
URL.revokeObjectURL(link.href);
showNotification('PNG heruntergeladen!');
}, 'image/png');
} catch (err) {
console.error('Fehler:', err);
showNotification('Fehler beim PNG-Export', 'error');
}
}
async function downloadSymbolJPG(id) {
var symbol = findSymbol(id);
if (!symbol) return;
try {
var canvas = await svgToCanvas(symbol.svg, 2);
var tempCanvas = document.createElement('canvas');
tempCanvas.width = canvas.width;
tempCanvas.height = canvas.height;
var tempCtx = tempCanvas.getContext('2d');
tempCtx.fillStyle = '#FFFFFF';
tempCtx.fillRect(0, 0, tempCanvas.width, tempCanvas.height);
tempCtx.drawImage(canvas, 0, 0);
tempCanvas.toBlob(function(blob) {
var link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = symbol.id + '.jpg';
link.click();
URL.revokeObjectURL(link.href);
showNotification('JPG heruntergeladen!');
}, 'image/jpeg', 0.95);
} catch (err) {
console.error('Fehler:', err);
showNotification('Fehler beim JPG-Export', 'error');
}
}
// ========== ZIP EXPORT ==========
async function downloadAllAsZip() {
showNotification('ZIP wird erstellt...', 'info');
const files = [];
Object.keys(SYMBOLS).forEach(categoryKey => {
const category = SYMBOLS[categoryKey];
category.items.forEach(item => {
files.push({
name: `${categoryKey}/${item.filename}`,
content: item.svg
});
files.push({
name: `${categoryKey}/${item.filename.replace('.svg', '.dxf')}`,
content: svgToDxf(item.svg, 1)
});
});
});
const info = `Symbolbibliothek enthält ${files.length / 2} Symbole in ${Object.keys(SYMBOLS).length} Kategorien.\n\n` +
`Für den ZIP-Download empfehlen wir, die Symbole einzeln herunterzuladen.`;
alert(info);
showNotification('ZIP-Export: Siehe Hinweis', 'info');
}

View File

@@ -0,0 +1,104 @@
// ============================================
// LEGEND EXPORT - Legenden SVG/PNG Export
// ============================================
function exportLegendSVG() {
if (legendItems.length === 0) {
showNotification('Legende ist leer', 'error');
return;
}
const itemHeight = 50;
const width = 400;
const height = legendItems.length * itemHeight + 60;
let svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width} ${height}" width="${width}" height="${height}">
<rect width="${width}" height="${height}" fill="white"/>
<text x="20" y="30" font-family="Arial" font-size="18" font-weight="bold">Legende</text>
<line x1="20" y1="40" x2="${width - 20}" y2="40" stroke="#ccc" stroke-width="1"/>`;
legendItems.forEach((item, index) => {
const y = 60 + index * itemHeight;
svg += `<g transform="translate(20, ${y})">
<g transform="scale(0.5)">${item.svg.replace(/<svg[^>]*>/, '').replace('</svg>', '')}</g>
<text x="50" y="20" font-family="Arial" font-size="14" font-weight="bold">${escapeHtml(item.name)}</text>
${item.description ? `<text x="50" y="35" font-family="Arial" font-size="11" fill="#666">${escapeHtml(item.description)}</text>` : ''}
</g>`;
});
svg += '</svg>';
const blob = new Blob([svg], { type: 'image/svg+xml' });
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = 'legende.svg';
link.click();
URL.revokeObjectURL(url);
showNotification('Legende als SVG exportiert!');
}
function exportLegendPNG() {
if (legendItems.length === 0) {
showNotification('Legende ist leer', 'error');
return;
}
const itemHeight = 50;
const width = 400;
const height = legendItems.length * itemHeight + 60;
const canvas = document.createElement('canvas');
canvas.width = width * 2;
canvas.height = height * 2;
const ctx = canvas.getContext('2d');
ctx.scale(2, 2);
ctx.fillRect(0, 0, width, height);
ctx.fillStyle = '#000';
ctx.font = 'bold 18px Arial';
ctx.fillText('Legende', 20, 30);
ctx.strokeStyle = '#ccc';
ctx.beginPath();
ctx.moveTo(20, 40);
ctx.lineTo(width - 20, 40);
ctx.stroke();
let loadedCount = 0;
legendItems.forEach((item, index) => {
const y = 60 + index * itemHeight;
const img = new Image();
const svgBlob = new Blob([item.svg], { type: 'image/svg+xml' });
img.src = URL.createObjectURL(svgBlob);
img.onload = () => {
ctx.drawImage(img, 20, y - 5, 32, 32);
ctx.fillStyle = '#000';
ctx.font = 'bold 14px Arial';
ctx.fillText(item.name, 60, y + 15);
if (item.description) {
ctx.fillStyle = '#666';
ctx.font = '11px Arial';
ctx.fillText(item.description, 60, y + 30);
}
loadedCount++;
if (loadedCount === legendItems.length) {
canvas.toBlob(blob => {
const url = URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = 'legende.png';
link.click();
URL.revokeObjectURL(url);
showNotification('Legende als PNG exportiert!');
}, 'image/png');
}
};
});
}

243
symbols/js/app/legend.js Normal file
View File

@@ -0,0 +1,243 @@
// ============================================
// LEGEND - Legenden-Funktionen
// ============================================
// ========== LEGENDE AUSWAHL ==========
function toggleLegendSelection(id) {
if (selectedSymbols.has(id)) {
selectedSymbols.delete(id);
} else {
selectedSymbols.add(id);
const item = findSymbol(id);
if (item && !legendItems.find(l => l.id === id)) {
legendItems.push({
id: item.id,
name: item.name,
svg: item.svg,
description: ''
});
}
}
renderSymbols();
updateLegendCount();
saveLegendToStorage();
}
function updateLegendCount() {
const countEl = document.getElementById('legendCount');
if (countEl) {
countEl.textContent = legendItems.length;
}
}
// ========== LEGENDE MODAL ==========
function openLegendModal() {
const modal = document.getElementById('legendModal');
modal.classList.add('active');
renderLegendEditor();
updateLegendPreview();
}
function closeLegendModal() {
const modal = document.getElementById('legendModal');
modal.classList.remove('active');
}
function renderLegendEditor() {
const container = document.getElementById('legendItems');
if (legendItems.length === 0) {
container.innerHTML = '<div class="legend-empty">Keine Symbole in der Legende. Klicken Sie auf 📑 bei einem Symbol, um es hinzuzufügen.</div>';
updateLegendPreview();
return;
}
container.innerHTML = legendItems.map((item, index) => `
<div class="legend-item" data-index="${index}">
<div class="legend-item-preview">${item.svg}</div>
<div class="legend-item-content">
<input type="text" class="legend-item-name" value="${item.name}"
oninput="updateLegendItem(${index}, 'name', this.value)" placeholder="Name">
<input type="text" class="legend-item-desc" value="${item.description || ''}"
oninput="updateLegendItem(${index}, 'description', this.value)" placeholder="Beschreibung (optional)">
</div>
<div class="legend-item-actions">
<button type="button" onclick="moveLegendItem(${index}, -1)" title="Nach oben" ${index === 0 ? 'disabled' : ''}>▲</button>
<button type="button" onclick="moveLegendItem(${index}, 1)" title="Nach unten" ${index === legendItems.length - 1 ? 'disabled' : ''}>▼</button>
<button type="button" onclick="removeLegendItem(${index})" title="Entfernen" class="btn-remove">✕</button>
</div>
</div>
`).join('');
updateLegendPreview();
}
function updateLegendItem(index, field, value) {
if (legendItems[index]) {
legendItems[index][field] = value;
saveLegendToStorage();
updateLegendPreview();
}
}
function moveLegendItem(index, direction) {
const newIndex = index + direction;
if (newIndex >= 0 && newIndex < legendItems.length) {
const temp = legendItems[index];
legendItems[index] = legendItems[newIndex];
legendItems[newIndex] = temp;
renderLegendEditor();
saveLegendToStorage();
}
}
function removeLegendItem(index) {
const item = legendItems[index];
if (item) {
selectedSymbols.delete(item.id);
}
legendItems.splice(index, 1);
renderLegendEditor();
renderSymbols();
updateLegendCount();
saveLegendToStorage();
}
function clearLegend() {
if (confirm('Möchten Sie die Legende wirklich leeren?')) {
legendItems = [];
selectedSymbols.clear();
renderLegendEditor();
renderSymbols();
updateLegendCount();
saveLegendToStorage();
}
}
// ========== LEGENDE SPEICHERN/LADEN ==========
function saveLegendToStorage() {
try {
localStorage.setItem('gutachter_legende', JSON.stringify(legendItems));
localStorage.setItem('gutachter_selected', JSON.stringify([...selectedSymbols]));
} catch (e) {
console.warn('LocalStorage nicht verfügbar');
}
}
function loadLegendFromStorage() {
try {
const saved = localStorage.getItem('gutachter_legende');
const savedSelected = localStorage.getItem('gutachter_selected');
if (saved) {
legendItems = JSON.parse(saved);
}
if (savedSelected) {
selectedSymbols = new Set(JSON.parse(savedSelected));
}
updateLegendCount();
} catch (e) {
console.warn('Fehler beim Laden der Legende');
}
}
// ========== LEGENDE VORSCHAU ==========
function generateLegendSVG() {
if (legendItems.length === 0) return null;
const itemHeight = 50;
const width = 320;
const height = legendItems.length * itemHeight + 60;
let svg = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 ${width} ${height}" width="${width}" height="${height}">
<rect width="${width}" height="${height}" fill="white"/>
<text x="20" y="30" font-family="Arial" font-size="18" font-weight="bold">Legende</text>
<line x1="20" y1="40" x2="${width - 20}" y2="40" stroke="#ccc" stroke-width="1"/>`;
legendItems.forEach((item, index) => {
const y = 60 + index * itemHeight;
svg += `<g transform="translate(20, ${y})">
<g transform="scale(0.5)">${item.svg.replace(/<svg[^>]*>/, '').replace('</svg>', '')}</g>
<text x="50" y="20" font-family="Arial" font-size="14" font-weight="bold">${escapeHtml(item.name)}</text>
${item.description ? `<text x="50" y="35" font-family="Arial" font-size="11" fill="#666">${escapeHtml(item.description)}</text>` : ''}
</g>`;
});
svg += '</svg>';
return svg;
}
function updateLegendPreview() {
const previewBox = document.getElementById('legendPreviewBox');
if (!previewBox) return;
if (legendItems.length === 0) {
previewBox.innerHTML = '<div class="legend-preview-empty">Keine Eintraege vorhanden</div>';
return;
}
const svg = generateLegendSVG();
if (svg) {
previewBox.innerHTML = svg;
}
}
async function copyLegendAsImage() {
if (legendItems.length === 0) {
showNotification('Legende ist leer', 'error');
return;
}
const svg = generateLegendSVG();
if (!svg) return;
try {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const itemHeight = 50;
const width = 320;
const height = legendItems.length * itemHeight + 60;
canvas.width = width * 2;
canvas.height = height * 2;
ctx.scale(2, 2);
ctx.fillStyle = 'white';
ctx.fillRect(0, 0, width, height);
const img = new Image();
const svgBlob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' });
const url = URL.createObjectURL(svgBlob);
await new Promise((resolve, reject) => {
img.onload = resolve;
img.onerror = reject;
img.src = url;
});
ctx.drawImage(img, 0, 0, width, height);
URL.revokeObjectURL(url);
canvas.toBlob(async (blob) => {
try {
await navigator.clipboard.write([
new ClipboardItem({ 'image/png': blob })
]);
showNotification('Legende in Zwischenablage kopiert!');
} catch (err) {
const link = document.createElement('a');
link.href = URL.createObjectURL(blob);
link.download = 'legende.png';
link.click();
showNotification('Legende als PNG heruntergeladen');
}
}, 'image/png');
} catch (err) {
console.error('Fehler beim Kopieren:', err);
showNotification('Fehler beim Kopieren', 'error');
}
}
// Export-Funktionen sind in legend-export.js

View File

@@ -0,0 +1,130 @@
// ============================================
// PATH PARSER - SVG Path zu DXF
// ============================================
function parseSvgPath(d, scaleX, flipY) {
let entities = "";
let currentX = 0, currentY = 0;
let startX = 0, startY = 0;
const commands = d.match(/[MmLlHhVvCcSsQqTtAaZz][^MmLlHhVvCcSsQqTtAaZz]*/g) || [];
commands.forEach(cmd => {
const type = cmd[0];
const args = cmd.slice(1).trim().split(/[\s,]+/).filter(s => s).map(Number);
switch(type) {
case "M":
currentX = args[0]; currentY = args[1];
startX = currentX; startY = currentY;
for(let i = 2; i < args.length; i += 2) {
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(args[i]), flipY(args[i+1]));
currentX = args[i]; currentY = args[i+1];
}
break;
case "m":
currentX += args[0]; currentY += args[1];
startX = currentX; startY = currentY;
for(let i = 2; i < args.length; i += 2) {
const nx = currentX + args[i], ny = currentY + args[i+1];
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(nx), flipY(ny));
currentX = nx; currentY = ny;
}
break;
case "L":
for(let i = 0; i < args.length; i += 2) {
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(args[i]), flipY(args[i+1]));
currentX = args[i]; currentY = args[i+1];
}
break;
case "l":
for(let i = 0; i < args.length; i += 2) {
const nx = currentX + args[i], ny = currentY + args[i+1];
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(nx), flipY(ny));
currentX = nx; currentY = ny;
}
break;
case "H":
for(let i = 0; i < args.length; i++) {
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(args[i]), flipY(currentY));
currentX = args[i];
}
break;
case "h":
for(let i = 0; i < args.length; i++) {
const nx = currentX + args[i];
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(nx), flipY(currentY));
currentX = nx;
}
break;
case "V":
for(let i = 0; i < args.length; i++) {
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(currentX), flipY(args[i]));
currentY = args[i];
}
break;
case "v":
for(let i = 0; i < args.length; i++) {
const ny = currentY + args[i];
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(currentX), flipY(ny));
currentY = ny;
}
break;
case "Q":
case "q":
for(let i = 0; i < args.length; i += 4) {
let ex, ey;
if(type === "Q") {
ex = args[i+2]; ey = args[i+3];
} else {
ex = currentX + args[i+2]; ey = currentY + args[i+3];
}
const cx = type === "Q" ? args[i] : currentX + args[i];
const cy = type === "Q" ? args[i+1] : currentY + args[i+1];
for(let t = 0; t <= 1; t += 0.25) {
const t2 = Math.min(t + 0.25, 1);
const x1 = (1-t)*(1-t)*currentX + 2*(1-t)*t*cx + t*t*ex;
const y1 = (1-t)*(1-t)*currentY + 2*(1-t)*t*cy + t*t*ey;
const x2 = (1-t2)*(1-t2)*currentX + 2*(1-t2)*t2*cx + t2*t2*ex;
const y2 = (1-t2)*(1-t2)*currentY + 2*(1-t2)*t2*cy + t2*t2*ey;
entities += createDxfLine(scaleX(x1), flipY(y1), scaleX(x2), flipY(y2));
}
currentX = ex; currentY = ey;
}
break;
case "C":
case "c":
for(let i = 0; i < args.length; i += 6) {
let c1x, c1y, c2x, c2y, ex, ey;
if(type === "C") {
c1x = args[i]; c1y = args[i+1];
c2x = args[i+2]; c2y = args[i+3];
ex = args[i+4]; ey = args[i+5];
} else {
c1x = currentX + args[i]; c1y = currentY + args[i+1];
c2x = currentX + args[i+2]; c2y = currentY + args[i+3];
ex = currentX + args[i+4]; ey = currentY + args[i+5];
}
for(let t = 0; t <= 1; t += 0.2) {
const t2 = Math.min(t + 0.2, 1);
const x1 = Math.pow(1-t,3)*currentX + 3*Math.pow(1-t,2)*t*c1x + 3*(1-t)*t*t*c2x + t*t*t*ex;
const y1 = Math.pow(1-t,3)*currentY + 3*Math.pow(1-t,2)*t*c1y + 3*(1-t)*t*t*c2y + t*t*t*ey;
const x2 = Math.pow(1-t2,3)*currentX + 3*Math.pow(1-t2,2)*t2*c1x + 3*(1-t2)*t2*t2*c2x + t2*t2*t2*ex;
const y2 = Math.pow(1-t2,3)*currentY + 3*Math.pow(1-t2,2)*t2*c1y + 3*(1-t2)*t2*t2*c2y + t2*t2*t2*ey;
entities += createDxfLine(scaleX(x1), flipY(y1), scaleX(x2), flipY(y2));
}
currentX = ex; currentY = ey;
}
break;
case "Z":
case "z":
if(currentX !== startX || currentY !== startY) {
entities += createDxfLine(scaleX(currentX), flipY(currentY), scaleX(startX), flipY(startY));
}
currentX = startX; currentY = startY;
break;
}
});
return entities;
}

63
symbols/js/app/utils.js Normal file
View File

@@ -0,0 +1,63 @@
// ============================================
// UTILS - Hilfsfunktionen
// ============================================
// ========== BENACHRICHTIGUNGEN ==========
function showNotification(message, type = 'success') {
const existing = document.querySelector('.notification');
if (existing) existing.remove();
const notification = document.createElement('div');
notification.className = `notification ${type}`;
notification.textContent = message;
document.body.appendChild(notification);
setTimeout(() => {
notification.classList.add('show');
}, 10);
setTimeout(() => {
notification.classList.remove('show');
setTimeout(() => notification.remove(), 300);
}, 2500);
}
// ========== HTML ESCAPING ==========
function escapeHtml(text) {
const div = document.createElement('div');
div.textContent = text;
return div.innerHTML;
}
// ========== SVG ZU CANVAS ==========
window.svgToCanvas = async function(svg, scale) {
var parser = new DOMParser();
var svgDoc = parser.parseFromString(svg, 'image/svg+xml');
var svgEl = svgDoc.documentElement;
var svgWidth = parseFloat(svgEl.getAttribute('width')) || parseFloat(svgEl.getAttribute('viewBox')?.split(' ')[2]) || 64;
var svgHeight = parseFloat(svgEl.getAttribute('height')) || parseFloat(svgEl.getAttribute('viewBox')?.split(' ')[3]) || 64;
if (!scale) scale = 2;
var canvasWidth = Math.round(svgWidth * scale);
var canvasHeight = Math.round(svgHeight * scale);
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
canvas.width = canvasWidth;
canvas.height = canvasHeight;
var img = new Image();
var svgBlob = new Blob([svg], { type: 'image/svg+xml;charset=utf-8' });
var url = URL.createObjectURL(svgBlob);
await new Promise(function(resolve, reject) {
img.onload = resolve;
img.onerror = reject;
img.src = url;
});
ctx.drawImage(img, 0, 0, canvasWidth, canvasHeight);
URL.revokeObjectURL(url);
return canvas;
};

View File

@@ -1,870 +0,0 @@
// ============================================
// SYMBOL-DEFINITIONEN
// Gutachter Symbolbibliothek v2.0
// ============================================
const SYMBOLS = {
// ========== SCHADENSARTEN ==========
schaeden: {
name: "Schadensarten",
icon: "🔥",
items: [
{
id: "wasserschaden",
name: "Wasserschaden",
filename: "wasserschaden_symbol.svg",
tags: ["wasser", "feuchtigkeit", "nass"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path d="M32 4 C32 4 12 28 12 42 C12 53 21 60 32 60 C43 60 52 53 52 42 C52 28 32 4 32 4 Z" fill="#3b82f6" stroke="#2563eb" stroke-width="2"/><ellipse cx="24" cy="38" rx="6" ry="10" fill="#93c5fd" opacity="0.5"/><circle cx="22" cy="32" r="3" fill="#dbeafe" opacity="0.7"/></svg>`
},
{
id: "brandschaden",
name: "Brandschaden",
filename: "brandschaden_symbol.svg",
tags: ["feuer", "brand", "flamme"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path d="M32 2 C32 2 18 18 18 34 C18 42 22 50 28 54 C24 48 24 40 28 34 C28 42 32 48 38 50 C34 44 36 36 40 32 C40 40 44 46 48 48 C50 44 52 38 52 34 C52 18 32 2 32 2 Z" fill="#f97316" stroke="#ea580c" stroke-width="1"/><path d="M32 14 C32 14 22 26 22 38 C22 44 26 50 32 52 C28 48 28 42 32 38 C32 44 36 48 40 48 C44 44 46 40 46 36 C46 26 32 14 32 14 Z" fill="#fb923c"/><path d="M32 26 C32 26 26 34 26 42 C26 46 28 50 32 52 C30 48 30 44 32 42 C34 46 36 48 38 48 C40 46 42 44 42 42 C42 34 32 26 32 26 Z" fill="#fbbf24"/><ellipse cx="32" cy="48" rx="4" ry="6" fill="#fef08a"/></svg>`
},
{
id: "rauchschaden",
name: "Rauchschaden",
filename: "rauchschaden_symbol.svg",
tags: ["rauch", "russ", "qualm"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="54" rx="14" ry="6" fill="#4b5563" opacity="0.9"/><ellipse cx="24" cy="42" rx="10" ry="8" fill="#6b7280" opacity="0.8"/><ellipse cx="40" cy="40" rx="12" ry="9" fill="#6b7280" opacity="0.75"/><ellipse cx="32" cy="28" rx="14" ry="10" fill="#9ca3af" opacity="0.7"/><ellipse cx="20" cy="24" rx="8" ry="7" fill="#9ca3af" opacity="0.6"/><ellipse cx="44" cy="26" rx="9" ry="7" fill="#9ca3af" opacity="0.6"/><ellipse cx="32" cy="14" rx="10" ry="7" fill="#d1d5db" opacity="0.5"/></svg>`
},
{
id: "leitungswasser",
name: "Leitungswasser / Rohrbruch",
filename: "leitungswasserschaden_symbol.svg",
tags: ["rohr", "leitung", "bruch", "wasser"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="2" y="24" width="22" height="16" rx="2" fill="#71717a" stroke="#52525b" stroke-width="2"/><rect x="20" y="22" width="6" height="20" rx="1" fill="#a1a1aa" stroke="#71717a" stroke-width="1"/><rect x="40" y="24" width="22" height="16" rx="2" fill="#71717a" stroke="#52525b" stroke-width="2"/><rect x="38" y="22" width="6" height="20" rx="1" fill="#a1a1aa" stroke="#71717a" stroke-width="1"/><path d="M26 22 L28 28 L26 32 L28 36 L26 42" stroke="#dc2626" stroke-width="2" fill="none" stroke-linecap="round"/><path d="M38 22 L36 28 L38 32 L36 36 L38 42" stroke="#dc2626" stroke-width="2" fill="none" stroke-linecap="round"/><path d="M30 28 Q34 20 38 10" stroke="#3b82f6" stroke-width="3" fill="none" stroke-linecap="round"/><path d="M31 32 Q36 32 42 28" stroke="#3b82f6" stroke-width="3" fill="none" stroke-linecap="round"/><path d="M30 36 Q34 44 38 54" stroke="#3b82f6" stroke-width="3" fill="none" stroke-linecap="round"/><circle cx="40" cy="8" r="3" fill="#60a5fa"/><circle cx="36" cy="56" r="3" fill="#60a5fa"/></svg>`
},
{
id: "schimmel",
name: "Schimmelschaden",
filename: "schimmelschaden_symbol.svg",
tags: ["schimmel", "pilz", "feucht", "sporen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="34" rx="24" ry="20" fill="#1f2937" opacity="0.3"/><ellipse cx="24" cy="28" rx="10" ry="8" fill="#166534"/><ellipse cx="38" cy="32" rx="12" ry="10" fill="#15803d"/><ellipse cx="28" cy="40" rx="9" ry="7" fill="#166534"/><ellipse cx="42" cy="24" rx="7" ry="6" fill="#14532d"/><ellipse cx="18" cy="38" rx="6" ry="5" fill="#15803d"/><circle cx="20" cy="26" r="2" fill="#052e16"/><circle cx="30" cy="30" r="2.5" fill="#052e16"/><circle cx="40" cy="28" r="2" fill="#052e16"/><circle cx="35" cy="38" r="2" fill="#052e16"/><circle cx="52" cy="12" r="10" fill="#dc2626"/><text x="52" y="17" font-family="Arial" font-size="14" font-weight="bold" fill="white" text-anchor="middle">!</text></svg>`
},
{
id: "sturm",
name: "Sturmschaden",
filename: "sturmschaden_symbol.svg",
tags: ["sturm", "wind", "dach", "unwetter"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="14" y="32" width="28" height="24" fill="#78716c" stroke="#57534e" stroke-width="2"/><polygon points="10,32 28,14 50,32" fill="#991b1b" stroke="#7f1d1d" stroke-width="2"/><polygon points="38,18 46,26 50,22 42,14" fill="#78716c" stroke="#57534e" stroke-width="1"/><rect x="18" y="38" width="8" height="8" fill="#bfdbfe" stroke="#57534e" stroke-width="1"/><rect x="30" y="38" width="8" height="8" fill="#bfdbfe" stroke="#57534e" stroke-width="1"/><rect x="24" y="46" width="8" height="10" fill="#44403c"/><path d="M48 10 Q56 10 54 6" stroke="#6b7280" stroke-width="3" fill="none" stroke-linecap="round"/><path d="M50 18 Q60 18 58 14" stroke="#6b7280" stroke-width="3" fill="none" stroke-linecap="round"/><path d="M52 26 Q62 26 60 22" stroke="#6b7280" stroke-width="2" fill="none" stroke-linecap="round"/><rect x="54" y="8" width="6" height="3" fill="#991b1b" transform="rotate(25 57 9)"/></svg>`
},
{
id: "einbruch",
name: "Einbruchschaden",
filename: "einbruchschaden_symbol.svg",
tags: ["einbruch", "diebstahl", "fenster", "tür"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="8" width="48" height="48" fill="none" stroke="#57534e" stroke-width="4" rx="2"/><line x1="32" y1="8" x2="32" y2="56" stroke="#57534e" stroke-width="3"/><line x1="8" y1="32" x2="56" y2="32" stroke="#57534e" stroke-width="3"/><polygon points="12,12 20,20 12,28 18,20" fill="#bfdbfe" stroke="#93c5fd" stroke-width="1"/><polygon points="20,14 28,12 24,24 16,20" fill="#dbeafe" stroke="#93c5fd" stroke-width="1"/><polygon points="10,36 18,42 12,52 8,44" fill="#bfdbfe" stroke="#93c5fd" stroke-width="1"/><rect x="36" y="16" width="4" height="32" rx="1" fill="#1f2937" transform="rotate(20 38 32)"/><rect x="34" y="14" width="8" height="6" rx="1" fill="#1f2937" transform="rotate(20 38 17)"/><circle cx="52" cy="52" r="8" fill="#dc2626"/><line x1="48" y1="48" x2="56" y2="56" stroke="white" stroke-width="2" stroke-linecap="round"/><line x1="56" y1="48" x2="48" y2="56" stroke="white" stroke-width="2" stroke-linecap="round"/></svg>`
},
{
id: "elektro",
name: "Elektroschaden",
filename: "elektroschaden_symbol.svg",
tags: ["elektro", "strom", "blitz", "kurzschluss"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="36,2 20,28 30,28 24,46 44,18 34,18" fill="#fbbf24" stroke="#f59e0b" stroke-width="2" stroke-linejoin="round"/><rect x="12" y="38" width="24" height="22" rx="3" fill="#e5e7eb" stroke="#9ca3af" stroke-width="2"/><circle cx="20" cy="46" r="3" fill="#1f2937"/><circle cx="28" cy="46" r="3" fill="#1f2937"/><rect x="22" y="52" width="4" height="4" rx="1" fill="#1f2937"/><line x1="40" y1="42" x2="48" y2="38" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/><line x1="42" y1="48" x2="52" y2="46" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/><line x1="40" y1="54" x2="50" y2="56" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/><polygon points="50,36 46,42 48,42 46,48 52,40 50,40" fill="#fbbf24"/></svg>`
},
{
id: "hagel",
name: "Hagelschaden",
filename: "hagelschaden_symbol.svg",
tags: ["hagel", "eis", "dellen", "unwetter"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="20" rx="24" ry="14" fill="#6b7280"/><ellipse cx="32" cy="18" rx="22" ry="12" fill="#9ca3af"/><circle cx="14" cy="36" r="6" fill="#e0f2fe" stroke="#7dd3fc" stroke-width="2"/><circle cx="32" cy="40" r="7" fill="#e0f2fe" stroke="#7dd3fc" stroke-width="2"/><circle cx="50" cy="34" r="5" fill="#e0f2fe" stroke="#7dd3fc" stroke-width="2"/><circle cx="22" cy="52" r="6" fill="#e0f2fe" stroke="#7dd3fc" stroke-width="2"/><circle cx="44" cy="50" r="5" fill="#e0f2fe" stroke="#7dd3fc" stroke-width="2"/><line x1="14" y1="26" x2="14" y2="30" stroke="#7dd3fc" stroke-width="2"/><line x1="32" y1="24" x2="32" y2="32" stroke="#7dd3fc" stroke-width="2"/><line x1="50" y1="26" x2="50" y2="28" stroke="#7dd3fc" stroke-width="2"/><line x1="22" y1="28" x2="22" y2="46" stroke="#7dd3fc" stroke-width="1.5"/><line x1="44" y1="28" x2="44" y2="44" stroke="#7dd3fc" stroke-width="1.5"/></svg>`
},
{
id: "vandalismus",
name: "Vandalismus",
filename: "vandalismus_symbol.svg",
tags: ["vandalismus", "graffiti", "zerstörung", "sachbeschädigung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="20" width="56" height="40" fill="#d6d3d1" stroke="#78716c" stroke-width="2"/><path d="M10 30 Q20 25 30 35 Q40 45 50 30" stroke="#dc2626" stroke-width="4" fill="none" stroke-linecap="round"/><path d="M15 45 Q25 55 35 40 Q45 25 55 45" stroke="#2563eb" stroke-width="3" fill="none" stroke-linecap="round"/><text x="32" y="54" font-family="Arial" font-size="10" fill="#000" text-anchor="middle" font-style="italic">TAG</text><circle cx="52" cy="12" r="10" fill="#dc2626"/><line x1="48" y1="8" x2="56" y2="16" stroke="white" stroke-width="2.5" stroke-linecap="round"/><line x1="56" y1="8" x2="48" y2="16" stroke="white" stroke-width="2.5" stroke-linecap="round"/></svg>`
}
]
},
// ========== WERKZEUGE & MARKIERUNGEN ==========
werkzeuge: {
name: "Werkzeuge & Markierungen",
icon: "🔧",
items: [
{
id: "massstab",
name: "Maßstab 1m",
filename: "massstab_1m.svg",
tags: ["maßstab", "meter", "lineal", "messen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="24" width="56" height="16" fill="#fef3c7" stroke="#f59e0b" stroke-width="2"/><g stroke="#92400e" stroke-width="1"><line x1="4" y1="28" x2="4" y2="36"/><line x1="10" y1="30" x2="10" y2="34"/><line x1="16" y1="30" x2="16" y2="34"/><line x1="22" y1="30" x2="22" y2="34"/><line x1="28" y1="30" x2="28" y2="34"/><line x1="32" y1="28" x2="32" y2="36"/><line x1="38" y1="30" x2="38" y2="34"/><line x1="44" y1="30" x2="44" y2="34"/><line x1="50" y1="30" x2="50" y2="34"/><line x1="56" y1="30" x2="56" y2="34"/><line x1="60" y1="28" x2="60" y2="36"/></g><text x="8" y="22" font-family="Arial" font-size="8" fill="#92400e">0</text><text x="28" y="22" font-family="Arial" font-size="8" fill="#92400e">50</text><text x="54" y="22" font-family="Arial" font-size="8" fill="#92400e">100</text><text x="32" y="48" font-family="Arial" font-size="10" fill="#92400e" text-anchor="middle">1 Meter</text></svg>`
},
{
id: "messpunkt",
name: "Messpunkt",
filename: "messpunkt.svg",
tags: ["messpunkt", "markierung", "punkt", "messen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="24" fill="none" stroke="#dc2626" stroke-width="3"/><circle cx="32" cy="32" r="16" fill="none" stroke="#dc2626" stroke-width="2"/><circle cx="32" cy="32" r="6" fill="#dc2626"/><line x1="32" y1="2" x2="32" y2="14" stroke="#dc2626" stroke-width="2"/><line x1="32" y1="50" x2="32" y2="62" stroke="#dc2626" stroke-width="2"/><line x1="2" y1="32" x2="14" y2="32" stroke="#dc2626" stroke-width="2"/><line x1="50" y1="32" x2="62" y2="32" stroke="#dc2626" stroke-width="2"/></svg>`
},
{
id: "kamera",
name: "Fotostandpunkt",
filename: "fotostandpunkt.svg",
tags: ["foto", "kamera", "standpunkt", "aufnahme"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="20" width="48" height="32" rx="4" fill="#374151" stroke="#1f2937" stroke-width="2"/><circle cx="32" cy="36" r="12" fill="#1f2937" stroke="#6b7280" stroke-width="2"/><circle cx="32" cy="36" r="8" fill="#3b82f6"/><circle cx="32" cy="36" r="4" fill="#1e3a5f"/><rect x="20" y="14" width="24" height="8" rx="2" fill="#4b5563"/><circle cx="48" cy="26" r="3" fill="#fbbf24"/><rect x="10" y="26" width="6" height="4" rx="1" fill="#6b7280"/></svg>`
},
{
id: "lupe",
name: "Detailbereich",
filename: "detailbereich.svg",
tags: ["detail", "lupe", "vergrößerung", "zoom"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="26" cy="26" r="20" fill="#dbeafe" stroke="#3b82f6" stroke-width="3"/><circle cx="26" cy="26" r="14" fill="white" stroke="#93c5fd" stroke-width="2"/><line x1="40" y1="40" x2="58" y2="58" stroke="#3b82f6" stroke-width="6" stroke-linecap="round"/><line x1="40" y1="40" x2="56" y2="56" stroke="#60a5fa" stroke-width="3" stroke-linecap="round"/><text x="26" y="30" font-family="Arial" font-size="14" fill="#3b82f6" text-anchor="middle" font-weight="bold">+</text></svg>`
},
{
id: "notiz",
name: "Notiz / Hinweis",
filename: "notiz_hinweis.svg",
tags: ["notiz", "hinweis", "anmerkung", "text"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path d="M8 4 L56 4 L56 48 L40 48 L40 60 L8 60 Z" fill="#fef3c7" stroke="#f59e0b" stroke-width="2"/><path d="M40 48 L56 48 L40 60 Z" fill="#fcd34d" stroke="#f59e0b" stroke-width="2"/><line x1="14" y1="16" x2="50" y2="16" stroke="#d97706" stroke-width="2"/><line x1="14" y1="26" x2="50" y2="26" stroke="#d97706" stroke-width="2"/><line x1="14" y1="36" x2="50" y2="36" stroke="#d97706" stroke-width="2"/><line x1="14" y1="46" x2="34" y2="46" stroke="#d97706" stroke-width="2"/></svg>`
},
{
id: "warnung",
name: "Warnung / Achtung",
filename: "warnung_achtung.svg",
tags: ["warnung", "achtung", "gefahr", "vorsicht"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="32,4 60,56 4,56" fill="#fbbf24" stroke="#f59e0b" stroke-width="2" stroke-linejoin="round"/><polygon points="32,10 54,52 10,52" fill="#fef3c7"/><text x="32" y="46" font-family="Arial" font-size="32" fill="#92400e" text-anchor="middle" font-weight="bold">!</text></svg>`
},
{
id: "info",
name: "Information",
filename: "information.svg",
tags: ["info", "information", "hinweis", "details"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="#3b82f6" stroke="#2563eb" stroke-width="2"/><circle cx="32" cy="16" r="4" fill="white"/><rect x="28" y="26" width="8" height="24" rx="2" fill="white"/></svg>`
},
{
id: "haken",
name: "Erledigt / OK",
filename: "erledigt_ok.svg",
tags: ["ok", "erledigt", "fertig", "haken", "check"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="#22c55e" stroke="#16a34a" stroke-width="2"/><polyline points="18,32 28,42 46,22" fill="none" stroke="white" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/></svg>`
},
{
id: "kreuz",
name: "Fehler / Mangel",
filename: "fehler_mangel.svg",
tags: ["fehler", "mangel", "falsch", "kreuz"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="#dc2626" stroke="#b91c1c" stroke-width="2"/><line x1="20" y1="20" x2="44" y2="44" stroke="white" stroke-width="6" stroke-linecap="round"/><line x1="44" y1="20" x2="20" y2="44" stroke="white" stroke-width="6" stroke-linecap="round"/></svg>`
},
{
id: "fragezeichen",
name: "Unklar / Prüfen",
filename: "unklar_pruefen.svg",
tags: ["unklar", "prüfen", "frage", "unbekannt"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="#f59e0b" stroke="#d97706" stroke-width="2"/><text x="32" y="44" font-family="Arial" font-size="36" fill="white" text-anchor="middle" font-weight="bold">?</text></svg>`
}
]
},
// ========== BAUTEILE ==========
bauteile: {
name: "Bauteile",
icon: "🏗️",
items: [
{
id: "fenster",
name: "Fenster",
filename: "bauteil_fenster.svg",
tags: ["fenster", "verglasung", "rahmen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="4" width="48" height="56" fill="#bfdbfe" stroke="#3b82f6" stroke-width="3"/><line x1="32" y1="4" x2="32" y2="60" stroke="#3b82f6" stroke-width="3"/><line x1="8" y1="32" x2="56" y2="32" stroke="#3b82f6" stroke-width="3"/><rect x="12" y="8" width="16" height="20" fill="#dbeafe"/><rect x="36" y="8" width="16" height="20" fill="#dbeafe"/><rect x="12" y="36" width="16" height="20" fill="#dbeafe"/><rect x="36" y="36" width="16" height="20" fill="#dbeafe"/><circle cx="28" cy="32" r="2" fill="#1e40af"/><circle cx="36" cy="32" r="2" fill="#1e40af"/></svg>`
},
{
id: "tuer",
name: "Tür",
filename: "bauteil_tuer.svg",
tags: ["tür", "türblatt", "eingang"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="12" y="4" width="40" height="56" fill="#92400e" stroke="#78350f" stroke-width="3"/><rect x="16" y="8" width="14" height="20" fill="#a16207" rx="1"/><rect x="34" y="8" width="14" height="20" fill="#a16207" rx="1"/><rect x="16" y="32" width="14" height="20" fill="#a16207" rx="1"/><rect x="34" y="32" width="14" height="20" fill="#a16207" rx="1"/><circle cx="44" cy="34" r="3" fill="#fbbf24" stroke="#92400e" stroke-width="1"/></svg>`
},
{
id: "wand",
name: "Wand (Mauerwerk)",
filename: "bauteil_wand.svg",
tags: ["wand", "mauer", "mauerwerk", "ziegel"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="#fca5a5" stroke="#dc2626" stroke-width="2"/><g stroke="#b91c1c" stroke-width="1"><line x1="4" y1="12" x2="60" y2="12"/><line x1="4" y1="20" x2="60" y2="20"/><line x1="4" y1="28" x2="60" y2="28"/><line x1="4" y1="36" x2="60" y2="36"/><line x1="4" y1="44" x2="60" y2="44"/><line x1="4" y1="52" x2="60" y2="52"/><line x1="18" y1="4" x2="18" y2="12"/><line x1="40" y1="4" x2="40" y2="12"/><line x1="8" y1="12" x2="8" y2="20"/><line x1="30" y1="12" x2="30" y2="20"/><line x1="52" y1="12" x2="52" y2="20"/><line x1="18" y1="20" x2="18" y2="28"/><line x1="40" y1="20" x2="40" y2="28"/><line x1="8" y1="28" x2="8" y2="36"/><line x1="30" y1="28" x2="30" y2="36"/><line x1="52" y1="28" x2="52" y2="36"/><line x1="18" y1="36" x2="18" y2="44"/><line x1="40" y1="36" x2="40" y2="44"/><line x1="8" y1="44" x2="8" y2="52"/><line x1="30" y1="44" x2="30" y2="52"/><line x1="52" y1="44" x2="52" y2="52"/><line x1="18" y1="52" x2="18" y2="60"/><line x1="40" y1="52" x2="40" y2="60"/></g></svg>`
},
{
id: "wand_beton",
name: "Wand (Beton)",
filename: "bauteil_wand_beton.svg",
tags: ["wand", "beton", "stahlbeton", "massiv"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="#9ca3af" stroke="#6b7280" stroke-width="2"/><circle cx="12" cy="14" r="2" fill="#6b7280" opacity="0.5"/><circle cx="28" cy="8" r="1.5" fill="#6b7280" opacity="0.4"/><circle cx="48" cy="18" r="2.5" fill="#6b7280" opacity="0.5"/><circle cx="8" cy="36" r="1.5" fill="#6b7280" opacity="0.4"/><circle cx="38" cy="28" r="2" fill="#6b7280" opacity="0.5"/><circle cx="54" cy="42" r="1.5" fill="#6b7280" opacity="0.4"/><circle cx="18" cy="48" r="2" fill="#6b7280" opacity="0.5"/><circle cx="44" cy="52" r="1.5" fill="#6b7280" opacity="0.4"/><circle cx="32" cy="44" r="2.5" fill="#6b7280" opacity="0.5"/></svg>`
},
{
id: "boden_fliesen",
name: "Fliesen",
filename: "bauteil_fliesen.svg",
tags: ["fliesen", "boden", "wand", "keramik", "kacheln"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="#e7e5e4" stroke="#78716c" stroke-width="2"/><g stroke="#a8a29e" stroke-width="2"><line x1="4" y1="18" x2="60" y2="18"/><line x1="4" y1="32" x2="60" y2="32"/><line x1="4" y1="46" x2="60" y2="46"/><line x1="18" y1="4" x2="18" y2="60"/><line x1="32" y1="4" x2="32" y2="60"/><line x1="46" y1="4" x2="46" y2="60"/></g><rect x="6" y="6" width="10" height="10" fill="#f5f5f4"/><rect x="34" y="20" width="10" height="10" fill="#f5f5f4"/><rect x="20" y="34" width="10" height="10" fill="#f5f5f4"/><rect x="48" y="48" width="10" height="10" fill="#f5f5f4"/></svg>`
},
{
id: "boden_parkett",
name: "Parkett / Holzboden",
filename: "bauteil_parkett.svg",
tags: ["parkett", "holz", "boden", "laminat", "dielen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="#d4a574" stroke="#92400e" stroke-width="2"/><g stroke="#b8860b" stroke-width="1"><rect x="4" y="4" width="14" height="28" fill="#deb887"/><rect x="18" y="4" width="14" height="28" fill="#d4a574"/><rect x="32" y="4" width="14" height="28" fill="#c9a066"/><rect x="46" y="4" width="14" height="28" fill="#deb887"/><rect x="4" y="32" width="14" height="28" fill="#c9a066"/><rect x="18" y="32" width="14" height="28" fill="#deb887"/><rect x="32" y="32" width="14" height="28" fill="#d4a574"/><rect x="46" y="32" width="14" height="28" fill="#c9a066"/></g></svg>`
},
{
id: "dach",
name: "Dach",
filename: "bauteil_dach.svg",
tags: ["dach", "dachstuhl", "ziegel", "bedachung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="32,4 4,40 60,40" fill="#991b1b" stroke="#7f1d1d" stroke-width="2"/><polygon points="32,10 10,38 54,38" fill="#b91c1c"/><g stroke="#7f1d1d" stroke-width="1"><line x1="12" y1="36" x2="52" y2="36"/><line x1="16" y1="32" x2="48" y2="32"/><line x1="20" y1="28" x2="44" y2="28"/><line x1="24" y1="24" x2="40" y2="24"/><line x1="28" y1="20" x2="36" y2="20"/></g><rect x="4" y="40" width="56" height="8" fill="#78716c" stroke="#57534e" stroke-width="1"/></svg>`
},
{
id: "treppe",
name: "Treppe",
filename: "bauteil_treppe.svg",
tags: ["treppe", "stufen", "aufgang", "treppenhaus"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><g fill="#d6d3d1" stroke="#78716c" stroke-width="2"><rect x="4" y="52" width="56" height="8"/><rect x="4" y="44" width="48" height="8"/><rect x="4" y="36" width="40" height="8"/><rect x="4" y="28" width="32" height="8"/><rect x="4" y="20" width="24" height="8"/><rect x="4" y="12" width="16" height="8"/><rect x="4" y="4" width="8" height="8"/></g><path d="M8 8 L8 56 L58 56" stroke="#57534e" stroke-width="3" fill="none"/></svg>`
},
{
id: "daemmung",
name: "Dämmung / Isolierung",
filename: "bauteil_daemmung.svg",
tags: ["dämmung", "isolierung", "wärme", "kälte"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="#fef08a" stroke="#eab308" stroke-width="2"/><g stroke="#ca8a04" stroke-width="1"><path d="M4 14 Q16 10 28 14 Q40 18 52 14 L60 14"/><path d="M4 24 Q14 28 26 24 Q38 20 50 24 L60 24"/><path d="M4 34 Q16 30 28 34 Q40 38 52 34 L60 34"/><path d="M4 44 Q14 48 26 44 Q38 40 50 44 L60 44"/><path d="M4 54 Q16 50 28 54 Q40 58 52 54 L60 54"/></g><circle cx="12" cy="20" r="2" fill="#facc15"/><circle cx="32" cy="30" r="2" fill="#facc15"/><circle cx="50" cy="40" r="2" fill="#facc15"/><circle cx="20" cy="50" r="2" fill="#facc15"/></svg>`
},
{
id: "rohr",
name: "Rohrleitung",
filename: "bauteil_rohr.svg",
tags: ["rohr", "leitung", "rohrleitung", "installation"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="26" width="56" height="12" fill="#6b7280" stroke="#4b5563" stroke-width="2"/><ellipse cx="4" cy="32" rx="3" ry="8" fill="#9ca3af" stroke="#4b5563" stroke-width="1"/><ellipse cx="60" cy="32" rx="3" ry="8" fill="#9ca3af" stroke="#4b5563" stroke-width="1"/><line x1="14" y1="26" x2="14" y2="38" stroke="#4b5563" stroke-width="1"/><line x1="32" y1="26" x2="32" y2="38" stroke="#4b5563" stroke-width="1"/><line x1="50" y1="26" x2="50" y2="38" stroke="#4b5563" stroke-width="1"/><rect x="20" y="22" width="8" height="20" rx="1" fill="#ef4444" stroke="#dc2626" stroke-width="1"/><polygon points="24,18 20,22 28,22" fill="#ef4444"/></svg>`
}
]
},
// ========== MÖBEL ==========
moebel: {
name: "Möbel",
icon: "🛋️",
items: [
{
id: "sofa",
name: "Sofa / Couch",
filename: "moebel_sofa.svg",
tags: ["sofa", "couch", "sitzmoebel", "wohnzimmer"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="24" width="56" height="28" rx="4" fill="#78716c" stroke="#57534e" stroke-width="2"/><rect x="8" y="20" width="48" height="20" rx="3" fill="#a8a29e" stroke="#78716c" stroke-width="1"/><rect x="4" y="28" width="10" height="20" rx="2" fill="#78716c" stroke="#57534e" stroke-width="1"/><rect x="50" y="28" width="10" height="20" rx="2" fill="#78716c" stroke="#57534e" stroke-width="1"/><rect x="6" y="52" width="6" height="6" rx="1" fill="#57534e"/><rect x="52" y="52" width="6" height="6" rx="1" fill="#57534e"/><line x1="22" y1="24" x2="22" y2="40" stroke="#57534e" stroke-width="1" opacity="0.5"/><line x1="42" y1="24" x2="42" y2="40" stroke="#57534e" stroke-width="1" opacity="0.5"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="12" width="56" height="40" fill="none" stroke="#000" stroke-width="1"/><rect x="4" y="12" width="8" height="40" fill="none" stroke="#000" stroke-width="1"/><rect x="52" y="12" width="8" height="40" fill="none" stroke="#000" stroke-width="1"/><line x1="22" y1="12" x2="22" y2="52" stroke="#000" stroke-width="0.5"/><line x1="42" y1="12" x2="42" y2="52" stroke="#000" stroke-width="0.5"/></svg>`
},
{
id: "tisch",
name: "Tisch",
filename: "moebel_tisch.svg",
tags: ["tisch", "esstisch", "schreibtisch", "möbel"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="20" width="52" height="6" rx="1" fill="#92400e" stroke="#78350f" stroke-width="2"/><rect x="10" y="26" width="4" height="30" fill="#a16207"/><rect x="50" y="26" width="4" height="30" fill="#a16207"/><rect x="8" y="54" width="8" height="4" rx="1" fill="#78350f"/><rect x="48" y="54" width="8" height="4" rx="1" fill="#78350f"/><line x1="14" y1="40" x2="50" y2="40" stroke="#a16207" stroke-width="2"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="8" width="52" height="48" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "stuhl",
name: "Stuhl",
filename: "moebel_stuhl.svg",
tags: ["stuhl", "sitz", "möbel", "esszimmer"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="14" y="4" width="36" height="32" rx="2" fill="#a16207" stroke="#92400e" stroke-width="2"/><rect x="18" y="8" width="28" height="24" rx="1" fill="#ca8a04"/><rect x="14" y="36" width="36" height="6" rx="1" fill="#92400e" stroke="#78350f" stroke-width="1"/><rect x="16" y="42" width="4" height="18" fill="#78350f"/><rect x="44" y="42" width="4" height="18" fill="#78350f"/><rect x="14" y="58" width="8" height="3" rx="1" fill="#57534e"/><rect x="42" y="58" width="8" height="3" rx="1" fill="#57534e"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="14" y="20" width="36" height="36" fill="none" stroke="#000" stroke-width="1"/><rect x="14" y="12" width="36" height="8" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "schrank",
name: "Schrank",
filename: "moebel_schrank.svg",
tags: ["schrank", "kleiderschrank", "möbel", "stauraum"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="4" width="52" height="54" rx="2" fill="#a16207" stroke="#92400e" stroke-width="2"/><line x1="32" y1="4" x2="32" y2="58" stroke="#92400e" stroke-width="2"/><rect x="10" y="8" width="18" height="46" fill="#ca8a04" rx="1"/><rect x="36" y="8" width="18" height="46" fill="#ca8a04" rx="1"/><circle cx="26" cy="32" r="2" fill="#78350f"/><circle cx="38" cy="32" r="2" fill="#78350f"/><rect x="8" y="58" width="6" height="4" fill="#78350f"/><rect x="50" y="58" width="6" height="4" fill="#78350f"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="8" width="52" height="48" fill="none" stroke="#000" stroke-width="1"/><line x1="32" y1="8" x2="32" y2="56" stroke="#000" stroke-width="0.5"/></svg>`
},
{
id: "bett",
name: "Bett",
filename: "moebel_bett.svg",
tags: ["bett", "schlafzimmer", "möbel", "schlafen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="20" width="56" height="32" rx="2" fill="#78716c" stroke="#57534e" stroke-width="2"/><rect x="8" y="16" width="14" height="12" rx="2" fill="#a8a29e" stroke="#78716c" stroke-width="1"/><rect x="42" y="16" width="14" height="12" rx="2" fill="#a8a29e" stroke="#78716c" stroke-width="1"/><rect x="8" y="24" width="48" height="24" fill="#e7e5e4" stroke="#d6d3d1" stroke-width="1"/><rect x="4" y="52" width="8" height="8" rx="1" fill="#57534e"/><rect x="52" y="52" width="8" height="8" rx="1" fill="#57534e"/><path d="M12 28 Q32 20 52 28" stroke="#d6d3d1" stroke-width="1" fill="none"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="none" stroke="#000" stroke-width="1"/><rect x="8" y="4" width="20" height="12" fill="none" stroke="#000" stroke-width="0.5"/><rect x="36" y="4" width="20" height="12" fill="none" stroke="#000" stroke-width="0.5"/></svg>`
},
{
id: "regal",
name: "Regal",
filename: "moebel_regal.svg",
tags: ["regal", "bücherregal", "möbel", "stauraum"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="4" width="48" height="56" fill="none" stroke="#92400e" stroke-width="3"/><line x1="8" y1="18" x2="56" y2="18" stroke="#92400e" stroke-width="2"/><line x1="8" y1="32" x2="56" y2="32" stroke="#92400e" stroke-width="2"/><line x1="8" y1="46" x2="56" y2="46" stroke="#92400e" stroke-width="2"/><rect x="12" y="8" width="6" height="8" fill="#3b82f6" rx="1"/><rect x="20" y="6" width="5" height="10" fill="#22c55e" rx="1"/><rect x="28" y="8" width="8" height="8" fill="#f59e0b" rx="1"/><rect x="14" y="22" width="10" height="8" fill="#a8a29e" rx="1"/><rect x="30" y="20" width="6" height="10" fill="#ef4444" rx="1"/><rect x="44" y="22" width="8" height="8" fill="#8b5cf6" rx="1"/><rect x="12" y="36" width="12" height="8" fill="#06b6d4" rx="1"/><rect x="40" y="34" width="10" height="10" fill="#ec4899" rx="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="8" width="48" height="12" fill="none" stroke="#000" stroke-width="1"/></svg>`
}
]
},
// ========== BAD / SANITÄR ==========
bad: {
name: "Bad & Sanitär",
icon: "🚿",
items: [
{
id: "wc",
name: "WC / Toilette",
filename: "wc_draufsicht.svg",
tags: ["wc", "toilette", "klo", "bad", "sanitär"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="38" rx="14" ry="18" fill="#f5f5f5" stroke="#333" stroke-width="2"/><ellipse cx="32" cy="38" rx="8" ry="12" fill="#e0f2fe" stroke="#333" stroke-width="1.5"/><rect x="22" y="8" width="20" height="16" rx="3" fill="#f5f5f5" stroke="#333" stroke-width="2"/><rect x="26" y="10" width="12" height="6" rx="1" fill="#ddd" stroke="#333" stroke-width="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="38" rx="14" ry="18" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="32" cy="38" rx="8" ry="12" fill="none" stroke="#000" stroke-width="1"/><rect x="22" y="8" width="20" height="16" rx="0" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "waschbecken",
name: "Waschbecken",
filename: "waschbecken_draufsicht.svg",
tags: ["waschbecken", "waschtisch", "bad", "sanitär", "lavabo"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="16" width="48" height="40" rx="4" fill="#f5f5f5" stroke="#333" stroke-width="2"/><ellipse cx="32" cy="36" rx="16" ry="12" fill="#e0f2fe" stroke="#333" stroke-width="1.5"/><circle cx="32" cy="40" r="3" fill="#333"/><rect x="30" y="18" width="4" height="8" rx="1" fill="#999" stroke="#333" stroke-width="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="16" width="48" height="40" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="32" cy="36" rx="16" ry="12" fill="none" stroke="#000" stroke-width="1"/><circle cx="32" cy="40" r="3" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "badewanne",
name: "Badewanne",
filename: "badewanne_draufsicht.svg",
tags: ["badewanne", "wanne", "bad", "sanitär", "baden"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="8" width="56" height="48" rx="8" fill="#f5f5f5" stroke="#333" stroke-width="2"/><rect x="8" y="12" width="48" height="40" rx="6" fill="#e0f2fe" stroke="#333" stroke-width="1.5"/><circle cx="50" cy="18" r="3" fill="#999" stroke="#333" stroke-width="1"/><ellipse cx="50" cy="46" rx="4" ry="3" fill="#999" stroke="#333" stroke-width="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="8" width="56" height="48" rx="0" fill="none" stroke="#000" stroke-width="1"/><rect x="8" y="12" width="48" height="40" rx="0" fill="none" stroke="#000" stroke-width="1"/><circle cx="50" cy="18" r="3" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="50" cy="46" rx="4" ry="3" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "dusche",
name: "Dusche",
filename: "dusche_draufsicht.svg",
tags: ["dusche", "duschwanne", "bad", "sanitär", "brause"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" rx="2" fill="#f5f5f5" stroke="#333" stroke-width="2"/><rect x="8" y="8" width="48" height="48" rx="1" fill="#e0f2fe" stroke="#333" stroke-width="1"/><circle cx="52" cy="12" r="4" fill="#999" stroke="#333" stroke-width="1"/><line x1="8" y1="8" x2="56" y2="56" stroke="#333" stroke-width="1" stroke-dasharray="4,2"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="none" stroke="#000" stroke-width="1"/><circle cx="52" cy="12" r="4" fill="none" stroke="#000" stroke-width="1"/><line x1="4" y1="4" x2="60" y2="60" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "bidet",
name: "Bidet",
filename: "bidet_draufsicht.svg",
tags: ["bidet", "bad", "sanitär"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="32" rx="14" ry="20" fill="#f5f5f5" stroke="#333" stroke-width="2"/><ellipse cx="32" cy="32" rx="8" ry="14" fill="#e0f2fe" stroke="#333" stroke-width="1.5"/><circle cx="32" cy="18" r="2" fill="#999" stroke="#333" stroke-width="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="32" rx="14" ry="20" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="32" cy="32" rx="8" ry="14" fill="none" stroke="#000" stroke-width="1"/><circle cx="32" cy="18" r="2" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "doppelwaschbecken",
name: "Doppelwaschbecken",
filename: "doppelwaschbecken_draufsicht.svg",
tags: ["doppelwaschbecken", "waschtisch", "bad", "sanitär", "doppel"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="2" y="16" width="60" height="32" rx="2" fill="#f5f5f5" stroke="#333" stroke-width="2"/><ellipse cx="18" cy="32" rx="10" ry="8" fill="#e0f2fe" stroke="#333" stroke-width="1"/><ellipse cx="46" cy="32" rx="10" ry="8" fill="#e0f2fe" stroke="#333" stroke-width="1"/><circle cx="18" cy="34" r="2" fill="#333"/><circle cx="46" cy="34" r="2" fill="#333"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="2" y="16" width="60" height="32" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="18" cy="32" rx="10" ry="8" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="46" cy="32" rx="10" ry="8" fill="none" stroke="#000" stroke-width="1"/><circle cx="18" cy="34" r="2" fill="none" stroke="#000" stroke-width="1"/><circle cx="46" cy="34" r="2" fill="none" stroke="#000" stroke-width="1"/></svg>`
}
]
},
// ========== KÜCHE ==========
kueche: {
name: "Küche",
icon: "🍳",
items: [
{
id: "herd",
name: "Herd / Kochfeld",
filename: "kueche_herd.svg",
tags: ["herd", "kochfeld", "küche", "kochen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" rx="3" fill="#1f2937" stroke="#111827" stroke-width="2"/><rect x="8" y="8" width="48" height="48" fill="#374151" rx="2"/><circle cx="22" cy="22" r="8" fill="#111827" stroke="#4b5563" stroke-width="2"/><circle cx="42" cy="22" r="8" fill="#111827" stroke="#4b5563" stroke-width="2"/><circle cx="22" cy="42" r="8" fill="#111827" stroke="#4b5563" stroke-width="2"/><circle cx="42" cy="42" r="8" fill="#111827" stroke="#4b5563" stroke-width="2"/><circle cx="22" cy="22" r="4" fill="#dc2626" opacity="0.8"/><circle cx="42" cy="22" r="4" fill="#dc2626" opacity="0.8"/><circle cx="22" cy="42" r="4" fill="#dc2626" opacity="0.4"/><circle cx="42" cy="42" r="4" fill="#dc2626" opacity="0.4"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="none" stroke="#000" stroke-width="1"/><circle cx="22" cy="22" r="8" fill="none" stroke="#000" stroke-width="1"/><circle cx="42" cy="22" r="8" fill="none" stroke="#000" stroke-width="1"/><circle cx="22" cy="42" r="8" fill="none" stroke="#000" stroke-width="1"/><circle cx="42" cy="42" r="8" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "spuele",
name: "Spüle",
filename: "kueche_spuele.svg",
tags: ["spüle", "waschbecken", "küche", "abwasch"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="8" width="56" height="48" rx="3" fill="#9ca3af" stroke="#6b7280" stroke-width="2"/><rect x="8" y="12" width="24" height="32" rx="4" fill="#4b5563" stroke="#374151" stroke-width="2"/><rect x="36" y="12" width="20" height="32" rx="4" fill="#4b5563" stroke="#374151" stroke-width="2"/><circle cx="20" cy="28" r="3" fill="#1f2937"/><ellipse cx="46" cy="28" rx="6" ry="8" fill="#374151"/><circle cx="50" cy="6" r="4" fill="#6b7280" stroke="#4b5563" stroke-width="1"/><rect x="48" y="6" width="4" height="8" fill="#6b7280"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="8" width="56" height="48" fill="none" stroke="#000" stroke-width="1"/><rect x="8" y="12" width="24" height="32" fill="none" stroke="#000" stroke-width="1"/><rect x="36" y="12" width="20" height="32" fill="none" stroke="#000" stroke-width="1"/><circle cx="20" cy="28" r="2" fill="none" stroke="#000" stroke-width="0.5"/></svg>`
},
{
id: "kuehlschrank",
name: "Kühlschrank",
filename: "kueche_kuehlschrank.svg",
tags: ["kühlschrank", "kühlen", "küche", "elektrogerät"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="10" y="4" width="44" height="56" rx="3" fill="#e5e7eb" stroke="#9ca3af" stroke-width="2"/><line x1="10" y1="24" x2="54" y2="24" stroke="#9ca3af" stroke-width="2"/><rect x="46" y="10" width="4" height="8" rx="1" fill="#6b7280"/><rect x="46" y="30" width="4" height="12" rx="1" fill="#6b7280"/><rect x="16" y="8" width="8" height="4" fill="#bfdbfe" rx="1"/><rect x="28" y="8" width="12" height="4" fill="#bfdbfe" rx="1"/><circle cx="20" cy="16" r="3" fill="#fbbf24"/><rect x="16" y="30" width="12" height="8" fill="#bbf7d0" rx="1"/><rect x="16" y="42" width="8" height="10" fill="#fecaca" rx="1"/><rect x="28" y="38" width="14" height="6" fill="#e0f2fe" rx="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="10" y="4" width="44" height="56" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "backofen",
name: "Backofen",
filename: "kueche_backofen.svg",
tags: ["backofen", "ofen", "küche", "backen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="4" width="52" height="56" rx="3" fill="#1f2937" stroke="#111827" stroke-width="2"/><rect x="10" y="18" width="44" height="38" rx="2" fill="#111827" stroke="#374151" stroke-width="2"/><rect x="14" y="22" width="36" height="30" fill="#292524" stroke="#4b5563" stroke-width="1"/><line x1="14" y1="32" x2="50" y2="32" stroke="#4b5563" stroke-width="1"/><line x1="14" y1="42" x2="50" y2="42" stroke="#4b5563" stroke-width="1"/><circle cx="16" cy="10" r="3" fill="#4b5563"/><circle cx="28" cy="10" r="3" fill="#4b5563"/><circle cx="40" cy="10" r="3" fill="#4b5563"/><rect x="46" y="8" width="8" height="4" rx="1" fill="#22c55e"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="4" width="52" height="56" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "spuelmaschine",
name: "Spülmaschine",
filename: "kueche_spuelmaschine.svg",
tags: ["spülmaschine", "geschirrspüler", "küche", "elektrogerät"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="4" width="52" height="56" rx="3" fill="#e5e7eb" stroke="#9ca3af" stroke-width="2"/><rect x="10" y="16" width="44" height="40" rx="2" fill="#d1d5db" stroke="#9ca3af" stroke-width="1"/><rect x="10" y="8" width="44" height="6" fill="#9ca3af" rx="1"/><circle cx="16" cy="11" r="2" fill="#4b5563"/><rect x="22" y="9" width="12" height="4" rx="1" fill="#1f2937"/><circle cx="48" cy="11" r="2" fill="#22c55e"/><ellipse cx="32" cy="36" rx="16" ry="14" fill="#93c5fd" stroke="#3b82f6" stroke-width="2"/><line x1="32" y1="24" x2="32" y2="48" stroke="#3b82f6" stroke-width="1" stroke-dasharray="2,2"/><line x1="18" y1="36" x2="46" y2="36" stroke="#3b82f6" stroke-width="1" stroke-dasharray="2,2"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="4" width="52" height="56" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "dunstabzug",
name: "Dunstabzugshaube",
filename: "kueche_dunstabzug.svg",
tags: ["dunstabzug", "dunstabzugshaube", "küche", "abzug"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="8,32 56,32 52,56 12,56" fill="#9ca3af" stroke="#6b7280" stroke-width="2"/><rect x="20" y="4" width="24" height="28" fill="#78716c" stroke="#57534e" stroke-width="2"/><rect x="24" y="8" width="16" height="8" fill="#57534e" rx="1"/><rect x="14" y="36" width="36" height="4" fill="#6b7280"/><rect x="14" y="44" width="36" height="4" fill="#6b7280"/><circle cx="32" cy="52" r="2" fill="#4b5563"/><g stroke="#d1d5db" stroke-width="1" opacity="0.5"><path d="M20 20 Q24 16 28 20" fill="none"/><path d="M36 20 Q40 16 44 20" fill="none"/></g></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="8" width="48" height="48" fill="none" stroke="#000" stroke-width="1"/></svg>`
}
]
},
// ========== PFEILE (dynamisch) ==========
pfeile: {
name: "Richtungspfeile (Rot)",
icon: "➡️",
items: []
},
// ========== KOMPASS (dynamisch) ==========
kompass: {
name: "Nordpfeile / Kompass",
icon: "🧭",
items: []
},
// ========== VERMESSUNG - STATUS ==========
vermessung_status: {
name: "Vermessung - Status",
icon: "📋",
items: [
{
id: "vm_reparatur",
name: "Reparatur",
filename: "vermessung_reparatur.svg",
tags: ["reparatur", "instandsetzung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="16" font-weight="bold" fill="#000" text-anchor="middle">R</text></svg>`
},
{
id: "vm_neu",
name: "Neu",
filename: "vermessung_neu.svg",
tags: ["neu", "neubau", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="16" font-weight="bold" fill="#000" text-anchor="middle">N</text></svg>`
},
{
id: "vm_bestand",
name: "Bestand",
filename: "vermessung_bestand.svg",
tags: ["bestand", "bestehend", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="16" font-weight="bold" fill="#000" text-anchor="middle">B</text></svg>`
},
{
id: "vm_abriss",
name: "Abriss",
filename: "vermessung_abriss.svg",
tags: ["abriss", "rückbau", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="none" stroke="#000" stroke-width="2"/><line x1="12" y1="12" x2="52" y2="52" stroke="#000" stroke-width="2"/><line x1="52" y1="12" x2="12" y2="52" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_geplant",
name: "Geplant",
filename: "vermessung_geplant.svg",
tags: ["geplant", "planung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="none" stroke="#000" stroke-width="2" stroke-dasharray="6,4"/><text x="32" y="38" font-family="Arial" font-size="16" font-weight="bold" fill="#000" text-anchor="middle">P</text></svg>`
}
]
},
// ========== VERMESSUNG - GRENZEN ==========
vermessung_grenzen: {
name: "Vermessung - Grenzen",
icon: "📍",
items: [
{
id: "vm_grundstuecksgrenze",
name: "Grundstücksgrenze",
filename: "vermessung_grundstuecksgrenze.svg",
tags: ["grundstück", "grenze", "flurstück", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="3"/><line x1="12" y1="26" x2="12" y2="38" stroke="#000" stroke-width="2"/><line x1="52" y1="26" x2="52" y2="38" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_grenzpunkt_vermarkt",
name: "Grenzpunkt (vermarkt)",
filename: "vermessung_grenzpunkt_vermarkt.svg",
tags: ["grenzpunkt", "grenzstein", "vermarkt", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="12" fill="#000"/><circle cx="32" cy="32" r="6" fill="#fff"/></svg>`
},
{
id: "vm_grenzpunkt_unvermarkt",
name: "Grenzpunkt (unvermarkt)",
filename: "vermessung_grenzpunkt_unvermarkt.svg",
tags: ["grenzpunkt", "unvermarkt", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="10" fill="none" stroke="#000" stroke-width="2"/><line x1="32" y1="22" x2="32" y2="42" stroke="#000" stroke-width="2"/><line x1="22" y1="32" x2="42" y2="32" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_flurstucksgrenze",
name: "Flurstücksgrenze",
filename: "vermessung_flurstucksgrenze.svg",
tags: ["flurstück", "grenze", "kataster", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="2" stroke-dasharray="12,4"/></svg>`
},
{
id: "vm_zaun",
name: "Zaun",
filename: "vermessung_zaun.svg",
tags: ["zaun", "einfriedung", "grenze", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="1.5"/><line x1="12" y1="24" x2="12" y2="40" stroke="#000" stroke-width="1.5"/><line x1="24" y1="24" x2="24" y2="40" stroke="#000" stroke-width="1.5"/><line x1="36" y1="24" x2="36" y2="40" stroke="#000" stroke-width="1.5"/><line x1="48" y1="24" x2="48" y2="40" stroke="#000" stroke-width="1.5"/><line x1="12" y1="28" x2="24" y2="28" stroke="#000" stroke-width="1"/><line x1="24" y1="28" x2="36" y2="28" stroke="#000" stroke-width="1"/><line x1="36" y1="28" x2="48" y2="28" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "vm_mauer",
name: "Mauer",
filename: "vermessung_mauer.svg",
tags: ["mauer", "wand", "einfriedung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="26" width="56" height="12" fill="none" stroke="#000" stroke-width="2"/><line x1="16" y1="26" x2="16" y2="38" stroke="#000" stroke-width="1"/><line x1="28" y1="26" x2="28" y2="38" stroke="#000" stroke-width="1"/><line x1="40" y1="26" x2="40" y2="38" stroke="#000" stroke-width="1"/><line x1="52" y1="26" x2="52" y2="38" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "vm_hecke",
name: "Hecke",
filename: "vermessung_hecke.svg",
tags: ["hecke", "grün", "bepflanzung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="38" x2="60" y2="38" stroke="#000" stroke-width="1.5"/><circle cx="12" cy="32" r="6" fill="none" stroke="#000" stroke-width="1.5"/><circle cx="24" cy="30" r="7" fill="none" stroke="#000" stroke-width="1.5"/><circle cx="38" cy="31" r="6" fill="none" stroke="#000" stroke-width="1.5"/><circle cx="52" cy="32" r="6" fill="none" stroke="#000" stroke-width="1.5"/></svg>`
}
]
},
// ========== VERMESSUNG - WASSER ==========
vermessung_wasser: {
name: "Vermessung - Wasser",
icon: "💧",
items: [
{
id: "vm_hydrant_unterflur",
name: "Hydrant (Unterflur)",
filename: "vermessung_hydrant_unterflur.svg",
tags: ["hydrant", "unterflur", "wasser", "feuerwehr", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="16" fill="none" stroke="#000" stroke-width="2"/><line x1="32" y1="16" x2="32" y2="48" stroke="#000" stroke-width="2"/><line x1="16" y1="32" x2="48" y2="32" stroke="#000" stroke-width="2"/><circle cx="32" cy="32" r="4" fill="#000"/></svg>`
},
{
id: "vm_hydrant_ueberflur",
name: "Hydrant (Überflur)",
filename: "vermessung_hydrant_ueberflur.svg",
tags: ["hydrant", "überflur", "wasser", "feuerwehr", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="32,8 48,24 48,56 16,56 16,24" fill="none" stroke="#000" stroke-width="2"/><line x1="16" y1="36" x2="48" y2="36" stroke="#000" stroke-width="2"/><circle cx="32" cy="46" r="4" fill="#000"/></svg>`
},
{
id: "vm_wasserschacht",
name: "Trinkwasserschacht",
filename: "vermessung_wasserschacht.svg",
tags: ["schacht", "wasser", "trinkwasser", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="16" y="16" width="32" height="32" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="14" font-weight="bold" fill="#000" text-anchor="middle">W</text></svg>`
},
{
id: "vm_wasserschieber",
name: "Wasserschieber",
filename: "vermessung_wasserschieber.svg",
tags: ["schieber", "absperrer", "wasser", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="8" y1="32" x2="56" y2="32" stroke="#000" stroke-width="2"/><line x1="32" y1="20" x2="32" y2="44" stroke="#000" stroke-width="3"/><circle cx="32" cy="32" r="6" fill="none" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_brunnen",
name: "Brunnen",
filename: "vermessung_brunnen.svg",
tags: ["brunnen", "wasser", "quelle", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="20" fill="none" stroke="#000" stroke-width="2"/><circle cx="32" cy="32" r="8" fill="none" stroke="#000" stroke-width="2"/><line x1="32" y1="12" x2="32" y2="4" stroke="#000" stroke-width="2"/><line x1="32" y1="52" x2="32" y2="60" stroke="#000" stroke-width="2"/><line x1="12" y1="32" x2="4" y2="32" stroke="#000" stroke-width="2"/><line x1="52" y1="32" x2="60" y2="32" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_wasserleitung",
name: "Wasserleitung",
filename: "vermessung_wasserleitung.svg",
tags: ["leitung", "wasser", "rohr", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="3"/><text x="32" y="24" font-family="Arial" font-size="10" fill="#000" text-anchor="middle">W</text></svg>`
}
]
},
// ========== VERMESSUNG - ABWASSER ==========
vermessung_abwasser: {
name: "Vermessung - Abwasser",
icon: "🚰",
items: [
{
id: "vm_abwasserschacht",
name: "Abwasserschacht",
filename: "vermessung_abwasserschacht.svg",
tags: ["schacht", "abwasser", "kanal", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="16" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="14" font-weight="bold" fill="#000" text-anchor="middle">S</text></svg>`
},
{
id: "vm_schacht_rund",
name: "Schacht (rund)",
filename: "vermessung_schacht_rund.svg",
tags: ["schacht", "rund", "kanal", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="18" fill="none" stroke="#000" stroke-width="2"/><circle cx="32" cy="32" r="10" fill="none" stroke="#000" stroke-width="1.5"/></svg>`
},
{
id: "vm_schacht_eckig",
name: "Schacht (eckig)",
filename: "vermessung_schacht_eckig.svg",
tags: ["schacht", "eckig", "kanal", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="14" y="14" width="36" height="36" fill="none" stroke="#000" stroke-width="2"/><rect x="22" y="22" width="20" height="20" fill="none" stroke="#000" stroke-width="1.5"/></svg>`
},
{
id: "vm_einlauf",
name: "Einlauf / Gully",
filename: "vermessung_einlauf.svg",
tags: ["einlauf", "gully", "straßenablauf", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="18" y="18" width="28" height="28" fill="none" stroke="#000" stroke-width="2"/><line x1="22" y1="26" x2="42" y2="26" stroke="#000" stroke-width="1.5"/><line x1="22" y1="32" x2="42" y2="32" stroke="#000" stroke-width="1.5"/><line x1="22" y1="38" x2="42" y2="38" stroke="#000" stroke-width="1.5"/></svg>`
},
{
id: "vm_abwasserleitung",
name: "Abwasserleitung",
filename: "vermessung_abwasserleitung.svg",
tags: ["leitung", "abwasser", "kanal", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="2" stroke-dasharray="10,4"/></svg>`
}
]
},
// ========== VERMESSUNG - STROM ==========
vermessung_strom: {
name: "Vermessung - Strom",
icon: "⚡",
items: [
{
id: "vm_hausanschluss_elektro",
name: "Hausanschluss Elektro",
filename: "vermessung_hausanschluss_elektro.svg",
tags: ["hausanschluss", "elektro", "strom", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="14" fill="none" stroke="#000" stroke-width="2"/><polygon points="32,20 26,34 30,34 28,44 38,30 34,30" fill="#000"/></svg>`
},
{
id: "vm_laterne",
name: "Laterne / Mast",
filename: "vermessung_laterne.svg",
tags: ["laterne", "mast", "beleuchtung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="4" fill="#000"/><line x1="32" y1="8" x2="32" y2="28" stroke="#000" stroke-width="2"/><line x1="32" y1="36" x2="32" y2="56" stroke="#000" stroke-width="2"/><line x1="8" y1="32" x2="28" y2="32" stroke="#000" stroke-width="2"/><line x1="36" y1="32" x2="56" y2="32" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_stromkabel",
name: "Stromkabel",
filename: "vermessung_stromkabel.svg",
tags: ["kabel", "strom", "leitung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="3"/><text x="32" y="24" font-family="Arial" font-size="10" fill="#000" text-anchor="middle">E</text></svg>`
},
{
id: "vm_schaltkasten",
name: "Schaltkasten",
filename: "vermessung_schaltkasten.svg",
tags: ["schaltkasten", "verteiler", "strom", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="16" y="12" width="32" height="40" fill="none" stroke="#000" stroke-width="2"/><line x1="16" y1="24" x2="48" y2="24" stroke="#000" stroke-width="1"/><text x="32" y="42" font-family="Arial" font-size="12" fill="#000" text-anchor="middle">E</text></svg>`
},
{
id: "vm_trafostation",
name: "Trafostation",
filename: "vermessung_trafostation.svg",
tags: ["trafo", "station", "umspanner", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="12" y="12" width="40" height="40" fill="none" stroke="#000" stroke-width="2"/><line x1="12" y1="12" x2="52" y2="52" stroke="#000" stroke-width="2"/><line x1="52" y1="12" x2="12" y2="52" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_mast_holz",
name: "Mast (Holz)",
filename: "vermessung_mast_holz.svg",
tags: ["mast", "holz", "freileitung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="12" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="14" fill="#000" text-anchor="middle">H</text></svg>`
},
{
id: "vm_mast_beton",
name: "Mast (Beton)",
filename: "vermessung_mast_beton.svg",
tags: ["mast", "beton", "freileitung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="12" fill="none" stroke="#000" stroke-width="2"/><circle cx="32" cy="32" r="6" fill="none" stroke="#000" stroke-width="1.5"/></svg>`
},
{
id: "vm_mast_stahl",
name: "Mast (Stahl)",
filename: "vermessung_mast_stahl.svg",
tags: ["mast", "stahl", "freileitung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="20" y="20" width="24" height="24" fill="none" stroke="#000" stroke-width="2"/></svg>`
}
]
},
// ========== VERMESSUNG - GAS ==========
vermessung_gas: {
name: "Vermessung - Gas",
icon: "🔥",
items: [
{
id: "vm_gasschieber",
name: "Gasschieber",
filename: "vermessung_gasschieber.svg",
tags: ["schieber", "absperrer", "gas", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="8" y1="32" x2="56" y2="32" stroke="#000" stroke-width="2" stroke-dasharray="8,4"/><line x1="32" y1="20" x2="32" y2="44" stroke="#000" stroke-width="3"/><text x="32" y="56" font-family="Arial" font-size="10" fill="#000" text-anchor="middle">G</text></svg>`
},
{
id: "vm_gasleitung",
name: "Gasleitung",
filename: "vermessung_gasleitung.svg",
tags: ["leitung", "gas", "rohr", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="2" stroke-dasharray="8,4"/><text x="32" y="24" font-family="Arial" font-size="10" fill="#000" text-anchor="middle">G</text></svg>`
},
{
id: "vm_hausanschluss_gas",
name: "Hausanschluss Gas",
filename: "vermessung_hausanschluss_gas.svg",
tags: ["hausanschluss", "gas", "anschluss", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="18" y="18" width="28" height="28" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="14" font-weight="bold" fill="#000" text-anchor="middle">G</text></svg>`
}
]
},
// ========== VERMESSUNG - VERKEHR ==========
vermessung_verkehr: {
name: "Vermessung - Verkehr",
icon: "🚗",
items: [
{
id: "vm_gleise",
name: "Gleise / Schienen",
filename: "vermessung_gleise.svg",
tags: ["gleise", "schienen", "bahn", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="24" x2="60" y2="24" stroke="#000" stroke-width="2"/><line x1="4" y1="40" x2="60" y2="40" stroke="#000" stroke-width="2"/><line x1="12" y1="24" x2="12" y2="40" stroke="#000" stroke-width="1.5"/><line x1="24" y1="24" x2="24" y2="40" stroke="#000" stroke-width="1.5"/><line x1="36" y1="24" x2="36" y2="40" stroke="#000" stroke-width="1.5"/><line x1="48" y1="24" x2="48" y2="40" stroke="#000" stroke-width="1.5"/></svg>`
},
{
id: "vm_prellbock",
name: "Prellbock",
filename: "vermessung_prellbock.svg",
tags: ["prellbock", "gleisende", "bahn", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="40" y2="32" stroke="#000" stroke-width="2"/><line x1="40" y1="16" x2="40" y2="48" stroke="#000" stroke-width="4"/><line x1="44" y1="20" x2="56" y2="20" stroke="#000" stroke-width="2"/><line x1="44" y1="44" x2="56" y2="44" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_verkehrsschild",
name: "Verkehrsschild",
filename: "vermessung_verkehrsschild.svg",
tags: ["schild", "verkehr", "straße", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="32" y1="36" x2="32" y2="60" stroke="#000" stroke-width="2"/><polygon points="32,8 50,24 50,36 14,36 14,24" fill="none" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_ampel",
name: "Ampel",
filename: "vermessung_ampel.svg",
tags: ["ampel", "signal", "verkehr", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="22" y="8" width="20" height="40" fill="none" stroke="#000" stroke-width="2"/><circle cx="32" cy="18" r="5" fill="none" stroke="#000" stroke-width="1.5"/><circle cx="32" cy="28" r="5" fill="none" stroke="#000" stroke-width="1.5"/><circle cx="32" cy="38" r="5" fill="none" stroke="#000" stroke-width="1.5"/><line x1="32" y1="48" x2="32" y2="60" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_haltestelle",
name: "Haltestelle",
filename: "vermessung_haltestelle.svg",
tags: ["haltestelle", "bus", "bahn", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="20" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="16" font-weight="bold" fill="#000" text-anchor="middle">H</text></svg>`
},
{
id: "vm_parkplatz",
name: "Parkplatz",
filename: "vermessung_parkplatz.svg",
tags: ["parkplatz", "parken", "stellplatz", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="14" y="14" width="36" height="36" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="40" font-family="Arial" font-size="24" font-weight="bold" fill="#000" text-anchor="middle">P</text></svg>`
},
{
id: "vm_schranke",
name: "Schranke",
filename: "vermessung_schranke.svg",
tags: ["schranke", "bahnübergang", "absperrung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="12" cy="32" r="6" fill="none" stroke="#000" stroke-width="2"/><line x1="18" y1="32" x2="60" y2="32" stroke="#000" stroke-width="3"/><line x1="24" y1="28" x2="28" y2="36" stroke="#000" stroke-width="2"/><line x1="36" y1="28" x2="40" y2="36" stroke="#000" stroke-width="2"/><line x1="48" y1="28" x2="52" y2="36" stroke="#000" stroke-width="2"/></svg>`
}
]
},
// ========== VERMESSUNG - TOPOGRAFIE ==========
vermessung_topografie: {
name: "Vermessung - Topografie",
icon: "🌳",
items: [
{
id: "vm_laubbaum",
name: "Laubbaum",
filename: "vermessung_laubbaum.svg",
tags: ["baum", "laubbaum", "vegetation", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="28" r="18" fill="none" stroke="#000" stroke-width="2"/><line x1="32" y1="46" x2="32" y2="60" stroke="#000" stroke-width="3"/></svg>`
},
{
id: "vm_nadelbaum",
name: "Nadelbaum",
filename: "vermessung_nadelbaum.svg",
tags: ["baum", "nadelbaum", "tanne", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="32,4 48,28 40,28 52,48 12,48 24,28 16,28" fill="none" stroke="#000" stroke-width="2"/><line x1="32" y1="48" x2="32" y2="60" stroke="#000" stroke-width="3"/></svg>`
},
{
id: "vm_gebaeude",
name: "Gebäude",
filename: "vermessung_gebaeude.svg",
tags: ["gebäude", "haus", "bauwerk", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="12" y="20" width="40" height="36" fill="none" stroke="#000" stroke-width="2"/><line x1="12" y1="20" x2="32" y2="8" stroke="#000" stroke-width="2"/><line x1="52" y1="20" x2="32" y2="8" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_hoehenpunkt",
name: "Höhenpunkt",
filename: "vermessung_hoehenpunkt.svg",
tags: ["höhe", "nivellement", "punkt", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="22" y1="42" x2="42" y2="42" stroke="#000" stroke-width="2"/><line x1="32" y1="42" x2="32" y2="22" stroke="#000" stroke-width="2"/><circle cx="32" cy="22" r="4" fill="#000"/><text x="46" y="28" font-family="Arial" font-size="10" fill="#000">HP</text></svg>`
},
{
id: "vm_boeschung",
name: "Böschung",
filename: "vermessung_boeschung.svg",
tags: ["böschung", "hang", "gelände", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="8" y1="20" x2="56" y2="20" stroke="#000" stroke-width="2"/><line x1="8" y1="44" x2="56" y2="44" stroke="#000" stroke-width="2"/><line x1="12" y1="20" x2="8" y2="44" stroke="#000" stroke-width="1"/><line x1="20" y1="20" x2="16" y2="44" stroke="#000" stroke-width="1"/><line x1="28" y1="20" x2="24" y2="44" stroke="#000" stroke-width="1"/><line x1="36" y1="20" x2="32" y2="44" stroke="#000" stroke-width="1"/><line x1="44" y1="20" x2="40" y2="44" stroke="#000" stroke-width="1"/><line x1="52" y1="20" x2="48" y2="44" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "vm_fliessrichtung",
name: "Fließrichtung",
filename: "vermessung_fliessrichtung.svg",
tags: ["fließrichtung", "gewässer", "bach", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="8" y1="32" x2="48" y2="32" stroke="#000" stroke-width="2"/><polygon points="56,32 44,24 44,40" fill="#000"/></svg>`
},
{
id: "vm_quelle",
name: "Quelle",
filename: "vermessung_quelle.svg",
tags: ["quelle", "wasser", "ursprung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="16" fill="none" stroke="#000" stroke-width="2"/><path d="M32 24 Q36 28 32 32 Q28 36 32 40" stroke="#000" stroke-width="2" fill="none"/></svg>`
},
{
id: "vm_durchlass",
name: "Durchlass",
filename: "vermessung_durchlass.svg",
tags: ["durchlass", "rohr", "kanal", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="24" width="48" height="16" fill="none" stroke="#000" stroke-width="2"/><line x1="8" y1="32" x2="0" y2="32" stroke="#000" stroke-width="2"/><line x1="56" y1="32" x2="64" y2="32" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_kilometerstein",
name: "Kilometerstein",
filename: "vermessung_kilometerstein.svg",
tags: ["kilometer", "stein", "markierung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="32,8 44,20 44,56 20,56 20,20" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="42" font-family="Arial" font-size="12" fill="#000" text-anchor="middle">km</text></svg>`
},
{
id: "vm_poller",
name: "Poller",
filename: "vermessung_poller.svg",
tags: ["poller", "absperrung", "pfosten", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="10" fill="#000"/><circle cx="32" cy="32" r="4" fill="#fff"/></svg>`
}
]
}
};
// ========== DYNAMISCHE PFEILE GENERIEREN ==========
function generateArrowSVG(angle) {
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><g transform="rotate(${angle}, 32, 32)"><rect x="28" y="20" width="8" height="30" fill="#dc2626"/><polygon points="32,4 16,24 24,24 24,20 40,20 40,24 48,24" fill="#dc2626"/></g></svg>`;
}
function generateNorthArrowSVG(angle) {
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><g transform="rotate(${angle}, 32, 32)"><circle cx="32" cy="32" r="28" fill="none" stroke="#374151" stroke-width="2"/><polygon points="32,6 26,32 32,28 38,32" fill="#dc2626"/><polygon points="32,58 26,32 32,36 38,32" fill="#ffffff" stroke="#374151" stroke-width="1"/><text x="32" y="18" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#1f2937" text-anchor="middle">N</text></g></svg>`;
}
// Pfeile und Kompass generieren
for (let angle = 0; angle < 360; angle += 15) {
SYMBOLS.pfeile.items.push({
id: `pfeil_${angle}`,
name: `${angle}°`,
filename: `richtungspfeil_rot_${angle}grad.svg`,
tags: ["pfeil", "richtung", "rot", angle.toString()],
svg: generateArrowSVG(angle)
});
SYMBOLS.kompass.items.push({
id: `nord_${angle}`,
name: `${angle}°`,
filename: `kompass_nord_${angle}grad.svg`,
tags: ["nord", "kompass", "himmelsrichtung", angle.toString()],
svg: generateNorthArrowSVG(angle)
});
}

View File

@@ -0,0 +1,80 @@
// ============================================
// SYMBOL-KATEGORIE: Bauteile
// ============================================
SYMBOLS.bauteile = {
name: "Bauteile",
icon: "🏗️",
items: [
{
id: "fenster",
name: "Fenster",
filename: "bauteil_fenster.svg",
tags: ["fenster", "verglasung", "rahmen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="4" width="48" height="56" fill="#bfdbfe" stroke="#3b82f6" stroke-width="3"/><line x1="32" y1="4" x2="32" y2="60" stroke="#3b82f6" stroke-width="3"/><line x1="8" y1="32" x2="56" y2="32" stroke="#3b82f6" stroke-width="3"/><rect x="12" y="8" width="16" height="20" fill="#dbeafe"/><rect x="36" y="8" width="16" height="20" fill="#dbeafe"/><rect x="12" y="36" width="16" height="20" fill="#dbeafe"/><rect x="36" y="36" width="16" height="20" fill="#dbeafe"/><circle cx="28" cy="32" r="2" fill="#1e40af"/><circle cx="36" cy="32" r="2" fill="#1e40af"/></svg>`
},
{
id: "tuer",
name: "Tür",
filename: "bauteil_tuer.svg",
tags: ["tür", "türblatt", "eingang"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="12" y="4" width="40" height="56" fill="#92400e" stroke="#78350f" stroke-width="3"/><rect x="16" y="8" width="14" height="20" fill="#a16207" rx="1"/><rect x="34" y="8" width="14" height="20" fill="#a16207" rx="1"/><rect x="16" y="32" width="14" height="20" fill="#a16207" rx="1"/><rect x="34" y="32" width="14" height="20" fill="#a16207" rx="1"/><circle cx="44" cy="34" r="3" fill="#fbbf24" stroke="#92400e" stroke-width="1"/></svg>`
},
{
id: "wand",
name: "Wand (Mauerwerk)",
filename: "bauteil_wand.svg",
tags: ["wand", "mauer", "mauerwerk", "ziegel"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="#fca5a5" stroke="#dc2626" stroke-width="2"/><g stroke="#b91c1c" stroke-width="1"><line x1="4" y1="12" x2="60" y2="12"/><line x1="4" y1="20" x2="60" y2="20"/><line x1="4" y1="28" x2="60" y2="28"/><line x1="4" y1="36" x2="60" y2="36"/><line x1="4" y1="44" x2="60" y2="44"/><line x1="4" y1="52" x2="60" y2="52"/><line x1="18" y1="4" x2="18" y2="12"/><line x1="40" y1="4" x2="40" y2="12"/><line x1="8" y1="12" x2="8" y2="20"/><line x1="30" y1="12" x2="30" y2="20"/><line x1="52" y1="12" x2="52" y2="20"/><line x1="18" y1="20" x2="18" y2="28"/><line x1="40" y1="20" x2="40" y2="28"/><line x1="8" y1="28" x2="8" y2="36"/><line x1="30" y1="28" x2="30" y2="36"/><line x1="52" y1="28" x2="52" y2="36"/><line x1="18" y1="36" x2="18" y2="44"/><line x1="40" y1="36" x2="40" y2="44"/><line x1="8" y1="44" x2="8" y2="52"/><line x1="30" y1="44" x2="30" y2="52"/><line x1="52" y1="44" x2="52" y2="52"/><line x1="18" y1="52" x2="18" y2="60"/><line x1="40" y1="52" x2="40" y2="60"/></g></svg>`
},
{
id: "wand_beton",
name: "Wand (Beton)",
filename: "bauteil_wand_beton.svg",
tags: ["wand", "beton", "stahlbeton", "massiv"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="#9ca3af" stroke="#6b7280" stroke-width="2"/><circle cx="12" cy="14" r="2" fill="#6b7280" opacity="0.5"/><circle cx="28" cy="8" r="1.5" fill="#6b7280" opacity="0.4"/><circle cx="48" cy="18" r="2.5" fill="#6b7280" opacity="0.5"/><circle cx="8" cy="36" r="1.5" fill="#6b7280" opacity="0.4"/><circle cx="38" cy="28" r="2" fill="#6b7280" opacity="0.5"/><circle cx="54" cy="42" r="1.5" fill="#6b7280" opacity="0.4"/><circle cx="18" cy="48" r="2" fill="#6b7280" opacity="0.5"/><circle cx="44" cy="52" r="1.5" fill="#6b7280" opacity="0.4"/><circle cx="32" cy="44" r="2.5" fill="#6b7280" opacity="0.5"/></svg>`
},
{
id: "boden_fliesen",
name: "Fliesen",
filename: "bauteil_fliesen.svg",
tags: ["fliesen", "boden", "wand", "keramik", "kacheln"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="#e7e5e4" stroke="#78716c" stroke-width="2"/><g stroke="#a8a29e" stroke-width="2"><line x1="4" y1="18" x2="60" y2="18"/><line x1="4" y1="32" x2="60" y2="32"/><line x1="4" y1="46" x2="60" y2="46"/><line x1="18" y1="4" x2="18" y2="60"/><line x1="32" y1="4" x2="32" y2="60"/><line x1="46" y1="4" x2="46" y2="60"/></g><rect x="6" y="6" width="10" height="10" fill="#f5f5f4"/><rect x="34" y="20" width="10" height="10" fill="#f5f5f4"/><rect x="20" y="34" width="10" height="10" fill="#f5f5f4"/><rect x="48" y="48" width="10" height="10" fill="#f5f5f4"/></svg>`
},
{
id: "boden_parkett",
name: "Parkett / Holzboden",
filename: "bauteil_parkett.svg",
tags: ["parkett", "holz", "boden", "laminat", "dielen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="#d4a574" stroke="#92400e" stroke-width="2"/><g stroke="#b8860b" stroke-width="1"><rect x="4" y="4" width="14" height="28" fill="#deb887"/><rect x="18" y="4" width="14" height="28" fill="#d4a574"/><rect x="32" y="4" width="14" height="28" fill="#c9a066"/><rect x="46" y="4" width="14" height="28" fill="#deb887"/><rect x="4" y="32" width="14" height="28" fill="#c9a066"/><rect x="18" y="32" width="14" height="28" fill="#deb887"/><rect x="32" y="32" width="14" height="28" fill="#d4a574"/><rect x="46" y="32" width="14" height="28" fill="#c9a066"/></g></svg>`
},
{
id: "dach",
name: "Dach",
filename: "bauteil_dach.svg",
tags: ["dach", "dachstuhl", "ziegel", "bedachung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="32,4 4,40 60,40" fill="#991b1b" stroke="#7f1d1d" stroke-width="2"/><polygon points="32,10 10,38 54,38" fill="#b91c1c"/><g stroke="#7f1d1d" stroke-width="1"><line x1="12" y1="36" x2="52" y2="36"/><line x1="16" y1="32" x2="48" y2="32"/><line x1="20" y1="28" x2="44" y2="28"/><line x1="24" y1="24" x2="40" y2="24"/><line x1="28" y1="20" x2="36" y2="20"/></g><rect x="4" y="40" width="56" height="8" fill="#78716c" stroke="#57534e" stroke-width="1"/></svg>`
},
{
id: "treppe",
name: "Treppe",
filename: "bauteil_treppe.svg",
tags: ["treppe", "stufen", "aufgang", "treppenhaus"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><g fill="#d6d3d1" stroke="#78716c" stroke-width="2"><rect x="4" y="52" width="56" height="8"/><rect x="4" y="44" width="48" height="8"/><rect x="4" y="36" width="40" height="8"/><rect x="4" y="28" width="32" height="8"/><rect x="4" y="20" width="24" height="8"/><rect x="4" y="12" width="16" height="8"/><rect x="4" y="4" width="8" height="8"/></g><path d="M8 8 L8 56 L58 56" stroke="#57534e" stroke-width="3" fill="none"/></svg>`
},
{
id: "daemmung",
name: "Dämmung / Isolierung",
filename: "bauteil_daemmung.svg",
tags: ["dämmung", "isolierung", "wärme", "kälte"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="#fef08a" stroke="#eab308" stroke-width="2"/><g stroke="#ca8a04" stroke-width="1"><path d="M4 14 Q16 10 28 14 Q40 18 52 14 L60 14"/><path d="M4 24 Q14 28 26 24 Q38 20 50 24 L60 24"/><path d="M4 34 Q16 30 28 34 Q40 38 52 34 L60 34"/><path d="M4 44 Q14 48 26 44 Q38 40 50 44 L60 44"/><path d="M4 54 Q16 50 28 54 Q40 58 52 54 L60 54"/></g><circle cx="12" cy="20" r="2" fill="#facc15"/><circle cx="32" cy="30" r="2" fill="#facc15"/><circle cx="50" cy="40" r="2" fill="#facc15"/><circle cx="20" cy="50" r="2" fill="#facc15"/></svg>`
},
{
id: "rohr",
name: "Rohrleitung",
filename: "bauteil_rohr.svg",
tags: ["rohr", "leitung", "rohrleitung", "installation"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="26" width="56" height="12" fill="#6b7280" stroke="#4b5563" stroke-width="2"/><ellipse cx="4" cy="32" rx="3" ry="8" fill="#9ca3af" stroke="#4b5563" stroke-width="1"/><ellipse cx="60" cy="32" rx="3" ry="8" fill="#9ca3af" stroke="#4b5563" stroke-width="1"/><line x1="14" y1="26" x2="14" y2="38" stroke="#4b5563" stroke-width="1"/><line x1="32" y1="26" x2="32" y2="38" stroke="#4b5563" stroke-width="1"/><line x1="50" y1="26" x2="50" y2="38" stroke="#4b5563" stroke-width="1"/><rect x="20" y="22" width="8" height="20" rx="1" fill="#ef4444" stroke="#dc2626" stroke-width="1"/><polygon points="24,18 20,22 28,22" fill="#ef4444"/></svg>`
}
]
};

View File

@@ -0,0 +1,52 @@
// ============================================
// SYMBOL-DEFINITIONEN - Index
// Gutachter Symbolbibliothek v2.0
// ============================================
// Globales SYMBOLS-Objekt, wird von den Modulen befüllt
const SYMBOLS = {};
// ========== DYNAMISCHE PFEILE GENERIEREN ==========
function generateArrowSVG(angle) {
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><g transform="rotate(${angle}, 32, 32)"><rect x="28" y="20" width="8" height="30" fill="#dc2626"/><polygon points="32,4 16,24 24,24 24,20 40,20 40,24 48,24" fill="#dc2626"/></g></svg>`;
}
function generateNorthArrowSVG(angle) {
return `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><g transform="rotate(${angle}, 32, 32)"><circle cx="32" cy="32" r="28" fill="none" stroke="#374151" stroke-width="2"/><polygon points="32,6 26,32 32,28 38,32" fill="#dc2626"/><polygon points="32,58 26,32 32,36 38,32" fill="#ffffff" stroke="#374151" stroke-width="1"/><text x="32" y="18" font-family="Arial, sans-serif" font-size="10" font-weight="bold" fill="#1f2937" text-anchor="middle">N</text></g></svg>`;
}
// Wird von init.js aufgerufen nachdem alle Kategorien geladen sind
function initDynamicSymbols() {
// Pfeile initialisieren
SYMBOLS.pfeile = {
name: "Richtungspfeile (Rot)",
icon: "➡️",
items: []
};
// Kompass initialisieren
SYMBOLS.kompass = {
name: "Nordpfeile / Kompass",
icon: "🧭",
items: []
};
// Pfeile und Kompass generieren
for (let angle = 0; angle < 360; angle += 15) {
SYMBOLS.pfeile.items.push({
id: `pfeil_${angle}`,
name: `${angle}°`,
filename: `richtungspfeil_rot_${angle}grad.svg`,
tags: ["pfeil", "richtung", "rot", angle.toString()],
svg: generateArrowSVG(angle)
});
SYMBOLS.kompass.items.push({
id: `nord_${angle}`,
name: `${angle}°`,
filename: `kompass_nord_${angle}grad.svg`,
tags: ["nord", "kompass", "himmelsrichtung", angle.toString()],
svg: generateNorthArrowSVG(angle)
});
}
}

View File

@@ -0,0 +1,10 @@
// ============================================
// SYMBOL-DEFINITIONEN - Initialisierung
// ============================================
// Dynamische Symbole generieren (Pfeile + Kompass)
document.addEventListener('DOMContentLoaded', function() {
if (typeof initDynamicSymbols === 'function') {
initDynamicSymbols();
}
});

View File

@@ -0,0 +1,58 @@
// ============================================
// SYMBOL-KATEGORIE: Möbel
// ============================================
SYMBOLS.moebel = {
name: "Möbel",
icon: "🛋️",
items: [
{
id: "sofa",
name: "Sofa / Couch",
filename: "moebel_sofa.svg",
tags: ["sofa", "couch", "sitzmoebel", "wohnzimmer"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="24" width="56" height="28" rx="4" fill="#78716c" stroke="#57534e" stroke-width="2"/><rect x="8" y="20" width="48" height="20" rx="3" fill="#a8a29e" stroke="#78716c" stroke-width="1"/><rect x="4" y="28" width="10" height="20" rx="2" fill="#78716c" stroke="#57534e" stroke-width="1"/><rect x="50" y="28" width="10" height="20" rx="2" fill="#78716c" stroke="#57534e" stroke-width="1"/><rect x="6" y="52" width="6" height="6" rx="1" fill="#57534e"/><rect x="52" y="52" width="6" height="6" rx="1" fill="#57534e"/><line x1="22" y1="24" x2="22" y2="40" stroke="#57534e" stroke-width="1" opacity="0.5"/><line x1="42" y1="24" x2="42" y2="40" stroke="#57534e" stroke-width="1" opacity="0.5"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="12" width="56" height="40" fill="none" stroke="#000" stroke-width="1"/><rect x="4" y="12" width="8" height="40" fill="none" stroke="#000" stroke-width="1"/><rect x="52" y="12" width="8" height="40" fill="none" stroke="#000" stroke-width="1"/><line x1="22" y1="12" x2="22" y2="52" stroke="#000" stroke-width="0.5"/><line x1="42" y1="12" x2="42" y2="52" stroke="#000" stroke-width="0.5"/></svg>`
},
{
id: "tisch",
name: "Tisch",
filename: "moebel_tisch.svg",
tags: ["tisch", "esstisch", "schreibtisch", "möbel"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="20" width="52" height="6" rx="1" fill="#92400e" stroke="#78350f" stroke-width="2"/><rect x="10" y="26" width="4" height="30" fill="#a16207"/><rect x="50" y="26" width="4" height="30" fill="#a16207"/><rect x="8" y="54" width="8" height="4" rx="1" fill="#78350f"/><rect x="48" y="54" width="8" height="4" rx="1" fill="#78350f"/><line x1="14" y1="40" x2="50" y2="40" stroke="#a16207" stroke-width="2"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="8" width="52" height="48" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "stuhl",
name: "Stuhl",
filename: "moebel_stuhl.svg",
tags: ["stuhl", "sitz", "möbel", "esszimmer"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="14" y="4" width="36" height="32" rx="2" fill="#a16207" stroke="#92400e" stroke-width="2"/><rect x="18" y="8" width="28" height="24" rx="1" fill="#ca8a04"/><rect x="14" y="36" width="36" height="6" rx="1" fill="#92400e" stroke="#78350f" stroke-width="1"/><rect x="16" y="42" width="4" height="18" fill="#78350f"/><rect x="44" y="42" width="4" height="18" fill="#78350f"/><rect x="14" y="58" width="8" height="3" rx="1" fill="#57534e"/><rect x="42" y="58" width="8" height="3" rx="1" fill="#57534e"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="14" y="20" width="36" height="36" fill="none" stroke="#000" stroke-width="1"/><rect x="14" y="12" width="36" height="8" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "schrank",
name: "Schrank",
filename: "moebel_schrank.svg",
tags: ["schrank", "kleiderschrank", "möbel", "stauraum"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="4" width="52" height="54" rx="2" fill="#a16207" stroke="#92400e" stroke-width="2"/><line x1="32" y1="4" x2="32" y2="58" stroke="#92400e" stroke-width="2"/><rect x="10" y="8" width="18" height="46" fill="#ca8a04" rx="1"/><rect x="36" y="8" width="18" height="46" fill="#ca8a04" rx="1"/><circle cx="26" cy="32" r="2" fill="#78350f"/><circle cx="38" cy="32" r="2" fill="#78350f"/><rect x="8" y="58" width="6" height="4" fill="#78350f"/><rect x="50" y="58" width="6" height="4" fill="#78350f"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="8" width="52" height="48" fill="none" stroke="#000" stroke-width="1"/><line x1="32" y1="8" x2="32" y2="56" stroke="#000" stroke-width="0.5"/></svg>`
},
{
id: "bett",
name: "Bett",
filename: "moebel_bett.svg",
tags: ["bett", "schlafzimmer", "möbel", "schlafen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="20" width="56" height="32" rx="2" fill="#78716c" stroke="#57534e" stroke-width="2"/><rect x="8" y="16" width="14" height="12" rx="2" fill="#a8a29e" stroke="#78716c" stroke-width="1"/><rect x="42" y="16" width="14" height="12" rx="2" fill="#a8a29e" stroke="#78716c" stroke-width="1"/><rect x="8" y="24" width="48" height="24" fill="#e7e5e4" stroke="#d6d3d1" stroke-width="1"/><rect x="4" y="52" width="8" height="8" rx="1" fill="#57534e"/><rect x="52" y="52" width="8" height="8" rx="1" fill="#57534e"/><path d="M12 28 Q32 20 52 28" stroke="#d6d3d1" stroke-width="1" fill="none"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="none" stroke="#000" stroke-width="1"/><rect x="8" y="4" width="20" height="12" fill="none" stroke="#000" stroke-width="0.5"/><rect x="36" y="4" width="20" height="12" fill="none" stroke="#000" stroke-width="0.5"/></svg>`
},
{
id: "regal",
name: "Regal",
filename: "moebel_regal.svg",
tags: ["regal", "bücherregal", "möbel", "stauraum"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="4" width="48" height="56" fill="none" stroke="#92400e" stroke-width="3"/><line x1="8" y1="18" x2="56" y2="18" stroke="#92400e" stroke-width="2"/><line x1="8" y1="32" x2="56" y2="32" stroke="#92400e" stroke-width="2"/><line x1="8" y1="46" x2="56" y2="46" stroke="#92400e" stroke-width="2"/><rect x="12" y="8" width="6" height="8" fill="#3b82f6" rx="1"/><rect x="20" y="6" width="5" height="10" fill="#22c55e" rx="1"/><rect x="28" y="8" width="8" height="8" fill="#f59e0b" rx="1"/><rect x="14" y="22" width="10" height="8" fill="#a8a29e" rx="1"/><rect x="30" y="20" width="6" height="10" fill="#ef4444" rx="1"/><rect x="44" y="22" width="8" height="8" fill="#8b5cf6" rx="1"/><rect x="12" y="36" width="12" height="8" fill="#06b6d4" rx="1"/><rect x="40" y="34" width="10" height="10" fill="#ec4899" rx="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="8" width="48" height="12" fill="none" stroke="#000" stroke-width="1"/></svg>`
}
]
};

View File

@@ -0,0 +1,115 @@
// ============================================
// SYMBOL-KATEGORIE: Bad & Sanitär + Küche
// ============================================
// Bad & Sanitär
SYMBOLS.bad = {
name: "Bad & Sanitär",
icon: "🚿",
items: [
{
id: "wc",
name: "WC / Toilette",
filename: "wc_draufsicht.svg",
tags: ["wc", "toilette", "klo", "bad", "sanitär"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="38" rx="14" ry="18" fill="#f5f5f5" stroke="#333" stroke-width="2"/><ellipse cx="32" cy="38" rx="8" ry="12" fill="#e0f2fe" stroke="#333" stroke-width="1.5"/><rect x="22" y="8" width="20" height="16" rx="3" fill="#f5f5f5" stroke="#333" stroke-width="2"/><rect x="26" y="10" width="12" height="6" rx="1" fill="#ddd" stroke="#333" stroke-width="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="38" rx="14" ry="18" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="32" cy="38" rx="8" ry="12" fill="none" stroke="#000" stroke-width="1"/><rect x="22" y="8" width="20" height="16" rx="0" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "waschbecken",
name: "Waschbecken",
filename: "waschbecken_draufsicht.svg",
tags: ["waschbecken", "waschtisch", "bad", "sanitär", "lavabo"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="16" width="48" height="40" rx="4" fill="#f5f5f5" stroke="#333" stroke-width="2"/><ellipse cx="32" cy="36" rx="16" ry="12" fill="#e0f2fe" stroke="#333" stroke-width="1.5"/><circle cx="32" cy="40" r="3" fill="#333"/><rect x="30" y="18" width="4" height="8" rx="1" fill="#999" stroke="#333" stroke-width="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="16" width="48" height="40" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="32" cy="36" rx="16" ry="12" fill="none" stroke="#000" stroke-width="1"/><circle cx="32" cy="40" r="3" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "badewanne",
name: "Badewanne",
filename: "badewanne_draufsicht.svg",
tags: ["badewanne", "wanne", "bad", "sanitär", "baden"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="8" width="56" height="48" rx="8" fill="#f5f5f5" stroke="#333" stroke-width="2"/><rect x="8" y="12" width="48" height="40" rx="6" fill="#e0f2fe" stroke="#333" stroke-width="1.5"/><circle cx="50" cy="18" r="3" fill="#999" stroke="#333" stroke-width="1"/><ellipse cx="50" cy="46" rx="4" ry="3" fill="#999" stroke="#333" stroke-width="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="8" width="56" height="48" rx="0" fill="none" stroke="#000" stroke-width="1"/><rect x="8" y="12" width="48" height="40" rx="0" fill="none" stroke="#000" stroke-width="1"/><circle cx="50" cy="18" r="3" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="50" cy="46" rx="4" ry="3" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "dusche",
name: "Dusche",
filename: "dusche_draufsicht.svg",
tags: ["dusche", "duschwanne", "bad", "sanitär", "brause"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" rx="2" fill="#f5f5f5" stroke="#333" stroke-width="2"/><rect x="8" y="8" width="48" height="48" rx="1" fill="#e0f2fe" stroke="#333" stroke-width="1"/><circle cx="52" cy="12" r="4" fill="#999" stroke="#333" stroke-width="1"/><line x1="8" y1="8" x2="56" y2="56" stroke="#333" stroke-width="1" stroke-dasharray="4,2"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="none" stroke="#000" stroke-width="1"/><circle cx="52" cy="12" r="4" fill="none" stroke="#000" stroke-width="1"/><line x1="4" y1="4" x2="60" y2="60" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "bidet",
name: "Bidet",
filename: "bidet_draufsicht.svg",
tags: ["bidet", "bad", "sanitär"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="32" rx="14" ry="20" fill="#f5f5f5" stroke="#333" stroke-width="2"/><ellipse cx="32" cy="32" rx="8" ry="14" fill="#e0f2fe" stroke="#333" stroke-width="1.5"/><circle cx="32" cy="18" r="2" fill="#999" stroke="#333" stroke-width="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="32" rx="14" ry="20" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="32" cy="32" rx="8" ry="14" fill="none" stroke="#000" stroke-width="1"/><circle cx="32" cy="18" r="2" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "doppelwaschbecken",
name: "Doppelwaschbecken",
filename: "doppelwaschbecken_draufsicht.svg",
tags: ["doppelwaschbecken", "waschtisch", "bad", "sanitär", "doppel"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="2" y="16" width="60" height="32" rx="2" fill="#f5f5f5" stroke="#333" stroke-width="2"/><ellipse cx="18" cy="32" rx="10" ry="8" fill="#e0f2fe" stroke="#333" stroke-width="1"/><ellipse cx="46" cy="32" rx="10" ry="8" fill="#e0f2fe" stroke="#333" stroke-width="1"/><circle cx="18" cy="34" r="2" fill="#333"/><circle cx="46" cy="34" r="2" fill="#333"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="2" y="16" width="60" height="32" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="18" cy="32" rx="10" ry="8" fill="none" stroke="#000" stroke-width="1"/><ellipse cx="46" cy="32" rx="10" ry="8" fill="none" stroke="#000" stroke-width="1"/><circle cx="18" cy="34" r="2" fill="none" stroke="#000" stroke-width="1"/><circle cx="46" cy="34" r="2" fill="none" stroke="#000" stroke-width="1"/></svg>`
}
]
};
// Küche
SYMBOLS.kueche = {
name: "Küche",
icon: "🍳",
items: [
{
id: "herd",
name: "Herd / Kochfeld",
filename: "kueche_herd.svg",
tags: ["herd", "kochfeld", "küche", "kochen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" rx="3" fill="#1f2937" stroke="#111827" stroke-width="2"/><rect x="8" y="8" width="48" height="48" fill="#374151" rx="2"/><circle cx="22" cy="22" r="8" fill="#111827" stroke="#4b5563" stroke-width="2"/><circle cx="42" cy="22" r="8" fill="#111827" stroke="#4b5563" stroke-width="2"/><circle cx="22" cy="42" r="8" fill="#111827" stroke="#4b5563" stroke-width="2"/><circle cx="42" cy="42" r="8" fill="#111827" stroke="#4b5563" stroke-width="2"/><circle cx="22" cy="22" r="4" fill="#dc2626" opacity="0.8"/><circle cx="42" cy="22" r="4" fill="#dc2626" opacity="0.8"/><circle cx="22" cy="42" r="4" fill="#dc2626" opacity="0.4"/><circle cx="42" cy="42" r="4" fill="#dc2626" opacity="0.4"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="4" width="56" height="56" fill="none" stroke="#000" stroke-width="1"/><circle cx="22" cy="22" r="8" fill="none" stroke="#000" stroke-width="1"/><circle cx="42" cy="22" r="8" fill="none" stroke="#000" stroke-width="1"/><circle cx="22" cy="42" r="8" fill="none" stroke="#000" stroke-width="1"/><circle cx="42" cy="42" r="8" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "spuele",
name: "Spüle",
filename: "kueche_spuele.svg",
tags: ["spüle", "waschbecken", "küche", "abwasch"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="8" width="56" height="48" rx="3" fill="#9ca3af" stroke="#6b7280" stroke-width="2"/><rect x="8" y="12" width="24" height="32" rx="4" fill="#4b5563" stroke="#374151" stroke-width="2"/><rect x="36" y="12" width="20" height="32" rx="4" fill="#4b5563" stroke="#374151" stroke-width="2"/><circle cx="20" cy="28" r="3" fill="#1f2937"/><ellipse cx="46" cy="28" rx="6" ry="8" fill="#374151"/><circle cx="50" cy="6" r="4" fill="#6b7280" stroke="#4b5563" stroke-width="1"/><rect x="48" y="6" width="4" height="8" fill="#6b7280"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="8" width="56" height="48" fill="none" stroke="#000" stroke-width="1"/><rect x="8" y="12" width="24" height="32" fill="none" stroke="#000" stroke-width="1"/><rect x="36" y="12" width="20" height="32" fill="none" stroke="#000" stroke-width="1"/><circle cx="20" cy="28" r="2" fill="none" stroke="#000" stroke-width="0.5"/></svg>`
},
{
id: "kuehlschrank",
name: "Kühlschrank",
filename: "kueche_kuehlschrank.svg",
tags: ["kühlschrank", "kühlen", "küche", "elektrogerät"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="10" y="4" width="44" height="56" rx="3" fill="#e5e7eb" stroke="#9ca3af" stroke-width="2"/><line x1="10" y1="24" x2="54" y2="24" stroke="#9ca3af" stroke-width="2"/><rect x="46" y="10" width="4" height="8" rx="1" fill="#6b7280"/><rect x="46" y="30" width="4" height="12" rx="1" fill="#6b7280"/><rect x="16" y="8" width="8" height="4" fill="#bfdbfe" rx="1"/><rect x="28" y="8" width="12" height="4" fill="#bfdbfe" rx="1"/><circle cx="20" cy="16" r="3" fill="#fbbf24"/><rect x="16" y="30" width="12" height="8" fill="#bbf7d0" rx="1"/><rect x="16" y="42" width="8" height="10" fill="#fecaca" rx="1"/><rect x="28" y="38" width="14" height="6" fill="#e0f2fe" rx="1"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="10" y="4" width="44" height="56" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "backofen",
name: "Backofen",
filename: "kueche_backofen.svg",
tags: ["backofen", "ofen", "küche", "backen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="4" width="52" height="56" rx="3" fill="#1f2937" stroke="#111827" stroke-width="2"/><rect x="10" y="18" width="44" height="38" rx="2" fill="#111827" stroke="#374151" stroke-width="2"/><rect x="14" y="22" width="36" height="30" fill="#292524" stroke="#4b5563" stroke-width="1"/><line x1="14" y1="32" x2="50" y2="32" stroke="#4b5563" stroke-width="1"/><line x1="14" y1="42" x2="50" y2="42" stroke="#4b5563" stroke-width="1"/><circle cx="16" cy="10" r="3" fill="#4b5563"/><circle cx="28" cy="10" r="3" fill="#4b5563"/><circle cx="40" cy="10" r="3" fill="#4b5563"/><rect x="46" y="8" width="8" height="4" rx="1" fill="#22c55e"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="4" width="52" height="56" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "spuelmaschine",
name: "Spülmaschine",
filename: "kueche_spuelmaschine.svg",
tags: ["spülmaschine", "geschirrspüler", "küche", "elektrogerät"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="4" width="52" height="56" rx="3" fill="#e5e7eb" stroke="#9ca3af" stroke-width="2"/><rect x="10" y="16" width="44" height="40" rx="2" fill="#d1d5db" stroke="#9ca3af" stroke-width="1"/><rect x="10" y="8" width="44" height="6" fill="#9ca3af" rx="1"/><circle cx="16" cy="11" r="2" fill="#4b5563"/><rect x="22" y="9" width="12" height="4" rx="1" fill="#1f2937"/><circle cx="48" cy="11" r="2" fill="#22c55e"/><ellipse cx="32" cy="36" rx="16" ry="14" fill="#93c5fd" stroke="#3b82f6" stroke-width="2"/><line x1="32" y1="24" x2="32" y2="48" stroke="#3b82f6" stroke-width="1" stroke-dasharray="2,2"/><line x1="18" y1="36" x2="46" y2="36" stroke="#3b82f6" stroke-width="1" stroke-dasharray="2,2"/></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="6" y="4" width="52" height="56" fill="none" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "dunstabzug",
name: "Dunstabzugshaube",
filename: "kueche_dunstabzug.svg",
tags: ["dunstabzug", "dunstabzugshaube", "küche", "abzug"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="8,32 56,32 52,56 12,56" fill="#9ca3af" stroke="#6b7280" stroke-width="2"/><rect x="20" y="4" width="24" height="28" fill="#78716c" stroke="#57534e" stroke-width="2"/><rect x="24" y="8" width="16" height="8" fill="#57534e" rx="1"/><rect x="14" y="36" width="36" height="4" fill="#6b7280"/><rect x="14" y="44" width="36" height="4" fill="#6b7280"/><circle cx="32" cy="52" r="2" fill="#4b5563"/><g stroke="#d1d5db" stroke-width="1" opacity="0.5"><path d="M20 20 Q24 16 28 20" fill="none"/><path d="M36 20 Q40 16 44 20" fill="none"/></g></svg>`,
dxfSvg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="8" width="48" height="48" fill="none" stroke="#000" stroke-width="1"/></svg>`
}
]
};

View File

@@ -0,0 +1,80 @@
// ============================================
// SYMBOL-KATEGORIE: Schadensarten
// ============================================
SYMBOLS.schaeden = {
name: "Schadensarten",
icon: "🔥",
items: [
{
id: "wasserschaden",
name: "Wasserschaden",
filename: "wasserschaden_symbol.svg",
tags: ["wasser", "feuchtigkeit", "nass"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path d="M32 4 C32 4 12 28 12 42 C12 53 21 60 32 60 C43 60 52 53 52 42 C52 28 32 4 32 4 Z" fill="#3b82f6" stroke="#2563eb" stroke-width="2"/><ellipse cx="24" cy="38" rx="6" ry="10" fill="#93c5fd" opacity="0.5"/><circle cx="22" cy="32" r="3" fill="#dbeafe" opacity="0.7"/></svg>`
},
{
id: "brandschaden",
name: "Brandschaden",
filename: "brandschaden_symbol.svg",
tags: ["feuer", "brand", "flamme"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path d="M32 2 C32 2 18 18 18 34 C18 42 22 50 28 54 C24 48 24 40 28 34 C28 42 32 48 38 50 C34 44 36 36 40 32 C40 40 44 46 48 48 C50 44 52 38 52 34 C52 18 32 2 32 2 Z" fill="#f97316" stroke="#ea580c" stroke-width="1"/><path d="M32 14 C32 14 22 26 22 38 C22 44 26 50 32 52 C28 48 28 42 32 38 C32 44 36 48 40 48 C44 44 46 40 46 36 C46 26 32 14 32 14 Z" fill="#fb923c"/><path d="M32 26 C32 26 26 34 26 42 C26 46 28 50 32 52 C30 48 30 44 32 42 C34 46 36 48 38 48 C40 46 42 44 42 42 C42 34 32 26 32 26 Z" fill="#fbbf24"/><ellipse cx="32" cy="48" rx="4" ry="6" fill="#fef08a"/></svg>`
},
{
id: "rauchschaden",
name: "Rauchschaden",
filename: "rauchschaden_symbol.svg",
tags: ["rauch", "russ", "qualm"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="54" rx="14" ry="6" fill="#4b5563" opacity="0.9"/><ellipse cx="24" cy="42" rx="10" ry="8" fill="#6b7280" opacity="0.8"/><ellipse cx="40" cy="40" rx="12" ry="9" fill="#6b7280" opacity="0.75"/><ellipse cx="32" cy="28" rx="14" ry="10" fill="#9ca3af" opacity="0.7"/><ellipse cx="20" cy="24" rx="8" ry="7" fill="#9ca3af" opacity="0.6"/><ellipse cx="44" cy="26" rx="9" ry="7" fill="#9ca3af" opacity="0.6"/><ellipse cx="32" cy="14" rx="10" ry="7" fill="#d1d5db" opacity="0.5"/></svg>`
},
{
id: "leitungswasser",
name: "Leitungswasser / Rohrbruch",
filename: "leitungswasserschaden_symbol.svg",
tags: ["rohr", "leitung", "bruch", "wasser"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="2" y="24" width="22" height="16" rx="2" fill="#71717a" stroke="#52525b" stroke-width="2"/><rect x="20" y="22" width="6" height="20" rx="1" fill="#a1a1aa" stroke="#71717a" stroke-width="1"/><rect x="40" y="24" width="22" height="16" rx="2" fill="#71717a" stroke="#52525b" stroke-width="2"/><rect x="38" y="22" width="6" height="20" rx="1" fill="#a1a1aa" stroke="#71717a" stroke-width="1"/><path d="M26 22 L28 28 L26 32 L28 36 L26 42" stroke="#dc2626" stroke-width="2" fill="none" stroke-linecap="round"/><path d="M38 22 L36 28 L38 32 L36 36 L38 42" stroke="#dc2626" stroke-width="2" fill="none" stroke-linecap="round"/><path d="M30 28 Q34 20 38 10" stroke="#3b82f6" stroke-width="3" fill="none" stroke-linecap="round"/><path d="M31 32 Q36 32 42 28" stroke="#3b82f6" stroke-width="3" fill="none" stroke-linecap="round"/><path d="M30 36 Q34 44 38 54" stroke="#3b82f6" stroke-width="3" fill="none" stroke-linecap="round"/><circle cx="40" cy="8" r="3" fill="#60a5fa"/><circle cx="36" cy="56" r="3" fill="#60a5fa"/></svg>`
},
{
id: "schimmel",
name: "Schimmelschaden",
filename: "schimmelschaden_symbol.svg",
tags: ["schimmel", "pilz", "feucht", "sporen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="34" rx="24" ry="20" fill="#1f2937" opacity="0.3"/><ellipse cx="24" cy="28" rx="10" ry="8" fill="#166534"/><ellipse cx="38" cy="32" rx="12" ry="10" fill="#15803d"/><ellipse cx="28" cy="40" rx="9" ry="7" fill="#166534"/><ellipse cx="42" cy="24" rx="7" ry="6" fill="#14532d"/><ellipse cx="18" cy="38" rx="6" ry="5" fill="#15803d"/><circle cx="20" cy="26" r="2" fill="#052e16"/><circle cx="30" cy="30" r="2.5" fill="#052e16"/><circle cx="40" cy="28" r="2" fill="#052e16"/><circle cx="35" cy="38" r="2" fill="#052e16"/><circle cx="52" cy="12" r="10" fill="#dc2626"/><text x="52" y="17" font-family="Arial" font-size="14" font-weight="bold" fill="white" text-anchor="middle">!</text></svg>`
},
{
id: "sturm",
name: "Sturmschaden",
filename: "sturmschaden_symbol.svg",
tags: ["sturm", "wind", "dach", "unwetter"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="14" y="32" width="28" height="24" fill="#78716c" stroke="#57534e" stroke-width="2"/><polygon points="10,32 28,14 50,32" fill="#991b1b" stroke="#7f1d1d" stroke-width="2"/><polygon points="38,18 46,26 50,22 42,14" fill="#78716c" stroke="#57534e" stroke-width="1"/><rect x="18" y="38" width="8" height="8" fill="#bfdbfe" stroke="#57534e" stroke-width="1"/><rect x="30" y="38" width="8" height="8" fill="#bfdbfe" stroke="#57534e" stroke-width="1"/><rect x="24" y="46" width="8" height="10" fill="#44403c"/><path d="M48 10 Q56 10 54 6" stroke="#6b7280" stroke-width="3" fill="none" stroke-linecap="round"/><path d="M50 18 Q60 18 58 14" stroke="#6b7280" stroke-width="3" fill="none" stroke-linecap="round"/><path d="M52 26 Q62 26 60 22" stroke="#6b7280" stroke-width="2" fill="none" stroke-linecap="round"/><rect x="54" y="8" width="6" height="3" fill="#991b1b" transform="rotate(25 57 9)"/></svg>`
},
{
id: "einbruch",
name: "Einbruchschaden",
filename: "einbruchschaden_symbol.svg",
tags: ["einbruch", "diebstahl", "fenster", "tür"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="8" width="48" height="48" fill="none" stroke="#57534e" stroke-width="4" rx="2"/><line x1="32" y1="8" x2="32" y2="56" stroke="#57534e" stroke-width="3"/><line x1="8" y1="32" x2="56" y2="32" stroke="#57534e" stroke-width="3"/><polygon points="12,12 20,20 12,28 18,20" fill="#bfdbfe" stroke="#93c5fd" stroke-width="1"/><polygon points="20,14 28,12 24,24 16,20" fill="#dbeafe" stroke="#93c5fd" stroke-width="1"/><polygon points="10,36 18,42 12,52 8,44" fill="#bfdbfe" stroke="#93c5fd" stroke-width="1"/><rect x="36" y="16" width="4" height="32" rx="1" fill="#1f2937" transform="rotate(20 38 32)"/><rect x="34" y="14" width="8" height="6" rx="1" fill="#1f2937" transform="rotate(20 38 17)"/><circle cx="52" cy="52" r="8" fill="#dc2626"/><line x1="48" y1="48" x2="56" y2="56" stroke="white" stroke-width="2" stroke-linecap="round"/><line x1="56" y1="48" x2="48" y2="56" stroke="white" stroke-width="2" stroke-linecap="round"/></svg>`
},
{
id: "elektro",
name: "Elektroschaden",
filename: "elektroschaden_symbol.svg",
tags: ["elektro", "strom", "blitz", "kurzschluss"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="36,2 20,28 30,28 24,46 44,18 34,18" fill="#fbbf24" stroke="#f59e0b" stroke-width="2" stroke-linejoin="round"/><rect x="12" y="38" width="24" height="22" rx="3" fill="#e5e7eb" stroke="#9ca3af" stroke-width="2"/><circle cx="20" cy="46" r="3" fill="#1f2937"/><circle cx="28" cy="46" r="3" fill="#1f2937"/><rect x="22" y="52" width="4" height="4" rx="1" fill="#1f2937"/><line x1="40" y1="42" x2="48" y2="38" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/><line x1="42" y1="48" x2="52" y2="46" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/><line x1="40" y1="54" x2="50" y2="56" stroke="#f59e0b" stroke-width="2" stroke-linecap="round"/><polygon points="50,36 46,42 48,42 46,48 52,40 50,40" fill="#fbbf24"/></svg>`
},
{
id: "hagel",
name: "Hagelschaden",
filename: "hagelschaden_symbol.svg",
tags: ["hagel", "eis", "dellen", "unwetter"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><ellipse cx="32" cy="20" rx="24" ry="14" fill="#6b7280"/><ellipse cx="32" cy="18" rx="22" ry="12" fill="#9ca3af"/><circle cx="14" cy="36" r="6" fill="#e0f2fe" stroke="#7dd3fc" stroke-width="2"/><circle cx="32" cy="40" r="7" fill="#e0f2fe" stroke="#7dd3fc" stroke-width="2"/><circle cx="50" cy="34" r="5" fill="#e0f2fe" stroke="#7dd3fc" stroke-width="2"/><circle cx="22" cy="52" r="6" fill="#e0f2fe" stroke="#7dd3fc" stroke-width="2"/><circle cx="44" cy="50" r="5" fill="#e0f2fe" stroke="#7dd3fc" stroke-width="2"/><line x1="14" y1="26" x2="14" y2="30" stroke="#7dd3fc" stroke-width="2"/><line x1="32" y1="24" x2="32" y2="32" stroke="#7dd3fc" stroke-width="2"/><line x1="50" y1="26" x2="50" y2="28" stroke="#7dd3fc" stroke-width="2"/><line x1="22" y1="28" x2="22" y2="46" stroke="#7dd3fc" stroke-width="1.5"/><line x1="44" y1="28" x2="44" y2="44" stroke="#7dd3fc" stroke-width="1.5"/></svg>`
},
{
id: "vandalismus",
name: "Vandalismus",
filename: "vandalismus_symbol.svg",
tags: ["vandalismus", "graffiti", "zerstörung", "sachbeschädigung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="20" width="56" height="40" fill="#d6d3d1" stroke="#78716c" stroke-width="2"/><path d="M10 30 Q20 25 30 35 Q40 45 50 30" stroke="#dc2626" stroke-width="4" fill="none" stroke-linecap="round"/><path d="M15 45 Q25 55 35 40 Q45 25 55 45" stroke="#2563eb" stroke-width="3" fill="none" stroke-linecap="round"/><text x="32" y="54" font-family="Arial" font-size="10" fill="#000" text-anchor="middle" font-style="italic">TAG</text><circle cx="52" cy="12" r="10" fill="#dc2626"/><line x1="48" y1="8" x2="56" y2="16" stroke="white" stroke-width="2.5" stroke-linecap="round"/><line x1="56" y1="8" x2="48" y2="16" stroke="white" stroke-width="2.5" stroke-linecap="round"/></svg>`
}
]
};

View File

@@ -0,0 +1,189 @@
// ============================================
// SYMBOL-KATEGORIE: Vermessung - Infrastruktur
// ============================================
// Wasser
SYMBOLS.vermessung_wasser = {
name: "Vermessung - Wasser",
icon: "💧",
items: [
{
id: "vm_hydrant_unterflur",
name: "Hydrant (Unterflur)",
filename: "vermessung_hydrant_unterflur.svg",
tags: ["hydrant", "unterflur", "wasser", "feuerwehr", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="16" fill="none" stroke="#000" stroke-width="2"/><line x1="32" y1="16" x2="32" y2="48" stroke="#000" stroke-width="2"/><line x1="16" y1="32" x2="48" y2="32" stroke="#000" stroke-width="2"/><circle cx="32" cy="32" r="4" fill="#000"/></svg>`
},
{
id: "vm_hydrant_ueberflur",
name: "Hydrant (Überflur)",
filename: "vermessung_hydrant_ueberflur.svg",
tags: ["hydrant", "überflur", "wasser", "feuerwehr", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="32,8 48,24 48,56 16,56 16,24" fill="none" stroke="#000" stroke-width="2"/><line x1="16" y1="36" x2="48" y2="36" stroke="#000" stroke-width="2"/><circle cx="32" cy="46" r="4" fill="#000"/></svg>`
},
{
id: "vm_wasserschacht",
name: "Trinkwasserschacht",
filename: "vermessung_wasserschacht.svg",
tags: ["schacht", "wasser", "trinkwasser", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="16" y="16" width="32" height="32" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="14" font-weight="bold" fill="#000" text-anchor="middle">W</text></svg>`
},
{
id: "vm_wasserschieber",
name: "Wasserschieber",
filename: "vermessung_wasserschieber.svg",
tags: ["schieber", "absperrer", "wasser", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="8" y1="32" x2="56" y2="32" stroke="#000" stroke-width="2"/><line x1="32" y1="20" x2="32" y2="44" stroke="#000" stroke-width="3"/><circle cx="32" cy="32" r="6" fill="none" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_brunnen",
name: "Brunnen",
filename: "vermessung_brunnen.svg",
tags: ["brunnen", "wasser", "quelle", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="20" fill="none" stroke="#000" stroke-width="2"/><circle cx="32" cy="32" r="8" fill="none" stroke="#000" stroke-width="2"/><line x1="32" y1="12" x2="32" y2="4" stroke="#000" stroke-width="2"/><line x1="32" y1="52" x2="32" y2="60" stroke="#000" stroke-width="2"/><line x1="12" y1="32" x2="4" y2="32" stroke="#000" stroke-width="2"/><line x1="52" y1="32" x2="60" y2="32" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_wasserleitung",
name: "Wasserleitung",
filename: "vermessung_wasserleitung.svg",
tags: ["leitung", "wasser", "rohr", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="3"/><text x="32" y="24" font-family="Arial" font-size="10" fill="#000" text-anchor="middle">W</text></svg>`
}
]
};
// Abwasser
SYMBOLS.vermessung_abwasser = {
name: "Vermessung - Abwasser",
icon: "🚰",
items: [
{
id: "vm_abwasserschacht",
name: "Abwasserschacht",
filename: "vermessung_abwasserschacht.svg",
tags: ["schacht", "abwasser", "kanal", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="16" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="14" font-weight="bold" fill="#000" text-anchor="middle">S</text></svg>`
},
{
id: "vm_schacht_rund",
name: "Schacht (rund)",
filename: "vermessung_schacht_rund.svg",
tags: ["schacht", "rund", "kanal", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="18" fill="none" stroke="#000" stroke-width="2"/><circle cx="32" cy="32" r="10" fill="none" stroke="#000" stroke-width="1.5"/></svg>`
},
{
id: "vm_schacht_eckig",
name: "Schacht (eckig)",
filename: "vermessung_schacht_eckig.svg",
tags: ["schacht", "eckig", "kanal", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="14" y="14" width="36" height="36" fill="none" stroke="#000" stroke-width="2"/><rect x="22" y="22" width="20" height="20" fill="none" stroke="#000" stroke-width="1.5"/></svg>`
},
{
id: "vm_einlauf",
name: "Einlauf / Gully",
filename: "vermessung_einlauf.svg",
tags: ["einlauf", "gully", "straßenablauf", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="18" y="18" width="28" height="28" fill="none" stroke="#000" stroke-width="2"/><line x1="22" y1="26" x2="42" y2="26" stroke="#000" stroke-width="1.5"/><line x1="22" y1="32" x2="42" y2="32" stroke="#000" stroke-width="1.5"/><line x1="22" y1="38" x2="42" y2="38" stroke="#000" stroke-width="1.5"/></svg>`
},
{
id: "vm_abwasserleitung",
name: "Abwasserleitung",
filename: "vermessung_abwasserleitung.svg",
tags: ["leitung", "abwasser", "kanal", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="2" stroke-dasharray="10,4"/></svg>`
}
]
};
// Strom
SYMBOLS.vermessung_strom = {
name: "Vermessung - Strom",
icon: "⚡",
items: [
{
id: "vm_hausanschluss_elektro",
name: "Hausanschluss Elektro",
filename: "vermessung_hausanschluss_elektro.svg",
tags: ["hausanschluss", "elektro", "strom", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="14" fill="none" stroke="#000" stroke-width="2"/><polygon points="32,20 26,34 30,34 28,44 38,30 34,30" fill="#000"/></svg>`
},
{
id: "vm_laterne",
name: "Laterne / Mast",
filename: "vermessung_laterne.svg",
tags: ["laterne", "mast", "beleuchtung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="4" fill="#000"/><line x1="32" y1="8" x2="32" y2="28" stroke="#000" stroke-width="2"/><line x1="32" y1="36" x2="32" y2="56" stroke="#000" stroke-width="2"/><line x1="8" y1="32" x2="28" y2="32" stroke="#000" stroke-width="2"/><line x1="36" y1="32" x2="56" y2="32" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_stromkabel",
name: "Stromkabel",
filename: "vermessung_stromkabel.svg",
tags: ["kabel", "strom", "leitung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="3"/><text x="32" y="24" font-family="Arial" font-size="10" fill="#000" text-anchor="middle">E</text></svg>`
},
{
id: "vm_schaltkasten",
name: "Schaltkasten",
filename: "vermessung_schaltkasten.svg",
tags: ["schaltkasten", "verteiler", "strom", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="16" y="12" width="32" height="40" fill="none" stroke="#000" stroke-width="2"/><line x1="16" y1="24" x2="48" y2="24" stroke="#000" stroke-width="1"/><text x="32" y="42" font-family="Arial" font-size="12" fill="#000" text-anchor="middle">E</text></svg>`
},
{
id: "vm_trafostation",
name: "Trafostation",
filename: "vermessung_trafostation.svg",
tags: ["trafo", "station", "umspanner", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="12" y="12" width="40" height="40" fill="none" stroke="#000" stroke-width="2"/><line x1="12" y1="12" x2="52" y2="52" stroke="#000" stroke-width="2"/><line x1="52" y1="12" x2="12" y2="52" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_mast_holz",
name: "Mast (Holz)",
filename: "vermessung_mast_holz.svg",
tags: ["mast", "holz", "freileitung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="12" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="14" fill="#000" text-anchor="middle">H</text></svg>`
},
{
id: "vm_mast_beton",
name: "Mast (Beton)",
filename: "vermessung_mast_beton.svg",
tags: ["mast", "beton", "freileitung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="12" fill="none" stroke="#000" stroke-width="2"/><circle cx="32" cy="32" r="6" fill="none" stroke="#000" stroke-width="1.5"/></svg>`
},
{
id: "vm_mast_stahl",
name: "Mast (Stahl)",
filename: "vermessung_mast_stahl.svg",
tags: ["mast", "stahl", "freileitung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="20" y="20" width="24" height="24" fill="none" stroke="#000" stroke-width="2"/></svg>`
}
]
};
// Gas
SYMBOLS.vermessung_gas = {
name: "Vermessung - Gas",
icon: "🔥",
items: [
{
id: "vm_gasschieber",
name: "Gasschieber",
filename: "vermessung_gasschieber.svg",
tags: ["schieber", "absperrer", "gas", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="8" y1="32" x2="56" y2="32" stroke="#000" stroke-width="2" stroke-dasharray="8,4"/><line x1="32" y1="20" x2="32" y2="44" stroke="#000" stroke-width="3"/><text x="32" y="56" font-family="Arial" font-size="10" fill="#000" text-anchor="middle">G</text></svg>`
},
{
id: "vm_gasleitung",
name: "Gasleitung",
filename: "vermessung_gasleitung.svg",
tags: ["leitung", "gas", "rohr", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="2" stroke-dasharray="8,4"/><text x="32" y="24" font-family="Arial" font-size="10" fill="#000" text-anchor="middle">G</text></svg>`
},
{
id: "vm_hausanschluss_gas",
name: "Hausanschluss Gas",
filename: "vermessung_hausanschluss_gas.svg",
tags: ["hausanschluss", "gas", "anschluss", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="18" y="18" width="28" height="28" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="14" font-weight="bold" fill="#000" text-anchor="middle">G</text></svg>`
}
]
};

View File

@@ -0,0 +1,138 @@
// ============================================
// SYMBOL-KATEGORIE: Vermessung - Verkehr & Topografie
// ============================================
// Verkehr
SYMBOLS.vermessung_verkehr = {
name: "Vermessung - Verkehr",
icon: "🚗",
items: [
{
id: "vm_gleise",
name: "Gleise / Schienen",
filename: "vermessung_gleise.svg",
tags: ["gleise", "schienen", "bahn", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="24" x2="60" y2="24" stroke="#000" stroke-width="2"/><line x1="4" y1="40" x2="60" y2="40" stroke="#000" stroke-width="2"/><line x1="12" y1="24" x2="12" y2="40" stroke="#000" stroke-width="1.5"/><line x1="24" y1="24" x2="24" y2="40" stroke="#000" stroke-width="1.5"/><line x1="36" y1="24" x2="36" y2="40" stroke="#000" stroke-width="1.5"/><line x1="48" y1="24" x2="48" y2="40" stroke="#000" stroke-width="1.5"/></svg>`
},
{
id: "vm_prellbock",
name: "Prellbock",
filename: "vermessung_prellbock.svg",
tags: ["prellbock", "gleisende", "bahn", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="40" y2="32" stroke="#000" stroke-width="2"/><line x1="40" y1="16" x2="40" y2="48" stroke="#000" stroke-width="4"/><line x1="44" y1="20" x2="56" y2="20" stroke="#000" stroke-width="2"/><line x1="44" y1="44" x2="56" y2="44" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_verkehrsschild",
name: "Verkehrsschild",
filename: "vermessung_verkehrsschild.svg",
tags: ["schild", "verkehr", "straße", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="32" y1="36" x2="32" y2="60" stroke="#000" stroke-width="2"/><polygon points="32,8 50,24 50,36 14,36 14,24" fill="none" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_ampel",
name: "Ampel",
filename: "vermessung_ampel.svg",
tags: ["ampel", "signal", "verkehr", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="22" y="8" width="20" height="40" fill="none" stroke="#000" stroke-width="2"/><circle cx="32" cy="18" r="5" fill="none" stroke="#000" stroke-width="1.5"/><circle cx="32" cy="28" r="5" fill="none" stroke="#000" stroke-width="1.5"/><circle cx="32" cy="38" r="5" fill="none" stroke="#000" stroke-width="1.5"/><line x1="32" y1="48" x2="32" y2="60" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_haltestelle",
name: "Haltestelle",
filename: "vermessung_haltestelle.svg",
tags: ["haltestelle", "bus", "bahn", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="20" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="16" font-weight="bold" fill="#000" text-anchor="middle">H</text></svg>`
},
{
id: "vm_parkplatz",
name: "Parkplatz",
filename: "vermessung_parkplatz.svg",
tags: ["parkplatz", "parken", "stellplatz", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="14" y="14" width="36" height="36" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="40" font-family="Arial" font-size="24" font-weight="bold" fill="#000" text-anchor="middle">P</text></svg>`
},
{
id: "vm_schranke",
name: "Schranke",
filename: "vermessung_schranke.svg",
tags: ["schranke", "bahnübergang", "absperrung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="12" cy="32" r="6" fill="none" stroke="#000" stroke-width="2"/><line x1="18" y1="32" x2="60" y2="32" stroke="#000" stroke-width="3"/><line x1="24" y1="28" x2="28" y2="36" stroke="#000" stroke-width="2"/><line x1="36" y1="28" x2="40" y2="36" stroke="#000" stroke-width="2"/><line x1="48" y1="28" x2="52" y2="36" stroke="#000" stroke-width="2"/></svg>`
}
]
};
// Topografie
SYMBOLS.vermessung_topografie = {
name: "Vermessung - Topografie",
icon: "🌳",
items: [
{
id: "vm_laubbaum",
name: "Laubbaum",
filename: "vermessung_laubbaum.svg",
tags: ["baum", "laubbaum", "vegetation", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="28" r="18" fill="none" stroke="#000" stroke-width="2"/><line x1="32" y1="46" x2="32" y2="60" stroke="#000" stroke-width="3"/></svg>`
},
{
id: "vm_nadelbaum",
name: "Nadelbaum",
filename: "vermessung_nadelbaum.svg",
tags: ["baum", "nadelbaum", "tanne", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="32,4 48,28 40,28 52,48 12,48 24,28 16,28" fill="none" stroke="#000" stroke-width="2"/><line x1="32" y1="48" x2="32" y2="60" stroke="#000" stroke-width="3"/></svg>`
},
{
id: "vm_gebaeude",
name: "Gebäude",
filename: "vermessung_gebaeude.svg",
tags: ["gebäude", "haus", "bauwerk", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="12" y="20" width="40" height="36" fill="none" stroke="#000" stroke-width="2"/><line x1="12" y1="20" x2="32" y2="8" stroke="#000" stroke-width="2"/><line x1="52" y1="20" x2="32" y2="8" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_hoehenpunkt",
name: "Höhenpunkt",
filename: "vermessung_hoehenpunkt.svg",
tags: ["höhe", "nivellement", "punkt", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="22" y1="42" x2="42" y2="42" stroke="#000" stroke-width="2"/><line x1="32" y1="42" x2="32" y2="22" stroke="#000" stroke-width="2"/><circle cx="32" cy="22" r="4" fill="#000"/><text x="46" y="28" font-family="Arial" font-size="10" fill="#000">HP</text></svg>`
},
{
id: "vm_boeschung",
name: "Böschung",
filename: "vermessung_boeschung.svg",
tags: ["böschung", "hang", "gelände", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="8" y1="20" x2="56" y2="20" stroke="#000" stroke-width="2"/><line x1="8" y1="44" x2="56" y2="44" stroke="#000" stroke-width="2"/><line x1="12" y1="20" x2="8" y2="44" stroke="#000" stroke-width="1"/><line x1="20" y1="20" x2="16" y2="44" stroke="#000" stroke-width="1"/><line x1="28" y1="20" x2="24" y2="44" stroke="#000" stroke-width="1"/><line x1="36" y1="20" x2="32" y2="44" stroke="#000" stroke-width="1"/><line x1="44" y1="20" x2="40" y2="44" stroke="#000" stroke-width="1"/><line x1="52" y1="20" x2="48" y2="44" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "vm_fliessrichtung",
name: "Fließrichtung",
filename: "vermessung_fliessrichtung.svg",
tags: ["fließrichtung", "gewässer", "bach", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="8" y1="32" x2="48" y2="32" stroke="#000" stroke-width="2"/><polygon points="56,32 44,24 44,40" fill="#000"/></svg>`
},
{
id: "vm_quelle",
name: "Quelle",
filename: "vermessung_quelle.svg",
tags: ["quelle", "wasser", "ursprung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="16" fill="none" stroke="#000" stroke-width="2"/><path d="M32 24 Q36 28 32 32 Q28 36 32 40" stroke="#000" stroke-width="2" fill="none"/></svg>`
},
{
id: "vm_durchlass",
name: "Durchlass",
filename: "vermessung_durchlass.svg",
tags: ["durchlass", "rohr", "kanal", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="24" width="48" height="16" fill="none" stroke="#000" stroke-width="2"/><line x1="8" y1="32" x2="0" y2="32" stroke="#000" stroke-width="2"/><line x1="56" y1="32" x2="64" y2="32" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_kilometerstein",
name: "Kilometerstein",
filename: "vermessung_kilometerstein.svg",
tags: ["kilometer", "stein", "markierung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="32,8 44,20 44,56 20,56 20,20" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="42" font-family="Arial" font-size="12" fill="#000" text-anchor="middle">km</text></svg>`
},
{
id: "vm_poller",
name: "Poller",
filename: "vermessung_poller.svg",
tags: ["poller", "absperrung", "pfosten", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="10" fill="#000"/><circle cx="32" cy="32" r="4" fill="#fff"/></svg>`
}
]
};

View File

@@ -0,0 +1,103 @@
// ============================================
// SYMBOL-KATEGORIE: Vermessung - Status & Grenzen
// ============================================
// Status
SYMBOLS.vermessung_status = {
name: "Vermessung - Status",
icon: "📋",
items: [
{
id: "vm_reparatur",
name: "Reparatur",
filename: "vermessung_reparatur.svg",
tags: ["reparatur", "instandsetzung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="16" font-weight="bold" fill="#000" text-anchor="middle">R</text></svg>`
},
{
id: "vm_neu",
name: "Neu",
filename: "vermessung_neu.svg",
tags: ["neu", "neubau", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="16" font-weight="bold" fill="#000" text-anchor="middle">N</text></svg>`
},
{
id: "vm_bestand",
name: "Bestand",
filename: "vermessung_bestand.svg",
tags: ["bestand", "bestehend", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="none" stroke="#000" stroke-width="2"/><text x="32" y="38" font-family="Arial" font-size="16" font-weight="bold" fill="#000" text-anchor="middle">B</text></svg>`
},
{
id: "vm_abriss",
name: "Abriss",
filename: "vermessung_abriss.svg",
tags: ["abriss", "rückbau", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="none" stroke="#000" stroke-width="2"/><line x1="12" y1="12" x2="52" y2="52" stroke="#000" stroke-width="2"/><line x1="52" y1="12" x2="12" y2="52" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_geplant",
name: "Geplant",
filename: "vermessung_geplant.svg",
tags: ["geplant", "planung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="none" stroke="#000" stroke-width="2" stroke-dasharray="6,4"/><text x="32" y="38" font-family="Arial" font-size="16" font-weight="bold" fill="#000" text-anchor="middle">P</text></svg>`
}
]
};
// Grenzen
SYMBOLS.vermessung_grenzen = {
name: "Vermessung - Grenzen",
icon: "📍",
items: [
{
id: "vm_grundstuecksgrenze",
name: "Grundstücksgrenze",
filename: "vermessung_grundstuecksgrenze.svg",
tags: ["grundstück", "grenze", "flurstück", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="3"/><line x1="12" y1="26" x2="12" y2="38" stroke="#000" stroke-width="2"/><line x1="52" y1="26" x2="52" y2="38" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_grenzpunkt_vermarkt",
name: "Grenzpunkt (vermarkt)",
filename: "vermessung_grenzpunkt_vermarkt.svg",
tags: ["grenzpunkt", "grenzstein", "vermarkt", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="12" fill="#000"/><circle cx="32" cy="32" r="6" fill="#fff"/></svg>`
},
{
id: "vm_grenzpunkt_unvermarkt",
name: "Grenzpunkt (unvermarkt)",
filename: "vermessung_grenzpunkt_unvermarkt.svg",
tags: ["grenzpunkt", "unvermarkt", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="10" fill="none" stroke="#000" stroke-width="2"/><line x1="32" y1="22" x2="32" y2="42" stroke="#000" stroke-width="2"/><line x1="22" y1="32" x2="42" y2="32" stroke="#000" stroke-width="2"/></svg>`
},
{
id: "vm_flurstucksgrenze",
name: "Flurstücksgrenze",
filename: "vermessung_flurstucksgrenze.svg",
tags: ["flurstück", "grenze", "kataster", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="2" stroke-dasharray="12,4"/></svg>`
},
{
id: "vm_zaun",
name: "Zaun",
filename: "vermessung_zaun.svg",
tags: ["zaun", "einfriedung", "grenze", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="32" x2="60" y2="32" stroke="#000" stroke-width="1.5"/><line x1="12" y1="24" x2="12" y2="40" stroke="#000" stroke-width="1.5"/><line x1="24" y1="24" x2="24" y2="40" stroke="#000" stroke-width="1.5"/><line x1="36" y1="24" x2="36" y2="40" stroke="#000" stroke-width="1.5"/><line x1="48" y1="24" x2="48" y2="40" stroke="#000" stroke-width="1.5"/><line x1="12" y1="28" x2="24" y2="28" stroke="#000" stroke-width="1"/><line x1="24" y1="28" x2="36" y2="28" stroke="#000" stroke-width="1"/><line x1="36" y1="28" x2="48" y2="28" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "vm_mauer",
name: "Mauer",
filename: "vermessung_mauer.svg",
tags: ["mauer", "wand", "einfriedung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="26" width="56" height="12" fill="none" stroke="#000" stroke-width="2"/><line x1="16" y1="26" x2="16" y2="38" stroke="#000" stroke-width="1"/><line x1="28" y1="26" x2="28" y2="38" stroke="#000" stroke-width="1"/><line x1="40" y1="26" x2="40" y2="38" stroke="#000" stroke-width="1"/><line x1="52" y1="26" x2="52" y2="38" stroke="#000" stroke-width="1"/></svg>`
},
{
id: "vm_hecke",
name: "Hecke",
filename: "vermessung_hecke.svg",
tags: ["hecke", "grün", "bepflanzung", "vermessung"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><line x1="4" y1="38" x2="60" y2="38" stroke="#000" stroke-width="1.5"/><circle cx="12" cy="32" r="6" fill="none" stroke="#000" stroke-width="1.5"/><circle cx="24" cy="30" r="7" fill="none" stroke="#000" stroke-width="1.5"/><circle cx="38" cy="31" r="6" fill="none" stroke="#000" stroke-width="1.5"/><circle cx="52" cy="32" r="6" fill="none" stroke="#000" stroke-width="1.5"/></svg>`
}
]
};

View File

@@ -0,0 +1,80 @@
// ============================================
// SYMBOL-KATEGORIE: Werkzeuge & Markierungen
// ============================================
SYMBOLS.werkzeuge = {
name: "Werkzeuge & Markierungen",
icon: "🔧",
items: [
{
id: "massstab",
name: "Maßstab 1m",
filename: "massstab_1m.svg",
tags: ["maßstab", "meter", "lineal", "messen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="4" y="24" width="56" height="16" fill="#fef3c7" stroke="#f59e0b" stroke-width="2"/><g stroke="#92400e" stroke-width="1"><line x1="4" y1="28" x2="4" y2="36"/><line x1="10" y1="30" x2="10" y2="34"/><line x1="16" y1="30" x2="16" y2="34"/><line x1="22" y1="30" x2="22" y2="34"/><line x1="28" y1="30" x2="28" y2="34"/><line x1="32" y1="28" x2="32" y2="36"/><line x1="38" y1="30" x2="38" y2="34"/><line x1="44" y1="30" x2="44" y2="34"/><line x1="50" y1="30" x2="50" y2="34"/><line x1="56" y1="30" x2="56" y2="34"/><line x1="60" y1="28" x2="60" y2="36"/></g><text x="8" y="22" font-family="Arial" font-size="8" fill="#92400e">0</text><text x="28" y="22" font-family="Arial" font-size="8" fill="#92400e">50</text><text x="54" y="22" font-family="Arial" font-size="8" fill="#92400e">100</text><text x="32" y="48" font-family="Arial" font-size="10" fill="#92400e" text-anchor="middle">1 Meter</text></svg>`
},
{
id: "messpunkt",
name: "Messpunkt",
filename: "messpunkt.svg",
tags: ["messpunkt", "markierung", "punkt", "messen"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="24" fill="none" stroke="#dc2626" stroke-width="3"/><circle cx="32" cy="32" r="16" fill="none" stroke="#dc2626" stroke-width="2"/><circle cx="32" cy="32" r="6" fill="#dc2626"/><line x1="32" y1="2" x2="32" y2="14" stroke="#dc2626" stroke-width="2"/><line x1="32" y1="50" x2="32" y2="62" stroke="#dc2626" stroke-width="2"/><line x1="2" y1="32" x2="14" y2="32" stroke="#dc2626" stroke-width="2"/><line x1="50" y1="32" x2="62" y2="32" stroke="#dc2626" stroke-width="2"/></svg>`
},
{
id: "kamera",
name: "Fotostandpunkt",
filename: "fotostandpunkt.svg",
tags: ["foto", "kamera", "standpunkt", "aufnahme"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><rect x="8" y="20" width="48" height="32" rx="4" fill="#374151" stroke="#1f2937" stroke-width="2"/><circle cx="32" cy="36" r="12" fill="#1f2937" stroke="#6b7280" stroke-width="2"/><circle cx="32" cy="36" r="8" fill="#3b82f6"/><circle cx="32" cy="36" r="4" fill="#1e3a5f"/><rect x="20" y="14" width="24" height="8" rx="2" fill="#4b5563"/><circle cx="48" cy="26" r="3" fill="#fbbf24"/><rect x="10" y="26" width="6" height="4" rx="1" fill="#6b7280"/></svg>`
},
{
id: "lupe",
name: "Detailbereich",
filename: "detailbereich.svg",
tags: ["detail", "lupe", "vergrößerung", "zoom"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="26" cy="26" r="20" fill="#dbeafe" stroke="#3b82f6" stroke-width="3"/><circle cx="26" cy="26" r="14" fill="white" stroke="#93c5fd" stroke-width="2"/><line x1="40" y1="40" x2="58" y2="58" stroke="#3b82f6" stroke-width="6" stroke-linecap="round"/><line x1="40" y1="40" x2="56" y2="56" stroke="#60a5fa" stroke-width="3" stroke-linecap="round"/><text x="26" y="30" font-family="Arial" font-size="14" fill="#3b82f6" text-anchor="middle" font-weight="bold">+</text></svg>`
},
{
id: "notiz",
name: "Notiz / Hinweis",
filename: "notiz_hinweis.svg",
tags: ["notiz", "hinweis", "anmerkung", "text"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><path d="M8 4 L56 4 L56 48 L40 48 L40 60 L8 60 Z" fill="#fef3c7" stroke="#f59e0b" stroke-width="2"/><path d="M40 48 L56 48 L40 60 Z" fill="#fcd34d" stroke="#f59e0b" stroke-width="2"/><line x1="14" y1="16" x2="50" y2="16" stroke="#d97706" stroke-width="2"/><line x1="14" y1="26" x2="50" y2="26" stroke="#d97706" stroke-width="2"/><line x1="14" y1="36" x2="50" y2="36" stroke="#d97706" stroke-width="2"/><line x1="14" y1="46" x2="34" y2="46" stroke="#d97706" stroke-width="2"/></svg>`
},
{
id: "warnung",
name: "Warnung / Achtung",
filename: "warnung_achtung.svg",
tags: ["warnung", "achtung", "gefahr", "vorsicht"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><polygon points="32,4 60,56 4,56" fill="#fbbf24" stroke="#f59e0b" stroke-width="2" stroke-linejoin="round"/><polygon points="32,10 54,52 10,52" fill="#fef3c7"/><text x="32" y="46" font-family="Arial" font-size="32" fill="#92400e" text-anchor="middle" font-weight="bold">!</text></svg>`
},
{
id: "info",
name: "Information",
filename: "information.svg",
tags: ["info", "information", "hinweis", "details"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="#3b82f6" stroke="#2563eb" stroke-width="2"/><circle cx="32" cy="16" r="4" fill="white"/><rect x="28" y="26" width="8" height="24" rx="2" fill="white"/></svg>`
},
{
id: "haken",
name: "Erledigt / OK",
filename: "erledigt_ok.svg",
tags: ["ok", "erledigt", "fertig", "haken", "check"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="#22c55e" stroke="#16a34a" stroke-width="2"/><polyline points="18,32 28,42 46,22" fill="none" stroke="white" stroke-width="6" stroke-linecap="round" stroke-linejoin="round"/></svg>`
},
{
id: "kreuz",
name: "Fehler / Mangel",
filename: "fehler_mangel.svg",
tags: ["fehler", "mangel", "falsch", "kreuz"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="#dc2626" stroke="#b91c1c" stroke-width="2"/><line x1="20" y1="20" x2="44" y2="44" stroke="white" stroke-width="6" stroke-linecap="round"/><line x1="44" y1="20" x2="20" y2="44" stroke="white" stroke-width="6" stroke-linecap="round"/></svg>`
},
{
id: "fragezeichen",
name: "Unklar / Prüfen",
filename: "unklar_pruefen.svg",
tags: ["unklar", "prüfen", "frage", "unbekannt"],
svg: `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64"><circle cx="32" cy="32" r="28" fill="#f59e0b" stroke="#d97706" stroke-width="2"/><text x="32" y="44" font-family="Arial" font-size="36" fill="white" text-anchor="middle" font-weight="bold">?</text></svg>`
}
]
};