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; }