From 9c4563bdb0f859ab7be73cbc75a445ee2abb39af Mon Sep 17 00:00:00 2001 From: Tom Kingstone Date: Tue, 27 Oct 2026 08:59:03 +0000 Subject: [PATCH 1/6] update default target pollination version --- LadybugTools_Engine/Query/IsPollinationInstalled.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LadybugTools_Engine/Query/IsPollinationInstalled.cs b/LadybugTools_Engine/Query/IsPollinationInstalled.cs index 5f71dac4..b7666c6b 100644 --- a/LadybugTools_Engine/Query/IsPollinationInstalled.cs +++ b/LadybugTools_Engine/Query/IsPollinationInstalled.cs @@ -37,7 +37,7 @@ public static partial class Query [Description("Return True if Pollination is installed to the currently supported version.")] [Input("targetPollinationVersion", "The target Pollination version that BHoM currently supports.")] [Output("bool", "True if Pollination is installed to the currently supported version.")] - public static bool IsPollinationInstalled(string targetPollinationVersion = "1.65.10") + public static bool IsPollinationInstalled(string targetPollinationVersion = "1.70.19") { // check if referenced Python is installed string referencedExecutable = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles) + @"\ladybug_tools\python\python.exe"; From 5fdcf97cd0477952362b5d48bed7737cbc5e52d4 Mon Sep 17 00:00:00 2001 From: Tom Kingstone Date: Tue, 27 Oct 2026 14:10:23 +0000 Subject: [PATCH 2/6] fix problems with install caused by upgrade --- .../Compute/InstallPythonEnv_LBT.cs | 7 +- LadybugTools_Engine/Python/pyproject.toml | 179 ++++++++++-------- .../categorical/categorical.py | 3 +- .../src/ladybugtools_toolkit/helpers.py | 4 +- .../plot/_evaporative_cooling_potential.py | 2 +- .../plot/_psychrometric.py | 4 +- 6 files changed, 111 insertions(+), 88 deletions(-) diff --git a/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs b/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs index d2f39179..a026d2d2 100644 --- a/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs +++ b/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs @@ -59,8 +59,11 @@ public static PythonEnvironment InstallPythonEnv_LBT(bool run = false, bool rein env.InstallPackageLocal(Path.Combine(Python.Query.DirectoryCode(), Query.ToolkitName())); // create requirements from referenced executable - string requirementsTxt = Python.Compute.RequirementsTxt(referencedExecutable, Path.Combine(Python.Query.DirectoryEnvironments(), $"requirements_{Query.ToolkitName()}.txt")); - env.InstallRequirements(requirementsTxt); + /* NOTE: following commented lines was original method before we started just copying the direct requirements to our pyproject.toml + * + * string requirementsTxt = Python.Compute.RequirementsTxt(referencedExecutable, Path.Combine(Python.Query.DirectoryEnvironments(), $"requirements_{Query.ToolkitName()}.txt")); + * env.InstallRequirements(requirementsTxt); + */ return env; } diff --git a/LadybugTools_Engine/Python/pyproject.toml b/LadybugTools_Engine/Python/pyproject.toml index 790bf656..61fac441 100644 --- a/LadybugTools_Engine/Python/pyproject.toml +++ b/LadybugTools_Engine/Python/pyproject.toml @@ -22,85 +22,106 @@ dependencies = [ "scipy", "tables", "tqdm", - "xlrd","attrs", - "Brotli", - "click", - "click-plugins", - "colorama", - "contourpy", - "cycler", - "dragonfly-comparison", - "dragonfly-core", - "dragonfly-display", - "dragonfly-doe2", - "dragonfly-energy", - "dragonfly-radiance", - "dragonfly-schema", - "dragonfly-uwg", - "fonttools", - "honeybee-core", - "honeybee-display", - "honeybee-doe2", - "honeybee-energy", - "honeybee-energy-standards", - "honeybee-idaice", - "honeybee-ies", - "honeybee-openstudio", - "honeybee-radiance", - "honeybee-radiance-command", - "honeybee-radiance-folder", - "honeybee-radiance-postprocess", - "honeybee-schema", - "honeybee-standards", - "inflate64", - "jsonschema", - "jsonschema-specifications", - "kiwisolver", - "ladybug-comfort", - "ladybug-core", - "ladybug-display", - "ladybug-display-schema", - "ladybug-geometry", - "ladybug-geometry-polyskel", - "ladybug-radiance", - "ladybug-rhino", - "ladybug-vtk", - "lbt-dragonfly==0.12.99", - "lbt-honeybee==0.9.95", - "lbt-ladybug==0.27.150", - "lbt-recipes==0.26.23", - "lockfile", - "luigi", - "matplotlib", - "multivolumefile", - "numpy", - "openstudio", - "packaging", - "pillow", - "pollination-handlers", - "psutil", - "py7zr", - "pybcj", - "pycryptodomex", - "pydantic==1.10.22", - "pydantic-openapi-helper==0.2.11", - "pyparsing", - "pyppmd", - "python-daemon", - "python-dateutil", - "PyYAML", - "pyzstd", - "queenbee", - "queenbee-local", - "referencing", - "rpds-py", - "six", - "tenacity", - "texttable", - "tornado", - "typing_extensions", - "uwg", - "vtk", + "xlrd", + #----POLLINATION DERIVED DEPENDENCIES----# + "annotated-types==0.8.0", + "attrs==26.1.0", + "backports.zstd==1.7.0", + "brotli==1.2.0", + "click==8.1.7", + "click-plugins==1.1.1.2", + "colorama==0.4.6", + "contourpy==1.3.3", + "cupy-cuda12x==13.6.0", + "cycler==0.12.1", + "dragonfly-comparison==0.1.4", + "dragonfly-core==1.77.1", + "dragonfly-designbuilder==0.1.10", + "dragonfly-display==0.5.0", + "dragonfly-doe2==0.12.19", + "dragonfly-energy==1.46.4", + "dragonfly-idaice==0.1.4", + "dragonfly-iesve==0.2.6", + "dragonfly-openstudio==0.2.5", + "dragonfly-radiance==0.4.223", + "dragonfly-schema==2.2.3", + "dragonfly-uwg==0.5.743", + "fairyfly-core==0.2.37", + "fairyfly-therm==0.10.18", + "fairyfly-therm-standards==0.1.0", + "fastrlock==0.8.3", + "fonttools==4.63.0", + "honeybee-core==1.64.65", + "honeybee-designbuilder==0.4.5", + "honeybee-display==0.6.3", + "honeybee-doe2==0.23.6", + "honeybee-energy==1.123.23", + "honeybee-energy-standards==2.3.4", + "honeybee-idaice==1.3.3", + "honeybee-ies==0.14.3", + "honeybee-openstudio==0.6.0", + "honeybee-radiance==1.66.285", + "honeybee-radiance-command==1.23.0", + "honeybee-radiance-folder==2.11.17", + "honeybee-radiance-postprocess==0.5.11", + "honeybee-schema==2.2.0", + "honeybee-standards==2.0.7", + "inflate64==1.0.4", + "jsonschema==4.26.0", + "jsonschema-specifications==2025.9.1", + "kiwisolver==1.5.0", + "ladybug-comfort==0.19.5", + "ladybug-core==0.44.56", + "ladybug-display==0.14.3", + "ladybug-display-schema==1.0.1", + "ladybug-geometry==1.35.3", + "ladybug-geometry-polyskel==1.7.52", + "ladybug-radiance==0.2.12", + "ladybug-rhino==1.45.0", + "ladybug-vtk==0.16.1", + "lbt-dragonfly==0.13.218", + "lbt-honeybee==0.9.451", + "lbt-ladybug==0.27.200", + "lbt-recipes==0.28.9", + "lockfile==0.12.2", + "loguru==0.7.3", + "luigi==3.3.0", + "matplotlib==3.11.1", + "multivolumefile==0.2.3", + "numpy==2.1.0", + "openstudio==3.11.0", + "openstudio-backporter==0.2.0", + "packaging==26.3", + "pillow==12.3.0", + "pollination-handlers==0.10.17", + "psutil==7.2.2", + "py7zr==1.1.0", + "pybcj==1.0.8", + "pycryptodomex==3.23.0", + "pydantic==2.13.4", + "pydantic-openapi-helper==1.0.5", + "pydantic_core==2.46.4", + "pyparsing==3.3.2", + "pyppmd==1.3.1", + "python-daemon==3.1.2", + "python-dateutil==2.9.0.post0", + "PyYAML==6.0.3", + "queenbee==2.0.1", + "queenbee-local==1.0.3", + "referencing==0.37.0", + "rpds-py==2026.6.3", + "setuptools==80.9.0", + "setuptools-scm==9.2.2", + "six==1.17.0", + "tenacity==8.5.0", + "texttable==1.7.0", + "tornado==6.5.7", + "typing-inspection==0.4.4", + "typing_extensions==4.16.0", + "uwg==5.8.13", + "vtk==9.7.0", + "wheel==0.48.0", + "win32_setctime==1.2.0; sys_platform == 'win32'", ] [urls] diff --git a/LadybugTools_Engine/Python/src/ladybugtools_toolkit/categorical/categorical.py b/LadybugTools_Engine/Python/src/ladybugtools_toolkit/categorical/categorical.py index 331e15b7..8c164b3a 100644 --- a/LadybugTools_Engine/Python/src/ladybugtools_toolkit/categorical/categorical.py +++ b/LadybugTools_Engine/Python/src/ladybugtools_toolkit/categorical/categorical.py @@ -188,8 +188,7 @@ def cmap(self) -> Colormap: colors = [to_rgba(i) for i in colors] cmap = ListedColormap(colors=colors, name=self.name) - cmap.set_over(self.colors[-1]) - cmap.set_under(self.colors[0]) + cmap.with_extremes(over=self.colors[-1], under=self.colors[0]) return cmap @property diff --git a/LadybugTools_Engine/Python/src/ladybugtools_toolkit/helpers.py b/LadybugTools_Engine/Python/src/ladybugtools_toolkit/helpers.py index 12eaf4d1..2a27c9fe 100644 --- a/LadybugTools_Engine/Python/src/ladybugtools_toolkit/helpers.py +++ b/LadybugTools_Engine/Python/src/ladybugtools_toolkit/helpers.py @@ -29,7 +29,7 @@ zhang_huang_solar_split) from ladybug.sunpath import Sunpath from ladybug_geometry.geometry2d import Vector2D -from meteostat import Hourly, Point +from meteostat import hourly, Point from python_toolkit.bhom.analytics import bhom_analytics from .bhom.logger import CONSOLE_LOGGER from .ladybug_extension.dt import lb_datetime_from_datetime @@ -905,7 +905,7 @@ def scrape_meteostat( raise ValueError("The end_date must be a datetime object or string.") location = Point(latitude, longitude, altitude) - data = Hourly(location, start_date, end_date).fetch() + data = hourly(location, start_date, end_date).fetch() if len(data) == 0: raise ValueError("No data was returned from Meteostat.") diff --git a/LadybugTools_Engine/Python/src/ladybugtools_toolkit/plot/_evaporative_cooling_potential.py b/LadybugTools_Engine/Python/src/ladybugtools_toolkit/plot/_evaporative_cooling_potential.py index 7baac9e6..df4578dd 100644 --- a/LadybugTools_Engine/Python/src/ladybugtools_toolkit/plot/_evaporative_cooling_potential.py +++ b/LadybugTools_Engine/Python/src/ladybugtools_toolkit/plot/_evaporative_cooling_potential.py @@ -97,7 +97,7 @@ def evaporative_cooling_potential_epw(epw: EPW, ax: plt.Axes = None, **kwargs) - dbt=collection_to_series(epw.dry_bulb_temperature), dpt=collection_to_series(epw.dew_point_temperature), ax=ax, - title=kwargs.pop("title", Path(epw.file_path).name) + title=kwargs.pop("title", Path(epw.file_path).name), **kwargs ) diff --git a/LadybugTools_Engine/Python/src/ladybugtools_toolkit/plot/_psychrometric.py b/LadybugTools_Engine/Python/src/ladybugtools_toolkit/plot/_psychrometric.py index 1c98a4e6..2d85ef22 100644 --- a/LadybugTools_Engine/Python/src/ladybugtools_toolkit/plot/_psychrometric.py +++ b/LadybugTools_Engine/Python/src/ladybugtools_toolkit/plot/_psychrometric.py @@ -128,9 +128,9 @@ class PsychrometricPolygons: strategies: list[PassiveStrategy] = field(init=True, default_factory=list) strategy_parameters: PassiveStrategyParameters = field( - init=True, default=PassiveStrategyParameters() + init=True, default_factory=PassiveStrategyParameters ) - pmv_parameter: PMVParameter = field(init=True, default=PMVParameter()) + pmv_parameter: PMVParameter = field(init=True, default_factory=PMVParameter) mean_radiant_temperature: float = field(init=True, default=None) air_speed: float = field(init=True, default=0.1) metabolic_rate: float = field(init=True, default=1.1) From f6acd5f4514ce87652e0aac26934d356af8d4e25 Mon Sep 17 00:00:00 2001 From: Tom Kingstone Date: Tue, 27 Oct 2026 14:21:54 +0000 Subject: [PATCH 3/6] update dockerfile to use different version of python toolkit and update internal openstudio version --- LadybugTools_Engine/Python/Dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/LadybugTools_Engine/Python/Dockerfile b/LadybugTools_Engine/Python/Dockerfile index 29acf9db..84f59294 100644 --- a/LadybugTools_Engine/Python/Dockerfile +++ b/LadybugTools_Engine/Python/Dockerfile @@ -1,5 +1,5 @@ #The bhom_python_toolkit image must exist in the docker image container, see https://github.com/BHoM/Python_Toolkit. -FROM bhom_python_toolkit:latest +FROM bhom_python_toolkit_3_13:latest #Install ladybugtools_toolkit packages. COPY . /LadybugTools_Toolkit @@ -11,9 +11,9 @@ RUN apt-get update \ && apt-get install wget -y #Install openstudio and dependencies. -RUN wget https://github.com/NREL/OpenStudio/releases/download/v3.10.0/OpenStudio-3.10.0+86d7e215a1-Ubuntu-22.04-x86_64.deb \ - && dpkg-deb -R OpenStudio-3.10.0+86d7e215a1-Ubuntu-22.04-x86_64.deb . \ - && rm OpenStudio-3.10.0+86d7e215a1-Ubuntu-22.04-x86_64.deb \ +RUN wget https://github.com/NatLabRockies/OpenStudio/releases/download/v3.11.0/OpenStudio-3.11.0+241b8abb4d-Ubuntu-22.04-x86_64.deb \ + && dpkg-deb -R OpenStudio-3.11.0+241b8abb4d-Ubuntu-22.04-x86_64.deb . \ + && rm OpenStudio-3.11.0+241b8abb4d-Ubuntu-22.04-x86_64.deb \ && apt install libgomp1 libx11-6 -y #install radiance From 77f2ac3c00a07c82ce200953bb6804fc2d060026 Mon Sep 17 00:00:00 2001 From: Tom Kingstone Date: Tue, 3 Nov 2026 09:11:11 +0000 Subject: [PATCH 4/6] try fix ladybug_tools existing in user home directory --- .../Compute/InstallPythonEnv_LBT.cs | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs b/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs index a026d2d2..131899b3 100644 --- a/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs +++ b/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs @@ -49,7 +49,11 @@ public static PythonEnvironment InstallPythonEnv_LBT(bool run = false, bool rein // check if environment already exists. If it does, and no reinstall requested, load it bool exists = Python.Query.VirtualEnvironmentExists(envName: Query.ToolkitName(), pythonVersion: pythonVersion); if (run && exists && !reinstall) - return Python.Compute.VirtualEnvironment(version: pythonVersion, name: Query.ToolkitName(), reload: true); + { + PythonEnvironment existing = Python.Compute.VirtualEnvironment(version: pythonVersion, name: Query.ToolkitName(), reload: true); + FixLadybugConfig(Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles), "ladybug_tools")); + return existing; + } // create environment from scratch PythonEnvironment env = Python.Compute.VirtualEnvironment(version: pythonVersion, name: Query.ToolkitName(), reload: false); @@ -65,11 +69,28 @@ public static PythonEnvironment InstallPythonEnv_LBT(bool run = false, bool rein * env.InstallRequirements(requirementsTxt); */ + FixLadybugConfig(Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.ProgramFiles), "ladybug_tools")); + return env; } - } -} + /// + /// Fix for if user home directory contains ladybug_tools (perhaps from old installation). This will break environments where users rely on that folder overriding the ladybug folder in program files. + /// + /// + private static void FixLadybugConfig(string targetFolder) + { + string userLbtFolder = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.UserProfile), "ladybug_tools") + if (!Directory.Exists(userLbtFolder)) + return; + + BH.Engine.Base.Compute.RecordNote($"The folder '{userLbtFolder}' was found, and as this can cause issues with referenceing Radiance and OpenStudio, the ladybug config has been explicitly pointed to the installation in Program Files."); + string command = $"{Python.Modify.AddQuotesIfRequired(System.IO.Path.Combine(Python.Query.VirtualEnvironmentDirectory(Query.ToolkitName()), "Scripts", "ladybug.exe"))} set-config ladybug-tools_folder {targetFolder}"; + string stdOut = Python.Compute.RunCommandStdout(command); + BH.Engine.Base.Compute.RecordNote($"Set explicit ladybug config path. stdOut:\n{stdOut}"); + } + } +} \ No newline at end of file From dc25d663bc95faa30dff864c81b669a54db5dd83 Mon Sep 17 00:00:00 2001 From: Tom Kingstone Date: Tue, 3 Nov 2026 09:15:01 +0000 Subject: [PATCH 5/6] silly mistake --- LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs b/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs index 131899b3..7f8513ef 100644 --- a/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs +++ b/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs @@ -86,7 +86,7 @@ private static void FixLadybugConfig(string targetFolder) BH.Engine.Base.Compute.RecordNote($"The folder '{userLbtFolder}' was found, and as this can cause issues with referenceing Radiance and OpenStudio, the ladybug config has been explicitly pointed to the installation in Program Files."); - string command = $"{Python.Modify.AddQuotesIfRequired(System.IO.Path.Combine(Python.Query.VirtualEnvironmentDirectory(Query.ToolkitName()), "Scripts", "ladybug.exe"))} set-config ladybug-tools_folder {targetFolder}"; + string command = $"{Python.Modify.AddQuotesIfRequired(System.IO.Path.Combine(Python.Query.VirtualEnvironmentDirectory(Query.ToolkitName()), "Scripts", "ladybug.exe"))} set-config ladybug-tools-folder {targetFolder}"; string stdOut = Python.Compute.RunCommandStdout(command); From 825a706a94e00728852a002fc5225078c344d0e5 Mon Sep 17 00:00:00 2001 From: Tom Kingstone Date: Tue, 3 Nov 2026 09:20:03 +0000 Subject: [PATCH 6/6] fix other problems --- LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs b/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs index 7f8513ef..7bad1dca 100644 --- a/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs +++ b/LadybugTools_Engine/Compute/InstallPythonEnv_LBT.cs @@ -80,13 +80,13 @@ public static PythonEnvironment InstallPythonEnv_LBT(bool run = false, bool rein /// private static void FixLadybugConfig(string targetFolder) { - string userLbtFolder = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.UserProfile), "ladybug_tools") + string userLbtFolder = Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.UserProfile), "ladybug_tools"); if (!Directory.Exists(userLbtFolder)) return; BH.Engine.Base.Compute.RecordNote($"The folder '{userLbtFolder}' was found, and as this can cause issues with referenceing Radiance and OpenStudio, the ladybug config has been explicitly pointed to the installation in Program Files."); - string command = $"{Python.Modify.AddQuotesIfRequired(System.IO.Path.Combine(Python.Query.VirtualEnvironmentDirectory(Query.ToolkitName()), "Scripts", "ladybug.exe"))} set-config ladybug-tools-folder {targetFolder}"; + string command = $"{Python.Modify.AddQuotesIfRequired(System.IO.Path.Combine(Python.Query.VirtualEnvironmentDirectory(Query.ToolkitName()), "Scripts", "ladybug.exe"))} set-config ladybug-tools-folder {Python.Modify.AddQuotesIfRequired(targetFolder)}"; string stdOut = Python.Compute.RunCommandStdout(command);