dolibarr.elektroplanung/tools/querschnittsrechner.php
data 0b5056337a feat: Elektroplanung Modul v1.0.0
Elektrotechnische Berechnungstools für Dolibarr:
- Leitungsquerschnittsrechner (DIN VDE 0100-520, DIN VDE 0298-4)
- Widerstandsrechner für Potentialausgleich (VDE 0100-534/540)
- Selektivitäts-Assistent (VDE 0100-530)

Features:
- Dark Mode Unterstützung
- Responsive Design
- PDF-Export
- Dolibarr-Berechtigungssystem

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-24 12:06:47 +01:00

615 lines
23 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/* Copyright (C) 2026 Eduard Wisch <data@data-it-solution.de>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
/**
* \file tools/querschnittsrechner.php
* \ingroup elektroplanung
* \brief Leitungsquerschnitt-Rechner nach DIN VDE 0100-520 und DIN VDE 0298-4
*/
// Load Dolibarr environment
$res = 0;
if (!$res && file_exists("../../main.inc.php")) {
$res = @include "../../main.inc.php";
}
if (!$res && file_exists("../../../main.inc.php")) {
$res = @include "../../../main.inc.php";
}
if (!$res) {
die("Include of main fails");
}
require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php';
require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
// Load translation files
$langs->loadLangs(array("elektroplanung@elektroplanung"));
// Security check
if (!isModEnabled('elektroplanung')) {
accessforbidden('Module not enabled');
}
if (!$user->hasRight('elektroplanung', 'tools', 'read')) {
accessforbidden('Permission denied');
}
$form = new Form($db);
// Page header
llxHeader('', $langs->trans("ElektroplanungQuerschnittsrechner"), '', '', 0, 0, array(
'https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js'
), array(
'/elektroplanung/css/elektroplanung.css'
), '', 'mod-elektroplanung page-querschnittsrechner');
// Viewport für Mobile
print '<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">';
print load_fiche_titre($langs->trans("ElektroplanungQuerschnittsrechner"), '', 'fa-bolt');
print '<div class="fichecenter">';
?>
<!-- Styles sind in /elektroplanung/css/elektroplanung.css -->
<div class="ep-calculator">
<div class="ep-toolbar">
<button class="butAction" onclick="epBerechnen()">
<span class="fa fa-search"></span> <?php echo $langs->trans("Calculate"); ?>
</button>
<button class="butActionDelete" onclick="epToggleFormulas()">
<span class="fa fa-calculator"></span> <span id="epFormulaToggleText"><?php echo $langs->trans("ElektroplanungFormelnAnzeigen"); ?></span>
</button>
<button class="butAction" onclick="epExportPDF()">
<span class="fa fa-file-pdf-o"></span> PDF
</button>
<button class="butActionDelete" onclick="epResetForm()">
<span class="fa fa-refresh"></span> <?php echo $langs->trans("Reset"); ?>
</button>
</div>
<!-- EINGABE SEKTION -->
<div class="ep-section">
<div class="ep-section-title">
<span class="fa fa-bolt"></span> <?php echo $langs->trans("ElektroplanungEingabeNetzart"); ?>
</div>
<div class="ep-form-group" style="margin-bottom: 15px;">
<label><?php echo $langs->trans("ElektroplanungEingabeart"); ?>:</label>
<div class="ep-radio-group">
<label class="ep-radio-label">
<input type="radio" name="inputType" value="strom" checked onchange="epToggleInputType()">
<span><?php echo $langs->trans("ElektroplanungStrom"); ?> (A)</span>
</label>
<label class="ep-radio-label">
<input type="radio" name="inputType" value="leistung" onchange="epToggleInputType()">
<span><?php echo $langs->trans("ElektroplanungLeistung"); ?> (kW)</span>
</label>
</div>
</div>
<div class="ep-form-grid">
<div class="ep-form-group" id="epStromInput">
<label><?php echo $langs->trans("ElektroplanungStrom"); ?> <span class="ep-unit">[A]</span></label>
<input type="number" id="epStrom" value="16" step="0.1" min="0">
</div>
<div class="ep-form-group" id="epLeistungInput" style="display: none;">
<label><?php echo $langs->trans("ElektroplanungLeistung"); ?> <span class="ep-unit">[kW]</span></label>
<input type="number" id="epLeistung" value="3.68" step="0.01" min="0">
</div>
<div class="ep-form-group">
<label><?php echo $langs->trans("ElektroplanungNetzart"); ?>:</label>
<select id="epNetzart" onchange="epUpdateSpannung()">
<option value="1ph230">1-phasig 230V (AC)</option>
<option value="3ph400" selected>3-phasig 400V (Drehstrom)</option>
<option value="dc12">12V DC</option>
<option value="dc24">24V DC</option>
<option value="dc48">48V DC</option>
</select>
</div>
<div class="ep-form-group">
<label><?php echo $langs->trans("ElektroplanungSpannung"); ?> <span class="ep-unit">[V]</span></label>
<input type="number" id="epSpannung" value="400" step="1" min="0">
</div>
</div>
</div>
<!-- LEITUNGSDATEN -->
<div class="ep-section">
<div class="ep-section-title">
<span class="fa fa-plug"></span> <?php echo $langs->trans("ElektroplanungLeitungsdaten"); ?>
</div>
<div class="ep-form-grid">
<div class="ep-form-group">
<label><?php echo $langs->trans("ElektroplanungLeitungslaenge"); ?> <span class="ep-unit">[m]</span></label>
<input type="number" id="epLaenge" value="20" step="0.1" min="0">
</div>
<div class="ep-form-group">
<label><?php echo $langs->trans("ElektroplanungLeistungsfaktor"); ?> (cos φ) <span class="ep-unit">[-]</span></label>
<input type="number" id="epCosphi" value="0.95" step="0.01" min="0.1" max="1.0">
</div>
<div class="ep-form-group">
<label><?php echo $langs->trans("ElektroplanungMaxSpannungsfall"); ?> <span class="ep-unit">[%]</span></label>
<select id="epSpannungsfall">
<option value="3">3% (Beleuchtung)</option>
<option value="5" selected>5% (Andere Verbraucher)</option>
<option value="1">1% (Sehr kritisch)</option>
<option value="2">2% (Kritisch)</option>
<option value="4">4% (Baustellen)</option>
</select>
</div>
<div class="ep-form-group">
<label><?php echo $langs->trans("ElektroplanungLeitermaterial"); ?>:</label>
<select id="epMaterial">
<option value="56" selected>Kupfer (Cu)</option>
<option value="35">Aluminium (Al)</option>
</select>
</div>
</div>
</div>
<!-- VERLEGUNG -->
<div class="ep-section">
<div class="ep-section-title">
<span class="fa fa-cogs"></span> <?php echo $langs->trans("ElektroplanungVerlegungUmgebung"); ?>
</div>
<div class="ep-form-grid">
<div class="ep-form-group">
<label><?php echo $langs->trans("ElektroplanungVerlegeart"); ?>:</label>
<select id="epVerlegeart">
<option value="B1">B1 - Mehradrig an/auf Wand</option>
<option value="B2" selected>B2 - Mehradrig in Mauerwerk</option>
<option value="C">C - Einadrig in Rohr</option>
<option value="E">E - Frei in Luft</option>
<option value="F">F - Einadrig frei</option>
</select>
</div>
<div class="ep-form-group">
<label><?php echo $langs->trans("ElektroplanungUmgebungstemperatur"); ?> <span class="ep-unit">[°C]</span></label>
<input type="number" id="epTemperatur" value="30" step="1" min="-20" max="80">
</div>
<div class="ep-form-group">
<label><?php echo $langs->trans("ElektroplanungAnzahlKabel"); ?>:</label>
<select id="epHaeufung">
<option value="1" selected>1 Kabel (keine Häufung)</option>
<option value="2">2 Kabel</option>
<option value="3">3 Kabel</option>
<option value="4">4 Kabel</option>
<option value="5">5 Kabel</option>
<option value="6">6-9 Kabel</option>
</select>
</div>
<div class="ep-form-group">
<label><?php echo $langs->trans("ElektroplanungIsolierung"); ?>:</label>
<select id="epIsolierung">
<option value="70" selected>PVC (70°C)</option>
<option value="90">XLPE/EPR (90°C)</option>
</select>
</div>
</div>
</div>
<!-- ERGEBNIS -->
<div id="epResultBox" class="ep-result-box">
<div class="ep-result-main" id="epResultQuerschnitt">2.5 mm²</div>
<div class="ep-result-label"><?php echo $langs->trans("ElektroplanungEmpfohlenerQuerschnitt"); ?></div>
<div class="ep-result-details">
<div class="ep-result-item">
<span><?php echo $langs->trans("ElektroplanungBerechnet"); ?>:</span>
<span class="ep-result-value" id="epResultBerechnet">-</span>
</div>
<div class="ep-result-item">
<span><?php echo $langs->trans("ElektroplanungSpannungsfallResult"); ?>:</span>
<span class="ep-result-value" id="epResultSpannungsfall">-</span>
</div>
<div class="ep-result-item">
<span><?php echo $langs->trans("ElektroplanungStrombelastbar"); ?>:</span>
<span class="ep-result-value" id="epResultStrombelastbar">-</span>
</div>
<div class="ep-result-item">
<span><?php echo $langs->trans("ElektroplanungKabeltyp"); ?>:</span>
<span class="ep-result-value" id="epResultKabeltyp">-</span>
</div>
</div>
<div id="epWarnings"></div>
</div>
<!-- FORMELN SEKTION -->
<div id="epFormulasSection" class="ep-formulas-section">
<div class="ep-section-title">
<span class="fa fa-calculator"></span> <?php echo $langs->trans("ElektroplanungAngewendeteFormeln"); ?>
</div>
<div id="epFormulasContent"></div>
</div>
<div class="ep-info-box">
<strong><span class="fa fa-info-circle"></span> <?php echo $langs->trans("ElektroplanungHinweise"); ?>:</strong>
<ul style="margin-left: 20px; margin-top: 5px;">
<li><?php echo $langs->trans("ElektroplanungHinweisDIN"); ?></li>
<li><?php echo $langs->trans("ElektroplanungHinweisLaenge"); ?></li>
<li><?php echo $langs->trans("ElektroplanungHinweisFachplanung"); ?></li>
<li><?php echo $langs->trans("ElektroplanungHinweisNormquerschnitte"); ?></li>
</ul>
</div>
</div>
<script>
// Globale Variablen
let epCalculationData = {};
// Normquerschnitte nach DIN VDE
const epNormQuerschnitte = [1.5, 2.5, 4, 6, 10, 16, 25, 35, 50, 70, 95, 120, 150, 185, 240, 300, 400, 500, 630];
// Strombelastbarkeit-Tabelle (Kupfer, PVC 70°C)
const epStrombelastbarkeit = {
'B1': { 1.5: 15.5, 2.5: 21, 4: 28, 6: 36, 10: 49, 16: 66, 25: 89, 35: 110, 50: 134, 70: 171, 95: 207, 120: 239, 150: 271, 185: 310, 240: 361, 300: 424, 400: 502 },
'B2': { 1.5: 18.5, 2.5: 25, 4: 34, 6: 43, 10: 60, 16: 80, 25: 107, 35: 133, 50: 164, 70: 209, 95: 253, 120: 290, 150: 328, 185: 375, 240: 435, 300: 509, 400: 599 },
'C': { 1.5: 19.5, 2.5: 27, 4: 37, 6: 47, 10: 64, 16: 86, 25: 114, 35: 141, 50: 175, 70: 222, 95: 269, 120: 309, 150: 349, 185: 399, 240: 461, 300: 537, 400: 629 },
'E': { 1.5: 24, 2.5: 32, 4: 42, 6: 54, 10: 73, 16: 98, 25: 131, 35: 162, 50: 199, 70: 253, 95: 306, 120: 351, 150: 396, 185: 453, 240: 524, 300: 611, 400: 716 },
'F': { 1.5: 22, 2.5: 30, 4: 40, 6: 51, 10: 69, 16: 93, 25: 125, 35: 154, 50: 190, 70: 242, 95: 293, 120: 336, 150: 379, 185: 434, 240: 502, 300: 585, 400: 685 }
};
// Temperatur-Korrekturfaktoren
function epGetTempFaktor(temp, isolierung) {
if (isolierung == 70) {
if (temp <= 10) return 1.22;
if (temp <= 15) return 1.17;
if (temp <= 20) return 1.12;
if (temp <= 25) return 1.06;
if (temp <= 30) return 1.0;
if (temp <= 35) return 0.94;
if (temp <= 40) return 0.87;
if (temp <= 45) return 0.79;
if (temp <= 50) return 0.71;
return 0.58;
} else {
if (temp <= 10) return 1.15;
if (temp <= 15) return 1.12;
if (temp <= 20) return 1.08;
if (temp <= 25) return 1.04;
if (temp <= 30) return 1.0;
if (temp <= 35) return 0.96;
if (temp <= 40) return 0.91;
if (temp <= 45) return 0.87;
if (temp <= 50) return 0.82;
if (temp <= 55) return 0.76;
return 0.71;
}
}
// Häufungs-Korrekturfaktoren
function epGetHaeufungsFaktor(anzahl) {
const faktoren = { 1: 1.0, 2: 0.80, 3: 0.70, 4: 0.65, 5: 0.60, 6: 0.57 };
return faktoren[anzahl] || 0.57;
}
// Toggle Strom/Leistung Eingabe
function epToggleInputType() {
const inputType = document.querySelector('input[name="inputType"]:checked').value;
document.getElementById('epStromInput').style.display = inputType === 'strom' ? 'flex' : 'none';
document.getElementById('epLeistungInput').style.display = inputType === 'leistung' ? 'flex' : 'none';
}
// Spannung aktualisieren
function epUpdateSpannung() {
const netzart = document.getElementById('epNetzart').value;
const spannungen = { '1ph230': 230, '3ph400': 400, 'dc12': 12, 'dc24': 24, 'dc48': 48 };
document.getElementById('epSpannung').value = spannungen[netzart];
}
// Nächsten Normquerschnitt finden
function epGetNormQuerschnitt(berechnet) {
for (let qs of epNormQuerschnitte) {
if (qs >= berechnet) return qs;
}
return epNormQuerschnitte[epNormQuerschnitte.length - 1];
}
// Formeln anzeigen/verbergen
function epToggleFormulas() {
const section = document.getElementById('epFormulasSection');
const text = document.getElementById('epFormulaToggleText');
if (section.classList.contains('show')) {
section.classList.remove('show');
text.textContent = '<?php echo addslashes($langs->trans("ElektroplanungFormelnAnzeigen")); ?>';
} else {
section.classList.add('show');
text.textContent = '<?php echo addslashes($langs->trans("ElektroplanungFormelnAusblenden")); ?>';
section.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
}
// Formeln generieren
function epGenerateFormulas(data) {
let html = '';
if (data.inputType === 'leistung') {
html += '<div class="ep-formula-box">';
html += '<div class="ep-formula-label">1. Stromberechnung aus Leistung</div>';
html += '<div class="ep-formula-content">';
if (data.netzart.startsWith('3ph')) {
html += `I = P / (√3 × U × cos φ)\nI = ${data.leistung} kW / (√3 × ${data.spannung} V × ${data.cosphi})\nI = ${data.strom.toFixed(2)} A`;
} else {
html += `I = P / (U × cos φ)\nI = ${data.leistung} kW / (${data.spannung} V × ${data.cosphi})\nI = ${data.strom.toFixed(2)} A`;
}
html += '</div></div>';
}
html += `<div class="ep-formula-box">
<div class="ep-formula-label">2. Querschnitt nach Spannungsfall (DIN VDE 0100-520)</div>
<div class="ep-formula-content">A = (2 × l × I × cos φ) / (κ × ΔU_zul)
Werte:
l = ${data.laenge} m
I = ${data.strom.toFixed(2)} A
cos φ = ${data.cosphi}
κ = ${data.kappa} m/(Ω·mm²) (${data.material})
ΔU_zul = ${data.deltaU_zul.toFixed(2)} V (${data.spannungsfallProzent}% von ${data.spannung}V)
A = (2 × ${data.laenge} × ${data.strom.toFixed(2)} × ${data.cosphi}) / (${data.kappa} × ${data.deltaU_zul.toFixed(2)})
A = ${data.A_spannungsfall.toFixed(3)} mm²
Normquerschnitt: ${data.querschnitt_spannungsfall} mm²</div>
</div>`;
html += `<div class="ep-formula-box">
<div class="ep-formula-label">3. Tatsächlicher Spannungsfall</div>
<div class="ep-formula-content">ΔU = (2 × l × I × cos φ) / (κ × A)
Mit ${data.querschnitt} mm²:
ΔU = ${data.deltaU_ist.toFixed(2)} V (${data.deltaU_prozent.toFixed(2)}%)
${data.deltaU_prozent <= data.spannungsfallProzent ? '✓ OK' : '✗ Zu hoch!'}</div>
</div>`;
html += `<div class="ep-formula-box">
<div class="ep-formula-label">4. Strombelastbarkeit (DIN VDE 0298-4)</div>
<div class="ep-formula-content">I_zul = I_Tabelle × f_Temp × f_Häufung
I_zul = ${data.I_tabelle.toFixed(1)} A × ${data.tempFaktor.toFixed(3)} × ${data.haeufungsFaktor.toFixed(2)}
I_zul = ${data.maxStrom.toFixed(1)} A
Benötigt: ${data.strom.toFixed(2)} A
${data.maxStrom >= data.strom ? '✓ Ausreichend' : '✗ Erhöhung nötig!'}</div>
</div>`;
document.getElementById('epFormulasContent').innerHTML = html;
}
// Hauptberechnung
function epBerechnen() {
try {
const inputType = document.querySelector('input[name="inputType"]:checked').value;
let strom, leistung = 0;
const spannung = parseFloat(document.getElementById('epSpannung').value);
const cosphi = parseFloat(document.getElementById('epCosphi').value);
const netzart = document.getElementById('epNetzart').value;
if (inputType === 'leistung') {
leistung = parseFloat(document.getElementById('epLeistung').value);
strom = netzart.startsWith('3ph')
? (leistung * 1000) / (Math.sqrt(3) * spannung * cosphi)
: (leistung * 1000) / (spannung * cosphi);
} else {
strom = parseFloat(document.getElementById('epStrom').value);
}
const laenge = parseFloat(document.getElementById('epLaenge').value);
const spannungsfallProzent = parseFloat(document.getElementById('epSpannungsfall').value);
const kappa = parseFloat(document.getElementById('epMaterial').value);
const verlegeart = document.getElementById('epVerlegeart').value;
const temperatur = parseFloat(document.getElementById('epTemperatur').value);
const haeufung = parseInt(document.getElementById('epHaeufung').value);
const isolierung = parseInt(document.getElementById('epIsolierung').value);
const material = kappa === 56 ? 'Kupfer' : 'Aluminium';
if (strom <= 0 || laenge <= 0 || spannung <= 0) {
throw new Error('Bitte alle Werte korrekt eingeben!');
}
const deltaU_zul = spannung * (spannungsfallProzent / 100);
const A_spannungsfall = (2 * laenge * strom * cosphi) / (kappa * deltaU_zul);
const querschnitt_spannungsfall = epGetNormQuerschnitt(A_spannungsfall);
let querschnitt = querschnitt_spannungsfall;
const tempFaktor = epGetTempFaktor(temperatur, isolierung);
const haeufungsFaktor = epGetHaeufungsFaktor(haeufung);
let I_tabelle = epStrombelastbarkeit[verlegeart][querschnitt] || 0;
let maxStrom = I_tabelle * tempFaktor * haeufungsFaktor;
let warnings = [];
while (maxStrom < strom && querschnitt < 500) {
const index = epNormQuerschnitte.indexOf(querschnitt);
if (index < epNormQuerschnitte.length - 1) {
const vorher = querschnitt;
querschnitt = epNormQuerschnitte[index + 1];
I_tabelle = epStrombelastbarkeit[verlegeart][querschnitt] || 0;
maxStrom = I_tabelle * tempFaktor * haeufungsFaktor;
warnings.push(`⚠️ Querschnitt von ${vorher}mm² auf ${querschnitt}mm² erhöht (Strombelastbarkeit)`);
} else break;
}
const deltaU_ist = (2 * laenge * strom * cosphi) / (kappa * querschnitt);
const deltaU_prozent = (deltaU_ist / spannung) * 100;
let kabeltyp = '';
if (netzart === '1ph230') kabeltyp = `NYM-J 3x${querschnitt}`;
else if (netzart.startsWith('3ph')) kabeltyp = `NYM-J 5x${querschnitt}`;
else kabeltyp = `H07V-K 2x${querschnitt}`;
if (deltaU_prozent > spannungsfallProzent) {
warnings.push(`⚠️ Spannungsfall ${deltaU_prozent.toFixed(2)}% > ${spannungsfallProzent}%`);
}
if (maxStrom / strom < 1.25) {
warnings.push(`💡 Nur ${((maxStrom/strom - 1)*100).toFixed(0)}% Reserve`);
}
if (temperatur > 40 && isolierung == 70) {
warnings.push(`⚠️ Hohe Temperatur! XLPE empfohlen`);
}
epCalculationData = {
inputType, strom, leistung, laenge, cosphi, spannungsfallProzent, spannung,
kappa, material, verlegeart, temperatur, haeufung, isolierung, netzart,
deltaU_zul, A_spannungsfall, querschnitt_spannungsfall, querschnitt,
deltaU_ist, deltaU_prozent, I_tabelle, tempFaktor, haeufungsFaktor,
maxStrom, kabeltyp, warnings
};
document.getElementById('epResultQuerschnitt').textContent = `${querschnitt} mm²`;
document.getElementById('epResultBerechnet').textContent = `${A_spannungsfall.toFixed(2)} mm²`;
document.getElementById('epResultSpannungsfall').textContent = `${deltaU_ist.toFixed(2)}V (${deltaU_prozent.toFixed(2)}%)`;
document.getElementById('epResultStrombelastbar').textContent = `${maxStrom.toFixed(1)} A`;
document.getElementById('epResultKabeltyp').textContent = kabeltyp;
const warningsDiv = document.getElementById('epWarnings');
warningsDiv.innerHTML = warnings.length > 0
? '<div class="ep-warning-box">' + warnings.join('<br>') + '</div>'
: '';
epGenerateFormulas(epCalculationData);
const resultBox = document.getElementById('epResultBox');
resultBox.classList.add('show');
resultBox.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
} catch (error) {
alert('Fehler: ' + error.message);
}
}
// Formular zurücksetzen
function epResetForm() {
document.getElementById('epStrom').value = 16;
document.getElementById('epLeistung').value = 3.68;
document.getElementById('epNetzart').value = '3ph400';
document.getElementById('epSpannung').value = 400;
document.getElementById('epLaenge').value = 20;
document.getElementById('epCosphi').value = 0.95;
document.getElementById('epSpannungsfall').value = 5;
document.getElementById('epMaterial').value = 56;
document.getElementById('epVerlegeart').value = 'B2';
document.getElementById('epTemperatur').value = 30;
document.getElementById('epHaeufung').value = 1;
document.getElementById('epIsolierung').value = 70;
document.getElementById('epResultBox').classList.remove('show');
document.getElementById('epFormulasSection').classList.remove('show');
document.getElementById('epFormulaToggleText').textContent = '<?php echo addslashes($langs->trans("ElektroplanungFormelnAnzeigen")); ?>';
}
// PDF Export
function epExportPDF() {
if (!epCalculationData.querschnitt) {
alert('Bitte erst eine Berechnung durchführen!');
return;
}
const { jsPDF } = window.jspdf;
const doc = new jsPDF();
const data = epCalculationData;
const datum = new Date().toLocaleDateString('de-DE');
let y = 20;
doc.setFontSize(18);
doc.setFont(undefined, 'bold');
doc.text('Leitungsquerschnitt-Berechnung', 105, y, { align: 'center' });
y += 8;
doc.setFontSize(10);
doc.setFont(undefined, 'normal');
doc.text('Nach DIN VDE 0100-520 und DIN VDE 0298-4', 105, y, { align: 'center' });
y += 5;
doc.text('Erstellt: ' + datum, 105, y, { align: 'center' });
y += 10;
doc.line(20, y, 190, y);
y += 10;
doc.setFontSize(14);
doc.setFont(undefined, 'bold');
doc.text('Eingabewerte', 20, y);
y += 7;
doc.setFontSize(10);
doc.setFont(undefined, 'normal');
const inputs = [
data.inputType === 'leistung' ? `Leistung: ${data.leistung} kW` : null,
`Strom: ${data.strom.toFixed(2)} A`,
`Spannung: ${data.spannung} V (${data.netzart})`,
`Leitungslänge: ${data.laenge} m`,
`Leistungsfaktor: ${data.cosphi}`,
`Max. Spannungsfall: ${data.spannungsfallProzent}%`,
`Material: ${data.material}`,
`Verlegeart: ${data.verlegeart}`,
`Temperatur: ${data.temperatur}°C`
].filter(Boolean);
inputs.forEach(line => { doc.text(line, 20, y); y += 6; });
y += 5;
doc.setFontSize(14);
doc.setFont(undefined, 'bold');
doc.text('Ergebnis', 20, y);
y += 7;
doc.setFontSize(16);
doc.setTextColor(16, 185, 129);
doc.text(`Querschnitt: ${data.querschnitt} mm²`, 20, y);
doc.setTextColor(0, 0, 0);
y += 8;
doc.setFontSize(10);
doc.setFont(undefined, 'normal');
doc.text(`Berechneter Querschnitt: ${data.A_spannungsfall.toFixed(2)} mm²`, 20, y); y += 6;
doc.text(`Spannungsfall: ${data.deltaU_ist.toFixed(2)} V (${data.deltaU_prozent.toFixed(2)}%)`, 20, y); y += 6;
doc.text(`Strombelastbarkeit: ${data.maxStrom.toFixed(1)} A`, 20, y); y += 6;
doc.text(`Kabeltyp: ${data.kabeltyp}`, 20, y);
doc.setFontSize(8);
doc.setTextColor(150);
doc.text('Elektroplanung - Alle Angaben ohne Gewähr', 105, 290, { align: 'center' });
doc.save(`Leitungsberechnung_${data.querschnitt}mm2_${datum.replace(/\./g, '-')}.pdf`);
}
// Initial berechnen
document.addEventListener('DOMContentLoaded', function() {
epBerechnen();
});
</script>
<?php
print '</div>';
llxFooter();
$db->close();