{"id":2125,"date":"2026-05-29T10:34:22","date_gmt":"2026-05-29T10:34:22","guid":{"rendered":"https:\/\/aiper.com\/blogs\/?page_id=2125"},"modified":"2026-06-24T04:24:45","modified_gmt":"2026-06-24T04:24:45","slug":"calculateur-sable-filtre-piscine","status":"publish","type":"page","link":"https:\/\/aiper.com\/blogs\/fr\/calculateur-sable-filtre-piscine\/","title":{"rendered":"Calculateur de sable pour piscine"},"content":{"rendered":"\n<div class=\"pool-sand-calc-container\">\n    <div class=\"psc-header\">\n        <h2>Calculateur de sable pour piscine<\/h2>\n        <p>Estimez avec pr\u00e9cision le volume, le poids et le co\u00fbt total du sable n\u00e9cessaire pour l\u2019installation de votre piscine ou la couche de base.<\/p>\n    <\/div>\n\n    <div class=\"psc-section\">\n        <label class=\"psc-section-title\"><span class=\"psc-step-badge\">1<\/span> Choisissez la forme de la piscine<\/label>\n        <div class=\"psc-shape-grid\">\n            <div class=\"psc-shape-card active\" data-shape=\"Rectangle\">\n                <svg viewBox=\"0 0 24 24\"><rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"2\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\"\/><\/svg>\n                <span>Rectangle<\/span>\n            <\/div>\n            <div class=\"psc-shape-card\" data-shape=\"L-shaped\">\n                <svg viewBox=\"0 0 24 24\"><path d=\"M5 5 v14 h14 v-7 h-7 v-7 z\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\" stroke-linejoin=\"round\"\/><\/svg>\n                <span>Forme en L<\/span>\n            <\/div>\n            <div class=\"psc-shape-card\" data-shape=\"Circle\">\n                <svg viewBox=\"0 0 24 24\"><circle cx=\"12\" cy=\"12\" r=\"8\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\"\/><\/svg>\n                <span>Cercle<\/span>\n            <\/div>\n            <div class=\"psc-shape-card\" data-shape=\"Triangle\">\n                <svg viewBox=\"0 0 24 24\"><polygon points=\"12,4 4,19 20,19\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\" stroke-linejoin=\"round\"\/><\/svg>\n                <span>Triangle<\/span>\n            <\/div>\n            <div class=\"psc-shape-card\" data-shape=\"Kidney\">\n                <svg viewBox=\"0 0 24 24\"><path d=\"M12 4C7 4 4 8 4 12C4 16 8 15 12 19C16 23 20 16 20 12C20 8 17 4 12 4Z\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\"\/><\/svg>\n                <span>Haricot<\/span>\n            <\/div>\n            <div class=\"psc-shape-card\" data-shape=\"Oval\">\n                <svg viewBox=\"0 0 24 24\"><ellipse cx=\"12\" cy=\"12\" rx=\"9\" ry=\"6\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\"\/><\/svg>\n                <span>Ovale<\/span>\n            <\/div>\n            <div class=\"psc-shape-card\" data-shape=\"Oblong\">\n                <svg viewBox=\"0 0 24 24\"><rect x=\"4\" y=\"6\" width=\"16\" height=\"12\" rx=\"6\" stroke=\"currentColor\" fill=\"none\" stroke-width=\"2\"\/><\/svg>\n                <span>Oblong<\/span>\n            <\/div>\n        <\/div>\n        <input type=\"hidden\" id=\"psc-selected-shape\" value=\"Rectangle\">\n    <\/div>\n\n    <div class=\"psc-section\">\n        <label class=\"psc-section-title\"><span class=\"psc-step-badge\">2<\/span> Unit\u00e9 de mesure<\/label>\n        <div class=\"psc-unit-toggle-container\">\n            <button type=\"button\" class=\"psc-unit-btn active\" data-unit=\"ft\">Pieds (ft)<\/button>\n            <button type=\"button\" class=\"psc-unit-btn\" data-unit=\"in\">Pouces (in)<\/button>\n            <button type=\"button\" class=\"psc-unit-btn\" data-unit=\"yd\">Yards (yd)<\/button>\n            <button type=\"button\" class=\"psc-unit-btn\" data-unit=\"cm\">Centim\u00e8tres (cm)<\/button>\n            <button type=\"button\" class=\"psc-unit-btn\" data-unit=\"m\">M\u00e8tres (m)<\/button>\n        <\/div>\n        <input type=\"hidden\" id=\"psc-selected-unit\" value=\"ft\">\n    <\/div>\n\n    <div class=\"psc-section\">\n        <label class=\"psc-section-title\"><span class=\"psc-step-badge\">3<\/span> Saisir les dimensions de la piscine<\/label>\n        <div id=\"psc-dynamic-fields\" class=\"psc-input-grid\">\n            <\/div>\n    <\/div>\n\n    <div class=\"psc-section\">\n        <label class=\"psc-section-title\"><span class=\"psc-step-badge\">4<\/span> Tarif &#038; devise<\/label>\n        <div class=\"psc-input-grid row-2\">\n            <div class=\"psc-input-wrapper\">\n                <label for=\"psc-currency\">Devise<\/label>\n                <select id=\"psc-currency\" class=\"psc-form-control\">\n                    <option value=\"USD\">USD ($)<\/option>\n                    <option value=\"AUD\">AUD ($)<\/option>\n                    <option value=\"EUR\">EUR (\u20ac)<\/option>\n                <\/select>\n            <\/div>\n            <div class=\"psc-input-wrapper\">\n                <label for=\"psc-price-per-ton\">Prix par tonne<\/label>\n                <input type=\"number\" id=\"psc-price-per-ton\" class=\"psc-form-control\" value=\"50\" min=\"0\" step=\"any\">\n            <\/div>\n        <\/div>\n\n        <div class=\"psc-regional-info\">\n            <div class=\"psc-regional-tab-headers\">\n                <span class=\"psc-reg-tab active\" data-region=\"us\">R\u00e9f\u00e9rence prix US<\/span>\n                <span class=\"psc-reg-tab\" data-region=\"au\">Prix Australie<\/span>\n                <span class=\"psc-reg-tab\" data-region=\"eu\">Prix Europe<\/span>\n            <\/div>\n            <div class=\"psc-regional-tab-content\">\n                <div id=\"psc-reg-us\" class=\"psc-reg-panel active\">\n                    <p><strong>Co\u00fbt du mat\u00e9riau&nbsp;:<\/strong> $15 \u2013 $60\/tonne. <strong>Avec livraison\/frais&nbsp;:<\/strong> $50 \u2013 $150\/tonne.<\/p>\n                    <ul>\n                        <li>Sable de remplissage: $15 \u2013 $40\/tonne<\/li>\n                        <li>Sable \u00e0 b\u00e9ton: $25 \u2013 $50\/tonne<\/li>\n                        <li>Sable de ma\u00e7on \/ sable de base de piscine: $50 \u2013 $65+\/tonne<\/li>\n                        <li>Sable sp\u00e9cialis\u00e9 \/ sable de jeu: $40 \u2013 $100+\/tonne<\/li>\n                    <\/ul>\n                <\/div>\n                <div id=\"psc-reg-au\" class=\"psc-reg-panel\">\n                    <p><strong>Fourchette moyenne&nbsp;:<\/strong> $60 \u2013 $150 AUD\/tonne m\u00e9trique selon le traitement et l\u2019emplacement.<\/p>\n                    <ul>\n                        <li>Sable en vrac &#038; de remplissage: $45 \u2013 $75\/tonne<\/li>\n                        <li>Sable \u00e0 brique &#038; de pavage: $64 \u2013 $95\/tonne<\/li>\n                        <li>Sable de rivi\u00e8re lav\u00e9: $60 \u2013 $95\/tonne<\/li>\n                        <li>Sable de jeu certifi\u00e9: $130 \u2013 $153\/tonne<\/li>\n                    <\/ul>\n                <\/div>\n                <div id=\"psc-reg-eu\" class=\"psc-reg-panel\">\n                    <p><strong>Fourchette moyenne&nbsp;:<\/strong> $30 \u2013 $150\/tonne. Les r\u00e9f\u00e9rences \u00e0 l\u2019import se situent en moyenne autour de $60 \u2013 $63\/tonne.<\/p>\n                    <ul>\n                        <li>Sable &#038; gravier de construction: $30 \u2013 $60\/tonne<\/li>\n                        <li>Sable de silice industriel: $60 \u2013 $150+\/tonne<\/li>\n                        <li>Qualit\u00e9s sp\u00e9ciales haute puret\u00e9: plusieurs fois les tarifs de r\u00e9f\u00e9rence<\/li>\n                    <\/ul>\n                <\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n\n    <div class=\"psc-action-container\">\n        <button type=\"button\" id=\"psc-calculate-btn\" class=\"psc-submit-btn\">Calculer<\/button>\n    <\/div>\n\n    <div id=\"psc-results-container\" class=\"psc-results-wrapper\" style=\"display: none;\">\n        <h3 class=\"psc-results-heading\">R\u00e9sultats du calcul<\/h3>\n        <div class=\"psc-results-grid\">\n            <div class=\"psc-result-card\">\n                <div class=\"psc-result-header\">\n                    <span class=\"psc-result-title\">Volume de sable<\/span>\n                    <select id=\"psc-volume-unit-toggle\" class=\"psc-mini-toggle\">\n                        <option value=\"gallons\">Gallons<\/option>\n                        <option value=\"liters\">Litres<\/option>\n                        <option value=\"m3\" selected>M\u00e8tres cubes (m\u00b3)<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"psc-result-value\" id=\"psc-output-volume\">0.00<\/div>\n            <\/div>\n\n            <div class=\"psc-result-card\">\n                <div class=\"psc-result-header\">\n                    <span class=\"psc-result-title\">Poids du sable<\/span>\n                    <select id=\"psc-weight-unit-toggle\" class=\"psc-mini-toggle\">\n                        <option value=\"tonnes\" selected>Tonnes (t)<\/option>\n                        <option value=\"kg\">Kilogrammes (kg)<\/option>\n                        <option value=\"lbs\">Livres (lbs)<\/option>\n                    <\/select>\n                <\/div>\n                <div class=\"psc-result-value\" id=\"psc-output-weight\">0.00<\/div>\n            <\/div>\n\n            <div class=\"psc-result-card highlighted\">\n                <div class=\"psc-result-header\">\n                    <span class=\"psc-result-title\">Co\u00fbt estim\u00e9 du sable<\/span>\n                    <span class=\"psc-currency-indicator\" id=\"psc-output-currency-label\">USD<\/span>\n                <\/div>\n                <div class=\"psc-result-value\" id=\"psc-output-cost\">0.00<\/div>\n            <\/div>\n        <\/div>\n    <\/div>\n<\/div>\n\n<style>\n\/* Scoped CSS styling matching WordPress core paradigms *\/\n.pool-sand-calc-container {\n    max-width: 800px;\n    margin: 20px auto;\n    background: #ffffff;\n    border: 1px solid #e2e8f0;\n    border-radius: 12px;\n    padding: 30px;\n    font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;\n    color: #334155;\n    box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);\n    box-sizing: border-box;\n}\n.pool-sand-calc-container *, .pool-sand-calc-container *::before, .pool-sand-calc-container *::after {\n    box-sizing: border-box;\n}\n.psc-header {\n    text-align: center;\n    margin-bottom: 30px;\n    border-bottom: 2px solid #f1f5f9;\n    padding-bottom: 20px;\n}\n.psc-header h2 {\n    margin: 0 0 10px 0;\n    color: #0f172a;\n    font-size: 28px;\n    font-weight: 700;\n}\n.psc-header p {\n    margin: 0;\n    color: #64748b;\n    font-size: 15px;\n    line-height: 1.5;\n}\n.psc-section {\n    margin-bottom: 30px;\n}\n.psc-section-title {\n    display: block;\n    font-size: 16px;\n    font-weight: 600;\n    color: #0f172a;\n    margin-bottom: 15px;\n}\n.psc-step-badge {\n    display: inline-block;\n    width: 24px;\n    height: 24px;\n    line-height: 24px;\n    text-align: center;\n    background-color: #1ecad3;\n    color: white;\n    border-radius: 50%;\n    font-size: 12px;\n    margin-right: 8px;\n    font-weight: bold;\n    vertical-align: middle;\n}\n.psc-shape-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n    gap: 12px;\n}\n@media (max-width: 600px) {\n    .psc-shape-grid {\n        grid-template-columns: repeat(3, 1fr);\n    }\n}\n.psc-shape-card {\n    border: 2px solid #e2e8f0;\n    border-radius: 8px;\n    padding: 15px 10px;\n    text-align: center;\n    cursor: pointer;\n    transition: all 0.2s ease;\n    background: #f8fafc;\n}\n.psc-shape-card:hover {\n    border-color: #1ecad3;\n    background: #f0fdfa;\n}\n.psc-shape-card.active {\n    border-color: #1ecad3;\n    background: #e6fbfb;\n    color: #0f172a;\n    font-weight: 600;\n}\n.psc-shape-card svg {\n    width: 32px;\n    height: 32px;\n    margin-bottom: 8px;\n    color: #64748b;\n    fill: none;\n}\n.psc-shape-card.active svg {\n    color: #1ecad3;\n}\n.psc-shape-card span {\n    display: block;\n    font-size: 12px;\n}\n.psc-unit-toggle-container {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 8px;\n}\n.psc-unit-btn {\n    flex: 1;\n    min-width: 80px;\n    background: #ffffff;\n    border: 1px solid #cbd5e1;\n    padding: 10px 14px;\n    font-size: 14px;\n    border-radius: 6px;\n    cursor: pointer;\n    transition: all 0.2s;\n    text-align: center;\n    color: #475569;\n}\n.psc-unit-btn:hover {\n    background: #f8fafc;\n    border-color: #94a3b8;\n}\n.psc-unit-btn.active {\n    background: #1ecad3;\n    color: #ffffff;\n    border-color: #1ecad3;\n    font-weight: 500;\n}\n.psc-input-grid {\n    display: grid;\n    grid-template-columns: repeat(2, 1fr);\n    gap: 16px;\n}\n@media (max-width: 500px) {\n    .psc-input-grid {\n        grid-template-columns: 1fr;\n    }\n}\n.psc-input-grid.row-2 {\n    grid-template-columns: repeat(2, 1fr);\n}\n.psc-input-wrapper {\n    display: flex;\n    flex-direction: column;\n}\n.psc-input-wrapper label {\n    font-size: 13px;\n    font-weight: 500;\n    color: #475569;\n    margin-bottom: 6px;\n}\n.psc-form-control {\n    width: 100%;\n    padding: 10px 14px;\n    font-size: 15px;\n    border: 1px solid #cbd5e1;\n    border-radius: 6px;\n    color: #1e293b;\n    background-color: #ffffff;\n    outline: none;\n}\n.psc-form-control:focus {\n    border-color: #1ecad3;\n    box-shadow: 0 0 0 3px rgba(30, 202, 211, 0.15);\n}\n.psc-regional-info {\n    margin-top: 20px;\n    border: 1px solid #e2e8f0;\n    border-radius: 8px;\n    overflow: hidden;\n    background: #fafafa;\n}\n.psc-regional-tab-headers {\n    display: flex;\n    background: #f1f5f9;\n    border-bottom: 1px solid #e2e8f0;\n}\n.psc-reg-tab {\n    flex: 1;\n    padding: 10px;\n    font-size: 12px;\n    text-align: center;\n    font-weight: 500;\n    color: #64748b;\n    cursor: pointer;\n}\n.psc-reg-tab:hover {\n    background: #e2e8f0;\n}\n.psc-reg-tab.active {\n    background: #ffffff;\n    color: #1ecad3;\n    font-weight: 600;\n    border-top: 2px solid #1ecad3;\n}\n.psc-regional-tab-content {\n    padding: 15px;\n}\n.psc-reg-panel {\n    display: none;\n}\n.psc-reg-panel.active {\n    display: block;\n}\n.psc-reg-panel p {\n    margin: 0 0 10px 0;\n    font-size: 13px;\n    line-height: 1.4;\n}\n.psc-reg-panel ul {\n    margin: 0;\n    padding-left: 20px;\n    font-size: 12px;\n    color: #475569;\n}\n.psc-reg-panel li {\n    margin-bottom: 4px;\n}\n.psc-action-container {\n    text-align: center;\n    margin-top: 35px;\n    margin-bottom: 35px;\n}\n.psc-submit-btn {\n    background-color: #1ecad3;\n    color: #ffffff;\n    border: none;\n    padding: 14px 40px;\n    font-size: 16px;\n    font-weight: 600;\n    border-radius: 8px;\n    cursor: pointer;\n    box-shadow: 0 4px 6px -1px rgba(30, 202, 211, 0.3);\n    transition: background-color 0.2s, transform 0.1s;\n}\n.psc-submit-btn:hover {\n    background-color: #16b4bd;\n}\n.psc-submit-btn:active {\n    transform: scale(0.98);\n}\n.psc-results-wrapper {\n    background: #f8fafc;\n    border: 2px solid #e2e8f0;\n    border-radius: 10px;\n    padding: 24px;\n    animation: pscFadeIn 0.4s ease-out;\n}\n.psc-results-heading {\n    margin: 0 0 20px 0;\n    font-size: 18px;\n    font-weight: 600;\n    color: #0f172a;\n    text-align: center;\n}\n.psc-results-grid {\n    display: grid;\n    grid-template-columns: repeat(3, 1fr);\n    gap: 16px;\n}\n@media (max-width: 680px) {\n    .psc-results-grid {\n        grid-template-columns: 1fr;\n    }\n}\n.psc-result-card {\n    background: #ffffff;\n    border: 1px solid #e2e8f0;\n    border-radius: 8px;\n    padding: 16px;\n}\n.psc-result-card.highlighted {\n    border-color: #1ecad3;\n    background: #f0fdfa;\n}\n.psc-result-header {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 12px;\n}\n.psc-result-title {\n    font-size: 13px;\n    font-weight: 600;\n    color: #64748b;\n}\n.psc-result-card.highlighted .psc-result-title {\n    color: #0d9488;\n}\n.psc-mini-toggle {\n    border: 1px solid #cbd5e1;\n    border-radius: 4px;\n    padding: 2px 4px;\n    font-size: 11px;\n    background: #f8fafc;\n    color: #334155;\n    cursor: pointer;\n}\n.psc-currency-indicator {\n    font-size: 11px;\n    font-weight: 700;\n    background: #1ecad3;\n    color: white;\n    padding: 2px 6px;\n    border-radius: 4px;\n}\n.psc-result-value {\n    font-size: 22px;\n    font-weight: 700;\n    color: #0f172a;\n    word-break: break-all;\n}\n@keyframes pscFadeIn {\n    from { opacity: 0; transform: translateY(10px); }\n    to { opacity: 1; transform: translateY(0); }\n}\n<\/style>\n\n<script>\ndocument.addEventListener('DOMContentLoaded', function() {\n    \/\/ UI field configurations matching prompt requested dimension patterns\n    const fieldConfigs = {\n        'Rectangle': [\n            { id: 'length', label: 'Longueur' },\n            { id: 'width', label: 'Largeur' },\n            { id: 'shallowDepth', label: 'Profondeur c\u00f4t\u00e9 petit bain' },\n            { id: 'deepDepth', label: 'Profondeur c\u00f4t\u00e9 grand bain' }\n        ],\n        'L-shaped': [\n            { id: 'totalLength', label: 'Longueur totale' },\n            { id: 'totalWidth', label: 'Largeur totale' },\n            { id: 'shortSideLength', label: 'Longueur du c\u00f4t\u00e9 court' },\n            { id: 'shortSideWidth', label: 'Largeur du c\u00f4t\u00e9 court' },\n            { id: 'shallowDepth', label: 'Profondeur c\u00f4t\u00e9 petit bain' },\n            { id: 'deepDepth', label: 'Profondeur c\u00f4t\u00e9 grand bain' }\n        ],\n        'Circle': [\n            { id: 'radius', label: 'Rayon' },\n            { id: 'shallowDepth', label: 'Profondeur c\u00f4t\u00e9 petit bain' },\n            { id: 'deepDepth', label: 'Profondeur c\u00f4t\u00e9 grand bain' }\n        ],\n        'Triangle': [\n            { id: 'baseLength', label: 'Longueur de la base' },\n            { id: 'height', label: 'Hauteur' },\n            { id: 'shallowDepth', label: 'Profondeur c\u00f4t\u00e9 petit bain' },\n            { id: 'deepDepth', label: 'Profondeur c\u00f4t\u00e9 grand bain' }\n        ],\n        'Kidney': [\n            { id: 'length', label: 'Longueur' },\n            { id: 'width', label: 'Largeur' },\n            { id: 'shallowDepth', label: 'Profondeur c\u00f4t\u00e9 petit bain' },\n            { id: 'deepDepth', label: 'Profondeur c\u00f4t\u00e9 grand bain' }\n        ],\n        'Oval': [\n            { id: 'length', label: 'Longueur (grand axe)' },\n            { id: 'width', label: 'Largeur (petit axe)' },\n            { id: 'shallowDepth', label: 'Profondeur c\u00f4t\u00e9 petit bain' },\n            { id: 'deepDepth', label: 'Profondeur c\u00f4t\u00e9 grand bain' }\n        ],\n        'Oblong': [\n            { id: 'majorDia', label: 'Grand diam\u00e8tre' },\n            { id: 'minorDia', label: 'Petit diam\u00e8tre' },\n            { id: 'length', label: 'Longueur' },\n            { id: 'shallowDepth', label: 'Profondeur c\u00f4t\u00e9 petit bain' },\n            { id: 'deepDepth', label: 'Profondeur c\u00f4t\u00e9 grand bain' }\n        ]\n    };\n\n    let calculatedCubicMeters = 0;\n\n    function renderDynamicFields(shape, unitLabel) {\n        const container = document.getElementById('psc-dynamic-fields');\n        container.innerHTML = '';\n        const inputs = fieldConfigs[shape] || [];\n\n        inputs.forEach(field => {\n            const wrapper = document.createElement('div');\n            wrapper.className = 'psc-input-wrapper';\n\n            const label = document.createElement('label');\n            label.setAttribute('for', 'field-' + field.id);\n            label.innerText = field.label + ' (' + unitLabel + ')';\n\n            const input = document.createElement('input');\n            input.type = 'number';\n            input.id = 'field-' + field.id;\n            input.className = 'psc-form-control';\n            input.min = '0';\n            input.step = 'any';\n            if (field.id.toLowerCase().includes('depth')) {\n                input.value = field.id.startsWith('shallow') ? '3' : '5';\n            } else {\n                input.value = '15';\n            }\n\n            wrapper.appendChild(label);\n            wrapper.appendChild(input);\n            container.appendChild(wrapper);\n        });\n    }\n\n    function convertToMeters(value, currentUnit) {\n        const val = parseFloat(value) || 0;\n        switch (currentUnit) {\n            case 'in': return val * 0.0254;\n            case 'yd': return val * 0.9144;\n            case 'cm': return val * 0.01;\n            case 'm':  return val;\n            case 'ft':\n            default:   return val * 0.3048;\n        }\n    }\n\n    function calculatePoolVolumeInM3() {\n        const shape = document.getElementById('psc-selected-shape').value;\n        const unit = document.getElementById('psc-selected-unit').value;\n\n        const getMetersValue = (id) => {\n            const el = document.getElementById('field-' + id);\n            return el ? convertToMeters(el.value, unit) : 0;\n        };\n\n        let surfaceAreaM2 = 0;\n        const shallowM = getMetersValue('shallowDepth');\n        const deepM = getMetersValue('deepDepth');\n        const avgDepthM = (shallowM + deepM) \/ 2;\n\n        switch (shape) {\n            case 'Rectangle': {\n                const len = getMetersValue('length');\n                const wid = getMetersValue('width');\n                surfaceAreaM2 = len * wid;\n                break;\n            }\n            case 'L-shaped': {\n                const totLen = getMetersValue('totalLength');\n                const totWid = getMetersValue('totalWidth');\n                const sLen = getMetersValue('shortSideLength');\n                const sWid = getMetersValue('shortSideWidth');\n                surfaceAreaM2 = (totLen * sWid) + ((totWid - sWid) * sLen);\n                break;\n            }\n            case 'Circle': {\n                const rad = getMetersValue('radius');\n                surfaceAreaM2 = Math.PI * Math.pow(rad, 2);\n                break;\n            }\n            case 'Triangle': {\n                const base = getMetersValue('baseLength');\n                const h = getMetersValue('height');\n                surfaceAreaM2 = 0.5 * base * h;\n                break;\n            }\n            case 'Kidney': {\n                const len = getMetersValue('length');\n                const wid = getMetersValue('width');\n                surfaceAreaM2 = len * wid * 0.45; \/\/ Industry standard mapping factor\n                break;\n            }\n            case 'Oval': {\n                const lenMajor = getMetersValue('length');\n                const widMinor = getMetersValue('width');\n                surfaceAreaM2 = Math.PI * (lenMajor \/ 2) * (widMinor \/ 2);\n                break;\n            }\n            case 'Oblong': {\n                const majDia = getMetersValue('majorDia');\n                const minDia = getMetersValue('minorDia');\n                const overallLen = getMetersValue('length');\n                const radius = minDia \/ 2;\n                const straightLength = Math.max(0, overallLen - minDia);\n                surfaceAreaM2 = (straightLength * minDia) + (Math.PI * Math.pow(radius, 2));\n                break;\n            }\n        }\n        return surfaceAreaM2 * avgDepthM;\n    }\n\n    function updateDisplayOutputs() {\n        if (calculatedCubicMeters <= 0) return;\n\n        \/\/ Volume conversion\n        const volUnit = document.getElementById('psc-volume-unit-toggle').value;\n        let volOutput = calculatedCubicMeters;\n        if (volUnit === 'gallons') volOutput = calculatedCubicMeters * 264.172;\n        else if (volUnit === 'liters') volOutput = calculatedCubicMeters * 1000;\n        document.getElementById('psc-output-volume').innerText = volOutput.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n\n        \/\/ Material weight (using dry masonry sand density factor ~1.6 metric tons per m3)\n        const structuralSandTonnes = calculatedCubicMeters * 1.6;\n        const weightUnit = document.getElementById('psc-weight-unit-toggle').value;\n        let weightOutput = structuralSandTonnes;\n\n        if (weightUnit === 'kg') weightOutput = structuralSandTonnes * 1000;\n        else if (weightUnit === 'lbs') weightOutput = structuralSandTonnes * 2204.62;\n        document.getElementById('psc-output-weight').innerText = weightOutput.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n\n        \/\/ Cost estimation mapping\n        const currency = document.getElementById('psc-currency').value;\n        const pricePerTon = parseFloat(document.getElementById('psc-price-per-ton').value) || 0;\n        const totalCost = structuralSandTonnes * pricePerTon;\n\n        const symbols = { 'USD': '$', 'AUD': '$', 'EUR': '\u20ac' };\n        document.getElementById('psc-output-currency-label').innerText = currency;\n        document.getElementById('psc-output-cost').innerText = (symbols[currency] || '') + totalCost.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 });\n    }\n\n    \/\/ Event listeners\n    document.querySelectorAll('.psc-shape-card').forEach(card => {\n        card.addEventListener('click', function() {\n            document.querySelectorAll('.psc-shape-card').forEach(c => c.classList.remove('active'));\n            this.classList.add('active');\n            const shape = this.getAttribute('data-shape');\n            document.getElementById('psc-selected-shape').value = shape;\n            renderDynamicFields(shape, document.getElementById('psc-selected-unit').value);\n        });\n    });\n\n    document.querySelectorAll('.psc-unit-btn').forEach(btn => {\n        btn.addEventListener('click', function() {\n            document.querySelectorAll('.psc-unit-btn').forEach(b => b.classList.remove('active'));\n            this.classList.add('active');\n            const unit = this.getAttribute('data-unit');\n            document.getElementById('psc-selected-unit').value = unit;\n            renderDynamicFields(document.getElementById('psc-selected-shape').value, unit);\n        });\n    });\n\n    document.querySelectorAll('.psc-reg-tab').forEach(tab => {\n        tab.addEventListener('click', function() {\n            document.querySelectorAll('.psc-reg-tab').forEach(t => t.classList.remove('active'));\n            document.querySelectorAll('.psc-reg-panel').forEach(p => p.classList.remove('active'));\n            this.classList.add('active');\n            document.getElementById('psc-reg-' + this.getAttribute('data-region')).classList.add('active');\n        });\n    });\n\n    document.getElementById('psc-calculate-btn').addEventListener('click', function() {\n        calculatedCubicMeters = calculatePoolVolumeInM3();\n        if (calculatedCubicMeters > 0) {\n            document.getElementById('psc-results-container').style.display = 'block';\n            updateDisplayOutputs();\n            document.getElementById('psc-results-container').scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n        }\n    });\n\n    document.getElementById('psc-volume-unit-toggle').addEventListener('change', updateDisplayOutputs);\n    document.getElementById('psc-weight-unit-toggle').addEventListener('change', updateDisplayOutputs);\n    document.getElementById('psc-currency').addEventListener('change', updateDisplayOutputs);\n    document.getElementById('psc-price-per-ton').addEventListener('input', updateDisplayOutputs);\n\n    \/\/ Initial setup\n    renderDynamicFields('Rectangle', 'ft');\n});\n<\/script>\n\n\n<!-- aiper-tool-links -->\n<div class=\"aiper-tool-links\">\n  <div class=\"aiper-tl-section\">\n    <div class=\"aiper-tl-heading\">Plus d&#8217;outils<\/div>\n    <div class=\"aiper-tl-tags\">\n      <a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-temps-remplissage-piscine\/\" class=\"aiper-tl-tag\">Calculateur de temps de remplissage de piscine<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-taux-renouvellement-piscine\/\" class=\"aiper-tl-tag\">Calculateur de taux de renouvellement de piscine<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/calculateur-indice-saturation-piscine\/\" class=\"aiper-tl-tag\">Calculateur d&#8217;indice de saturation pour piscine (LSI)<\/a>\n    <\/div>\n  <\/div>\n  <div class=\"aiper-tl-section\">\n    <div class=\"aiper-tl-heading\">Articles connexes<\/div>\n    <div class=\"aiper-tl-tags\">\n      <a href=\"https:\/\/aiper.com\/blogs\/fr\/reduire-alcalinite-piscine\/\" class=\"aiper-tl-tag\">Comment r\u00e9duire l&#8217;alcalinit\u00e9 d&#8217;une piscine<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/robot-piscine-bloque-drain-principal\/\" class=\"aiper-tl-tag\">Pourquoi le robot de piscine reste bloqu\u00e9 sur le drain principal ?<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/hivernage-piscine-enterree\/\" class=\"aiper-tl-tag\">Hivernage piscine enterr\u00e9e : guide \u00e9tape par \u00e9tape<\/a>\n<a href=\"https:\/\/aiper.com\/blogs\/fr\/laisser-robot-nettoyeur-piscine-dans-eau\/\" class=\"aiper-tl-tag\">Peut-on laisser un robot nettoyeur de piscine dans l&#8217;eau ?<\/a>\n    <\/div>\n  <\/div>\n<\/div>\n\n<style>\n.aiper-tool-links{margin:2.5rem 0 1.5rem;padding:1.5rem 1.75rem;background:linear-gradient(135deg,rgba(148,134,247,.04),rgba(30,202,211,.04));border-radius:12px;border:1px solid rgba(148,134,247,.10)}\n.aiper-tl-section{margin-bottom:1.25rem}\n.aiper-tl-section:last-child{margin-bottom:0}\n.aiper-tl-heading{font-size:.75rem;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:#8899aa;margin:0 0 .65rem}\n.aiper-tl-tags{display:flex;flex-wrap:wrap;gap:.5rem}\n.aiper-tl-tag{display:inline-block;padding:.4rem .95rem;font-size:.82rem;font-weight:500;line-height:1.35;color:#9486f7;background:rgba(148,134,247,.055);border:1px solid rgba(30,202,211,.25);border-radius:22px;text-decoration:none;transition:all .18s}\n.aiper-tl-tag:hover{background:#1ecad3;color:#fff;border-color:#1ecad3;box-shadow:0 2px 10px rgba(30,202,211,.22)}\n<\/style>","protected":false},"excerpt":{"rendered":"<p>Calculateur de sable pour piscine Estimez avec pr\u00e9cision le volume, le poids et le co\u00fbt total du sable n\u00e9cessaire pour l\u2019installation de votre piscine ou la couche de base. 1 Choisissez la forme de la piscine Rectangle Forme en L Cercle Triangle Haricot Ovale Oblong 2 Unit\u00e9 de mesure Pieds (ft) Pouces (in) Yards (yd) [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"aiper_reading_time":2,"aiper_last_reviewed":"","aiper_reviewer":0,"aiper_related_ids":[],"aiper_layout":"","footnotes":""},"class_list":["post-2125","page","type-page","status-publish","hentry"],"lang":"fr","translations":{"fr":2125,"de":2124,"en":1818,"es":2126},"_links":{"self":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2125","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/comments?post=2125"}],"version-history":[{"count":3,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2125\/revisions"}],"predecessor-version":[{"id":4360,"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/pages\/2125\/revisions\/4360"}],"wp:attachment":[{"href":"https:\/\/aiper.com\/blogs\/wp-json\/wp\/v2\/media?parent=2125"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}