{"id":2625,"date":"2026-10-02T17:39:44","date_gmt":"2026-10-02T15:39:44","guid":{"rendered":"https:\/\/cad-kompass.de\/?p=2625"},"modified":"2026-10-03T11:40:30","modified_gmt":"2026-10-03T09:40:30","slug":"modell-schnellcheck","status":"publish","type":"post","link":"https:\/\/cad-kompass.de\/?p=2625","title":{"rendered":"Modell-Schnellcheck"},"content":{"rendered":"\n<!-- CAD-Kompass, 05-BIM, Themenfeld 5: Modell-Schnellcheck. WordPress-Embed, CSS-Prefix msc-. -->\n<style>\n    .msc-box {\n        --msc-primary: #3f5f75;\n        --msc-primary-dark: #2c4a5e;\n        --msc-primary-deep: #1e3548;\n        --msc-error: #dc2626;\n        --msc-good: #059669;\n        --msc-good-deep: #15803d;\n        --msc-accent: #e8913a;\n        --msc-warn: #d97706;\n        --msc-ink: #1e293b;\n        --msc-text: #334155;\n        --msc-muted: #64748b;\n        --msc-faint: #94a3b8;\n        --msc-border: #c8d6e0;\n        --msc-hair: #e2e8f0;\n        --msc-surface: #f7f9fb;\n        background: var(--msc-surface);\n        border: 3px solid var(--msc-primary);\n        border-radius: 8px;\n        margin: 28px 0;\n        overflow: hidden;\n        font-family: inherit;\n        color: var(--msc-text);\n        line-height: 1.6;\n    }\n    .msc-box *, .msc-box *::before, .msc-box *::after { box-sizing: border-box; }\n\n    \/* Kopf *\/\n    .msc-header {\n        background: linear-gradient(135deg, var(--msc-primary-deep) 0%, var(--msc-primary-dark) 100%);\n        padding: 20px 28px 18px;\n        position: relative;\n        overflow: hidden;\n    }\n    .msc-header::after {\n        content: '';\n        position: absolute;\n        bottom: 0; left: 0; right: 0;\n        height: 3px;\n        background: repeating-linear-gradient(90deg, var(--msc-primary) 0px, var(--msc-primary) 8px, transparent 8px, transparent 12px);\n    }\n    .msc-header-top { display: flex; align-items: center; gap: 12px; margin-bottom: 6px; }\n    .msc-header-icon { width: 36px; height: 36px; flex-shrink: 0; opacity: 0.85; }\n    .msc-box .msc-box-title {\n        font-size: 1.15rem; font-weight: 700; color: #fff;\n        margin: 0; padding: 0; letter-spacing: 0.02em; display: inline;\n    }\n    .msc-box .msc-box-desc {\n        font-size: 0.85rem; color: rgba(255,255,255,0.68);\n        margin: 0; padding: 0; line-height: 1.5; display: block;\n    }\n\n    .msc-body { padding: 22px 28px 24px; }\n\n    \/* Datenschutz, deckt die Dateiverarbeitung ausdr\u00fccklich mit ab *\/\n    .msc-privacy {\n        background: #f0fdf4;\n        border: 1px solid #bbf7d0;\n        border-radius: 3px;\n        padding: 9px 14px;\n        margin-bottom: 14px;\n        font-size: 0.8rem;\n        color: var(--msc-good-deep);\n        line-height: 1.5;\n        display: flex; align-items: flex-start; gap: 8px;\n    }\n    .msc-privacy::before { content: '\\1F512'; flex-shrink: 0; font-size: 0.9rem; line-height: 1.5; }\n\n    \/* Einordnung, neutraler Linksstrich als Hausstil *\/\n    .msc-scope {\n        background: #fff;\n        border: 1px solid var(--msc-border);\n        border-left: 3px solid var(--msc-primary);\n        border-radius: 0 3px 3px 0;\n        padding: 12px 16px;\n        margin-bottom: 16px;\n        font-size: 0.82rem;\n        color: var(--msc-text);\n        line-height: 1.6;\n    }\n    .msc-scope p { margin: 0 0 7px; }\n    .msc-scope p:last-child { margin-bottom: 0; }\n    .msc-scope strong { color: var(--msc-ink); }\n    .msc-box .msc-scope a { color: var(--msc-primary-dark); }\n\n    .msc-label {\n        font-size: 0.72rem;\n        font-weight: 600;\n        color: var(--msc-muted);\n        text-transform: uppercase;\n        letter-spacing: 0.06em;\n        margin-bottom: 6px;\n        display: block;\n    }\n\n    \/* Beispielzeile *\/\n    .msc-presets { margin-bottom: 18px; }\n    .msc-preset-row { display: flex; flex-wrap: wrap; gap: 6px; }\n    .msc-preset-note { font-size: 0.78rem; color: var(--msc-muted); margin: 7px 0 0; }\n\n    \/* Standard-Schalter, box-gescopt und gegen Theme-Resets geh\u00e4rtet *\/\n    .msc-box .msc-btn {\n        min-height: 36px !important;\n        padding: 7px 14px !important;\n        font-size: 0.82rem !important;\n        font-family: inherit !important;\n        font-weight: 600 !important;\n        border: 1px solid var(--msc-border) !important;\n        border-radius: 3px !important;\n        background: #fff !important;\n        color: var(--msc-primary) !important;\n        cursor: pointer;\n        line-height: 1.4 !important;\n        text-transform: none !important;\n        letter-spacing: normal !important;\n        box-shadow: none !important;\n        transition: background 0.15s, color 0.15s, border-color 0.15s;\n    }\n    .msc-box .msc-btn:hover { background: #eef2f6 !important; border-color: var(--msc-primary) !important; color: var(--msc-primary-dark) !important; }\n    .msc-box .msc-btn:active { background: #e2eaf1 !important; color: var(--msc-primary-deep) !important; border-color: var(--msc-primary) !important; }\n    .msc-box .msc-btn:focus-visible { outline: 2px solid var(--msc-primary) !important; outline-offset: 2px; }\n    .msc-box .msc-btn:disabled { background: #f1f5f9 !important; color: var(--msc-faint) !important; border-color: var(--msc-hair) !important; opacity: 0.45 !important; cursor: not-allowed !important; }\n    .msc-box .msc-btn.is-active { background: var(--msc-primary) !important; color: #fff !important; border-color: var(--msc-primary) !important; }\n\n    \/* Segment-Schalter f\u00fcr Ja\/Nein und Mehrfachauswahl *\/\n    .msc-box .msc-seg {\n        min-height: 34px !important;\n        padding: 5px 12px !important;\n        font-size: 0.82rem !important;\n        font-family: inherit !important;\n        font-weight: 500 !important;\n        border: 1px solid var(--msc-border) !important;\n        border-radius: 3px !important;\n        background: #fff !important;\n        color: var(--msc-muted) !important;\n        cursor: pointer;\n        line-height: 1.4 !important;\n        text-transform: none !important;\n        letter-spacing: normal !important;\n        box-shadow: none !important;\n        transition: background 0.15s, color 0.15s, border-color 0.15s;\n    }\n    .msc-box .msc-seg:hover { background: #eef2f6 !important; border-color: var(--msc-primary) !important; color: var(--msc-ink) !important; }\n    .msc-box .msc-seg:active { background: #e2eaf1 !important; color: var(--msc-primary-deep) !important; border-color: var(--msc-primary) !important; }\n    .msc-box .msc-seg:focus-visible { outline: 2px solid var(--msc-primary) !important; outline-offset: 2px; }\n    .msc-box .msc-seg:disabled { background: #f1f5f9 !important; color: var(--msc-faint) !important; border-color: var(--msc-hair) !important; opacity: 0.45 !important; cursor: not-allowed !important; }\n    .msc-box .msc-seg.is-active { background: var(--msc-primary) !important; color: #fff !important; border-color: var(--msc-primary) !important; }\n\n    \/* Dateiblock *\/\n    .msc-file {\n        background: #fff;\n        border: 1px dashed var(--msc-border);\n        border-radius: 4px;\n        padding: 14px 16px;\n        margin-bottom: 20px;\n    }\n    .msc-file-head { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; flex-wrap: wrap; margin-bottom: 4px; }\n    .msc-file-title { font-size: 0.9rem; font-weight: 700; color: var(--msc-ink); margin: 0; }\n    .msc-file-tag {\n        font-size: 0.68rem; font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase;\n        color: var(--msc-muted); border: 1px solid var(--msc-hair); border-radius: 2px; padding: 1px 6px;\n    }\n    .msc-file-note { font-size: 0.8rem; color: var(--msc-muted); margin: 0 0 10px; }\n    .msc-box .msc-file-input {\n        display: block;\n        width: 100%;\n        font-family: inherit;\n        font-size: 0.82rem;\n        color: var(--msc-text);\n        background: #fff;\n        border: 1px solid var(--msc-border);\n        border-radius: 3px;\n        padding: 7px 10px;\n    }\n    .msc-box .msc-file-input:focus { outline: none; border-color: var(--msc-primary); box-shadow: 0 0 0 2px rgba(63,95,117,0.12); }\n    .msc-box .msc-file-input::file-selector-button {\n        font-family: inherit; font-size: 0.8rem; font-weight: 600;\n        color: var(--msc-primary); background: #fff;\n        border: 1px solid var(--msc-border); border-radius: 3px;\n        padding: 5px 11px; margin-right: 10px; cursor: pointer; min-height: 30px;\n    }\n    .msc-box .msc-file-input::-webkit-file-upload-button {\n        font-family: inherit; font-size: 0.8rem; font-weight: 600;\n        color: var(--msc-primary); background: #fff;\n        border: 1px solid var(--msc-border); border-radius: 3px;\n        padding: 5px 11px; margin-right: 10px; cursor: pointer; min-height: 30px;\n    }\n    .msc-file-actions { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 10px; }\n    .msc-file-out { margin-top: 12px; }\n    .msc-fbefund {\n        display: grid;\n        grid-template-columns: 190px 1fr;\n        gap: 4px 14px;\n        padding: 8px 0;\n        border-top: 1px solid var(--msc-hair);\n        font-size: 0.83rem;\n    }\n    .msc-fbefund:first-child { border-top: 0; }\n    .msc-fbefund-k { color: var(--msc-muted); font-weight: 600; }\n    .msc-fbefund-w { color: var(--msc-ink); }\n    .msc-fbefund-n { grid-column: 2; color: var(--msc-muted); font-size: 0.78rem; line-height: 1.5; }\n    .msc-mono { font-family: 'SF Mono', 'Fira Code', Consolas, monospace; font-size: 0.95em; }\n    .msc-warnzeile {\n        background: #fffbeb; border: 1px solid #fde68a; border-radius: 3px;\n        padding: 8px 12px; font-size: 0.8rem; color: #92400e; margin-top: 10px;\n    }\n\n    \/* Schritte *\/\n    .msc-step {\n        background: #fff;\n        border: 1px solid var(--msc-border);\n        border-left: 3px solid var(--msc-primary);\n        border-radius: 0 4px 4px 0;\n        padding: 14px 16px 16px;\n        margin-bottom: 12px;\n    }\n    .msc-step-head { display: flex; align-items: baseline; gap: 10px; margin-bottom: 3px; }\n    .msc-step-nr {\n        font-family: 'SF Mono', 'Fira Code', Consolas, monospace;\n        font-size: 0.72rem; font-weight: 700; color: var(--msc-primary);\n        border: 1px solid var(--msc-border); border-radius: 2px; padding: 1px 6px;\n    }\n    .msc-box .msc-step-title { font-size: 0.95rem; font-weight: 700; color: var(--msc-ink); margin: 0; padding: 0; }\n    .msc-step-sub { font-size: 0.79rem; color: var(--msc-muted); margin: 0 0 12px; }\n\n    .msc-fields { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px 18px; }\n    .msc-field.is-wide { grid-column: 1 \/ -1; }\n    .msc-field-label { display: block; font-size: 0.82rem; font-weight: 600; color: var(--msc-ink); margin-bottom: 5px; }\n    .msc-field-hint { display: block; font-size: 0.76rem; font-weight: 400; color: var(--msc-muted); margin-top: 2px; }\n\n    .msc-box select.msc-select {\n        width: 100%;\n        font-family: inherit;\n        font-size: 0.84rem;\n        color: var(--msc-ink);\n        background-color: #fff;\n        border: 1px solid var(--msc-border);\n        border-radius: 3px;\n        padding: 7px 10px;\n        min-height: 36px;\n        line-height: 1.4;\n        cursor: pointer;\n        max-width: 100%;\n    }\n    .msc-box select.msc-select:focus { outline: none; border-color: var(--msc-primary); box-shadow: 0 0 0 2px rgba(63,95,117,0.12); }\n    .msc-box select.msc-select.is-open { color: var(--msc-muted); }\n    .msc-switch { display: flex; flex-wrap: wrap; gap: 6px; }\n    .msc-prefill {\n        display: inline-block; margin-top: 5px;\n        font-size: 0.74rem; color: var(--msc-good-deep);\n        background: #f0fdf4; border: 1px solid #bbf7d0; border-radius: 2px;\n        padding: 1px 7px;\n    }\n\n    \/* Ausgabe *\/\n    .msc-out { margin-top: 22px; padding-top: 16px; border-top: 1px solid var(--msc-border); }\n    .msc-out-head { display: flex; justify-content: space-between; align-items: baseline; gap: 12px; flex-wrap: wrap; margin-bottom: 10px; }\n    .msc-box .msc-out-title { font-size: 1rem; font-weight: 700; color: var(--msc-ink); margin: 0; padding: 0; }\n    .msc-zustand {\n        background: #fff;\n        border: 1px solid var(--msc-border);\n        border-left: 3px solid var(--msc-primary);\n        border-radius: 0 3px 3px 0;\n        padding: 12px 16px;\n        margin-bottom: 14px;\n        font-size: 0.86rem;\n        color: var(--msc-ink);\n    }\n    .msc-zustand p { margin: 0 0 6px; }\n    .msc-zustand p:last-child { margin-bottom: 0; }\n    .msc-zustand-satz { font-weight: 700; }\n    .msc-zustand-zusatz { color: var(--msc-text); font-size: 0.82rem; }\n\n    .msc-rang { margin-bottom: 14px; }\n    .msc-rang-head { display: flex; align-items: center; gap: 8px; margin-bottom: 7px; }\n    .msc-mark { width: 10px; height: 10px; border-radius: 1px; flex-shrink: 0; display: inline-block; }\n    .msc-rang-wort { font-size: 0.78rem; font-weight: 700; letter-spacing: 0.04em; text-transform: uppercase; }\n    .msc-rang-zahl { font-family: 'SF Mono', 'Fira Code', Consolas, monospace; font-size: 0.76rem; color: var(--msc-muted); }\n    .msc-befund {\n        background: #fff;\n        border: 1px solid var(--msc-hair);\n        border-radius: 3px;\n        padding: 9px 12px;\n        margin-bottom: 6px;\n        font-size: 0.84rem;\n    }\n    .msc-befund-satz { color: var(--msc-ink); font-weight: 600; margin: 0 0 3px; }\n    .msc-befund-tun { color: var(--msc-text); margin: 0; font-size: 0.82rem; }\n    .msc-befund-quelle { display: block; margin-top: 4px; font-size: 0.74rem; color: var(--msc-muted); }\n    .msc-box .msc-karte-link { color: var(--msc-primary-dark); }\n\n    .msc-copy-block { margin-top: 16px; }\n    .msc-copy-head { display: flex; justify-content: space-between; align-items: baseline; gap: 10px; flex-wrap: wrap; margin-bottom: 6px; }\n    .msc-box .msc-copy-title { font-size: 0.88rem; font-weight: 700; color: var(--msc-ink); margin: 0; padding: 0; }\n    .msc-copy-note { font-size: 0.78rem; color: var(--msc-muted); margin: 0 0 7px; }\n    .msc-box textarea.msc-ta {\n        width: 100%;\n        min-height: 210px;\n        font-family: 'SF Mono', 'Fira Code', Consolas, monospace;\n        font-size: 0.78rem;\n        line-height: 1.55;\n        color: var(--msc-ink);\n        background: #fff;\n        border: 1px solid var(--msc-border);\n        border-radius: 3px;\n        padding: 11px 13px;\n        resize: vertical;\n        white-space: pre;\n        overflow-x: auto;\n    }\n    .msc-box textarea.msc-ta:focus { outline: none; border-color: var(--msc-primary); box-shadow: 0 0 0 2px rgba(63,95,117,0.12); }\n    .msc-box textarea.msc-ta-fragen { min-height: 150px; white-space: pre-wrap; }\n    .msc-copy-row { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; margin-top: 7px; }\n    .msc-copy-ok { font-size: 0.78rem; color: var(--msc-good-deep); }\n\n    \/* Nur f\u00fcr den Druck. Ein Textfeld w\u00e4chst im Druck nicht mit, ein pre schon. *\/\n    .msc-print-only { display: none; }\n\n    \/* Fu\u00dfzeile *\/\n    .msc-foot {\n        margin-top: 20px;\n        padding-top: 14px;\n        border-top: 1px solid var(--msc-border);\n        font-size: 0.76rem;\n        color: var(--msc-muted);\n        line-height: 1.6;\n    }\n    .msc-foot p { margin: 0 0 6px; }\n    .msc-foot p:last-child { margin-bottom: 0; }\n    .msc-box .msc-foot a { color: var(--msc-primary-dark); }\n\n    @media (max-width: 700px) {\n        .msc-body { padding: 18px 16px 20px; }\n        .msc-header { padding: 16px 18px 14px; }\n        .msc-fields { grid-template-columns: 1fr; }\n        .msc-fbefund { grid-template-columns: 1fr; }\n        .msc-fbefund-n { grid-column: 1; }\n    }\n\n    @media print {\n        .msc-box { border: 1px solid #333; background: #fff; margin: 0; }\n        .msc-header { background: #fff !important; padding: 0 0 8px; }\n        .msc-box .msc-box-title { color: #000; }\n        .msc-box .msc-box-desc { color: #333; }\n        .msc-header::after { display: none; }\n        .msc-header-icon { display: none; }\n        .msc-body { padding: 12px 0 0; }\n        .msc-privacy, .msc-presets, .msc-file, .msc-steps, .msc-copy-row, .msc-scope { display: none !important; }\n        .msc-box button { display: none !important; }\n        .msc-copy-note { color: #333; }\n        .msc-out { border-top: 0; margin-top: 0; padding-top: 0; }\n        .msc-befund, .msc-zustand { page-break-inside: avoid; border: 1px solid #999; }\n        .msc-box textarea.msc-ta { display: none !important; }\n        .msc-print-only {\n            display: block;\n            border: 1px solid #999;\n            padding: 8px 10px;\n            font-family: 'SF Mono', Consolas, monospace;\n            font-size: 8pt;\n            line-height: 1.45;\n            white-space: pre-wrap;\n            page-break-inside: avoid;\n            margin: 0;\n        }\n        .msc-foot { color: #333; }\n    }\n<\/style>\n<div class=\"msc-box\">\n    <div class=\"msc-header\">\n        <div class=\"msc-header-top\">\n            <svg class=\"msc-header-icon\" viewBox=\"0 0 36 36\" fill=\"none\" aria-hidden=\"true\">\n                <rect x=\"6\" y=\"4\" width=\"21\" height=\"27\" rx=\"2\" stroke=\"rgba(255,255,255,0.6)\" stroke-width=\"1.3\"\/>\n                <line x1=\"10\" y1=\"10\" x2=\"23\" y2=\"10\" stroke=\"rgba(255,255,255,0.5)\" stroke-width=\"1.1\"\/>\n                <line x1=\"10\" y1=\"14\" x2=\"23\" y2=\"14\" stroke=\"rgba(255,255,255,0.45)\" stroke-width=\"1.1\"\/>\n                <line x1=\"10\" y1=\"18\" x2=\"18\" y2=\"18\" stroke=\"rgba(255,255,255,0.45)\" stroke-width=\"1.1\"\/>\n                <path d=\"M10 24.5 L13 27.5 L19 21\" stroke=\"rgba(255,255,255,0.75)\" stroke-width=\"1.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>\n                <circle cx=\"26\" cy=\"25\" r=\"5.5\" stroke=\"rgba(255,255,255,0.55)\" stroke-width=\"1.3\"\/>\n                <line x1=\"30\" y1=\"29\" x2=\"33\" y2=\"32\" stroke=\"rgba(255,255,255,0.55)\" stroke-width=\"1.5\" stroke-linecap=\"round\"\/>\n            <\/svg>\n            <span class=\"msc-box-title\">Modell-Schnellcheck<\/span>\n        <\/div>\n        <span class=\"msc-box-desc\">Die Pr\u00fcfung vor dem Versand. Am Ende steht ein Lieferschein, der sagt, was nicht drin ist, dazu die R\u00fcckfragen, die noch an den Auftraggeber geh\u00f6ren.<\/span>\n    <\/div>\n\n    <div class=\"msc-body\">\n        <div class=\"msc-privacy\">L\u00e4uft komplett im Browser. Es wird keine Datei hochgeladen und nichts gespeichert. Wenn du unten eine IFC-Datei ausw\u00e4hlst, liest dein Browser sie lokal von der Festplatte. Sie verl\u00e4sst deinen Rechner nicht, und nach dem Schlie\u00dfen der Seite ist nichts davon \u00fcbrig.<\/div>\n\n        <div class=\"msc-scope\">\n            <p><strong>Das Werkzeug vergibt keine Note.<\/strong> Keinen Reifegrad, keine Punktzahl. Es sagt dir, was in der Lieferung fehlt und was noch zu kl\u00e4ren ist, und schreibt beides so auf, dass du es weiterschicken kannst.<\/p>\n            <p><strong>Es ersetzt keine Pr\u00fcfung durch den Auftraggeber.<\/strong> Was im Vertrag steht, geht jeder allgemeinen Empfehlung vor. Welche Ausgabe eines Formats gerade gilt, steht in <a href=\"https:\/\/cad-kompass.de\/?p=2643\">Versionen und St\u00e4nde<\/a>.<\/p>\n            <p>Beispielwelt der Fragen ist eine Bauma\u00dfnahme mit Kanalerneuerung in der Beispiel Gemeinde. Die Fragen passen genauso auf andere Lieferungen im kommunalen Tiefbau.<\/p>\n        <\/div>\n\n        <div class=\"msc-presets\">\n            <span class=\"msc-label\">Zum Ausprobieren: vier Lieferungen aus derselben Bauma\u00dfnahme<\/span>\n            <div class=\"msc-preset-row\" id=\"msc-presets\"><\/div>\n            <p class=\"msc-preset-note\">Ein Klick f\u00fcllt alle Felder. Danach \u00e4nderst du einzelne Antworten und siehst sofort, was das mit dem Ergebnis macht.<\/p>\n        <\/div>\n\n        <div class=\"msc-file\">\n            <div class=\"msc-file-head\">\n                <p class=\"msc-file-title\">Blick in den Dateikopf<\/p>\n                <span class=\"msc-file-tag\">Zugabe, nicht n\u00f6tig<\/span>\n            <\/div>\n            <p class=\"msc-file-note\">W\u00e4hle eine unkomprimierte IFC-Datei. Das Werkzeug liest den Kopf und z\u00e4hlt die Bauteilklassen. Es ist kein vollst\u00e4ndiger Pr\u00fcfdienst und ersetzt keinen. Ohne Datei funktionieren alle Fragen genauso.<\/p>\n            <input type=\"file\" class=\"msc-file-input\" id=\"msc-file\" accept=\".ifc,.ifcxml,.stp,.step,text\/plain\" aria-describedby=\"msc-file-out\">\n            <div class=\"msc-file-actions\" id=\"msc-file-actions\"><\/div>\n            <div class=\"msc-file-out\" id=\"msc-file-out\" aria-live=\"polite\"><\/div>\n        <\/div>\n\n        <div class=\"msc-steps\" id=\"msc-steps\">\n            <section class=\"msc-step\">\n                <div class=\"msc-step-head\">\n                    <span class=\"msc-step-nr\">1<\/span>\n                    <h3 class=\"msc-step-title\">Wer bekommt die Datei, und was soll er damit tun?<\/h3>\n                <\/div>\n                <p class=\"msc-step-sub\">Alles Weitere h\u00e4ngt daran. Die Version bestimmt der Empf\u00e4nger.<\/p>\n                <div class=\"msc-fields\" data-schritt=\"1\"><\/div>\n            <\/section>\n\n            <section class=\"msc-step\">\n                <div class=\"msc-step-head\">\n                    <span class=\"msc-step-nr\">2<\/span>\n                    <h3 class=\"msc-step-title\">Format und Version<\/h3>\n                <\/div>\n                <p class=\"msc-step-sub\">Ein Format ohne Version ist eine Absichtserkl\u00e4rung. Entscheidend ist, was das Programm des Empf\u00e4ngers liest.<\/p>\n                <div class=\"msc-fields\" data-schritt=\"2\"><\/div>\n            <\/section>\n\n            <section class=\"msc-step\">\n                <div class=\"msc-step-head\">\n                    <span class=\"msc-step-nr\">3<\/span>\n                    <h3 class=\"msc-step-title\">Lage und H\u00f6he<\/h3>\n                <\/div>\n                <p class=\"msc-step-sub\">Ein Modell ohne benanntes Bezugssystem landet beim Empf\u00e4nger irgendwo. H\u00f6hen ohne benannten Bezug sind Zahlen.<\/p>\n                <div class=\"msc-fields\" data-schritt=\"3\"><\/div>\n            <\/section>\n\n            <section class=\"msc-step\">\n                <div class=\"msc-step-head\">\n                    <span class=\"msc-step-nr\">4<\/span>\n                    <h3 class=\"msc-step-title\">Inhalt<\/h3>\n                <\/div>\n                <p class=\"msc-step-sub\">Die Datei kann ankommen und der Inhalt trotzdem nicht. Klassen, Merkmale und Namen entscheiden dar\u00fcber.<\/p>\n                <div class=\"msc-fields\" data-schritt=\"4\"><\/div>\n            <\/section>\n\n            <section class=\"msc-step\">\n                <div class=\"msc-step-head\">\n                    <span class=\"msc-step-nr\">5<\/span>\n                    <h3 class=\"msc-step-title\">Gegenprobe<\/h3>\n                <\/div>\n                <p class=\"msc-step-sub\">Gepr\u00fcft wird die Datei, nicht die Zeichnung. Am besten in einem Programm, das nicht deins ist.<\/p>\n                <div class=\"msc-fields\" data-schritt=\"5\"><\/div>\n            <\/section>\n        <\/div>\n\n        <div class=\"msc-out\">\n            <div class=\"msc-out-head\">\n                <h3 class=\"msc-out-title\">Ergebnis<\/h3>\n                <button type=\"button\" class=\"msc-btn\" id=\"msc-reset\">Alles zur\u00fccksetzen<\/button>\n            <\/div>\n\n            <div class=\"msc-zustand\" id=\"msc-zustand\" aria-live=\"polite\"><\/div>\n            <div id=\"msc-befunde\"><\/div>\n\n            <div class=\"msc-copy-block\">\n                <div class=\"msc-copy-head\">\n                    <p class=\"msc-copy-title\">Lieferschein zum Mitschicken<\/p>\n                    <span class=\"msc-rang-zahl\" id=\"msc-ls-stand\"><\/span>\n                <\/div>\n                <p class=\"msc-copy-note\">Kopieren, Projektzeile ersetzen, der Lieferung beilegen. Der Teil, der z\u00e4hlt, steht unter \u201eNicht enthalten&#8220;.<\/p>\n                <textarea class=\"msc-ta\" id=\"msc-lieferschein\" readonly spellcheck=\"false\" aria-label=\"Lieferschein zum Kopieren\"><\/textarea>\n                <pre class=\"msc-print-only\" id=\"msc-lieferschein-druck\"><\/pre>\n                <div class=\"msc-copy-row\">\n                    <button type=\"button\" class=\"msc-btn\" id=\"msc-copy-ls\">Lieferschein kopieren<\/button>\n                    <span class=\"msc-copy-ok\" id=\"msc-copy-ls-ok\" aria-live=\"polite\"><\/span>\n                <\/div>\n            <\/div>\n\n            <div class=\"msc-copy-block\">\n                <div class=\"msc-copy-head\">\n                    <p class=\"msc-copy-title\">R\u00fcckfragen an den Auftraggeber<\/p>\n                    <span class=\"msc-rang-zahl\" id=\"msc-fr-stand\"><\/span>\n                <\/div>\n                <p class=\"msc-copy-note\">Fertige S\u00e4tze, die aus den offenen Punkten entstehen. In eine Mail kopieren und abschicken, bevor die Lieferung rausgeht.<\/p>\n                <textarea class=\"msc-ta msc-ta-fragen\" id=\"msc-fragen\" readonly spellcheck=\"false\" aria-label=\"R\u00fcckfragen zum Kopieren\"><\/textarea>\n                <pre class=\"msc-print-only\" id=\"msc-fragen-druck\"><\/pre>\n                <div class=\"msc-copy-row\">\n                    <button type=\"button\" class=\"msc-btn\" id=\"msc-copy-fr\">R\u00fcckfragen kopieren<\/button>\n                    <span class=\"msc-copy-ok\" id=\"msc-copy-fr-ok\" aria-live=\"polite\"><\/span>\n                <\/div>\n            <\/div>\n        <\/div>\n\n        <div class=\"msc-foot\">\n            <p><strong>Woher die Fragen kommen:<\/strong> aus den f\u00fcnf Themenseiten dieses Themenfelds. Hinter jedem Befund steht die Seite, die den Fall ausf\u00fchrlich behandelt.<\/p>\n            <p><strong>Was der Dateiteil kann und was nicht:<\/strong> Er liest die Schema-Kennung, das erzeugende Programm, das Vorhandensein von Bezugssystem und Transformation und z\u00e4hlt die Bauteilklassen. Er pr\u00fcft weder Geometrie noch Merkmale noch die Regeln einer Modellsicht. Daf\u00fcr gibt es Pr\u00fcfdienste, und die Pr\u00fcfung des Auftraggebers ersetzt er ohnehin nicht.<\/p>\n            <p>Angaben ohne Gew\u00e4hr. Was im Vertrag steht, geht jeder allgemeinen Angabe vor. \u00a9 CAD-Kompass.<\/p>\n            <p>Stand 09\/2026<\/p>\n        <\/div>\n    <\/div>\n<\/div>\n\n<script>\n(function () {\n    'use strict';\n\n    var box = document.querySelector('.msc-box');\n    if (box === null) { return; }\n\n    \/\/ ---------- kleine Helfer ----------\n\n    function el(tag, klasse, text) {\n        var k = document.createElement(tag);\n        if (klasse) { k.className = klasse; }\n        if (text !== undefined) { k.textContent = text; }\n        return k;\n    }\n\n    function fuellen(s, laenge) {\n        var t = s;\n        while (t.length < laenge) { t += ' '; }\n        return t;\n    }\n\n    function heute() {\n        var d = new Date();\n        var tag = String(d.getDate());\n        var mon = String(d.getMonth() + 1);\n        if (tag.length === 1) { tag = '0' + tag; }\n        if (mon.length === 1) { mon = '0' + mon; }\n        return tag + '.' + mon + '.' + d.getFullYear();\n    }\n\n    function tausend(n) {\n        var s = String(n);\n        var out = '';\n        var zaehler = 0;\n        var i = s.length - 1;\n        while (i >= 0) {\n            out = s.charAt(i) + out;\n            zaehler += 1;\n            if (zaehler % 3 === 0) {\n                if (i !== 0) { out = '.' + out; }\n            }\n            i -= 1;\n        }\n        return out;\n    }\n\n    \/\/ ---------- Felder ----------\n    \/\/ t   select   Auswahlliste\n    \/\/     schalter gestaltete Ja\/Nein-Kn\u00f6pfe, auch f\u00fcr Kurzlisten\n    \/\/     mehr     Mehrfachauswahl\n    \/\/ u   an einer Option: die Antwort hei\u00dft \"wei\u00df ich nicht\" und z\u00e4hlt f\u00fcr die\n    \/\/     Deckelung mit, siehe unsicherLage()\n    \/\/ nur Sichtbarkeitsbedingung. Ein unsichtbares Feld z\u00e4hlt als unbeantwortet,\n    \/\/     damit R11, R12, R17, R18 und R19 beim falschen Format stumm bleiben.\n\n    var FELDER = [\n        {id: 'emp', s: 1, t: 'select', weit: true,\n         l: 'Wer bekommt die Datei?',\n         h: 'Format und Version bestimmt der Empf\u00e4nger, deshalb steht diese Frage vorn.',\n         o: [\n            {v: 'ag', t: 'Auftraggeber zur Pr\u00fcfung'},\n            {v: 'fachplaner', t: 'anderer Fachplaner zur Koordination'},\n            {v: 'netz', t: 'Netzbetreiber oder Kataster'},\n            {v: 'baufirma', t: 'Baufirma oder Baustelle'},\n            {v: 'ausschreibung', t: 'Ausschreibung und Abrechnung'},\n            {v: 'unbekannt', t: 'wei\u00df ich noch nicht', u: true}\n         ]},\n        {id: 'zweck', s: 1, t: 'mehr', weit: true,\n         l: 'Was soll er damit tun?',\n         h: 'Mehrfachauswahl. Der Zweck entscheidet, welche Fragen \u00fcberhaupt gestellt werden.',\n         o: [\n            {v: 'ansehen', t: 'ansehen'},\n            {v: 'pruefen', t: 'pr\u00fcfen und freigeben'},\n            {v: 'weiterplanen', t: 'weiterplanen'},\n            {v: 'mengen', t: 'Mengen ziehen'},\n            {v: 'bauen', t: 'bauen und abstecken'},\n            {v: 'datenbank', t: 'in eine Datenbank einpflegen'}\n         ]},\n\n        {id: 'fmt', s: 2, t: 'select', weit: true,\n         l: 'In welchem Format geht die Lieferung raus?',\n         o: [\n            {v: 'ifc', t: 'offenes Bauwerksformat (IFC)'},\n            {v: 'isybau', t: 'Kanalfachformat (ISYBAU)'},\n            {v: 'landxml', t: 'Geometrieformat (LandXML)'},\n            {v: 'okstra', t: 'Stra\u00dfenfachformat (OKSTRA)'},\n            {v: 'dwg', t: 'Zeichnung (DWG oder DXF)'},\n            {v: 'gaeb', t: 'Mengen- und Ausschreibungsformat (GAEB)'},\n            {v: 'mehrere', t: 'mehrere Formate'}\n         ]},\n        {id: 'fver', s: 2, t: 'select',\n         l: 'Ist die Version des Formats vereinbart?',\n         o: [\n            {v: 'schriftlich', t: 'ja, steht schriftlich', ls: 'schriftlich vereinbart'},\n            {v: 'muendlich', t: 'm\u00fcndlich abgestimmt', ls: 'm\u00fcndlich abgestimmt, nicht schriftlich'},\n            {v: 'nein', t: 'nein', ls: 'nicht vereinbart'},\n            {v: 'weiss', t: 'wei\u00df ich nicht', ls: 'nicht bekannt', u: true}\n         ]},\n        {id: 'fque', s: 2, t: 'select',\n         l: 'Woher stammt die Versionsvorgabe?',\n         o: [\n            {v: 'vertrag', t: 'Vertrag oder Auftraggeber-Informationsanforderungen', ls: 'Vertrag oder Informationsanforderungen'},\n            {v: 'bap', t: 'Abwicklungsplan'},\n            {v: 'rueckfrage', t: 'beantwortete R\u00fcckfrage'},\n            {v: 'unbekannt', t: 'unbekannt', u: true}\n         ]},\n        {id: 'ziel', s: 2, t: 'select',\n         l: 'Ist bekannt, womit der Empf\u00e4nger die Datei liest?',\n         o: [\n            {v: 'jahrgang', t: 'ja, Programm und Jahrgang bekannt', ls: 'Programm und Jahrgang bekannt'},\n            {v: 'nur', t: 'nur das Programm bekannt'},\n            {v: 'nein', t: 'nein, nicht bekannt', ls: 'nicht bekannt', u: true}\n         ]},\n        {id: 'probe', s: 2, t: 'select',\n         l: 'Hat der Empf\u00e4nger eine Probe gelesen?',\n         o: [\n            {v: 'ja', t: 'ja, mit R\u00fcckmeldung', ls: 'gelesen, mit R\u00fcckmeldung'},\n            {v: 'verschickt', t: 'Probe verschickt, keine R\u00fcckmeldung', ls: 'verschickt, ohne R\u00fcckmeldung'},\n            {v: 'nein', t: 'nein', ls: 'keine'},\n            {v: 'weiss', t: 'wei\u00df ich nicht', ls: 'nicht bekannt', u: true}\n         ]},\n\n        {id: 'bez', s: 3, t: 'schalter',\n         l: 'Ist ein Bezugssystem gesetzt?',\n         h: 'Lage und H\u00f6he, jeweils mit benanntem Bezug.',\n         o: [\n            {v: 'ja', t: 'ja'},\n            {v: 'nein', t: 'nein'},\n            {v: 'weiss', t: 'wei\u00df ich nicht', u: true}\n         ]},\n        {id: 'bezd', s: 3, t: 'select',\n         l: 'Wo ist das gepr\u00fcft?',\n         o: [\n            {v: 'ja', t: 'in der gelieferten Datei gepr\u00fcft'},\n            {v: 'zeichnung', t: 'nur in der Zeichnung gesehen'},\n            {v: 'nein', t: 'gar nicht gepr\u00fcft'},\n            {v: 'weiss', t: 'wei\u00df ich nicht', ls: 'Pr\u00fcfstand nicht bekannt', u: true}\n         ]},\n        {id: 'hoehe', s: 3, t: 'schalter',\n         l: 'Ist der H\u00f6henbezug benannt?',\n         o: [\n            {v: 'ja', t: 'ja', ls: 'benannt'},\n            {v: 'nein', t: 'nein', ls: 'nicht benannt'},\n            {v: 'weiss', t: 'wei\u00df ich nicht', ls: 'nicht bekannt', u: true}\n         ]},\n        {id: 'beibl', s: 3, t: 'schalter',\n         l: 'Liegt ein Beiblatt bei?',\n         h: 'Ein Blatt, das nennt, was das Format nicht transportiert.',\n         o: [\n            {v: 'ja', t: 'ja', ls: 'liegt bei'},\n            {v: 'nein', t: 'nein', ls: 'liegt nicht bei'}\n         ]},\n\n        {id: 'klass', s: 4, t: 'select',\n         l: 'Welche Klassen haben die Bauteile?',\n         o: [\n            {v: 'unterschiedlich', t: 'Bauteile haben unterschiedliche Klassen'},\n            {v: 'gleich', t: 'alle Bauteile in derselben Klasse'},\n            {v: 'ungeprueft', t: 'nicht gepr\u00fcft', u: true}\n         ]},\n        {id: 'imp', s: 4, t: 'select',\n         l: 'Stammt die Zeichnung aus einem Import?',\n         o: [\n            {v: 'nein', t: 'nein, alles selbst konstruiert'},\n            {v: 'teilweise', t: 'teilweise'},\n            {v: 'ja', t: 'ja, ganz oder \u00fcberwiegend'},\n            {v: 'weiss', t: 'wei\u00df ich nicht', u: true}\n         ]},\n        {id: 'achse', s: 4, t: 'select',\n         l: 'Ist die Achse in der Datei zu finden?',\n         h: 'Nur beim offenen Bauwerksformat gefragt.',\n         nur: function (a) {\n            if (a.fmt === 'ifc') { return true; }\n            return a.fmt === 'mehrere';\n         },\n         o: [\n            {v: 'projekt', t: 'ja, am Projekt', ls: 'in der Datei, am Projekt'},\n            {v: 'nein', t: 'nein', ls: 'nicht gefunden'},\n            {v: 'nicht_gesucht', t: 'nicht gesucht', u: true}\n         ]},\n        {id: 'kat', s: 4, t: 'select',\n         l: 'Woher stammen die Merkmalsnamen?',\n         o: [\n            {v: 'mit_fassung', t: 'Katalog benannt, mit Version'},\n            {v: 'ohne_fassung', t: 'Katalog benannt, ohne Version'},\n            {v: 'eigene', t: 'eigene Namen'}\n         ]},\n        {id: 'dtyp', s: 4, t: 'schalter',\n         l: 'Sind Datentyp und Einheit je Merkmal vereinbart?',\n         o: [\n            {v: 'ja', t: 'ja', ls: 'je Merkmal vereinbart'},\n            {v: 'nein', t: 'nein', ls: 'nicht vereinbart'},\n            {v: 'weiss', t: 'wei\u00df ich nicht', ls: 'nicht bekannt', u: true}\n         ]},\n        {id: 'benen', s: 4, t: 'select',\n         l: 'Wie sind die Objekte benannt?',\n         o: [\n            {v: 'abgestimmt', t: 'mit dem Auftraggeber abgestimmt'},\n            {v: 'formatregel', t: 'nach der Regel des Formats'},\n            {v: 'frei', t: 'frei vergeben'}\n         ]},\n        {id: 'minda', s: 4, t: 'schalter',\n         l: 'Sind die Mindestangaben je Objektart vereinbart?',\n         h: 'Nur beim Kanalfachformat gefragt.',\n         nur: function (a) {\n            if (a.fmt === 'isybau') { return true; }\n            return a.fmt === 'mehrere';\n         },\n         o: [\n            {v: 'ja', t: 'ja', ls: 'vereinbart'},\n            {v: 'nein', t: 'nein', ls: 'nicht vereinbart'},\n            {v: 'weiss', t: 'wei\u00df ich nicht', ls: 'nicht bekannt', u: true}\n         ]},\n\n        {id: 'zweitp', s: 5, t: 'select',\n         l: 'Ist die geschriebene Datei ge\u00f6ffnet worden?',\n         o: [\n            {v: 'ja', t: 'ja, in einem fremden Programm', ls: 'in einem fremden Programm ge\u00f6ffnet'},\n            {v: 'eigenes', t: 'nur im eigenen Programm', ls: 'nur im eigenen Programm ge\u00f6ffnet'},\n            {v: 'nein', t: 'nein', ls: 'nicht ge\u00f6ffnet'}\n         ]},\n        {id: 'prot', s: 5, t: 'schalter',\n         l: 'Liegt ein Protokoll der Gegenprobe vor?',\n         o: [\n            {v: 'ja', t: 'ja', ls: 'liegt vor'},\n            {v: 'nein', t: 'nein', ls: 'liegt nicht vor'}\n         ]},\n        {id: 'mweg', s: 5, t: 'select',\n         l: 'Wie entsteht aus dem Modell eine pr\u00fcff\u00e4hige Menge?',\n         o: [\n            {v: 'bap', t: 'im Abwicklungsplan festgehalten'},\n            {v: 'besprochen', t: 'besprochen, nicht schriftlich'},\n            {v: 'offen', t: 'offen'}\n         ]},\n        {id: 'bphase', s: 5, t: 'schalter',\n         l: 'Steht im Lieferverzeichnis ein Format f\u00fcr die Bauphase?',\n         h: 'Mit Empf\u00e4nger, nicht nur mit Formatnamen.',\n         o: [\n            {v: 'ja', t: 'ja', ls: 'im Lieferverzeichnis festgelegt'},\n            {v: 'nein', t: 'nein', ls: 'nicht festgelegt'},\n            {v: 'weiss', t: 'wei\u00df ich nicht', ls: 'nicht bekannt', u: true}\n         ]}\n    ];\n\n    \/\/ ---------- Antwortstand ----------\n\n    var A = {};\n    FELDER.forEach(function (f) {\n        A[f.id] = f.t === 'mehr' ? [] : '';\n    });\n\n    var VORBELEGT = {};   \/\/ Felder, die der Dateiblick gef\u00fcllt hat\n    var DATEI = null;     \/\/ Befunde aus dem Dateikopf\n\n    function sichtbar(f) {\n        if (f.nur === undefined) { return true; }\n        return f.nur(A) === true;\n    }\n\n    function feldVon(id) {\n        var treffer = null;\n        FELDER.forEach(function (f) { if (f.id === id) { treffer = f; } });\n        return treffer;\n    }\n\n    \/\/ Wert eines Feldes. Ein unsichtbares Feld gilt als unbeantwortet.\n    function w(id) {\n        var f = feldVon(id);\n        if (f === null) { return ''; }\n        if (sichtbar(f) === false) { return ''; }\n        return A[id];\n    }\n\n    function zweckHat(schluessel) {\n        return A.zweck.indexOf(schluessel) !== -1;\n    }\n\n    function istUnsicher(id) {\n        var f = feldVon(id);\n        if (f === null) { return false; }\n        var wert = A[id];\n        if (typeof wert !== 'string') { return false; }\n        if (wert === '') { return false; }\n        var treffer = false;\n        f.o.forEach(function (o) {\n            if (o.v === wert) { treffer = o.u === true; }\n        });\n        return treffer;\n    }\n\n    function textZu(id, wert) {\n        var f = feldVon(id);\n        if (f === null) { return wert; }\n        var t = wert;\n        f.o.forEach(function (o) { if (o.v === wert) { t = o.t; } });\n        return t;\n    }\n\n    \/\/ Im Lieferschein steht die Antwort als Aussage, nicht als Auswahltext.\n    \/\/ \"H\u00f6henbezug ja\" liest sich schlecht, \"H\u00f6henbezug benannt\" gut.\n    function textFuerSchein(id, wert) {\n        var f = feldVon(id);\n        if (f === null) { return wert; }\n        var t = null;\n        f.o.forEach(function (o) {\n            if (o.v === wert) { t = o.ls === undefined ? o.t : o.ls; }\n        });\n        return t === null ? wert : t;\n    }\n\n    \/\/ ---------- Regelwerk ----------\n    \/\/ 26 Regeln in drei R\u00e4ngen, aus den Rechercheunterlagen, Abschnitt 8.1.\n    \/\/ r  Rang: halt, klaeren, notiert. Auch eine Funktion, wenn eine Antwort\n    \/\/    zwei Auspr\u00e4gungen hat (etwa \"nein\" gegen \"wei\u00df ich nicht\").\n    \/\/ s  Satz, t Handlung, beide entweder Zeichenkette oder nach Rang getrennt.\n    \/\/ k  Fundstelle zum Nachlesen. Eine Zahl oder ein Zahlenpaar meint eine\n    \/\/    Seite oder ein Datenblatt (Tabelle KARTEN) und wird beim Rendern verlinkt.\n    \/\/    Eine Zeichenkette bliebe unverlinkt.\n    \/\/ n  Kurzzeile f\u00fcr den Lieferschein, w die Rubrik dort:\n    \/\/    inhalt   steht unter \"Nicht enthalten\"\n    \/\/    klaerung steht unter \"Noch zu kl\u00e4ren\"\n    \/\/ f  h\u00e4ngt an diesem Feld. Ist die Antwort dort eine Unsicherheits-Antwort,\n    \/\/    greift die Deckelung.\n\n    var REGELN = [\n        {nr: 'R01', f: 'emp', k: 1,\n         p: function () { return w('emp') === 'unbekannt' ? 'halt' : false; },\n         s: 'Ohne Empf\u00e4nger keine Formatwahl.',\n         t: 'Kl\u00e4re zuerst, wer die Datei bekommt und was er damit tun soll. Format, Version und Umfang h\u00e4ngen daran.',\n         n: 'Empf\u00e4nger der Lieferung', w: 'klaerung'},\n\n        {nr: 'R02', f: 'fver', k: 2,\n         p: function () {\n            if (w('fver') === 'nein') { return 'halt'; }\n            return w('fver') === 'weiss' ? 'klaeren' : false;\n         },\n         s: {halt: 'Die Version des Formats ist nicht vereinbart.',\n             klaeren: 'Ob eine Version vereinbart ist, wei\u00df gerade niemand.'},\n         t: {halt: 'Vor dem Export schriftlich festhalten, welche Version geliefert wird. Die passende R\u00fcckfrage steht unten im Kasten.',\n             klaeren: 'In den Vertragsunterlagen nachsehen. Steht dort nichts, geh\u00f6rt das als Bieterfrage an den Auftraggeber.'},\n         n: 'schriftlich vereinbarte Version des Formats', w: 'klaerung'},\n\n        {nr: 'R03', f: 'fver', k: 2,\n         p: function () { return w('fver') === 'muendlich' ? 'klaeren' : false; },\n         s: 'M\u00fcndlich abgestimmt hei\u00dft: niemand kann es belegen.',\n         t: 'Eine Mail mit einem Satz gen\u00fcgt. Die kostet f\u00fcnf Minuten und ist sp\u00e4ter in jeder Diskussion der Beleg.',\n         n: 'schriftlicher Nachweis der Versionsvereinbarung', w: 'klaerung'},\n\n        {nr: 'R04', f: 'ziel', k: 2,\n         p: function () { return w('ziel') === 'nein' ? 'halt' : false; },\n         s: 'Das Programm des Empf\u00e4ngers ist nicht bekannt.',\n         t: 'Programm und Jahrgang abfragen. Die Formatgrenze setzt das Programm des Empf\u00e4ngers.',\n         n: 'Angabe zum Zielsystem des Empf\u00e4ngers', w: 'klaerung'},\n\n        {nr: 'R05', f: 'ziel', k: 2,\n         p: function () {\n            if (w('ziel') !== 'nur') { return false; }\n            if (w('fmt') === 'ifc') { return 'klaeren'; }\n            return w('fmt') === 'mehrere' ? 'klaeren' : false;\n         },\n         s: 'Vom Zielsystem ist nur der Programmname bekannt.',\n         t: 'Den Jahrgang nachfragen. Welches Schema gelesen wird, entscheidet der Jahrgang.',\n         n: 'Jahrgang des Zielsystems', w: 'klaerung'},\n\n        {nr: 'R06', f: 'probe', k: 14,\n         p: function () {\n            if (w('probe') === 'nein') { return 'klaeren'; }\n            if (w('probe') === 'verschickt') { return 'notiert'; }\n            return w('probe') === 'weiss' ? 'notiert' : false;\n         },\n         s: {klaeren: 'Der Empf\u00e4nger hat noch keine Probe gelesen.',\n             notiert: 'Eine Probe ist unterwegs, gelesen hat sie noch niemand.'},\n         t: {klaeren: 'Eine kleine Probedatei vorab schicken und um R\u00fcckmeldung bitten; der Bund empfiehlt solche Schnittstellentests zu Projektbeginn, sonst ist der erste Liefertermin der Test.',\n             notiert: 'Nachfassen, bevor die richtige Lieferung rausgeht. Eine verschickte Probe ohne R\u00fcckmeldung ist keine Gegenprobe.'},\n         n: 'best\u00e4tigte Probelieferung', w: 'klaerung'},\n\n        {nr: 'R07', f: 'klass', k: 3,\n         p: function () { return w('klass') === 'gleich' ? 'halt' : false; },\n         s: 'Alle Bauteile haben dieselbe Klasse.',\n         t: 'Vor dem Export je Objektart die passende Klasse zuweisen. Sonst findet der Empf\u00e4nger keine Bauteile, und die Mengenermittlung greift nicht. F\u00fchrt die vereinbarte Version f\u00fcr deine Objektart gar keine eigene Klasse, wie es vor IFC 4.3 bei der Fahrbahnschicht und beim Bordstein der Fall ist, h\u00e4lt die Sammelklasse die Lieferung trotzdem auf. Dann geh\u00f6rt ins Beiblatt, welche Objektart dahintersteht und woran der Empf\u00e4nger sie erkennt.',\n         n: 'Klassifizierung der Bauteile', w: 'inhalt'},\n\n        {nr: 'R08', f: 'klass', k: 3,\n         p: function () { return w('klass') === 'ungeprueft' ? 'klaeren' : false; },\n         s: 'Die Klassen sind nicht gepr\u00fcft.',\n         t: 'Die Datei einmal in einem IFC-Viewer \u00f6ffnen und ein paar Bauteile anklicken. Ohne diesen Blick wei\u00df niemand, ob die Klassen stimmen.',\n         n: 'Pr\u00fcfung der Klassen', w: 'klaerung'},\n\n        {nr: 'R09', f: 'imp', k: 5,\n         p: function () {\n            var k = w('klass');\n            if (k === '') { return false; }\n            if (k === 'gleich') { return false; }\n            if (w('imp') === 'ja') { return 'klaeren'; }\n            return w('imp') === 'teilweise' ? 'klaeren' : false;\n         },\n         s: 'Teile der Zeichnung stammen aus einem Import.',\n         t: 'Bei Fremdgeometrie zuerst die Klassifizierung ansehen, dann die Merkmale. Importierte Objekte haben oft eine Klasse, aber keinen gef\u00fcllten Eigenschaftssatz.',\n         n: 'gepr\u00fcfte Merkmale an importierten Objekten', w: 'inhalt'},\n\n        {nr: 'R10', f: 'zweitp', k: 4,\n         p: function () {\n            if (w('zweitp') === 'eigenes') { return 'halt'; }\n            return w('zweitp') === 'nein' ? 'halt' : false;\n         },\n         s: 'Die Datei ist nicht in einem fremden Programm ge\u00f6ffnet worden.',\n         t: 'Die geschriebene Datei in einem IFC-Viewer \u00f6ffnen, der nicht vom selben Hersteller stammt. Erst dort zeigt sich, was in der Datei steht.',\n         n: 'Gegenprobe in einem fremden Programm', w: 'klaerung'},\n\n        {nr: 'R11', f: 'achse', k: 6,\n         p: function () { return w('achse') === 'nein' ? 'klaeren' : false; },\n         s: 'Die Achse ist in der Datei nicht gefunden worden.',\n         t: 'Im IFC-Viewer unter dem Projekt suchen, nicht unter der Stra\u00dfe. Die Achse ist ein Positionierungselement und h\u00e4ngt am Projekt.',\n         n: 'Achse in der Lieferung', w: 'inhalt'},\n\n        {nr: 'R12', f: 'achse', k: [6, 11],\n         p: function () {\n            if (w('achse') !== 'nicht_gesucht') { return false; }\n            return zweckHat('weiterplanen') ? 'klaeren' : false;\n         },\n         s: 'Wer weiterplanen soll, braucht die Achse mit ihren Parametern.',\n         t: 'Nachsehen, ob die Achse in der Datei steht, und kl\u00e4ren, ob die Trassierungsparameter gebraucht werden. Eine eingeschr\u00e4nkte Modellsicht f\u00fchrt die Kurventypen nicht mit.',\n         n: 'Achse mit Trassierungsparametern', w: 'inhalt'},\n\n        {nr: 'R13', f: 'bez', k: 7,\n         p: function () {\n            if (w('bez') === 'nein') { return 'halt'; }\n            return w('bez') === 'weiss' ? 'klaeren' : false;\n         },\n         s: {halt: 'Es ist kein Bezugssystem gesetzt.',\n             klaeren: 'Ob ein Bezugssystem gesetzt ist, ist unklar.'},\n         t: {halt: 'Vor dem Export Lage- und H\u00f6henbezug setzen. Ohne Bezugssystem landet das Modell beim Empf\u00e4nger irgendwo.',\n             klaeren: 'In den Einstellungen der Zeichnung nachsehen, bevor exportiert wird. Das dauert eine Minute.'},\n         n: 'benanntes Bezugssystem', w: 'inhalt'},\n\n        {nr: 'R14', f: 'bezd', k: 7,\n         p: function () {\n            var v = w('bezd');\n            if (v === '') { return false; }\n            return v === 'ja' ? false : 'klaeren';\n         },\n         s: 'Das Bezugssystem ist nicht in der gelieferten Datei gepr\u00fcft.',\n         t: 'Die exportierte Datei \u00f6ffnen und nachsehen, ob Bezugssystem und Transformation darin stehen. Was in der Zeichnung steht, kommt nicht immer in der Datei an.',\n         n: 'Nachweis des Bezugssystems in der Datei', w: 'klaerung'},\n\n        {nr: 'R15', f: 'hoehe', k: 7,\n         p: function () {\n            if (w('hoehe') === 'nein') { return 'klaeren'; }\n            return w('hoehe') === 'weiss' ? 'klaeren' : false;\n         },\n         s: 'Der H\u00f6henbezug ist nicht benannt.',\n         t: 'Das H\u00f6hensystem im Beiblatt und im Dateikopf benennen. H\u00f6hen ohne benannten Bezug sind Zahlen.',\n         n: 'benannter H\u00f6henbezug', w: 'inhalt'},\n\n        {nr: 'R16', f: 'beibl', k: 7,\n         p: function (lage) {\n            if (w('beibl') !== 'nein') { return false; }\n            return lage.lageBefund === true ? 'notiert' : false;\n         },\n         s: 'Es liegt kein Beiblatt bei.',\n         t: 'Was das Format nicht transportiert, geh\u00f6rt auf ein Blatt zur Lieferung. Das ist die billigste Versicherung im ganzen Ablauf.',\n         n: 'Beiblatt zur Lieferung', w: 'inhalt'},\n\n        {nr: 'R17', f: 'minda', k: 10,\n         p: function () {\n            if (w('minda') === 'nein') { return 'halt'; }\n            return w('minda') === 'weiss' ? 'klaeren' : false;\n         },\n         s: {halt: 'Die Mindestangaben je Objektart sind nicht vereinbart.',\n             klaeren: 'Ob Mindestangaben vereinbart sind, ist unklar.'},\n         t: {halt: 'Festlegen, welche Angaben je Haltung und je Schacht gef\u00fcllt sein m\u00fcssen. Eine schemakonforme Datei ohne diese Angaben hilft wenig.',\n             klaeren: 'Beim Auftraggeber nachfragen. Die passende R\u00fcckfrage steht unten im Kasten.'},\n         n: 'vereinbarte Mindestangaben je Objektart', w: 'klaerung'},\n\n        {nr: 'R18', f: 'benen', k: 9,\n         p: function () {\n            if (w('fmt') !== 'isybau') {\n                if (w('fmt') !== 'mehrere') { return false; }\n            }\n            return w('benen') === 'frei' ? 'halt' : false;\n         },\n         s: 'Die Objektbezeichnungen sind frei vergeben.',\n         t: 'Die Benennung mit dem Auftraggeber abstimmen, bevor exportiert wird. Im Kanalnetz bilden Objektbezeichnung und Objektart den Schl\u00fcssel, \u00fcber den zusammenfindet, was zusammengeh\u00f6rt.',\n         n: 'abgestimmte Benennungssystematik', w: 'klaerung'},\n\n        {nr: 'R19', f: 'fque', k: [2, 8],\n         p: function () {\n            if (w('fmt') !== 'isybau') {\n                if (w('fmt') !== 'mehrere') { return false; }\n            }\n            if (w('emp') === 'baufirma') { return false; }\n            return w('fque') === 'unbekannt' ? 'klaeren' : false;\n         },\n         s: 'Woher die Versionsvorgabe stammt, ist unklar.',\n         t: 'Die brauchbare Version ist die h\u00f6chste, die das System des Empf\u00e4ngers noch liest, nicht die h\u00f6chste, die dein Programm schreibt.',\n         n: 'Quelle der Versionsvorgabe', w: 'klaerung'},\n\n        {nr: 'R20', f: 'kat', k: 13,\n         p: function () { return w('kat') === 'eigene' ? 'klaeren' : false; },\n         s: 'Die Merkmale haben selbst vergebene Namen.',\n         t: 'Einen benannten Katalog verwenden oder die eigene Liste als Anlage mitliefern. Selbst vergebene Namen findet keine automatische Pr\u00fcfung.',\n         n: 'Merkmale aus einem benannten Katalog', w: 'inhalt'},\n\n        {nr: 'R21', f: 'kat', k: 13,\n         p: function () { return w('kat') === 'ohne_fassung' ? 'notiert' : false; },\n         s: 'Der Katalog ist benannt, seine Version nicht.',\n         t: 'Die Version des Katalogs in den Lieferschein schreiben. Ohne Stand wei\u00df sp\u00e4ter niemand, welche Merkmalsliste galt.',\n         n: 'Version des Merkmalskatalogs', w: 'klaerung'},\n\n        {nr: 'R22', f: 'dtyp', k: 13,\n         p: function () {\n            if (w('dtyp') === 'nein') { return 'klaeren'; }\n            return w('dtyp') === 'weiss' ? 'klaeren' : false;\n         },\n         s: 'Datentyp und Einheit sind je Merkmal nicht vereinbart.',\n         t: 'Festlegen, ob ein Wert Zahl oder Text ist und in welcher Einheit er steht. Ohne das ist der Wert nicht auswertbar, auch wenn er ankommt.',\n         n: 'Datentyp und Einheit je Merkmal', w: 'klaerung'},\n\n        {nr: 'R23', f: 'mweg', k: 12,\n         p: function () {\n            if (zweckHat('mengen') === false) { return false; }\n            if (w('mweg') === 'offen') { return 'halt'; }\n            return w('mweg') === 'besprochen' ? 'klaeren' : false;\n         },\n         s: {halt: 'Es ist offen, wie aus dem Modell eine pr\u00fcff\u00e4hige Menge wird.',\n             klaeren: 'Der Mengenweg ist besprochen, aber nicht festgehalten.'},\n         t: {halt: 'Den Rechenweg festhalten, bevor gerechnet wird. Das Modell liefert die Grundlage, gerechnet wird nach dem festgehaltenen Weg.',\n             klaeren: 'Eine Zeile in den Abwicklungsplan. Sonst steht die Frage bei der ersten Abschlagsrechnung wieder auf dem Tisch.'},\n         n: 'vereinbarter Weg zur pr\u00fcff\u00e4higen Menge', w: 'klaerung'},\n\n        {nr: 'R24', f: 'bphase', k: 12,\n         p: function () {\n            if (zweckHat('bauen') === false) { return false; }\n            if (w('bphase') === 'nein') { return 'halt'; }\n            return w('bphase') === 'weiss' ? 'klaeren' : false;\n         },\n         s: {halt: 'F\u00fcr die Bauphase ist kein Format mit Empf\u00e4nger festgelegt.',\n             klaeren: 'Ob f\u00fcr die Bauphase ein Format festgelegt ist, ist unklar.'},\n         t: {halt: 'Im Lieferverzeichnis festhalten, wer auf der Baustelle was bekommt und in welchem Format. Sonst liegt dort am Ende ein PDF.',\n             klaeren: 'Im Lieferverzeichnis nachsehen, bevor die Lieferung rausgeht.'},\n         n: 'Format f\u00fcr die Bauphase mit Empf\u00e4nger', w: 'klaerung'},\n\n        {nr: 'R25', f: 'prot', k: 4,\n         p: function () {\n            if (w('zweitp') !== 'ja') { return false; }\n            return w('prot') === 'nein' ? 'notiert' : false;\n         },\n         s: 'Die Gegenprobe ist gelaufen, ein Protokoll gibt es nicht.',\n         t: 'Zwei Zeilen gen\u00fcgen: Programm, Jahrgang, Datum, was aufgefallen ist. Eine Gegenprobe ohne Protokoll ist eine Erinnerung.',\n         n: 'Protokoll der Gegenprobe', w: 'klaerung'},\n\n        {nr: 'R26', f: 'fmt', k: 2,\n         p: function () { return w('fmt') === 'mehrere' ? 'notiert' : false; },\n         s: 'Es gehen mehrere Formate raus.',\n         t: 'Je Format eine eigene Versionsvereinbarung und eine eigene Gegenprobe. Der Lieferschein f\u00fchrt hier nur eine Zeile; trag die Formate darin einzeln ein, jedes mit seiner Version.',\n         n: '', w: ''}\n    ];\n\n    \/\/ Die drei R\u00e4nge. Rot und Bernstein sind die Explainer-Hausfarben.\n    \/\/ Das Grau #64748b ist werkzeugeigen: \"notiert\" ist kein Mangel und darf\n    \/\/ deshalb keine Warnfarbe tragen. Gezeigt wird der Rang \u00fcber ein Quadrat\n    \/\/ und ein farbiges Wort, keine runden Ampelpunkte.\n    var RAENGE = [\n        {id: 'halt', wort: 'H\u00e4lt die Lieferung auf', farbe: '#dc2626',\n         hinweis: 'Der Empf\u00e4nger kann mit der Datei nicht arbeiten.'},\n        {id: 'klaeren', wort: 'Kl\u00e4ren, bevor es teuer wird', farbe: '#d97706',\n         hinweis: 'Die Lieferung geht durch, das Problem kommt sp\u00e4ter zur\u00fcck.'},\n        {id: 'notiert', wort: 'Notiert', farbe: '#64748b',\n         hinweis: 'Kein Mangel, geh\u00f6rt aber in den Lieferschein.'}\n    ];\n\n    \/\/ Formatempfehlung, ein Satz je Empf\u00e4nger. Ohne Empf\u00e4nger bleibt sie aus.\n    var EMPFEHLUNG = {\n        ag: 'Das offene Bauwerksformat in der Version, die im Vertrag steht. Der Auftraggeber pr\u00fcft die Datei gegen seine eigene Vorgabe.',\n        fachplaner: 'Das offene Bauwerksformat zum Ansehen und Koordinieren, dazu die Geometrie in dem Format, mit dem der andere weiterrechnen kann.',\n        netz: 'Das Kanalfachformat in der Version, die das System des Netzbetreibers liest. Ein Kataster nimmt selten die neueste.',\n        baufirma: 'Das Geometrieformat f\u00fcr die Maschine, dazu die Mengen im Ausschreibungsformat. Ein Bauwerksmodell allein hilft an der Baugrube wenig.',\n        ausschreibung: 'Das Mengen- und Ausschreibungsformat mit dem vereinbarten Rechenweg. Das Modell ist die Grundlage, die Rechnung entsteht daraus.'\n    };\n\n    \/\/ Beispiellieferungen. Sie sind zugleich die Kalibrierung der vier\n    \/\/ didaktischen Zust\u00e4nde, siehe Kommentar am Kopf der Datei.\n    var BEISPIELE = [\n        {id: 'z1', t: 'Standardantworten',\n         h: 'Der saubere Fall. Keine Regel greift.',\n         a: {emp: 'ag', zweck: ['pruefen'], fmt: 'ifc', fver: 'schriftlich', fque: 'vertrag',\n             ziel: 'jahrgang', probe: 'ja', bez: 'ja', bezd: 'ja', hoehe: 'ja', beibl: 'ja',\n             klass: 'unterschiedlich', imp: 'nein', achse: 'projekt', kat: 'mit_fassung',\n             dtyp: 'ja', benen: 'abgestimmt', minda: '', zweitp: 'ja', prot: 'ja',\n             mweg: 'bap', bphase: 'ja'}},\n        {id: 'z2', t: 'Normalfall',\n         h: 'Geht raus, vier Punkte geh\u00f6ren auf den Lieferschein.',\n         a: {emp: 'ag', zweck: ['pruefen'], fmt: 'ifc', fver: 'muendlich', fque: 'bap',\n             ziel: 'jahrgang', probe: 'ja', bez: 'ja', bezd: 'zeichnung', hoehe: 'ja', beibl: 'nein',\n             klass: 'unterschiedlich', imp: 'nein', achse: 'projekt', kat: 'mit_fassung',\n             dtyp: 'ja', benen: 'abgestimmt', minda: '', zweitp: 'ja', prot: 'nein',\n             mweg: 'bap', bphase: 'ja'}},\n        {id: 'z3', t: 'Kanal an den Netzbetreiber',\n         h: 'Der Empf\u00e4nger kann die Datei nicht lesen.',\n         a: {emp: 'netz', zweck: ['datenbank'], fmt: 'isybau', fver: 'weiss', fque: 'unbekannt',\n             ziel: 'nein', probe: 'nein', bez: 'ja', bezd: 'ja', hoehe: 'ja', beibl: 'nein',\n             klass: 'unterschiedlich', imp: 'nein', achse: '', kat: 'ohne_fassung',\n             dtyp: 'ja', benen: 'frei', minda: 'nein', zweitp: 'ja', prot: 'ja',\n             mweg: 'bap', bphase: 'ja'}},\n        {id: 'z4', t: 'Modell aus dem Import',\n         h: 'Die Datei kommt an, mit ungepr\u00fcften Klassen und eigenen Merkmalsnamen.',\n         a: {emp: 'fachplaner', zweck: ['pruefen', 'weiterplanen'], fmt: 'ifc', fver: 'schriftlich',\n             fque: 'vertrag', ziel: 'jahrgang', probe: 'ja', bez: 'ja', bezd: 'ja', hoehe: 'ja',\n             beibl: 'ja', klass: 'ungeprueft', imp: 'ja', achse: 'nein', kat: 'eigene',\n             dtyp: 'nein', benen: 'formatregel', minda: '', zweitp: 'eigenes', prot: 'nein',\n             mweg: 'bap', bphase: 'ja'}}\n    ];\n\n    \/\/ ---------- Formular bauen ----------\n\n    var KNOTEN = {};\n\n    function alle(sel, wurzel) {\n        var basis = wurzel === undefined ? box : wurzel;\n        return Array.prototype.slice.call(basis.querySelectorAll(sel));\n    }\n\n    function baueFeld(f, ziel) {\n        var wrap = el('div', f.weit === true ? 'msc-field is-wide' : 'msc-field');\n        var eintrag = {wrap: wrap, feld: f, knoepfe: [], select: null, marke: null};\n\n        if (f.t === 'select') {\n            var lab = el('label', 'msc-field-label');\n            lab.setAttribute('for', 'msc-f-' + f.id);\n            lab.appendChild(document.createTextNode(f.l));\n            if (f.h !== undefined) { lab.appendChild(el('span', 'msc-field-hint', f.h)); }\n            wrap.appendChild(lab);\n\n            var sel = document.createElement('select');\n            sel.className = 'msc-select';\n            sel.id = 'msc-f-' + f.id;\n            var leer = document.createElement('option');\n            leer.value = '';\n            leer.textContent = 'noch nicht beantwortet';\n            sel.appendChild(leer);\n            f.o.forEach(function (o) {\n                var op = document.createElement('option');\n                op.value = o.v;\n                op.textContent = o.t;\n                sel.appendChild(op);\n            });\n            sel.addEventListener('change', function () {\n                A[f.id] = sel.value;\n                VORBELEGT[f.id] = false;\n                aktualisiere();\n            });\n            wrap.appendChild(sel);\n            eintrag.select = sel;\n        } else {\n            var gruppe = el('div');\n            gruppe.setAttribute('role', 'group');\n            gruppe.setAttribute('aria-label', f.l);\n            var kopf = el('span', 'msc-field-label');\n            kopf.appendChild(document.createTextNode(f.l));\n            if (f.h !== undefined) { kopf.appendChild(el('span', 'msc-field-hint', f.h)); }\n            gruppe.appendChild(kopf);\n\n            var reihe = el('div', 'msc-switch');\n            f.o.forEach(function (o) {\n                var b = el('button', 'msc-seg', o.t);\n                b.type = 'button';\n                b.setAttribute('aria-pressed', 'false');\n                b.addEventListener('click', function () {\n                    VORBELEGT[f.id] = false;\n                    if (f.t === 'mehr') {\n                        var pos = A[f.id].indexOf(o.v);\n                        if (pos === -1) { A[f.id].push(o.v); } else { A[f.id].splice(pos, 1); }\n                    } else {\n                        A[f.id] = A[f.id] === o.v ? '' : o.v;\n                    }\n                    aktualisiere();\n                });\n                eintrag.knoepfe.push({b: b, v: o.v});\n                reihe.appendChild(b);\n            });\n            gruppe.appendChild(reihe);\n            wrap.appendChild(gruppe);\n        }\n\n        var marke = el('span', 'msc-prefill', 'aus der Datei \u00fcbernommen');\n        marke.style.display = 'none';\n        wrap.appendChild(marke);\n        eintrag.marke = marke;\n\n        KNOTEN[f.id] = eintrag;\n        ziel.appendChild(wrap);\n    }\n\n    (function bauen() {\n        var behaelter = {};\n        alle('.msc-fields').forEach(function (d) {\n            behaelter[d.getAttribute('data-schritt')] = d;\n        });\n        FELDER.forEach(function (f) {\n            var ziel = behaelter[String(f.s)];\n            if (ziel === undefined) { return; }\n            baueFeld(f, ziel);\n        });\n    })();\n\n    function zeichneFormular() {\n        FELDER.forEach(function (f) {\n            var k = KNOTEN[f.id];\n            if (k === undefined) { return; }\n            k.wrap.style.display = sichtbar(f) === true ? '' : 'none';\n            if (k.select !== null) {\n                k.select.value = A[f.id];\n                if (A[f.id] === '') {\n                    k.select.classList.add('is-open');\n                } else {\n                    k.select.classList.remove('is-open');\n                }\n            }\n            k.knoepfe.forEach(function (kn) {\n                var an = false;\n                if (f.t === 'mehr') {\n                    an = A[f.id].indexOf(kn.v) !== -1;\n                } else {\n                    an = A[f.id] === kn.v;\n                }\n                if (an === true) {\n                    kn.b.classList.add('is-active');\n                    kn.b.setAttribute('aria-pressed', 'true');\n                } else {\n                    kn.b.classList.remove('is-active');\n                    kn.b.setAttribute('aria-pressed', 'false');\n                }\n            });\n            k.marke.style.display = VORBELEGT[f.id] === true ? '' : 'none';\n        });\n    }\n\n    \/\/ ---------- Auswertung ----------\n\n    function regelVon(nr) {\n        var t = null;\n        REGELN.forEach(function (r) { if (r.nr === nr) { t = r; } });\n        return t;\n    }\n\n    function nachRang(x, rang) {\n        if (typeof x === 'string') { return x; }\n        return x[rang];\n    }\n\n    \/\/ Deckelung. Zwei Gr\u00fcnde, beide aus den Grenzf\u00e4llen der Recherche:\n    \/\/ steht der Empf\u00e4nger offen, ist alles andere vorl\u00e4ufig. Und wer fast\n    \/\/ \u00fcberall \"wei\u00df ich nicht\" antwortet, bekommt keine acht roten Zeilen.\n    function deckelGrund() {\n        if (w('emp') === 'unbekannt') { return 'emp'; }\n        var beantwortet = 0;\n        var unsicher = 0;\n        FELDER.forEach(function (f) {\n            if (f.t === 'mehr') { return; }\n            if (sichtbar(f) === false) { return; }\n            if (A[f.id] === '') { return; }\n            beantwortet += 1;\n            if (istUnsicher(f.id) === true) { unsicher += 1; }\n        });\n        if (beantwortet < 5) { return ''; }\n        return unsicher * 10 >= beantwortet * 8 ? 'unsicher' : '';\n    }\n\n    function offeneFelder() {\n        var offen = 0;\n        var gesamt = 0;\n        FELDER.forEach(function (f) {\n            if (sichtbar(f) === false) { return; }\n            gesamt += 1;\n            if (f.t === 'mehr') {\n                if (A[f.id].length === 0) { offen += 1; }\n                return;\n            }\n            if (A[f.id] === '') { offen += 1; }\n        });\n        return {offen: offen, gesamt: gesamt};\n    }\n\n    function bewerte() {\n        var vor = [];\n        REGELN.forEach(function (rg) {\n            if (rg.nr === 'R16') { return; }\n            var rang = rg.p({lageBefund: false});\n            if (rang === false) { return; }\n            vor.push({rg: rg, rang: rang, gedeckelt: false});\n        });\n\n        var lage = false;\n        vor.forEach(function (b) {\n            if (b.rg.nr === 'R13') { lage = true; }\n            if (b.rg.nr === 'R14') { lage = true; }\n            if (b.rg.nr === 'R15') { lage = true; }\n        });\n        var r16 = regelVon('R16');\n        if (r16 !== null) {\n            var rang16 = r16.p({lageBefund: lage});\n            if (rang16 !== false) { vor.push({rg: r16, rang: rang16, gedeckelt: false}); }\n        }\n\n        var grund = deckelGrund();\n        if (grund !== '') {\n            vor.forEach(function (b) {\n                if (b.rg.nr === 'R01') { return; }\n                if (b.rang === 'halt') {\n                    b.rang = 'klaeren';\n                    b.gedeckelt = true;\n                }\n            });\n        }\n\n        vor.sort(function (a1, a2) {\n            var i1 = 0;\n            var i2 = 0;\n            RAENGE.forEach(function (r, i) {\n                if (r.id === a1.rang) { i1 = i; }\n                if (r.id === a2.rang) { i2 = i; }\n            });\n            if (i1 !== i2) { return i1 - i2; }\n            return a1.rg.nr > a2.rg.nr ? 1 : -1;\n        });\n\n        return {befunde: vor, deckel: grund};\n    }\n\n    \/\/ ---------- Ausgabe: Zustand und Befundliste ----------\n\n    var zustandBox = document.getElementById('msc-zustand');\n    var befundBox = document.getElementById('msc-befunde');\n\n    function zaehleRang(befunde, id) {\n        var n = 0;\n        befunde.forEach(function (b) { if (b.rang === id) { n += 1; } });\n        return n;\n    }\n\n    function maleZustand(erg, stand) {\n        zustandBox.textContent = '';\n        var halt = zaehleRang(erg.befunde, 'halt');\n        var klaeren = zaehleRang(erg.befunde, 'klaeren');\n        var notiert = zaehleRang(erg.befunde, 'notiert');\n        var satz = '';\n        var zusatz = '';\n\n        if (stand.gesamt === stand.offen) {\n            satz = 'Fang mit dem Empf\u00e4nger an.';\n            zusatz = 'Solange nicht feststeht, wer die Datei bekommt und was er damit tun soll, ist jede weitere Antwort eine Vermutung. Der Rest geht danach schnell.';\n        } else if (halt > 0) {\n            satz = 'So sollte die Lieferung nicht rausgehen.';\n            zusatz = halt === 1\n                ? 'Ein Punkt h\u00e4lt sie auf. Der Empf\u00e4nger kann mit der Datei so nicht arbeiten.'\n                : halt + ' Punkte halten sie auf. Der Empf\u00e4nger kann mit der Datei so nicht arbeiten.';\n        } else if (klaeren > 0) {\n            satz = 'Die Lieferung kann raus, offen bleibt trotzdem etwas.';\n            zusatz = klaeren === 1\n                ? 'Ein Punkt kommt sp\u00e4ter zur\u00fcck, wenn ihn jetzt niemand kl\u00e4rt.'\n                : klaeren + ' Punkte kommen sp\u00e4ter zur\u00fcck, wenn sie jetzt niemand kl\u00e4rt.';\n            if (notiert > 0) {\n                zusatz += notiert === 1\n                    ? ' Dazu ein Punkt, der nur in den Lieferschein geh\u00f6rt.'\n                    : ' Dazu ' + notiert + ' Punkte, die nur in den Lieferschein geh\u00f6ren.';\n            } else {\n                zusatz += ' Sie stehen unten im Lieferschein.';\n            }\n        } else if (notiert > 0) {\n            satz = 'Die Lieferung kann raus.';\n            zusatz = notiert === 1\n                ? 'Ein Punkt geh\u00f6rt auf den Lieferschein, ein Mangel ist er nicht.'\n                : notiert + ' Punkte geh\u00f6ren auf den Lieferschein, M\u00e4ngel sind sie nicht.';\n        } else if (stand.offen === 0) {\n            satz = 'Kein Befund. Die Lieferung kann so rausgehen.';\n            zusatz = 'Der Lieferschein unten sagt trotzdem, was drin ist und was nicht. Er ersetzt keine Pr\u00fcfung durch den Auftraggeber.';\n        } else {\n            satz = 'Bis hierher kein Befund.';\n            zusatz = 'Die offenen Fragen fehlen noch. Was unbeantwortet bleibt, steht im Lieferschein als nicht beantwortet.';\n        }\n\n        zustandBox.appendChild(el('p', 'msc-zustand-satz', satz));\n        zustandBox.appendChild(el('p', 'msc-zustand-zusatz', zusatz));\n\n        if (stand.offen > 0) {\n            if (stand.gesamt !== stand.offen) {\n                zustandBox.appendChild(el('p', 'msc-zustand-zusatz',\n                    stand.offen + ' von ' + stand.gesamt + ' Fragen sind noch offen.'));\n            }\n        }\n\n        var empf = EMPFEHLUNG[w('emp')];\n        if (empf !== undefined) {\n            var p = el('p', 'msc-zustand-zusatz');\n            p.appendChild(el('strong', '', 'Empfehlung zum Format: '));\n            p.appendChild(document.createTextNode(empf + ' Die Version bestimmt in jedem Fall der Empf\u00e4nger.'));\n            zustandBox.appendChild(p);\n        }\n\n        if (erg.deckel === 'emp') {\n            zustandBox.appendChild(el('p', 'msc-zustand-zusatz',\n                'Weil der Empf\u00e4nger offen ist, bleibt die Formatempfehlung aus, und alles andere steht hier vorl\u00e4ufig unter \u201ekl\u00e4ren\". Sobald der Empf\u00e4nger feststeht, sortiert sich die Liste neu.'));\n        }\n        if (erg.deckel === 'unsicher') {\n            zustandBox.appendChild(el('p', 'msc-zustand-zusatz',\n                'Fast alles steht auf \u201ewei\u00df ich nicht\". Deshalb l\u00e4uft hier alles unter \u201ekl\u00e4ren\u201c, auch was sonst die Lieferung aufhielte. Nimm dir die obersten drei Punkte vor, der Rest l\u00f6st sich meistens mit.'));\n        }\n    }\n\n    \/\/ Fundstelle zum Befund. Jede Nummer meint eine Seite oder ein Datenblatt,\n    \/\/ mehrere Nummern k\u00f6nnen auf dieselbe Seite zeigen. text ersetzt den Linktext.\n    var KARTEN = {\n        1: {href: 'https:\/\/cad-kompass.de\/?p=2613', titel: 'Welches Format wof\u00fcr'},\n        2: {href: 'https:\/\/cad-kompass.de\/?p=2613', titel: 'Welches Format wof\u00fcr'},\n        3: {href: 'https:\/\/cad-kompass.de\/?p=2617', titel: 'Was beim Export verloren geht'},\n        4: {href: 'https:\/\/cad-kompass.de\/?p=2617', titel: 'Was beim Export verloren geht'},\n        5: {href: 'https:\/\/cad-kompass.de\/?p=2617', titel: 'Was beim Export verloren geht'},\n        6: {href: 'https:\/\/cad-kompass.de\/?p=2615', titel: 'IFC im Tiefbau'},\n        7: {href: 'https:\/\/cad-kompass.de\/?p=2617', titel: 'Was beim Export verloren geht'},\n        8: {href: 'https:\/\/cad-kompass.de\/?p=2619', titel: 'Kanal kommunal'},\n        9: {href: 'https:\/\/cad-kompass.de\/?p=2619', titel: 'Kanal kommunal'},\n        10: {href: 'https:\/\/cad-kompass.de\/?p=2619', titel: 'Kanal kommunal'},\n        11: {href: 'https:\/\/cad-kompass.de\/?p=2615', titel: 'IFC im Tiefbau'},\n        12: {href: 'https:\/\/cad-kompass.de\/?p=2621', titel: 'Die letzte Meile'},\n        13: {href: 'https:\/\/cad-kompass.de\/?p=2607', titel: 'Merkmale aus dem Katalog', text: 'Themenfeld 4, Seite \u201eMerkmale aus dem Katalog\u201c'},\n        14: {href: 'https:\/\/cad-kompass.de\/?p=2623#export', titel: 'Datenblatt Formate und IFC', text: 'Datenblatt Formate und IFC dieses Themenfelds, Abschnitt Export (Schnittstellentests)'}\n    };\n\n    function karteLink(n) {\n        var eintrag = KARTEN[n];\n        var a = document.createElement('a');\n        a.className = 'msc-karte-link';\n        a.setAttribute('href', eintrag.href);\n        a.textContent = eintrag.text !== undefined ? eintrag.text : 'Seite \u201e' + eintrag.titel + '\u201c';\n        return a;\n    }\n\n    \/\/ H\u00e4ngt die Zeile \"Mehr dazu: ...\" an den Knoten und sagt, ob etwas kam.\n    function fundstelle(ziel, k) {\n        if (k === undefined) { return false; }\n        if (k === '') { return false; }\n        ziel.appendChild(document.createTextNode('Mehr dazu: '));\n        if (typeof k === 'string') {\n            ziel.appendChild(document.createTextNode(k + '.'));\n            return true;\n        }\n        var nummern = typeof k === 'number' ? [k] : k;\n        var gesehen = {};\n        var einzigartig = [];\n        nummern.forEach(function (n) {\n            var href = KARTEN[n].href;\n            if (gesehen[href] === undefined) {\n                gesehen[href] = true;\n                einzigartig.push(n);\n            }\n        });\n        einzigartig.forEach(function (n, i) {\n            if (i > 0) {\n                ziel.appendChild(document.createTextNode(i === einzigartig.length - 1 ? ' und ' : ', '));\n            }\n            ziel.appendChild(karteLink(n));\n        });\n        ziel.appendChild(document.createTextNode('.'));\n        return true;\n    }\n\n    function maleBefunde(erg) {\n        befundBox.textContent = '';\n        if (erg.befunde.length === 0) { return; }\n\n        RAENGE.forEach(function (r) {\n            var teil = erg.befunde.filter(function (b) { return b.rang === r.id; });\n            if (teil.length === 0) { return; }\n\n            var gruppe = el('div', 'msc-rang');\n            var kopf = el('div', 'msc-rang-head');\n            var q = el('span', 'msc-mark');\n            q.style.background = r.farbe;\n            kopf.appendChild(q);\n            var wort = el('span', 'msc-rang-wort', r.wort);\n            wort.style.color = r.farbe;\n            kopf.appendChild(wort);\n            kopf.appendChild(el('span', 'msc-rang-zahl', teil.length === 1 ? '1 Punkt' : teil.length + ' Punkte'));\n            gruppe.appendChild(kopf);\n            gruppe.appendChild(el('p', 'msc-befund-tun', r.hinweis));\n\n            teil.forEach(function (b) {\n                var karte = el('div', 'msc-befund');\n                karte.appendChild(el('p', 'msc-befund-satz', nachRang(b.rg.s, b.rang)));\n                karte.appendChild(el('p', 'msc-befund-tun', nachRang(b.rg.t, b.rang)));\n                var quelle = el('span', 'msc-befund-quelle');\n                var hatQuelle = fundstelle(quelle, b.rg.k);\n                if (b.gedeckelt === true) {\n                    var deckelsatz = 'Dieser Punkt hielte die Lieferung auf, sobald die offenen Antworten stehen.';\n                    quelle.appendChild(document.createTextNode(\n                        hatQuelle === true ? ' ' + deckelsatz : deckelsatz));\n                    hatQuelle = true;\n                }\n                if (hatQuelle === true) { karte.appendChild(quelle); }\n                gruppe.appendChild(karte);\n            });\n\n            befundBox.appendChild(gruppe);\n        });\n    }\n\n    \/\/ ---------- Ausgabe: Lieferschein ----------\n\n    var BREITE = 26;\n\n    function zeile(schluessel, wert) {\n        return fuellen(schluessel, BREITE) + wert;\n    }\n\n    function antwortText(id, fehltext) {\n        var v = w(id);\n        if (v === '') { return fehltext === undefined ? 'nicht beantwortet' : fehltext; }\n        return textFuerSchein(id, v);\n    }\n\n    function zweckText() {\n        if (A.zweck.length === 0) { return 'nicht beantwortet'; }\n        var teile = [];\n        A.zweck.forEach(function (v) { teile.push(textZu('zweck', v)); });\n        return teile.join(', ');\n    }\n\n    function fassungText() {\n        var v = w('fver');\n        if (v === '') { return 'nicht beantwortet'; }\n        var basis = textFuerSchein('fver', v);\n        var q = w('fque');\n        if (q === '') { return basis; }\n        return basis + ', Quelle: ' + textFuerSchein('fque', q);\n    }\n\n    function gegenprobeText() {\n        var v = w('zweitp');\n        if (v === '') { return 'nicht beantwortet'; }\n        var basis = textFuerSchein('zweitp', v);\n        if (v !== 'ja') { return basis; }\n        if (w('prot') === 'ja') { return basis + ', Protokoll liegt bei'; }\n        if (w('prot') === 'nein') { return basis + ', ohne Protokoll'; }\n        return basis;\n    }\n\n    function bezugText() {\n        var g = w('bez');\n        var d = w('bezd');\n        if (g === '') {\n            if (d === '') { return 'nicht beantwortet'; }\n        }\n        var teile = [];\n        if (g !== '') { teile.push(g === 'ja' ? 'gesetzt' : (g === 'nein' ? 'nicht gesetzt' : 'unklar')); }\n        if (d !== '') { teile.push(textFuerSchein('bezd', d)); }\n        return teile.join(', ');\n    }\n\n    function baueLieferschein(erg) {\n        var z = [];\n        z.push('LIEFERSCHEIN ZUR MODELL\u00dcBERGABE');\n        z.push('');\n\n        var start = offeneFelder();\n        if (start.offen === start.gesamt) {\n            z.push('Noch nichts beantwortet. Sobald oben die ersten Antworten stehen,');\n            z.push('f\u00fcllt sich dieser Schein und l\u00e4sst sich in eine Mail kopieren.');\n            z.push('');\n            z.push('Er nennt am Ende, was die Lieferung enth\u00e4lt, was sie nicht enth\u00e4lt');\n            z.push('und was vorher noch zu kl\u00e4ren ist.');\n            return z.join('\\n');\n        }\n\n        z.push(zeile('Projekt', 'Beispiel Gemeinde, Kanalerneuerung (bitte ersetzen)'));\n        z.push(zeile('Lieferung vom', heute()));\n        z.push(zeile('Empf\u00e4nger', antwortText('emp')));\n        z.push(zeile('Zweck beim Empf\u00e4nger', zweckText()));\n        z.push(zeile('Format', antwortText('fmt')));\n        z.push(zeile('Version', fassungText()));\n        z.push(zeile('Zielsystem Empf\u00e4nger', antwortText('ziel')));\n        z.push(zeile('Probelieferung', antwortText('probe')));\n        z.push(zeile('Bezugssystem', bezugText()));\n        z.push(zeile('H\u00f6henbezug', antwortText('hoehe')));\n        z.push(zeile('Beiblatt', antwortText('beibl')));\n        z.push(zeile('Klassen der Bauteile', antwortText('klass')));\n        z.push(zeile('Merkmalskatalog', antwortText('kat')));\n        z.push(zeile('Datentyp und Einheit', antwortText('dtyp')));\n        z.push(zeile('Benennung', antwortText('benen')));\n        if (w('minda') !== '') { z.push(zeile('Mindestangaben', antwortText('minda'))); }\n        if (w('achse') !== '') { z.push(zeile('Achse', antwortText('achse'))); }\n        z.push(zeile('Gegenprobe', gegenprobeText()));\n        z.push(zeile('Weg zur Menge', antwortText('mweg')));\n        z.push(zeile('Format f\u00fcr die Bauphase', antwortText('bphase')));\n\n        if (DATEI !== null) {\n            z.push('');\n            z.push('AUS DEM DATEIKOPF GELESEN');\n            z.push(zeile('  Datei', DATEI.name));\n            z.push(zeile('  Schema-Kennung', DATEI.schemaText));\n            z.push(zeile('  Erzeugendes Programm', DATEI.programmText));\n            z.push(zeile('  Bezugssystem', DATEI.crsText));\n            z.push(zeile('  Klassenz\u00e4hlung', DATEI.klassenText));\n        }\n\n        var fehlt = [];\n        var klaeren = [];\n        erg.befunde.forEach(function (b) {\n            if (b.rg.n === '') { return; }\n            if (b.rg.w === 'inhalt') { fehlt.push(b.rg.n); }\n            if (b.rg.w === 'klaerung') { klaeren.push(b.rg.n); }\n        });\n\n        z.push('');\n        z.push('NICHT ENTHALTEN');\n        if (fehlt.length === 0) {\n            z.push('  nichts festgestellt. Was das Format grunds\u00e4tzlich nicht transportiert,');\n            z.push('  steht im Beiblatt.');\n        } else {\n            fehlt.forEach(function (t) { z.push('  - ' + t); });\n        }\n\n        z.push('');\n        z.push('NOCH ZU KL\u00c4REN');\n        if (klaeren.length === 0) {\n            z.push('  keine offenen Punkte notiert.');\n        } else {\n            klaeren.forEach(function (t) { z.push('  - ' + t); });\n        }\n\n        var stand = offeneFelder();\n        if (stand.offen > 0) {\n            z.push('');\n            z.push('Hinweis: ' + stand.offen + ' von ' + stand.gesamt + ' Fragen des Schnellchecks sind');\n            z.push('unbeantwortet geblieben. Die zugeh\u00f6rigen Zeilen oben haben deshalb');\n            z.push('den Vermerk \u201enicht beantwortet\".');\n        }\n\n        z.push('');\n        z.push('Diese Lieferung ersetzt keine Pr\u00fcfung durch den Auftraggeber.');\n        z.push('Erstellt mit dem Modell-Schnellcheck des CAD-Kompass.');\n        return z.join('\\n');\n    }\n\n    \/\/ ---------- Ausgabe: R\u00fcckfragen ----------\n\n    var FRAGEN = [\n        {id: 1, titel: 'Version des Formats',\n         text: 'In den Unterlagen ist das Format genannt, die Version nicht.\\n   Welche Version soll geliefert werden, und mit welchem Programm\\n   wird sie gelesen?',\n         wann: function () {\n            if (w('emp') === 'unbekannt') { return true; }\n            if (w('fver') === 'nein') { return true; }\n            if (w('fver') === 'muendlich') { return true; }\n            if (w('fver') === 'weiss') { return true; }\n            return w('fque') === 'unbekannt';\n         }},\n        {id: 2, titel: 'Pr\u00fcfprogramm des Empf\u00e4ngers',\n         text: 'Mit welchem Programm und welchem Jahrgang wird die Lieferung\\n   gelesen und gepr\u00fcft? Davon h\u00e4ngt ab, welche Version wir schreiben.',\n         wann: function () {\n            if (w('ziel') === 'nein') { return true; }\n            if (w('ziel') === 'nur') { return true; }\n            return w('probe') === 'nein';\n         }},\n        {id: 3, titel: 'Benennungsregel',\n         text: 'F\u00fchren Sie eine eigene Benennungssystematik, die von der Regel\\n   des Formats abweicht? Wenn ja, bitte mit einem Beispiel je Objektart.',\n         wann: function () {\n            if (w('benen') === 'frei') { return true; }\n            return w('benen') === 'formatregel';\n         }},\n        {id: 4, titel: 'Mindestangaben je Objektart',\n         text: 'Welche Angaben m\u00fcssen je Haltung und je Schacht gef\u00fcllt sein,\\n   damit die Lieferung in Ihr System \u00fcbernommen werden kann?',\n         wann: function () {\n            if (w('minda') === 'nein') { return true; }\n            return w('minda') === 'weiss';\n         }},\n        {id: 5, titel: 'Weg zur pr\u00fcff\u00e4higen Menge',\n         text: 'Auf welchem Weg soll aus dem Modell eine pr\u00fcff\u00e4hige Menge\\n   entstehen, und welches Verfahren gilt dabei als vereinbart?',\n         wann: function () {\n            if (zweckHat('mengen') === false) { return false; }\n            if (w('mweg') === 'offen') { return true; }\n            return w('mweg') === 'besprochen';\n         }},\n        {id: 6, titel: 'Umfang der Achse',\n         text: 'Soll die Achse mit ihren Trassierungsparametern geliefert werden,\\n   oder gen\u00fcgt sie als Objekt? Die eingeschr\u00e4nkte Modellsicht, die\\n   in Mustervorlagen vorkommt, f\u00fchrt die Kurventypen der Achse nicht mit.',\n         wann: function () {\n            if (w('achse') === 'nein') { return true; }\n            if (w('achse') === 'nicht_gesucht') { return true; }\n            if (w('fmt') !== 'ifc') { return false; }\n            return zweckHat('weiterplanen');\n         }}\n    ];\n\n    function baueFragen() {\n        var treffer = FRAGEN.filter(function (f) { return f.wann() === true; });\n        var z = [];\n        z.push('R\u00fcckfragen zur geplanten Lieferung');\n        z.push('Projekt: Beispiel Gemeinde, Kanalerneuerung (bitte ersetzen)');\n        z.push('Stand: ' + heute());\n        z.push('');\n        if (treffer.length === 0) {\n            z.push('Aus den Antworten ergibt sich gerade keine R\u00fcckfrage.');\n            z.push('Das hei\u00dft nicht, dass es nichts zu fragen gibt: Wenn eine Vorgabe');\n            z.push('unklar ist, geh\u00f6rt die Frage vor die Lieferung.');\n            return {text: z.join('\\n'), zahl: 0};\n        }\n        z.push('Vor der n\u00e4chsten Lieferung bitten wir um eine kurze Auskunft zu den');\n        z.push('folgenden Punkten. Sie entscheiden dar\u00fcber, was wir liefern.');\n        z.push('');\n        var nr = 0;\n        treffer.forEach(function (f) {\n            nr += 1;\n            z.push(nr + '. ' + f.titel);\n            z.push('   ' + f.text);\n            z.push('');\n        });\n        z.push('Bis zur Kl\u00e4rung halten wir die Lieferung im bisher vereinbarten Umfang');\n        z.push('bereit. Vielen Dank f\u00fcr die kurze R\u00fcckmeldung.');\n        return {text: z.join('\\n'), zahl: treffer.length};\n    }\n\n    \/\/ ---------- Blick in den Dateikopf ----------\n    \/\/ Kein Parser. Gelesen wird der Kopf, gez\u00e4hlt wird in Scheiben.\n    \/\/ Nichts verl\u00e4sst den Browser.\n\n    var KOPF_BYTES = 262144;        \/\/ 256 KB, deckt Kopf und die ersten Instanzen\n    var SCHEIBE = 4194304;          \/\/ 4 MB je Leseschritt\n    var UEBERLAPP = 60;             \/\/ \u00dcberhang gegen Treffer an der Schnittkante\n    var GROSS = 104857600;          \/\/ ab 100 MB wird vorher gefragt\n    var MAXZAEHL = 251658240;       \/\/ 240 MB, dar\u00fcber nur der Anfang\n\n    var ZULAESSIG = ['IFC2X3', 'IFC4', 'IFC4X3_ADD2'];\n\n    \/\/ Bauteilklassen f\u00fcr die Z\u00e4hlung. Vorn die, die im kommunalen Tiefbau\n    \/\/ vorkommen, dahinter die gel\u00e4ufigen Hochbauklassen, damit ein gemischtes\n    \/\/ Modell nicht als leer erscheint.\n    var KLASSEN = [\n        {t: 'IFCPIPESEGMENT', n: 'IfcPipeSegment'},\n        {t: 'IFCPIPEFITTING', n: 'IfcPipeFitting'},\n        {t: 'IFCDISTRIBUTIONCHAMBERELEMENT', n: 'IfcDistributionChamberElement'},\n        {t: 'IFCWASTETERMINAL', n: 'IfcWasteTerminal'},\n        {t: 'IFCFLOWTERMINAL', n: 'IfcFlowTerminal'},\n        {t: 'IFCVALVE', n: 'IfcValve'},\n        {t: 'IFCPUMP', n: 'IfcPump'},\n        {t: 'IFCTANK', n: 'IfcTank'},\n        {t: 'IFCCOURSE', n: 'IfcCourse'},\n        {t: 'IFCPAVEMENT', n: 'IfcPavement'},\n        {t: 'IFCKERB', n: 'IfcKerb'},\n        {t: 'IFCEARTHWORKSCUT', n: 'IfcEarthworksCut'},\n        {t: 'IFCEARTHWORKSFILL', n: 'IfcEarthworksFill'},\n        {t: 'IFCEARTHWORKSELEMENT', n: 'IfcEarthworksElement'},\n        {t: 'IFCREINFORCEDSOIL', n: 'IfcReinforcedSoil'},\n        {t: 'IFCGEOTECHNICALSTRATUM', n: 'IfcGeotechnicalStratum'},\n        {t: 'IFCBOREHOLE', n: 'IfcBorehole'},\n        {t: 'IFCSURFACEFEATURE', n: 'IfcSurfaceFeature'},\n        {t: 'IFCSIGN', n: 'IfcSign'},\n        {t: 'IFCSIGNAL', n: 'IfcSignal'},\n        {t: 'IFCGEOGRAPHICELEMENT', n: 'IfcGeographicElement'},\n        {t: 'IFCSLAB', n: 'IfcSlab'},\n        {t: 'IFCWALL', n: 'IfcWall'},\n        {t: 'IFCWALLSTANDARDCASE', n: 'IfcWallStandardCase'},\n        {t: 'IFCBEAM', n: 'IfcBeam'},\n        {t: 'IFCCOLUMN', n: 'IfcColumn'},\n        {t: 'IFCFOOTING', n: 'IfcFooting'},\n        {t: 'IFCPILE', n: 'IfcPile'},\n        {t: 'IFCRAILING', n: 'IfcRailing'},\n        {t: 'IFCCOVERING', n: 'IfcCovering'},\n        {t: 'IFCSTAIR', n: 'IfcStair'},\n        {t: 'IFCDOOR', n: 'IfcDoor'},\n        {t: 'IFCWINDOW', n: 'IfcWindow'},\n        {t: 'IFCMEMBER', n: 'IfcMember'},\n        {t: 'IFCPLATE', n: 'IfcPlate'},\n        {t: 'IFCDUCTSEGMENT', n: 'IfcDuctSegment'},\n        {t: 'IFCDUCTFITTING', n: 'IfcDuctFitting'},\n        {t: 'IFCCABLESEGMENT', n: 'IfcCableSegment'},\n        {t: 'IFCCABLECARRIERSEGMENT', n: 'IfcCableCarrierSegment'},\n        {t: 'IFCRAIL', n: 'IfcRail'},\n        {t: 'IFCTRACKELEMENT', n: 'IfcTrackElement'},\n        {t: 'IFCBRIDGE', n: 'IfcBridge'}\n    ];\n\n    var dateiFeld = document.getElementById('msc-file');\n    var dateiAktionen = document.getElementById('msc-file-actions');\n    var dateiAus = document.getElementById('msc-file-out');\n\n    \/\/ karte ist optional und meint eine Themenseite aus KARTEN.\n    \/\/ Sie wird an die Anmerkung geh\u00e4ngt und verlinkt.\n    function zeigeZeile(schluessel, wert, note, karte) {\n        var d = el('div', 'msc-fbefund');\n        d.appendChild(el('div', 'msc-fbefund-k', schluessel));\n        d.appendChild(el('div', 'msc-fbefund-w', wert));\n        var text = note === undefined ? '' : note;\n        var hatKarte = karte === undefined ? false : karte !== 0;\n        if (text !== '' || hatKarte === true) {\n            var n = el('div', 'msc-fbefund-n', text);\n            if (hatKarte === true) {\n                if (text !== '') { n.appendChild(document.createTextNode(' ')); }\n                fundstelle(n, karte);\n            }\n            d.appendChild(n);\n        }\n        dateiAus.appendChild(d);\n    }\n\n    function meldung(text, warnend) {\n        var d = el('div', warnend === true ? 'msc-warnzeile' : 'msc-file-note', text);\n        dateiAus.appendChild(d);\n        return d;\n    }\n\n    \/\/ Inhalt der Klammer, die bei startIdx beginnt. Beachtet Zeichenketten.\n    function klammerInhalt(text, startIdx) {\n        var i = text.indexOf('(', startIdx);\n        if (i === -1) { return ''; }\n        var tiefe = 0;\n        var inStr = false;\n        var j = i;\n        while (j < text.length) {\n            var c = text.charAt(j);\n            if (inStr === true) {\n                if (c === \"'\") { inStr = false; }\n            } else if (c === \"'\") {\n                inStr = true;\n            } else if (c === '(') {\n                tiefe += 1;\n            } else if (c === ')') {\n                tiefe -= 1;\n                if (tiefe === 0) { return text.slice(i + 1, j); }\n            }\n            j += 1;\n        }\n        return '';\n    }\n\n    function argumente(s) {\n        var out = [];\n        var akt = '';\n        var tiefe = 0;\n        var inStr = false;\n        var i = 0;\n        while (i < s.length) {\n            var c = s.charAt(i);\n            if (inStr === true) {\n                akt += c;\n                if (c === \"'\") { inStr = false; }\n                i += 1;\n                continue;\n            }\n            if (c === \"'\") { inStr = true; akt += c; i += 1; continue; }\n            if (c === '(') { tiefe += 1; akt += c; i += 1; continue; }\n            if (c === ')') { tiefe -= 1; akt += c; i += 1; continue; }\n            if (c === ',') {\n                if (tiefe === 0) { out.push(akt); akt = ''; i += 1; continue; }\n            }\n            akt += c;\n            i += 1;\n        }\n        out.push(akt);\n        return out;\n    }\n\n    function ohneHochkomma(s) {\n        var t = s.replace(\/^\\s+\/, '').replace(\/\\s+$\/, '');\n        if (t.charAt(0) === \"'\") {\n            if (t.charAt(t.length - 1) === \"'\") { return t.slice(1, t.length - 1); }\n        }\n        return t;\n    }\n\n    function kopfAuswerten(rohtext) {\n        var text = rohtext;\n        var gross = text.toUpperCase();\n        var out = {step: gross.indexOf('ISO-10303-21') !== -1, schema: '', schemaAlle: [],\n                   programm: '', werkzeug: '', zeit: '', crsKopf: false, mapKopf: false};\n\n        var i = gross.indexOf('FILE_SCHEMA');\n        if (i !== -1) {\n            var inhalt = klammerInhalt(text, i);\n            var liste = inhalt.replace(\/[()]\/g, '');\n            argumente(liste).forEach(function (s) {\n                var v = ohneHochkomma(s);\n                if (v !== '') { out.schemaAlle.push(v.toUpperCase()); }\n            });\n            if (out.schemaAlle.length > 0) { out.schema = out.schemaAlle[0]; }\n        }\n\n        var j = gross.indexOf('FILE_NAME');\n        if (j !== -1) {\n            var teile = argumente(klammerInhalt(text, j));\n            if (teile.length > 1) { out.zeit = ohneHochkomma(teile[1]); }\n            if (teile.length > 4) { out.werkzeug = ohneHochkomma(teile[4]); }\n            if (teile.length > 5) { out.programm = ohneHochkomma(teile[5]); }\n        }\n\n        out.crsKopf = gross.indexOf('IFCPROJECTEDCRS') !== -1;\n        out.mapKopf = gross.indexOf('IFCMAPCONVERSION') !== -1;\n        return out;\n    }\n\n    function zaehle(datei, grenze, fertig, fortschritt) {\n        var tally = {};\n        var pos = 0;\n        var rest = '';\n        function weiter() {\n            if (pos >= grenze) { fertig(tally, pos); return; }\n            var ende = Math.min(pos + SCHEIBE, grenze);\n            var leser = new FileReader();\n            leser.onerror = function () { fertig(tally, pos); };\n            leser.onload = function (ev) {\n                var stueck = String(ev.target.result).toUpperCase();\n                var voll = rest + stueck;\n                var re = \/=\\s*([A-Z0-9_]+)\\s*\\(\/g;\n                var m = re.exec(voll);\n                while (m !== null) {\n                    if (m.index + m[0].length > rest.length) {\n                        var name = m[1];\n                        tally[name] = (tally[name] === undefined ? 0 : tally[name]) + 1;\n                    }\n                    m = re.exec(voll);\n                }\n                rest = voll.length > UEBERLAPP ? voll.slice(voll.length - UEBERLAPP) : voll;\n                pos = ende;\n                if (fortschritt !== undefined) { fortschritt(pos, grenze); }\n                setTimeout(weiter, 0);\n            };\n            leser.readAsText(datei.slice(pos, ende));\n        }\n        weiter();\n    }\n\n    function mb(bytes) {\n        return String(Math.round(bytes \/ 104857.6) \/ 10).replace('.', ',');\n    }\n\n    function groesseText(bytes) {\n        if (bytes < 1048576) { return tausend(Math.max(1, Math.round(bytes \/ 1024))) + ' KB'; }\n        return mb(bytes) + ' MB';\n    }\n\n    function schemaSatz(kopf) {\n        if (kopf.schema === '') {\n            return {wert: 'keine Angabe gefunden',\n                    note: 'Die Zeile FILE_SCHEMA fehlt oder ist leer. Das ist ein Befund: Ohne diese Angabe r\u00e4t jedes Programm am anderen Ende, welches Schema es vor sich hat.'};\n        }\n        var ok = ZULAESSIG.indexOf(kopf.schema) !== -1;\n        if (ok === true) {\n            return {wert: kopf.schema,\n                    note: 'Eine der drei Kennungen, die als Lieferstand gef\u00fchrt werden. Ob sie zu deinem Empf\u00e4nger passt, entscheidet trotzdem sein Programm.'};\n        }\n        return {wert: kopf.schema,\n                note: 'Diese Kennung steht nicht in der Liste der drei Kennungen, die als Lieferstand gef\u00fchrt werden (IFC2X3, IFC4, IFC4X3_ADD2). Das ist eine Beobachtung. Pr\u00fcfe, ob der Empf\u00e4nger sie \u00fcberhaupt liest, und welche Ausgabe gerade gilt, steht in Versionen und St\u00e4nde.'};\n    }\n\n    function programmSatz(kopf) {\n        var teile = [];\n        if (kopf.programm !== '') { teile.push(kopf.programm); }\n        if (kopf.werkzeug !== '') { teile.push(kopf.werkzeug); }\n        if (teile.length === 0) {\n            return {wert: 'keine Angabe',\n                    note: 'Das Feld f\u00fcr das erzeugende System ist leer. Bei einer R\u00fcckfrage fehlt damit die Spur, aus welchem Programm die Datei stammt.'};\n        }\n        var note = 'Steht im Kopf der Datei. Bei einer R\u00fcckfrage zum Export ist das die erste Angabe, nach der gefragt wird.';\n        if (kopf.zeit !== '') { note = 'Zeitstempel der Datei: ' + kopf.zeit + '. ' + note; }\n        return {wert: teile.join(' \/ '), note: note};\n    }\n\n    function zeigeDatei() {\n        dateiAus.textContent = '';\n        if (DATEI === null) { return; }\n        zeigeZeile('Datei', DATEI.name + ', ' + groesseText(DATEI.groesse), '');\n        zeigeZeile('Schema-Kennung', DATEI.schemaText, DATEI.schemaNote);\n        zeigeZeile('Erzeugendes Programm', DATEI.programmText, DATEI.programmNote);\n        zeigeZeile('Bezugssystem', DATEI.crsText, DATEI.crsNote);\n        zeigeZeile('Klassenz\u00e4hlung', DATEI.klassenText, DATEI.klassenNote, DATEI.klassenKarte);\n        DATEI.warnungen.forEach(function (t) { meldung(t, true); });\n    }\n\n    function uebernehmen(id, wert) {\n        if (wert === '') { return; }\n        A[id] = wert;\n        VORBELEGT[id] = true;\n    }\n\n    function werteZaehlungAus(tally, gelesen) {\n        var proxy = tally['IFCBUILDINGELEMENTPROXY'] === undefined ? 0 : tally['IFCBUILDINGELEMENTPROXY'];\n        var built = tally['IFCBUILTELEMENT'] === undefined ? 0 : tally['IFCBUILTELEMENT'];\n        \/\/ Sammelklassen: IfcBuiltElement in IFC 4.3, IfcBuildingElementProxy in IFC4.\n        var sammel = proxy + built;\n        var fach = 0;\n        var arten = [];\n        KLASSEN.forEach(function (k) {\n            var n = tally[k.t] === undefined ? 0 : tally[k.t];\n            if (n > 0) {\n                fach += n;\n                arten.push({n: k.n, z: n});\n            }\n        });\n        arten.sort(function (a, b) { return b.z - a.z; });\n        var gesamt = sammel + fach;\n\n        var teilweise = gelesen < DATEI.groesse;\n        if (teilweise === true) {\n            DATEI.warnungen.push('Gez\u00e4hlt wurde nur der Anfang der Datei, ' + groesseText(gelesen) + ' von ' + groesseText(DATEI.groesse) + '. Die Zahlen unten gelten f\u00fcr diesen Ausschnitt, nicht f\u00fcr die ganze Datei.');\n        }\n\n        \/\/ Bezugssystem: die Z\u00e4hlung ist verl\u00e4sslicher als der Blick in den Kopf,\n        \/\/ weil IfcProjectedCRS auch weiter hinten stehen kann.\n        var crs = tally['IFCPROJECTEDCRS'] === undefined ? 0 : tally['IFCPROJECTEDCRS'];\n        var map = tally['IFCMAPCONVERSION'] === undefined ? 0 : tally['IFCMAPCONVERSION'];\n        if (crs > 0) {\n            if (map > 0) {\n                DATEI.crsText = 'IfcProjectedCRS und IfcMapConversion vorhanden';\n                DATEI.crsNote = 'Die Datei enth\u00e4lt ein benanntes Bezugssystem und die Transformation dorthin. Ob es das richtige ist, sagt die Z\u00e4hlung nicht.';\n                uebernehmen('bez', 'ja');\n                uebernehmen('bezd', 'ja');\n            } else {\n                DATEI.crsText = 'nur IfcProjectedCRS, keine IfcMapConversion';\n                DATEI.crsNote = 'Das Bezugssystem ist benannt, die Transformation fehlt. Dann steht das Modell im System, aber nicht an der richtigen Stelle darin.';\n                uebernehmen('bezd', 'ja');\n            }\n        } else if (map > 0) {\n            DATEI.crsText = 'nur IfcMapConversion, kein IfcProjectedCRS';\n            DATEI.crsNote = 'Eine Transformation ohne benanntes Zielsystem. Der Empf\u00e4nger wei\u00df dann, um wie viel verschoben wird, aber nicht wohin.';\n            uebernehmen('bezd', 'ja');\n        } else {\n            DATEI.crsText = 'nicht gefunden';\n            DATEI.crsNote = teilweise === true\n                ? 'Im gelesenen Ausschnitt kommen weder IfcProjectedCRS noch IfcMapConversion vor. Bei einer angeschnittenen Datei ist das kein Beweis, aber ein Grund nachzusehen.'\n                : 'Weder IfcProjectedCRS noch IfcMapConversion kommen vor. Damit fehlt der Datei ein benanntes Bezugssystem, und das Modell landet beim Empf\u00e4nger irgendwo.';\n            if (teilweise === false) {\n                uebernehmen('bez', 'nein');\n                uebernehmen('bezd', 'ja');\n            }\n        }\n\n        if (gesamt === 0) {\n            DATEI.klassenText = 'keine Bauteile aus der Liste gefunden';\n            DATEI.klassenNote = 'Das Werkzeug z\u00e4hlt eine feste Liste von Bauteilklassen. Findet es keine, kann die Datei ein Fachmodell mit anderen Klassen sein, ein reines Gel\u00e4ndemodell, oder die Bauteile stehen in einer Klasse, die hier nicht gef\u00fchrt wird. Sieh selbst nach, bevor du daraus etwas schlie\u00dft.';\n            DATEI.klassenKarte = 0;\n        } else {\n            var kopfsatz = sammel === 0\n                ? 'Gez\u00e4hlt: ' + tausend(gesamt) + ' Bauteile, keines davon in einer Sammelklasse (IfcBuiltElement in IFC 4.3, IfcBuildingElementProxy in IFC4).'\n                : 'Von ' + tausend(gesamt) + ' gez\u00e4hlten Bauteilen stehen ' + tausend(sammel) + ' in einer Sammelklasse (IfcBuiltElement in IFC 4.3, IfcBuildingElementProxy in IFC4).';\n            var spitze = [];\n            arten.slice(0, 3).forEach(function (a) { spitze.push(a.n + ' (' + tausend(a.z) + ')'); });\n            var zusatz = arten.length === 0\n                ? 'Eine Fachklasse kommt nicht vor.'\n                : 'Am h\u00e4ufigsten: ' + spitze.join(', ') + '. Insgesamt ' + arten.length + (arten.length === 1 ? ' Fachklasse.' : ' Fachklassen.');\n            DATEI.klassenText = kopfsatz;\n            DATEI.klassenNote = zusatz + ' Das ist eine Z\u00e4hlung. Was die Sammelklasse beim Empf\u00e4nger ausl\u00f6st, sagt die Zahl nicht.';\n            DATEI.klassenKarte = 3;\n\n            if (fach === 0) {\n                uebernehmen('klass', 'gleich');\n            } else if (sammel >= fach * 4) {\n                uebernehmen('klass', 'gleich');\n            } else if (arten.length >= 2) {\n                if (fach >= sammel * 4) { uebernehmen('klass', 'unterschiedlich'); }\n            }\n        }\n\n        aktualisiere();\n        zeigeDatei();\n    }\n\n    function nachKopf(datei, kopf) {\n        DATEI = {name: datei.name, groesse: datei.size, warnungen: [],\n                 schemaText: '', schemaNote: '', programmText: '', programmNote: '',\n                 crsText: 'nicht gepr\u00fcft', crsNote: '', klassenText: 'nicht gez\u00e4hlt', klassenNote: '',\n                 klassenKarte: 0};\n\n        var s = schemaSatz(kopf);\n        DATEI.schemaText = s.wert;\n        DATEI.schemaNote = s.note;\n        var p = programmSatz(kopf);\n        DATEI.programmText = p.wert;\n        DATEI.programmNote = p.note;\n        if (kopf.schema.indexOf('IFC') === 0) { uebernehmen('fmt', 'ifc'); }\n\n        dateiAktionen.textContent = '';\n        var weg = el('button', 'msc-btn', 'Dateibefund entfernen');\n        weg.type = 'button';\n        weg.addEventListener('click', function () {\n            DATEI = null;\n            dateiFeld.value = '';\n            dateiAktionen.textContent = '';\n            dateiAus.textContent = '';\n            FELDER.forEach(function (f) { VORBELEGT[f.id] = false; });\n            aktualisiere();\n        });\n        dateiAktionen.appendChild(weg);\n\n        zeigeDatei();\n\n        if (datei.size > GROSS) {\n            var frage = meldung('Die Datei ist ' + groesseText(datei.size) + ' gro\u00df. Die Z\u00e4hlung l\u00e4uft dann einen Moment, und dein Browser ist so lange besch\u00e4ftigt. Der Kopf oben steht schon.', true);\n            var reihe = el('div', 'msc-file-actions');\n            var los = el('button', 'msc-btn', 'Trotzdem z\u00e4hlen');\n            los.type = 'button';\n            var ohne = el('button', 'msc-btn', 'Beim Kopf bleiben');\n            ohne.type = 'button';\n            los.addEventListener('click', function () {\n                reihe.parentNode.removeChild(reihe);\n                frage.parentNode.removeChild(frage);\n                starteZaehlung(datei);\n            });\n            ohne.addEventListener('click', function () {\n                reihe.parentNode.removeChild(reihe);\n                DATEI.klassenText = 'nicht gez\u00e4hlt';\n                DATEI.klassenNote = 'Die Z\u00e4hlung ist \u00fcbersprungen worden. Ohne sie sagt das Werkzeug nichts \u00fcber Klassen und Bezugssystem.';\n                zeigeDatei();\n            });\n            reihe.appendChild(los);\n            reihe.appendChild(ohne);\n            dateiAus.appendChild(reihe);\n            return;\n        }\n        starteZaehlung(datei);\n    }\n\n    function starteZaehlung(datei) {\n        var grenze = Math.min(datei.size, MAXZAEHL);\n        var lauf = meldung('Z\u00e4hlt die Klassen, das l\u00e4uft lokal in deinem Browser ...');\n        zaehle(datei, grenze, function (tally, gelesen) {\n            if (lauf.parentNode !== null) { lauf.parentNode.removeChild(lauf); }\n            werteZaehlungAus(tally, gelesen);\n        }, function (pos, ziel) {\n            lauf.textContent = 'Z\u00e4hlt die Klassen, ' + mb(pos) + ' von ' + mb(ziel) + ' MB gelesen.';\n        });\n    }\n\n    dateiFeld.addEventListener('change', function () {\n        var datei = dateiFeld.files.length === 0 ? null : dateiFeld.files[0];\n        DATEI = null;\n        dateiAus.textContent = '';\n        dateiAktionen.textContent = '';\n        FELDER.forEach(function (f) { VORBELEGT[f.id] = false; });\n        aktualisiere();\n        if (datei === null) { return; }\n\n        var name = datei.name.toLowerCase();\n        if (name.slice(-4) === '.zip') {\n            meldung('Das sieht nach einer gepackten Datei aus. Hier lassen sich nur unkomprimierte IFC-Dateien lesen. Pack sie aus und w\u00e4hle sie erneut.', true);\n            return;\n        }\n        if (name.slice(-7) === '.ifczip') {\n            meldung('Das sieht nach einer gepackten Datei aus. Hier lassen sich nur unkomprimierte IFC-Dateien lesen. Pack sie aus und w\u00e4hle sie erneut.', true);\n            return;\n        }\n\n        var leser = new FileReader();\n        leser.onerror = function () {\n            meldung('Die Datei lie\u00df sich nicht lesen. Das kann an den Rechten liegen oder daran, dass sie gerade von einem anderen Programm gehalten wird.', true);\n        };\n        leser.onload = function (ev) {\n            var kopf = kopfAuswerten(String(ev.target.result));\n            if (kopf.step === false) {\n                meldung('Das sieht nicht nach einer IFC-Datei im STEP-Format aus. Die erste Zeile einer solchen Datei beginnt mit ISO-10303-21. Die Fragen unten kannst du trotzdem alle beantworten.', true);\n                return;\n            }\n            nachKopf(datei, kopf);\n        };\n        leser.readAsText(datei.slice(0, Math.min(datei.size, KOPF_BYTES)));\n    });\n\n    \/\/ ---------- Kopieren ----------\n\n    function kopiere(text, feld, meldungsknoten) {\n        function fertig() {\n            meldungsknoten.textContent = 'Kopiert.';\n            setTimeout(function () { meldungsknoten.textContent = ''; }, 2500);\n        }\n        function ersatz() {\n            try {\n                feld.removeAttribute('readonly');\n                feld.focus();\n                feld.setSelectionRange(0, feld.value.length);\n                var ok = document.execCommand('copy');\n                feld.setAttribute('readonly', 'readonly');\n                if (ok === true) { fertig(); return; }\n            } catch (e) {\n                feld.setAttribute('readonly', 'readonly');\n            }\n            meldungsknoten.textContent = 'Bitte von Hand kopieren, der Text ist markiert.';\n        }\n        if (navigator.clipboard === undefined) { ersatz(); return; }\n        try {\n            navigator.clipboard.writeText(text).then(fertig, ersatz);\n        } catch (e) {\n            ersatz();\n        }\n    }\n\n    \/\/ ---------- Zusammenspiel ----------\n\n    var lsFeld = document.getElementById('msc-lieferschein');\n    var lsDruck = document.getElementById('msc-lieferschein-druck');\n    var lsStand = document.getElementById('msc-ls-stand');\n    var frFeld = document.getElementById('msc-fragen');\n    var frDruck = document.getElementById('msc-fragen-druck');\n    var frStand = document.getElementById('msc-fr-stand');\n\n    function aktualisiere() {\n        zeichneFormular();\n        var stand = offeneFelder();\n        var erg = bewerte();\n        maleZustand(erg, stand);\n        maleBefunde(erg);\n\n        var ls = baueLieferschein(erg);\n        lsFeld.value = ls;\n        lsDruck.textContent = ls;\n        lsStand.textContent = ls.split('\\n').length + ' Zeilen';\n\n        var fr = baueFragen();\n        frFeld.value = fr.text;\n        frDruck.textContent = fr.text;\n        if (fr.zahl === 0) {\n            frStand.textContent = 'keine offene R\u00fcckfrage';\n        } else if (fr.zahl === 1) {\n            frStand.textContent = '1 R\u00fcckfrage';\n        } else {\n            frStand.textContent = fr.zahl + ' R\u00fcckfragen';\n        }\n    }\n\n    document.getElementById('msc-copy-ls').addEventListener('click', function () {\n        kopiere(lsFeld.value, lsFeld, document.getElementById('msc-copy-ls-ok'));\n    });\n    document.getElementById('msc-copy-fr').addEventListener('click', function () {\n        kopiere(frFeld.value, frFeld, document.getElementById('msc-copy-fr-ok'));\n    });\n\n    document.getElementById('msc-reset').addEventListener('click', function () {\n        FELDER.forEach(function (f) {\n            A[f.id] = f.t === 'mehr' ? [] : '';\n            VORBELEGT[f.id] = false;\n        });\n        aktualisiere();\n        var erste = KNOTEN.emp;\n        if (erste !== undefined) {\n            if (erste.select !== null) { erste.select.focus(); }\n        }\n    });\n\n    (function baueBeispiele() {\n        var reihe = document.getElementById('msc-presets');\n        BEISPIELE.forEach(function (bsp) {\n            var b = el('button', 'msc-seg', bsp.t);\n            b.type = 'button';\n            b.title = bsp.h;\n            b.addEventListener('click', function () {\n                FELDER.forEach(function (f) {\n                    var v = bsp.a[f.id];\n                    if (f.t === 'mehr') {\n                        A[f.id] = v === undefined ? [] : v.slice(0);\n                        return;\n                    }\n                    A[f.id] = v === undefined ? '' : v;\n                    VORBELEGT[f.id] = false;\n                });\n                aktualisiere();\n            });\n            reihe.appendChild(b);\n        });\n    })();\n\n    aktualisiere();\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>Modell-Schnellcheck Die Pr\u00fcfung vor dem Versand. Am Ende steht ein Lieferschein, der sagt, was nicht drin ist, dazu die R\u00fcckfragen, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"disabled","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[54],"tags":[],"class_list":["post-2625","post","type-post","status-publish","format-standard","hentry","category-tf5-liefern"],"uagb_featured_image_src":{"full":false,"thumbnail":false,"medium":false,"medium_large":false,"large":false,"1536x1536":false,"2048x2048":false},"uagb_author_info":{"display_name":false,"author_link":"https:\/\/cad-kompass.de\/?author=1"},"uagb_comment_info":0,"uagb_excerpt":"Modell-Schnellcheck Die Pr\u00fcfung vor dem Versand. Am Ende steht ein Lieferschein, der sagt, was nicht drin ist, dazu die R\u00fcckfragen, [&hellip;]","_links":{"self":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/posts\/2625","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2625"}],"version-history":[{"count":4,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/posts\/2625\/revisions"}],"predecessor-version":[{"id":2712,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=\/wp\/v2\/posts\/2625\/revisions\/2712"}],"wp:attachment":[{"href":"https:\/\/cad-kompass.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2625"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2625"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cad-kompass.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2625"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}