diff --git a/src/compute.geometry/Config.cs b/src/compute.geometry/Config.cs
index d783d0d1..1e45d856 100644
--- a/src/compute.geometry/Config.cs
+++ b/src/compute.geometry/Config.cs
@@ -34,6 +34,11 @@ static class Config
///
public static int LogRetainDays { get; private set; }
+ ///
+ /// RHINO_COMPUTE_CREATE_HEADLESS_DOC: create a headless Rhino document for each request.
+ ///
+ public static bool CreateHeadlessDoc { get; private set; }
+
public static string[] GetDeprecationWarnings() => _warnings.ToArray();
///
@@ -50,6 +55,7 @@ public static void Load()
ApiKey = GetEnvironmentVariable(RHINO_COMPUTE_KEY, null);
LogPath = GetEnvironmentVariable(RHINO_COMPUTE_LOG_PATH, Path.Combine(Path.GetTempPath(), "Compute", "Logs"), COMPUTE_LOG_PATH);
LogRetainDays = GetEnvironmentVariable(RHINO_COMPUTE_LOG_RETAIN_DAYS, 10, COMPUTE_LOG_RETAIN_DAYS);
+ CreateHeadlessDoc = GetEnvironmentVariable(RHINO_COMPUTE_CREATE_HEADLESS_DOC, false);
#if DEBUG
Debug = true;
@@ -73,6 +79,7 @@ public static void Load()
const string RHINO_COMPUTE_LOG_PATH = "RHINO_COMPUTE_LOG_PATH";
const string RHINO_COMPUTE_LOG_RETAIN_DAYS = "RHINO_COMPUTE_LOG_RETAIN_DAYS";
const string RHINO_COMPUTE_DEBUG = "RHINO_COMPUTE_DEBUG";
+ const string RHINO_COMPUTE_CREATE_HEADLESS_DOC = "RHINO_COMPUTE_CREATE_HEADLESS_DOC";
// deprecated
const string COMPUTE_BIND_URLS = "COMPUTE_BIND_URLS";
diff --git a/src/compute.geometry/Program.cs b/src/compute.geometry/Program.cs
index c5f43668..fdc16477 100644
--- a/src/compute.geometry/Program.cs
+++ b/src/compute.geometry/Program.cs
@@ -45,6 +45,10 @@ static void Main(string[] args)
RhinoInside.Resolver.LoadRhino();
LogVersions();
+
+ if (Config.CreateHeadlessDoc)
+ Log.Information("Compute to use headless Rhino documents");
+
var host = Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
diff --git a/src/compute.geometry/ResthopperEndpoints.cs b/src/compute.geometry/ResthopperEndpoints.cs
index e5f9fedd..ee69d49f 100644
--- a/src/compute.geometry/ResthopperEndpoints.cs
+++ b/src/compute.geometry/ResthopperEndpoints.cs
@@ -15,6 +15,7 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Routing;
using Rhino.Geometry;
+using Rhino;
namespace compute.geometry
{
@@ -75,6 +76,19 @@ static string GrasshopperSolveHelper(Schema input, string body, System.Diagnosti
SetDefaultTolerances(input.AbsoluteTolerance, input.AngleTolerance);
SetDefaultUnits(input.ModelUnits);
+ // Instantiate headless doc
+ if (Config.CreateHeadlessDoc)
+ {
+ RhinoDoc.ActiveDoc = RhinoDoc.CreateHeadless(null);
+ RhinoDoc.ActiveDoc.ModelAbsoluteTolerance = input.AbsoluteTolerance;
+ RhinoDoc.ActiveDoc.ModelAngleToleranceDegrees = input.AngleTolerance;
+
+ if (Enum.TryParse(input.ModelUnits, out UnitSystem units))
+ {
+ RhinoDoc.ActiveDoc.ModelUnitSystem = units;
+ }
+ }
+
int recursionLevel = input.RecursionLevel + 1;
definition.Definition.DefineConstant("ComputeRecursionLevel", new Grasshopper.Kernel.Expressions.GH_Variant(recursionLevel));
@@ -98,6 +112,11 @@ static string GrasshopperSolveHelper(Schema input, string body, System.Diagnosti
DataCache.SetCachedSolveResults(body, returnJson, definition);
}
}
+
+ // Dispose headless doc
+ if (RhinoDoc.ActiveDoc is object)
+ RhinoDoc.ActiveDoc.Dispose();
+
return returnJson;
}