@open3cl/engine
Version:
Open Source 3CL-DPE engine
320 lines (286 loc) • 10.8 kB
JavaScript
import { inject } from 'dioma';
import { DeperditionMurService } from './mur/deperdition-mur.service.js';
import { DeperditionPorteService } from './porte/deperdition-porte.service.js';
import { DeperditionPlancherBasService } from './plancher_bas/deperdition-plancher-bas.service.js';
import { DeperditionPlancherHautService } from './plancher_haut/deperdition-plancher-haut.service.js';
import { DeperditionVentilationService } from './ventilation/deperdition-ventilation.service.js';
import { DeperditionBaieVitreeService } from './baie_vitree/deperdition-baie-vitree.service.js';
import { DeperditionPontThermiqueService } from './pont_thermique/deperdition-pont-thermique.service.js';
import { EspaceTamponService } from './espace_tampon/espace-tampon.service.js';
/**
* Calcul des déperditions de l’enveloppe
* @see Méthode de calcul 3CL-DPE 2021 (cotobre 2021) chapitre 3
*/
export class DeperditionEnveloppeService {
/**
* @type {DeperditionMurService}
*/
#deperditionMurService;
/**
* @type {DeperditionPorteService}
*/
#deperditionPorteService;
/**
* @type {DeperditionPlancherBasService}
*/
#deperditionPlancherBasService;
/**
* @type {DeperditionPlancherHautService}
*/
#deperditionPlancherHautService;
/**
* @type {DeperditionBaieVitreeService}
*/
#deperditionBaieVitreeService;
/**
* @type {EspaceTamponService}
*/
#espaceTamponService;
/**
* @type {DeperditionPontThermiqueService}
*/
#deperditionPontThermiqueService;
/**
* @type {DeperditionVentilationService}
*/
#deperditionVentilationService;
/**
* @type {number}
*/
#surfaceDeperditive;
/**
* @type {number}
*/
#surfaceIsolee;
/**
* @type {number}
*/
#surfaceNonIsolee;
/**
* @type {number}
*/
#surfaceMenuiserieAvecJoint;
/**
* @type {number}
*/
#surfaceMenuiserieSansJoint;
/**
*
* @param deperditionMurService {DeperditionMurService}
* @param deperditionPorteService {DeperditionPorteService}
* @param deperditionPlancherBasService {DeperditionPlancherBasService}
* @param deperditionPlancherHautService {DeperditionPlancherHautService}
* @param deperditionBaieVitreeService {DeperditionBaieVitreeService}
* @param espaceTamponService {EspaceTamponService}
* @param deperditionPontThermiqueService {DeperditionPontThermiqueService}
* @param deperditionVentilationService {DeperditionVentilationService}
*/
constructor(
deperditionMurService = inject(DeperditionMurService),
deperditionPorteService = inject(DeperditionPorteService),
deperditionPlancherBasService = inject(DeperditionPlancherBasService),
deperditionPlancherHautService = inject(DeperditionPlancherHautService),
deperditionBaieVitreeService = inject(DeperditionBaieVitreeService),
espaceTamponService = inject(EspaceTamponService),
deperditionPontThermiqueService = inject(DeperditionPontThermiqueService),
deperditionVentilationService = inject(DeperditionVentilationService)
) {
this.#deperditionMurService = deperditionMurService;
this.#deperditionPorteService = deperditionPorteService;
this.#deperditionPlancherBasService = deperditionPlancherBasService;
this.#deperditionPlancherHautService = deperditionPlancherHautService;
this.#deperditionBaieVitreeService = deperditionBaieVitreeService;
this.#espaceTamponService = espaceTamponService;
this.#deperditionPontThermiqueService = deperditionPontThermiqueService;
this.#deperditionVentilationService = deperditionVentilationService;
this.#surfaceDeperditive = 0;
this.#surfaceIsolee = 0;
this.#surfaceNonIsolee = 0;
this.#surfaceMenuiserieAvecJoint = 0;
this.#surfaceMenuiserieSansJoint = 0;
}
/**
* Calcul des déperditions de l’enveloppe
* @param ctx {Contexte}
* @param logement {Logement}
* @returns {{hvent: number, hperm: number, deperdition_renouvellement_air: number, deperdition_mur: number, deperdition_plancher_bas: number, deperdition_plancher_haut: number, deperdition_baie_vitree: number, deperdition_porte: number, deperdition_pont_thermique: number, deperdition_enveloppe: number}}
*/
deperditions(ctx, logement) {
const GV = this.#gv(ctx, logement.enveloppe);
const ventilation = this.#ventilation(ctx, logement);
return {
...GV,
...ventilation,
...{
deperdition_enveloppe:
GV.deperdition_mur +
GV.deperdition_plancher_bas +
GV.deperdition_plancher_haut +
GV.deperdition_baie_vitree +
GV.deperdition_porte +
GV.deperdition_pont_thermique +
ventilation.hvent +
ventilation.hperm
}
};
}
/**
* Calcul des déperditions de l’enveloppe GV
*
* @param ctx {Contexte}
* @param enveloppe {Enveloppe}
*
* @return {Deperdition}
*/
#gv(ctx, enveloppe) {
this.#surfaceDeperditive = 0;
this.#surfaceIsolee = 0;
this.#surfaceNonIsolee = 0;
this.#surfaceMenuiserieAvecJoint = 0;
this.#surfaceMenuiserieSansJoint = 0;
/**
* @type {Deperdition}
*/
const deperditions = {
deperdition_mur: 0,
deperdition_plancher_bas: 0,
deperdition_plancher_haut: 0,
deperdition_baie_vitree: 0,
deperdition_pont_thermique: 0,
deperdition_porte: 0
};
enveloppe.mur_collection.mur?.forEach((m) => {
m.donnee_intermediaire = this.#deperditionMurService.execute(ctx, m.donnee_entree);
deperditions.deperdition_mur +=
m.donnee_intermediaire.b *
m.donnee_entree.surface_paroi_opaque *
m.donnee_intermediaire.umur;
if (m.donnee_intermediaire.b > 0) {
// Paroi déperditive si b != 0 et adjacence != 'local non déperditif'
if (m.donnee_entree.enum_type_adjacence_id !== '22') {
this.#surfaceDeperditive += m.donnee_entree.surface_paroi_opaque;
}
// Surface isolée si b != 0 et type d'isolation != 'inconnu' et != 'non isolé'
if (['1', '2'].includes(m.donnee_entree.enum_type_isolation_id)) {
this.#surfaceNonIsolee += m.donnee_entree.surface_paroi_opaque;
} else {
this.#surfaceIsolee += m.donnee_entree.surface_paroi_opaque;
}
}
});
enveloppe.porte_collection.porte?.forEach((p) => {
p.donnee_intermediaire = this.#deperditionPorteService.execute(ctx, p.donnee_entree);
deperditions.deperdition_porte +=
p.donnee_intermediaire.b * p.donnee_entree.surface_porte * p.donnee_intermediaire.uporte;
// Surface de porte déperditive si b != 0
if (p.donnee_intermediaire.b > 0) {
this.#surfaceDeperditive += p.donnee_entree.surface_porte;
}
// Surface de porte avec ou sans joint
if (p.donnee_entree.presence_joint) {
this.#surfaceMenuiserieAvecJoint += p.donnee_entree.surface_porte;
} else {
this.#surfaceMenuiserieSansJoint += p.donnee_entree.surface_porte;
}
});
const plancherBas = enveloppe.plancher_bas_collection.plancher_bas || [];
plancherBas?.forEach((pb) => {
pb.donnee_intermediaire = this.#deperditionPlancherBasService.execute(
ctx,
pb.donnee_entree,
plancherBas
);
deperditions.deperdition_plancher_bas +=
pb.donnee_intermediaire.b *
pb.donnee_entree.surface_paroi_opaque *
pb.donnee_intermediaire.upb_final;
});
enveloppe.plancher_haut_collection.plancher_haut?.forEach((ph) => {
ph.donnee_intermediaire = this.#deperditionPlancherHautService.execute(ctx, ph.donnee_entree);
deperditions.deperdition_plancher_haut +=
ph.donnee_intermediaire.b *
ph.donnee_entree.surface_paroi_opaque *
ph.donnee_intermediaire.uph;
if (ph.donnee_intermediaire.b > 0) {
// Plancher déperditif si b != 0 et adjacence != 'local non déperditif'
if (ph.donnee_entree.enum_type_adjacence_id !== '22') {
this.#surfaceDeperditive += ph.donnee_entree.surface_paroi_opaque;
}
// Surface isolée si b != 0 et type d'isolation != 'inconnu' et != 'non isolé'
if (['1', '2'].includes(ph.donnee_entree.enum_type_isolation_id)) {
this.#surfaceNonIsolee += ph.donnee_entree.surface_paroi_opaque;
} else {
this.#surfaceIsolee += ph.donnee_entree.surface_paroi_opaque;
}
}
});
enveloppe.baie_vitree_collection.baie_vitree?.forEach((bv) => {
bv.donnee_intermediaire = this.#deperditionBaieVitreeService.execute(ctx, bv);
deperditions.deperdition_baie_vitree +=
bv.donnee_intermediaire.b *
bv.donnee_entree.surface_totale_baie *
bv.donnee_intermediaire.u_menuiserie;
// Surface de baie vitrée déperditive si b != 0
if (bv.donnee_intermediaire.b > 0) {
this.#surfaceDeperditive += bv.donnee_entree.surface_totale_baie;
}
// Surface de baie vitrée avec ou sans joint
if (bv.donnee_entree.presence_joint) {
this.#surfaceMenuiserieAvecJoint += bv.donnee_entree.surface_totale_baie;
} else {
this.#surfaceMenuiserieSansJoint += bv.donnee_entree.surface_totale_baie;
}
});
let ets = enveloppe.ets_collection?.ets;
if (ets) {
// Certaines vérandas sont dupliqués dans les DPE.
if (Array.isArray(ets)) {
ets = ets[0];
}
ets.donnee_intermediaire = this.#espaceTamponService.execute(ctx, ets);
}
enveloppe.pont_thermique_collection.pont_thermique?.forEach((pt) => {
pt.donnee_intermediaire = this.#deperditionPontThermiqueService.execute(
ctx,
enveloppe,
pt.donnee_entree
);
deperditions.deperdition_pont_thermique +=
pt.donnee_entree.l *
pt.donnee_intermediaire.k *
(pt.donnee_entree.pourcentage_valeur_pont_thermique || 1);
});
return deperditions;
}
/**
* Calcul des déperditions par la ventilation
*
* @param ctx {Contexte}
* @param logement {Logement}
*
* @return {Deperdition}
*/
#ventilation(ctx, logement) {
/**
* @type {Deperdition}
*/
const deperditions = {
hperm: 0,
hvent: 0
};
logement.ventilation_collection.ventilation?.forEach((ventilation) => {
ventilation.donnee_intermediaire = this.#deperditionVentilationService.execute(
ctx,
ventilation.donnee_entree,
this.#surfaceDeperditive,
this.#surfaceIsolee,
this.#surfaceNonIsolee,
this.#surfaceMenuiserieAvecJoint,
this.#surfaceMenuiserieSansJoint
);
deperditions.hvent += ventilation.donnee_intermediaire.hvent;
deperditions.hperm += ventilation.donnee_intermediaire.hperm;
});
return deperditions;
}
}