EN 1995-1-2:2025
Eurocode 5 - Design of timber structures - Part 1-2: Structural fire design
| Fecha edición: |
2025-09-17
En Vigor
|
|---|---|
| Idiomas disponibles: | Francés, Inglés |
| Resumen: | 1.1 Scope of EN 1995-1-2
(1) This document deals with the design of timber structures for the accidental situation of fire exposure and it is intended to be used in conjunction with EN 1995-1-1 and EN 1991-1-2.
This document only identifies differences from, or supplements to, normal temperature design.
(2) This document applies to timber structures required to fulfil a loadbearing function, separating function or both.
(3) This document gives principles and application rules for the design of structures for specified requirements in respect of the aforementioned functions and the levels of performance.
(4) This document applies to structures, or parts of structures, that are within the scope of EN 1995-1-1 and are designed accordingly.
(5) The methods given in this document are applicable to all products covered by European technical product specifications made reference to in this document.
1.2 Assumptions
(1) In addition to the general assumptions of EN 1990, the following assumptions apply:
- the choice of the relevant design fire scenario is made by appropriate qualified and experienced personnel, or is given by the relevant national regulation;
- any fire protection measure taken into account in the design will be adequately maintained. 1.1 Anwendungsbereich von EN 1995 1 2 (1) Dieses Dokument regelt Bemessung und Konstruktion von Holzbauwerken für die außergewöhnliche Situation einer Brandbeanspruchung und ist in Verbindung mit EN 1995 1 1 und EN 1991 1 2 anwendbar. Dieses Dokument bestimmt nur Unterschiede von oder Ergänzungen zur Bemessung unter Normaltemperatur. (2) Dieses Dokument ist anwendbar für Holzbaukonstruktionen, die eine tragende Funktion, raumabschließende Funktion oder beides erfüllen. (3) Dieses Dokument enthält Grundsätze und Anwendungsregeln für die Bemessung von Tragwerken mit festgelegten Anforderungen hinsichtlich der vorgenannten Funktionen und Anforderungsklassen. (4) Dieses Dokument ist anwendbar für Tragwerke oder Teile von Tragwerken, die in den Anwendungsbereich von EN 1995 1 1 fallen und entsprechend bemessen werden. (5) Die in diesem Dokument enthaltenen Verfahren sind auf alle Produkte anwendbar, auf deren Europäische Technische Produktspezifikationen in diesem Dokument verwiesen wird. 1.2 Voraussetzungen (1) Die folgenden Voraussetzungen sind zusätzlich zu den allgemeinen Voraussetzungen nach EN 1990 anwendbar: die Wahl des maßgebenden Bemessungsbrandszenarios wird durch entsprechend qualifiziertes und erfahrenes Personal getroffen oder durch die maßgebende nationale Vorschrift vorgegeben; jede bei der Bemessung berücksichtigte Brandschutzmaßnahme wird ausreichend gewartet. 1.1 Domaine d'application de l'EN 1995-1-2 (1) Le présent document traite du calcul des structures en bois pour une situation accidentelle d'exposition au feu et doit être utilisé conjointement avec l'EN 1995-1-1 et l’EN 1991-1-2. Le présent document identifie uniquement les différences avec le calcul à température normale, ou lui apporte des compléments. (2) Le présent document s'applique aux structures en bois devant remplir une fonction porteuse, une fonction séparative ou les deux. (3) Le présent document donne les principes et les règles d'application relatifs au calcul des structures par rapport aux exigences spécifiées eu égard aux fonctions mentionnées ci-dessus et aux niveaux de performances. (4) Le présent document s'applique aux structures, ou aux parties de structures, relevant du domaine d'application de l'EN 1995-1-1 et conçues en conséquence. (5) Les méthodes données dans le présent document sont applicables pour tous les produits couverts par les spécifications techniques produits européennes qui sont référencées dans le présent document. 1.2 Hypothèses (1) Outre les hypothèses de travail générales définies dans l'EN 1990, les hypothèses suivantes s'appliquent : - le choix du scénario de feu de calcul pertinent est fait par un concepteur possédant une qualification et une expérience appropriées, ou est indiqué par la réglementation nationale concernée ; - les mesures de protection contre l'incendie prises en compte dans le calcul font l'objet d'un entretien approprié. |
| ICS: | 91.010.30 - Aspectos técnicos, 13.220.50 - Resistencia al fuego de los materiales y elementos de construcción, 91.080.20 - Estructuras de madera |
| CTN: | CEN/TC 250 - 6231 |
|
Modificaciones Normas |
Es modificada por EN 1995-1-2:2025/prA1 |
Se ha producido un error al procesar la plantilla.
The following has evaluated to null or missing:
==> getListTypeEntriesByERC(ercOfListTypeEntryLanguages) [in template "34352066712900#33336#null" at line 25, column 28]
----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----
----
FTL stack trace ("~" means nesting-related):
- Failed at: #assign languageEntries = getListType... [in template "34352066712900#33336#null" at line 25, column 1]
----
1<#-- Variables -->
2<#assign isDebug = false>
3<#assign channelResponse = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels?filter=name eq 'Aenor Tienda'")>
4<#assign channel = channelResponse.items[0]>
5<#assign channelId = channel.id>
6<#assign product = getProduct(channelId, CPDefinition_cProductId.getData()) />
7<#assign siteGroup = themeDisplay.getSiteGroup() />
8<#assign currentLocale = themeDisplay.getLocale()>
9<#assign currentLanguage = currentLocale?substring(0,2)>
10
11<#-- Product data -->
12<#assign displayDateProduct = CPDefinition_displayDate.getData() />
13<#assign productId = product.productId />
14<#assign cpDefinitionId = product.id />
15
16<#assign categoriesProduct = getProductCategories(channelId, productId) />
17<#assign hasProductCategoriaTipoEntidadLibro = isVocabularyNameIntoCategories(categoriesProduct, 'entity type', 'libro') />
18<#assign hasProductCategoriaTipoEntidadNorma = isVocabularyNameIntoCategories(categoriesProduct, 'entity type', 'norma') />
19<#assign hasProductCategoriaTipoEntidadColeccionTematica = isVocabularyNameIntoCategories(categoriesProduct, 'entity type', 'coleccion tematica') />
20<#assign categoryProductInfoTematica = getCategoriesByVocabularyAsString(categoriesProduct, "temáticas", " / ", "title") />
21<#assign categoryProductInfoStatus = getCategoriesByVocabularyAsString(categoriesProduct, "status", " / ", "title") />
22
23<#-- PickList de languages -->
24<#assign ercOfListTypeEntryLanguages = 'IDIOMAS_NORMAS_PICKLIST' />
25<#assign languageEntries = getListTypeEntriesByERC(ercOfListTypeEntryLanguages) />
26
27<#-- Specifications/Specifications language -->
28<#assign specificationsLanguagesProduct = getSpecificationsProduct(channelId, productId, 'specificationKey', 'standard-languages') />
29<#assign filteredSpecificationsLanguagesProductTemp = filterOutItems(specificationsLanguagesProduct, 'value', ['BI', 'TR']) />
30<#assign filteredSpecificationsLanguagesProduct = addAllMatchingLanguagesByField(filteredSpecificationsLanguagesProductTemp, languageEntries, 'value', 'title') />
31
32<#-- Thematic collection/Coleccion tematica data -->
33<#assign thematicCollectionsProduct = getThematicCollectionProduct(cpDefinitionId) />
34
35
36<#-- Functions -->
37<#function getProduct channelId productId>
38 <#return restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/${channelId}/products/${productId}")>
39</#function>
40
41
42<#function getProductByERC erc>
43 <#-- TODO: estamos usando el endpoint del product admin, hay que usar la del Product de Liferay NO admin: headless-commerce-delivery-catalog -->
44 <#-- <#return restClient.get("/headless-commerce-admin-catalog/v1.0/products/by-externalReferenceCode/${erc}")> -->
45 <#assign response = restClient.get("/headless-commerce-admin-catalog/v1.0/products/by-externalReferenceCode/${erc}")>
46 <#-- Si el producto no existe o tiene status NOT_FOUND, devolvemos string vacío -->
47 <#if response?? && response.status?? && response.status == "NOT_FOUND">
48 <#return {}>
49 <#elseif !response??>
50 <#return {}>
51 <#else>
52 <#return response>
53 </#if>
54</#function>
55
56
57<#function getURLsOfProduct product baseURL="" siteFriendlyURL="" languageFieldName="language" urlFieldName="url">
58 <#-- Inicializamos un array vacío -->
59 <#assign urlsArray = []>
60
61 <#-- Validamos que product y product.urls existan -->
62 <#if product?? && product.urls??>
63 <#-- Iteramos sobre los idiomas -->
64 <#list product.urls?keys as lang>
65 <#assign urlValue = product.urls[lang] />
66 <#if urlValue?? && urlValue?has_content>
67 <#-- Aseguramos que la URL empiece con "/p/" -->
68 <#assign cleanUrl = urlValue?starts_with("/")?then(urlValue, "/p/" + urlValue) />
69
70 <#-- Generamos la URL completa -->
71 <#-- Si baseURL tiene contenido, construimos URL completa -->
72 <#if baseURL?? && baseURL?has_content>
73
74 <#-- Aseguramos que el slug empiece con /p/ -->
75 <#assign cleanUrl = urlValue?starts_with("/")?then(urlValue, "/p/" + urlValue) />
76
77 <#-- Tomamos las dos primeras letras del idioma para el prefijo -->
78 <#assign langPrefix = lang?substring(0,2)>
79
80 <#-- Construimos la URL completa -->
81 <#if siteFriendlyURL?? && siteFriendlyURL?has_content>
82 <#assign fullUrl = baseURL + "/" + langPrefix + siteFriendlyURL + cleanUrl>
83 <#else>
84 <#assign fullUrl = baseURL + "/" + langPrefix + cleanUrl>
85 </#if>
86
87 <#else>
88 <#assign fullUrl = cleanUrl>
89 </#if>
90
91 <#-- Creamos el objeto language+url -->
92 <#assign newItem = {(languageFieldName): lang, (urlFieldName): fullUrl} />
93
94 <#-- Lo agregamos al array -->
95 <#assign urlsArray = urlsArray + [newItem] />
96 </#if>
97 </#list>
98 </#if>
99
100 <#return urlsArray>
101</#function>
102
103
104<#function getProductCategories channelId productId>
105 <#return restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/${channelId}/products/${productId}/categories?sort=vocabulary").items>
106</#function>
107
108
109<#function getSpecificationsProduct channelId productId field="" value="">
110 <#assign response = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/${channelId}/products/${productId}/product-specifications?pageSize=100&sort")>
111 <#assign items = response.items>
112
113 <#-- Si se pasa campo y valor, filtrar -->
114 <#if field?has_content && value?has_content>
115 <#assign items = items?filter(item ->
116 (item[field]??) && (item[field]?string?lower_case == value?lower_case)
117 )>
118 </#if>
119
120 <#return items>
121</#function>
122
123
124<#function filterOutItems items field valuesToExclude>
125 <#-- Si el array o los valores no existen, devolver items sin cambios -->
126 <#if !items?? || !valuesToExclude??>
127 <#return items>
128 </#if>
129
130 <#-- Filtramos: solo mantener los items cuyo campo no esté en la lista -->
131 <#assign filteredItems = items?filter(item ->
132 !(item[field]?? && (valuesToExclude?seq_contains(item[field]?string)))
133 )>
134
135 <#return filteredItems>
136</#function>
137
138
139<#function addAllMatchingLanguagesByField specificationsLanguagesProduct languageEntries specValueField newSpecField>
140
141 <#if specificationsLanguagesProduct?? && languageEntries?? && specValueField?? && newSpecField??>
142
143 <#-- Creamos una copia para no modificar el original directamente -->
144 <#local updatedSpecs = []>
145
146 <#list specificationsLanguagesProduct as spec>
147 <#-- Valor por el que buscamos coincidencia (puede venir vacío) -->
148 <#local keyValue = (spec[specValueField]!"")?string>
149
150 <#-- Buscar coincidencia sin lanzar error si no existe (idioma nuevo no contemplado) -->
151 <#local match = {}>
152 <#list languageEntries as entry>
153 <#if (entry.key!"")?string == keyValue>
154 <#local match = entry>
155 <#break>
156 </#if>
157 </#list>
158
159 <#-- Crear una copia del objeto actual -->
160 <#local newSpec = spec>
161
162 <#-- Si hay match con nombre válido usamos su nombre; si no, usamos el código del idioma como fallback -->
163 <#if match?has_content && match.name?? && match.name?has_content>
164 <#local newSpec = newSpec + { (newSpecField): match.name }>
165 <#elseif keyValue?has_content>
166 <#local newSpec = newSpec + { (newSpecField): keyValue }>
167 </#if>
168
169 <#-- Añadir al array final -->
170 <#local updatedSpecs = updatedSpecs + [newSpec]>
171 </#list>
172
173 <#return updatedSpecs>
174 <#else>
175 <#return specificationsLanguagesProduct>
176 </#if>
177 </#function>
178
179
180<#function getListTypeEntriesByERC erc fields="key,name,externalReferenceCode,name_i18n" sort="key" pageSize="1000">
181 <#attempt>
182 <#return restClient.get(
183 "/headless-admin-list-type/v1.0/list-type-definitions/by-external-reference-code/${erc}/list-type-entries?fields=${fields}&sort=${sort}&pageSize=${pageSize}"
184 ).items>
185 <#recover>
186 <#return []>
187 </#attempt>
188</#function>
189
190
191<#function getThematicCollectionProduct cpDefinitionId>
192 <#assign response = restClient.get("/c/thematiccollections/?filter=r_thematicCollection_CPDefinitionId eq '${cpDefinitionId}'")!{} />
193 <#assign items = response.items![] />
194 <#return (items?size > 0)?then(items[0], {}) />
195</#function>
196
197
198<#function sortByField items fieldPath sortFieldName="sortKey" order="asc">
199
200 <#-- Array temporal con el campo auxiliar -->
201 <#assign prepared = []>
202
203 <#list items as e>
204 <#-- Evaluar el valor del campo dinámico -->
205 <#assign sortValue = "" />
206 <#if fieldPath == "section?first.key">
207 <#assign sortValue = (e.section?first.key)!""?lower_case>
208 <#elseif fieldPath == "section?first.name">
209 <#assign sortValue = (e.section?first.name)!""?lower_case>
210 <#elseif fieldPath == "type?first.key">
211 <#assign sortValue = (e.type?first.key)!""?lower_case>
212 <#else>
213 <#-- Si el campoPath no está mapeado, usar vacío -->
214 <#assign sortValue = "" />
215 </#if>
216
217 <#-- Agregar objeto enriquecido con campo auxiliar -->
218 <#assign prepared = prepared + [ e + { (sortFieldName): sortValue } ]>
219 </#list>
220
221 <#-- Ordenar -->
222 <#assign sorted = prepared?sort_by(sortFieldName)>
223
224 <#-- Si order = desc, invertir -->
225 <#if order?lower_case == "desc">
226 <#assign sorted = sorted?reverse>
227 </#if>
228
229 <#return sorted>
230</#function>
231
232
233<#function addKeysFieldNested items arrayField nestedField newFieldName mode="first" subArrayField="">
234
235 <#assign enrichedItems = []>
236
237 <#list items as e>
238 <#assign resultValue = "">
239
240 <#-- Detectamos el array del objeto principal -->
241 <#assign targetArray = e[arrayField]![]>
242
243 <#if targetArray?has_content>
244 <#if mode == "all">
245 <#assign keysList = []>
246 <#list targetArray as t>
247 <#if subArrayField?has_content>
248 <#assign subArray = t[subArrayField]![]>
249 <#if subArray?has_content>
250 <#list subArray as sub>
251 <#assign keysList = keysList + [ sub[nestedField]!"" ]>
252 </#list>
253 </#if>
254 <#else>
255 <#assign keysList = keysList + [ t[nestedField]!"" ]>
256 </#if>
257 </#list>
258 <#assign resultValue = keysList?join(", ")>
259 <#elseif mode == "first">
260 <#assign firstItem = targetArray?first>
261 <#if subArrayField?has_content>
262 <#assign subArray = firstItem[subArrayField]![]>
263 <#if subArray?has_content>
264 <#assign resultValue = subArray?first[nestedField]!"" >
265 <#else>
266 <#assign resultValue = "" >
267 </#if>
268 <#else>
269 <#assign resultValue = firstItem[nestedField]!"" >
270 </#if>
271 </#if>
272 <#else>
273 <#assign resultValue = "">
274 </#if>
275
276 <#-- Añadimos el nuevo campo al objeto -->
277 <#assign enrichedItems = enrichedItems + [
278 e + { (newFieldName): resultValue }
279 ]>
280 </#list>
281
282 <#return enrichedItems>
283</#function>
284
285
286<#function isVocabularyNameIntoCategories categories vocabulary name>
287 <#assign found = false />
288
289 <#if categories?has_content && vocabulary?has_content && name?has_content>
290
291 <#assign vocabNorm = normalize(vocabulary) />
292 <#assign nameNorm = normalize(name) />
293
294 <#list categories as category>
295 <#if !found>
296 <#assign catVocabNorm = normalize(category.vocabulary) />
297 <#assign catNameNorm = normalize(category.name) />
298
299 <#if catVocabNorm == vocabNorm && catNameNorm == nameNorm>
300 <#assign found = true />
301 </#if>
302 </#if>
303 </#list>
304
305 </#if>
306
307 <#return found>
308</#function>
309
310
311<#function normalize text onlyAccents = false>
312 <#-- proteger null -->
313 <#if !text?has_content>
314 <#return "">
315 </#if>
316
317 <#assign t = text />
318
319 <#-- quitar acentos -->
320 <#assign t = t
321 ?replace("á","a")?replace("é","e")?replace("í","i")
322 ?replace("ó","o")?replace("ú","u")?replace("ü","u")
323 ?replace("ñ","n")
324 ?replace("Á","A")?replace("É","E")?replace("Í","I")
325 ?replace("Ó","O")?replace("Ú","U")?replace("Ü","U")
326 ?replace("Ñ","N")
327 />
328
329 <#-- si NO es solo acentos, normalización completa -->
330 <#if !onlyAccents>
331 <#assign t = t?lower_case />
332 <#assign t = t?trim />
333 <#assign t = t?replace("\\s+", " ", "r") />
334 </#if>
335
336 <#return t>
337</#function>
338
339
340<#-- Función que retorna los valores de categorías como string, normalizando vocabulario -->
341<#function getCategoriesByVocabularyAsString categories vocabulary separator=" / " field="name">
342 <#assign matchedValues = []>
343 <#if categories?has_content && vocabulary?has_content>
344 <#list categories as category>
345 <#-- Normalizamos tanto el vocabulary de la categoría como el buscado -->
346 <#if normalize(category.vocabulary, true)?lower_case == normalize(vocabulary, true)?lower_case>
347 <#if field == "title">
348 <#assign matchedValues += [category.title]>
349 <#else>
350 <#assign matchedValues += [category.name]>
351 </#if>
352 </#if>
353 </#list>
354 </#if>
355 <#return matchedValues?join(separator)>
356</#function>
357
358
359<#macro printObject obj>
360 <#-- Permite hacer un output de un array de objetos o un objeto que se pasa como parámetro -->
361 <#if obj?is_hash>
362 {
363 <#list obj?keys as k>
364 "${k}":
365 <#assign value = obj[k]>
366 <#if value?is_hash || value?is_sequence>
367 <@printObject obj=value/>
368 <#elseif value?is_boolean>
369 ${value?c}
370 <#elseif value?is_number>
371 ${value}
372 <#elseif value?has_content>
373 "${value?string}"
374 <#else>
375 null
376 </#if>
377 <#if k_has_next>, </#if>
378 </#list>
379 }
380 <#elseif obj?is_sequence>
381 [
382 <#list obj as item>
383 <@printObject obj=item/>
384 <#if item_has_next>, </#if>
385 </#list>
386 ]
387 <#elseif obj?is_boolean>
388 ${obj?c}
389 <#elseif obj?is_number>
390 ${obj}
391 <#elseif obj?has_content>
392 "${obj?string}"
393 <#else>
394 null
395 </#if>
396</#macro>
397
398
399
400
401<#-- HTML -->
402<#if hasProductCategoriaTipoEntidadColeccionTematica>
403 <div id="ecom-coleccion_tematica-detail" class="ecom-coleccion_tematica">
404
405 <div class="tabs-section">
406 <div class="tab-content">
407
408 <#-- Fecha edicion del producto > description del Producto -->
409 <div class="ecom-coleccion_tematica-detail-body">
410 ${product.description}
411 </div>
412
413 <#-- Para imprimir el contenido de los Objects -->
414 <#-- Thematic collection/Coleccion tematica data
415 <#if isDebug>
416 <div class="">
417 <p><strong>thematicCollectionsProduct:</strong></p>
418 <div class="print-object-json-content mb-3" style="max-height:200px; overflow:auto; border:1px solid #ccc; padding:5px; cursor:pointer;"
419 onclick="const r=document.createRange(); r.selectNodeContents(this); const s=window.getSelection(); s.removeAllRanges(); s.addRange(r);">
420 <@printObject thematicCollectionsProduct />
421 </div>
422 </div>
423 </#if>
424 -->
425
426 </div>
427 </div>
428 </div>
429</#if>










