diff --git a/static/css/images/havenith-body-zones.png b/static/css/images/havenith-body-zones.png new file mode 100644 index 00000000..4ac57c78 Binary files /dev/null and b/static/css/images/havenith-body-zones.png differ diff --git a/static/html/preset-ensemble.html b/static/html/preset-ensemble.html new file mode 100644 index 00000000..7c7897b5 --- /dev/null +++ b/static/html/preset-ensemble.html @@ -0,0 +1,196 @@ + + +
+
+
+ + + + + + + +
+ + clo +
+
+ + Front, side and back views of the body insulation zones + +

+ Source: Havenith et al. (2013), ASHRAE 1504-TRP. Whole-body intrinsic + clothing insulation is from Tables 2 and 3. Regional total insulation at + 0.2 m/s is from Tables 7 and 8. All fields remain editable after a preset + is selected. Editing a regional value recalculates whole-body + Icl with an area-weighted parallel model normalized to the + selected preset. +

+
+ +
+
+

Regional insulation

+ IT [m²·K/W] +
+

+ Choose the garments that most closely match what is actually worn on + each body zone. Values are regional measurements taken while the full + source ensemble was worn - they are not insulation values of an + individual garment. The numeric field remains editable for advanced + adjustments. +

+ +
+
+

+

+
+
+
diff --git a/static/js/ASHRAE/ashrae.js b/static/js/ASHRAE/ashrae.js index 763c7c64..1bdbadce 100644 --- a/static/js/ASHRAE/ashrae.js +++ b/static/js/ASHRAE/ashrae.js @@ -182,6 +182,29 @@ $(function () { }, }); + $("#presetEnsembleDialog").dialog({ + autoOpen: false, + width: Math.min(1100, $(window).width() - 40), + maxHeight: $(window).height() - 40, + modal: true, + resizable: true, + buttons: { + "Use ensemble": function () { + const clo = parseFloat($("#presetClo").val()); + if (!Number.isFinite(clo) || clo < 0 || clo > 5) { + window.alert("Whole-body clothing insulation must be between 0 and 5 clo."); + return; + } + $("#clo").val(clo.toFixed(2)); + $(this).dialog("close"); + update(); + }, + Close: function () { + $(this).dialog("close"); + }, + }, + }); + $("#localdialog").dialog({ autoOpen: false, height: 900, @@ -340,6 +363,212 @@ $("#ERF").click(function () { container.dialog("open"); }); +function populatePresetEnsembleSelect() { + const gender = $("#presetGender").val(); + const select = $("#presetEnsemble"); + select.empty(); + window.HAVENITH_PRESET_ENSEMBLES.filter(function (preset) { + return preset.gender === gender; + }).forEach(function (preset) { + select.append( + $("