#pcs-calculator, #pcs-calculator * { box-sizing: border-box; } #pcs-calculator { –pcs-purple: #63309a; –pcs-purple-dark: #4f247f; –pcs-purple-light: #f3ecfb; –pcs-border: #decdf0; max-width: 1240px; margin: 28px auto; padding: 28px; border: 1px solid var(–pcs-border); border-radius: 22px; background: linear-gradient(135deg, #ffffff 0%, #eee2fa 100%); box-shadow: 0 18px 45px rgba(80, 35, 125, .12); color: #29222f; font-family: Poppins, Arial, sans-serif; } #pcs-calculator h2 { margin: 0 0 8px; color: var(–pcs-purple-dark); font-size: clamp(25px, 3vw, 38px); line-height: 1.15; } .pcs-intro { margin: 0 0 24px; color: #62586a; font-size: 15px; } .pcs-layout { display: grid; grid-template-columns: minmax(300px, .72fr) minmax(460px, 1.28fr); gap: 25px; align-items: start; } .pcs-card { padding: 22px; border: 1px solid rgba(99, 48, 154, .14); border-radius: 17px; background: rgba(255,255,255,.94); box-shadow: 0 9px 24px rgba(45,25,65,.07); } .pcs-form { display: grid; gap: 15px; } .pcs-label { display: block; color: #3a3041; font-weight: 700; } .pcs-label span { display: block; margin-bottom: 7px; } .pcs-label select, .pcs-label input { width: 100%; min-height: 48px; padding: 11px 13px; border: 1px solid #d7c9e2; border-radius: 10px; background: #fff; color: #29222f; font: inherit; font-size: 15px; outline: none; } .pcs-label select:focus, .pcs-label input:focus { border-color: #7540b5; box-shadow: 0 0 0 3px rgba(117,64,181,.13); } .pcs-fixed-profile { padding: 13px 14px; border-left: 4px solid #7540b5; border-radius: 9px; background: var(–pcs-purple-light); color: var(–pcs-purple-dark); font-size: 13px; line-height: 1.45; } .pcs-fixed-profile strong { display: block; margin-bottom: 2px; } #pcs-calculate { width: 100%; padding: 15px 20px; border: 0; border-radius: 11px; background: linear-gradient(135deg,#7540b5,#552887); box-shadow: 0 9px 20px rgba(91,45,139,.24); color: #fff; font: inherit; font-size: 16px; font-weight: 800; cursor: pointer; transition: transform .2s, box-shadow .2s; } #pcs-calculate:hover { transform: translateY(-2px); box-shadow: 0 12px 25px rgba(91,45,139,.31); } .pcs-heading { margin: 0 0 6px; color: var(–pcs-purple-dark); font-size: 21px; } .pcs-help { margin: 0 0 16px; color: #716777; font-size: 13px; line-height: 1.5; } .pcs-span-grid { display: grid; grid-template-columns: repeat(4,1fr); gap: 8px; } .pcs-span-item { padding: 10px 7px; border: 1px solid #e3d7ec; border-radius: 10px; background: #faf8fc; text-align: center; } .pcs-span-item span { display: block; color: #7b6e83; font-size: 11px; } .pcs-span-item strong { display: block; margin-top: 2px; color: var(–pcs-purple); font-size: 15px; } .pcs-span-item.is-active { border-color: #7540b5; background: #f0e5fa; box-shadow: inset 0 0 0 1px #7540b5; } .pcs-note { margin-top: 15px; padding: 12px 14px; border: 1px solid #ead9b0; border-radius: 10px; background: #fffaf0; color: #665224; font-size: 12px; line-height: 1.5; } .pcs-note a { color: #5b2d8b; font-weight: 700; } .pcs-depth-warning { margin-top: -7px; padding: 10px 12px; border-left: 4px solid #c78314; border-radius: 8px; background: #fff7e7; color: #6b4b12; font-size: 12px; line-height: 1.45; } .pcs-depth-warning[hidden] { display: none; } #pcs-result { margin-top: 25px; } .pcs-success, .pcs-error { padding: 15px; border-radius: 11px; font-weight: 700; } .pcs-success { margin-bottom: 16px; background: #f1ebf8; color: var(–pcs-purple-dark); } .pcs-error { background: #fff0f0; color: #a80020; } .pcs-solutions { display: grid; grid-template-columns: repeat(2,minmax(0,1fr)); gap: 18px; } .pcs-solution { overflow: hidden; border: 1px solid #dfd2ea; border-radius: 15px; background: #fff; box-shadow: 0 8px 20px rgba(42,24,63,.07); } .pcs-solution-head { padding: 17px 18px; background: linear-gradient(135deg,#6634a0,#51247f); color: #fff; } .pcs-solution-head h3 { margin: 0 0 4px; color: #fff; font-size: 19px; } .pcs-solution-head p { margin: 0; font-size: 12px; opacity: .92; } .pcs-diagram { padding: 14px 14px 12px; border-bottom: 1px solid #e9dff0; background: linear-gradient(145deg,#fbf9fd,#f1e8f9); } .pcs-svg { display: block; width: 100%; height: auto; min-height: 230px; } .pcs-svg .pcs-part { cursor: pointer; transition: opacity .2s, filter .2s, stroke-width .2s; } .pcs-solution.has-part-selection .pcs-svg .pcs-part { opacity: .16; } .pcs-svg .pcs-part:hover, .pcs-svg .pcs-part.is-active { filter: drop-shadow(0 4px 4px rgba(91,45,139,.25)); opacity: 1; stroke: #5b2d8b !important; stroke-width: 5 !important; } .pcs-svg .pcs-part[data-pcs-part= »select »] { stroke-width: 7; } .pcs-svg .pcs-part[data-pcs-part= »select »]:hover, .pcs-svg .pcs-part[data-pcs-part= »select »].is-active { stroke-width: 9 !important; } .pcs-diagram-buttons { display: flex; flex-wrap: wrap; gap: 7px; margin-top: 8px; } .pcs-diagram-buttons button { padding: 7px 10px; border: 1px solid #d8c6e7; border-radius: 999px; background: #fff; color: #514358; font: inherit; font-size: 11px; font-weight: 700; cursor: pointer; } .pcs-diagram-buttons button:hover, .pcs-diagram-buttons button.is-active { border-color: #65319d; background: #65319d; color: #fff; } .pcs-diagram-info { min-height: 49px; margin-top: 9px; padding: 9px 11px; border: 1px solid #e0d2eb; border-radius: 9px; background: rgba(255,255,255,.9); color: #594e60; font-size: 11px; line-height: 1.45; } .pcs-diagram-info strong { display: block; color: #5b2d8b; font-size: 12px; } .pcs-metrics { display: grid; grid-template-columns: repeat(2,1fr); gap: 8px; padding: 13px; background: #faf7fd; } .pcs-metric { padding: 9px; border: 1px solid #e7dcef; border-radius: 9px; background: #fff; } .pcs-metric span { display: block; color: #786e7d; font-size: 10px; } .pcs-metric strong { display: block; margin-top: 2px; color: var(–pcs-purple); font-size: 14px; } .pcs-table-wrap { overflow-x: auto; } .pcs-table { width: 100%; min-width: 580px; border-collapse: collapse; } .pcs-table th { padding: 11px 12px; background: #eee6f6; color: #4e4059; text-align: left; font-size: 11px; } .pcs-table td { padding: 11px 12px; border-bottom: 1px solid #ece5f1; vertical-align: top; font-size: 12px; } .pcs-table tr:last-child td { border-bottom: 0; } .pcs-table a { color: #5b2d8b; font-weight: 700; text-decoration: underline; text-underline-offset: 2px; } .pcs-dimension { color: #493e50; font-weight: 700; white-space: nowrap; } .pcs-quantity { color: var(–pcs-purple); font-weight: 900; white-space: nowrap; } .pcs-small { display: block; margin-top: 3px; color: #786f7d; font-size: 10px; font-weight: 400; white-space: normal; } .pcs-warning { margin: 14px; padding: 11px 12px; border-left: 4px solid #d19b23; border-radius: 8px; background: #fff9ec; color: #654e1e; font-size: 11px; line-height: 1.5; } @media (max-width: 900px) { #pcs-calculator { padding: 18px; } .pcs-layout, .pcs-solutions { grid-template-columns: 1fr; } } @media (max-width: 520px) { #pcs-calculator { padding: 14px; border-radius: 16px; } .pcs-card { padding: 16px; } .pcs-span-grid { grid-template-columns: repeat(2,1fr); } }

Calculateur de toiture en polycarbonate compact

Comparez instantanément une installation sur chevrons et une installation sur pannes, puis obtenez les plaques, profils SELECT et accessoires nécessaires.

Profil de jonction recommandé Profil universel SELECT 45 mm en aluminium brut, livré avec ses joints et compatible avec toutes les épaisseurs proposées. Pour calculer la largeur des plaques, chaque jonction retire 18 mm : languette centrale de 8 mm + jeu de 5 mm de chaque côté. Deux profils F aluminium 10 mm sont ajoutés aux extrémités latérales pour les plaques de 2 à 10 mm, avec joints EPDM pour les épaisseurs de 2 à 8 mm.

Espacements maximaux indicatifs

Repères issus du guide technique PALSUN pour la plus petite dimension supportée. La valeur sélectionnée est utilisée pour les chevrons comme pour les pannes.

2 mm500 mm*
3 mm700 mm
4 mm900 mm
5 mm1 100 mm
6 mm1 300 mm
8 mm1 500 mm
10 mm1 700 mm
12 mm1 900 mm
Important : ces valeurs sont des repères de pré-dimensionnement et ne remplacent pas une étude tenant compte de la pente, du vent, de la neige et des règles locales. *Le 2 mm n’apparaît pas dans le tableau PALSUN pour cette application : 500 mm est une valeur prudente à faire valider. Source fabricant PALSUN.
(function () { « use strict »; var root = document.getElementById(« pcs-calculator »); if (!root) return; var thicknessField = document.getElementById(« pcs-thickness »); var wallField = document.getElementById(« pcs-wall »); var depthField = document.getElementById(« pcs-depth »); var depthWarning = document.getElementById(« pcs-depth-warning »); var button = document.getElementById(« pcs-calculate »); var result = document.getElementById(« pcs-result »); var maxSpan = { 2: 500, 3: 700, 4: 900, 5: 1100, 6: 1300, 8: 1500, 10: 1700, 12: 1900 }; var maxSheetLength = { 2: 3050, 3: 3050, 4: 4200, 5: 3050, 6: 4200, 8: 3050, 10: 3050, 12: 3050 }; var profileLengths = [2000, 3000, 3500, 4000, 5000, 6000, 7000]; var maxSheetWidth = 2050; var fixingSpacing = 400; var selectTongueWidth = 8; var selectClearanceEachSide = 5; var selectDeductionPerJoin = selectTongueWidth + (2 * selectClearanceEachSide); function fmt(value) { return new Intl.NumberFormat(« fr-FR », { maximumFractionDigits: 0 }).format(value); } function profileLengthFor(depth) { for (var i = 0; i = depth) return profileLengths[i]; } return null; } function highlightSpan() { var selected = thicknessField.value; root.querySelectorAll(« .pcs-span-item »).forEach(function (item) { item.classList.toggle(« is-active », item.dataset.thickness === selected); }); } function updateDepthWarning() { var thickness = Number(thicknessField.value); var depth = Number(depthField.value); var availableLength = maxSheetLength[thickness]; var isTooDeep = depth > availableLength; depthWarning.hidden = !isTooDeep; depthWarning.innerHTML = isTooDeep ? « Profondeur supérieure au format disponible. En  » + thickness +  » mm, la plaque compacte mesure au maximum  » + fmt(availableLength) +  » ×  » + fmt(maxSheetWidth) +  » mm. Le calculateur ne prévoit pas de raccord transversal entre deux plaques. » : «  »; } function productRow(product, dimension, quantity, detail) { return «  » + «  » + product + (detail ? ‘‘ + detail + «  » : «  ») + «  » + ‘‘ + dimension + «  » + ‘‘ + quantity + «  » + « « ; } function diagramSvg(type, data) { var isRafter = type === « rafter »; var visiblePanels = Math.min(data.panelCount, 10); var visibleSupports = Math.min(data.supportCount, 10); var svg =  »; svg +=  » +  » +  » + «  »; svg +=  » + ‘Mur’ +  »; if (isRafter) { for (var r = 0; r < visibleSupports; r++) { var rt = 130 + (300 / Math.max(1, visibleSupports – 1)) * r; var rb = 48 + (464 / Math.max(1, visibleSupports – 1)) * r; svg += '’; } } else { for (var p = 0; p < visibleSupports; p++) { var ratio = p / Math.max(1, visibleSupports – 1); var py = 88 + 154 * ratio; var left = 130 – 82 * ratio; var right = 430 + 82 * ratio; svg += '’; } } for (var i = 0; i < visiblePanels; i++) { var topStart = 130 + (300 / visiblePanels) * i; var topEnd = 130 + (300 / visiblePanels) * (i + 1); var bottomStart = 48 + (464 / visiblePanels) * i; var bottomEnd = 48 + (464 / visiblePanels) * (i + 1); svg += '’; } /* Les profils SELECT sont dessinés après les plaques pour rester clairement visibles, exactement sur chaque jonction commune entre deux plaques. */ for (var j = 1; j < visiblePanels; j++) { var joinTop = 130 + (300 / visiblePanels) * j; var joinBottom = 48 + (464 / visiblePanels) * j; svg += '’; } if (data.hasEdgeProfiles) { svg +=  » +  »; } svg +=  » +  » +  » +  » + fmt(data.wall) + ‘ mm au mur’ +  » + fmt(data.depth) + ‘ mm’ + «  »; return svg; } function diagramBlock(type, data) { var supportLabel = type === « rafter » ? « Chevrons » : « Pannes »; return ‘
‘ + diagramSvg(type, data) + ‘
‘ + ‘‘ + ‘ » + ‘‘ + (data.hasEdgeProfiles ? ‘‘ : «  ») + ‘‘ + « 
 » + ‘
Schéma interactifCliquez sur un élément pour afficher son rôle.
‘ + « 
« ; } function solutionCard(type, data) { var isRafter = type === « rafter »; var title = isRafter ? « Solution 1 — Pose sur chevrons » : « Solution 2 — Pose sur pannes »; var subtitle = isRafter ? « Les profils SELECT suivent la pente et reposent sur les chevrons. » : « Les pannes traversent la largeur de la toiture et soutiennent les plaques. »; var structureName = isRafter ? « Chevrons porteurs » : « Pannes porteuses »; var structureDimension = isRafter ? fmt(data.depth) +  » mm » : fmt(data.wall) +  » mm »; var structureQuantity = isRafter ? data.supportCount +  » chevron(s) » : data.supportCount +  » panne(s) »; var rows = «  »; rows += productRow(« Plaques polycarbonate compact  » + data.thickness +  » mm », fmt(data.panelWidth) +  » ×  » + fmt(data.depth) +  » mm », data.panelCount +  » plaque(s) », « Format brut maximal :  » + fmt(data.maxSheetLength) +  » ×  » + fmt(data.maxSheetWidth) +  » mm, orientation libre. Largeur calculée après déduction de  » + data.selectDeduction +  » mm par profil SELECT (languette 8 mm + jeux latéraux 5 + 5 mm). »); rows += productRow(structureName, structureDimension, structureQuantity, « Entraxe maximal indicatif :  » + fmt(data.span) +  » mm. »); rows += productRow(« Profil universel SELECT 45 mm – aluminium brut », fmt(data.profileLength) +  » mm par profil », data.joinerCount +  » profil(s) », « Uniquement entre deux plaques : nombre de plaques − 1. Pose dans le sens de la pente. Chaque jonction retire  » + data.selectDeduction +  » mm à la largeur disponible pour les plaques. »); if (data.hasEdgeProfiles) { rows += productRow(« Profils F aluminium 10 mm – finitions latérales », « 2 ×  » + fmt(data.profileLength) +  » mm », « 2 profils F », « Un profil à chaque extrémité de la toiture, toujours dans le sens de la pente. La longueur commerciale choisie couvre au minimum la profondeur de la toiture. »); } if (data.hasEdgeSeals) { rows += productRow(‘Joint EPDM pour profils F‘, « 2 ×  » + fmt(data.depth) +  » mm », data.edgeSealMetres +  » m », « Joint à installer dans les deux profils F. Vendu au mètre. »); } rows += productRow(« Profil mural aluminium », « 4 000 mm par profil », data.wallProfileCount +  » profil(s) », « Raccord entre la toiture et le mur. »); rows += productRow(« Fixations inox avec rondelle EPDM », « Espacement estimatif 400 mm », data.fixingCount +  » fixation(s) », « Pré-perçage obligatoire avec jeu de dilatation. »); rows += productRow(« Mousse d’étanchéité et de calage », « Rouleau de 10 m », data.foamRolls +  » rouleau(x) », « Environ  » + data.foamMetres.toFixed(1) +  » m nécessaires. »); return ‘
‘ + ‘

‘ + title + « 

 » + subtitle + « 

 » + diagramBlock(type, data) + ‘
‘ + ‘
Largeur par plaque‘ + fmt(data.panelWidth) +  » mm
 » + ‘
Entraxe maximal‘ + fmt(data.span) +  » mm
 » + ‘
Longueur SELECT‘ + fmt(data.profileLength) +  » mm
 » + ‘
Nombre de plaques‘ + data.panelCount + « 
 » + « 
 » + ‘
‘ + «  » + «  » + rows + «  » + « 
Produit recommandéLongueur / dimensionsQuantité
 » + (data.thickness === 2 ? ‘
Attention au 2 mm : cette épaisseur est très flexible. Une validation technique est indispensable avant toute utilisation en toiture.
‘ : «  ») + « 
« ; } function calculate() { var thickness = Number(thicknessField.value); var wall = Number(wallField.value); var depth = Number(depthField.value); if (!wall || !depth || wall < 300 || depth < 300) { result.innerHTML = '
Merci de saisir des dimensions valides d’au moins 300 mm.
‘; return; } var availableSheetLength = maxSheetLength[thickness]; if (depth > availableSheetLength) { result.innerHTML = ‘
Profondeur trop importante pour une plaque en une seule pièce.
En polycarbonate compact ‘ + thickness +  » mm, le format maximal disponible est de  » + fmt(availableSheetLength) +  » ×  » + fmt(maxSheetWidth) +  » mm. La profondeur de la toiture ne peut donc pas dépasser  » + fmt(availableSheetLength) +  » mm avec ce système, même si la plaque peut être orientée librement. Un projet avec raccord transversal nécessite une étude spécifique.
« ; return; } if (depth > 7000) { result.innerHTML = ‘
La profondeur maximale est de 7 000 mm, correspondant à la longueur maximale du profil SELECT.
‘; return; } var span = maxSpan[thickness]; var selectedProfileLength = profileLengthFor(depth); var wallProfileCount = Math.max(1, Math.ceil(wall / 4000)); var rafterPanelCount = Math.max(1, Math.ceil(wall / span)); var rafterSupportCount = rafterPanelCount + 1; var rafterJoinerCount = Math.max(0, rafterPanelCount – 1); var rafterPanelWidth = Math.ceil((wall – (rafterJoinerCount * selectDeductionPerJoin)) / rafterPanelCount); var rafterFixingCount = rafterSupportCount * (Math.ceil(depth / fixingSpacing) + 1); var rafterFoamLength = rafterSupportCount * depth + wall; var purlinMaxPanelWidth = depth = 2 && thickness = 2 && thickness <= 8, edgeSealMetres: Math.ceil((2 * depth) / 1000) }; var rafterData = Object.assign({}, common, { panelCount: rafterPanelCount, panelWidth: rafterPanelWidth, supportCount: rafterSupportCount, joinerCount: rafterJoinerCount, fixingCount: rafterFixingCount, foamMetres: rafterFoamLength / 1000, foamRolls: Math.max(1, Math.ceil(rafterFoamLength / 10000)) }); var purlinData = Object.assign({}, common, { panelCount: purlinPanelCount, panelWidth: purlinPanelWidth, supportCount: purlinSupportCount, joinerCount: purlinJoinerCount, fixingCount: purlinFixingCount, foamMetres: purlinFoamLength / 1000, foamRolls: Math.max(1, Math.ceil(purlinFoamLength / 10000)) }); result.innerHTML = '
Calcul effectué.
Toiture de ‘ + fmt(wall) +  » ×  » + fmt(depth) +  » mm en polycarbonate compact  » + thickness +  » mm — format maximal disponible :  » + fmt(availableSheetLength) +  » ×  » + fmt(maxSheetWidth) +  » mm, orientation libre — entraxe maximal indicatif :  » + fmt(span) +  » mm.
 » + ‘
‘ + solutionCard(« rafter », rafterData) + solutionCard(« purlin », purlinData) + « 
« ; } thicknessField.addEventListener(« change », function () { highlightSpan(); updateDepthWarning(); }); depthField.addEventListener(« input », updateDepthWarning); button.addEventListener(« click », calculate); result.addEventListener(« click », function (event) { var trigger = event.target.closest(« [data-pcs-part], [data-pcs-target] »); if (!trigger) return; var solution = trigger.closest(« .pcs-solution »); if (!solution) return; var part = trigger.dataset.pcsPart || trigger.dataset.pcsTarget; var isRafter = solution.querySelector(« .pcs-solution-head h3 »).textContent.indexOf(« chevrons ») !== -1; var supportName = isRafter ? « Chevrons porteurs » : « Pannes porteuses »; solution.classList.add(« has-part-selection »); var descriptions = { panels: [« Plaques compactes », « Les plaques transparentes couvrent la toiture et reposent sur la structure porteuse. »], supports: [supportName, isRafter ? « Les chevrons suivent la pente et limitent la portée latérale des plaques. » : « Les pannes sont perpendiculaires à la pente et réduisent la portée des plaques dans le sens de la profondeur. »], select: [« Profils SELECT », « Les profils universels SELECT assemblent uniquement deux plaques entre elles. Leur nombre correspond toujours au nombre de plaques moins un et ils suivent la pente. La languette de 8 mm et les jeux de 5 mm de chaque côté représentent une déduction totale de 18 mm par jonction. »], edges: [« Profils F de bord », « Deux profils F aluminium 10 mm ferment les extrémités latérales pour les plaques de 2 à 10 mm. Ils suivent toujours la longueur de la pente. Des joints EPDM sont ajoutés pour les épaisseurs de 2 à 8 mm. »], wall: [« Profil mural », « Le profil mural assure la finition et l’étanchéité du raccord contre le mur. »] }; solution.querySelectorAll(« [data-pcs-part], [data-pcs-target] »).forEach(function (element) { var elementPart = element.dataset.pcsPart || element.dataset.pcsTarget; element.classList.toggle(« is-active », elementPart === part); }); if (descriptions[part]) { solution.querySelector(« .pcs-diagram-info »).innerHTML = «  » + descriptions[part][0] + «  » + descriptions[part][1]; } }); [wallField, depthField].forEach(function (field) { field.addEventListener(« keydown », function (event) { if (event.key === « Enter ») { event.preventDefault(); calculate(); } }); }); highlightSpan(); updateDepthWarning(); calculate(); })();