- A US Freeway map rendered with a custom Unique Value Renderer that color-codes different highway types.
+ A US Highway map rendered with a custom Unique Value Renderer that color-codes different road types.
-
+
@if (_showLegend)
@@ -48,8 +28,4 @@
}
-
-
-@code {
- private bool _showLegend;
-}
\ No newline at end of file
+
\ No newline at end of file
diff --git a/samples/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/UniqueValueRenderers.razor.cs b/samples/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/UniqueValueRenderers.razor.cs
new file mode 100644
index 000000000..a21a830dc
--- /dev/null
+++ b/samples/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/UniqueValueRenderers.razor.cs
@@ -0,0 +1,68 @@
+using dymaptic.GeoBlazor.Core.Components;
+using dymaptic.GeoBlazor.Core.Components.Renderers;
+using dymaptic.GeoBlazor.Core.Components.Symbols;
+using dymaptic.GeoBlazor.Core.Enums;
+using dymaptic.GeoBlazor.Core.Extensions;
+using dymaptic.GeoBlazor.Core.Model;
+
+
+namespace dymaptic.GeoBlazor.Core.Sample.Shared.Pages;
+
+public partial class UniqueValueRenderers
+{
+ private static readonly Dictionary roadTypes = new()
+ {
+ // Major highways - wide, bold colors
+ ["motorway"] = new SimpleLineSymbol(new MapColor(232, 63, 111), 5, SimpleLineSymbolStyle.Solid),
+ ["motorway_link"] = new SimpleLineSymbol(new MapColor(232, 63, 111), 3, SimpleLineSymbolStyle.Solid),
+ ["trunk"] = new SimpleLineSymbol(new MapColor(247, 148, 29), 4, SimpleLineSymbolStyle.Solid),
+ ["trunk_link"] = new SimpleLineSymbol(new MapColor(247, 148, 29), 2, SimpleLineSymbolStyle.Solid),
+
+ // Primary roads - medium-wide, warm colors
+ ["primary"] = new SimpleLineSymbol(new MapColor(255, 200, 69), 4, SimpleLineSymbolStyle.Solid),
+ ["primary_link"] = new SimpleLineSymbol(new MapColor(255, 200, 69), 2, SimpleLineSymbolStyle.Solid),
+
+ // Secondary roads - medium width, cooler tones
+ ["secondary"] = new SimpleLineSymbol(new MapColor(141, 198, 63), 3, SimpleLineSymbolStyle.Solid),
+ ["secondary_link"] = new SimpleLineSymbol(new MapColor(141, 198, 63), 2, SimpleLineSymbolStyle.Solid),
+
+ // Tertiary roads - narrower
+ ["tertiary"] = new SimpleLineSymbol(new MapColor(102, 178, 255), 2.5, SimpleLineSymbolStyle.Solid),
+ ["tertiary_link"] = new SimpleLineSymbol(new MapColor(102, 178, 255), 1.5, SimpleLineSymbolStyle.Solid),
+
+ // Local roads - thin, neutral colors
+ ["residential"] = new SimpleLineSymbol(new MapColor(200, 200, 200), 2, SimpleLineSymbolStyle.Solid),
+ ["living_street"] = new SimpleLineSymbol(new MapColor(180, 180, 220), 2, SimpleLineSymbolStyle.Solid),
+ ["unclassified"] = new SimpleLineSymbol(new MapColor(170, 170, 170), 1.5, SimpleLineSymbolStyle.Solid),
+ ["road"] = new SimpleLineSymbol(new MapColor(150, 150, 150), 1.5, SimpleLineSymbolStyle.Solid),
+
+ // Service and access roads
+ ["service"] = new SimpleLineSymbol(new MapColor(128, 128, 128), 1, SimpleLineSymbolStyle.Solid),
+ ["services"] = new SimpleLineSymbol(new MapColor(128, 128, 128), 1, SimpleLineSymbolStyle.Solid),
+
+ // Pedestrian paths - thin, dashed styles, earth tones
+ ["footway"] = new SimpleLineSymbol(new MapColor(139, 90, 43), 1, SimpleLineSymbolStyle.Dash),
+ ["path"] = new SimpleLineSymbol(new MapColor(160, 82, 45), 1, SimpleLineSymbolStyle.Dash),
+ ["pedestrian"] = new SimpleLineSymbol(new MapColor(139, 69, 19), 1.5, SimpleLineSymbolStyle.ShortDash),
+ ["steps"] = new SimpleLineSymbol(new MapColor(105, 105, 105), 1, SimpleLineSymbolStyle.Dot),
+ ["corridor"] = new SimpleLineSymbol(new MapColor(169, 169, 169), 1, SimpleLineSymbolStyle.ShortDash),
+
+ // Off-road and rural paths
+ ["track"] = new SimpleLineSymbol(new MapColor(139, 119, 101), 1.5, SimpleLineSymbolStyle.LongDash),
+ ["bridleway"] = new SimpleLineSymbol(new MapColor(107, 142, 35), 1, SimpleLineSymbolStyle.DashDot),
+
+ // Special purpose roads
+ ["busway"] = new SimpleLineSymbol(new MapColor(0, 112, 192), 2.5, SimpleLineSymbolStyle.Solid),
+ ["raceway"] = new SimpleLineSymbol(new MapColor(255, 0, 0), 3, SimpleLineSymbolStyle.Solid),
+
+ // Under development - distinctive dashed patterns
+ ["construction"] = new SimpleLineSymbol(new MapColor(255, 165, 0), 2, SimpleLineSymbolStyle.DashDot),
+ ["proposed"] = new SimpleLineSymbol(new MapColor(192, 192, 192), 1.5, SimpleLineSymbolStyle.Dot)
+ };
+ private readonly UniqueValueRenderer _uniqueValueRenderer = new(uniqueValueInfos: roadTypes
+ .Select(r => new UniqueValueInfo(r.Key.ToUpperFirstChar().Replace("_", " "), r.Value, r.Key))
+ .ToArray(),
+ field: "highway", defaultLabel: "Service",
+ legendOptions: new UniqueValueRendererLegendOptions("Route Type"));
+ private bool _showLegend;
+}
\ No newline at end of file
diff --git a/samples/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/WCSLayers.razor b/samples/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/WCSLayers.razor
index 19d338b75..ae29f32cf 100644
--- a/samples/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/WCSLayers.razor
+++ b/samples/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/WCSLayers.razor
@@ -55,29 +55,44 @@
private void OnViewRendered() => _mapRendered = true;
- public async Task AddRemoveWCSLayer(bool colorized)
+ private async Task AddRemoveWCSLayer(bool colorized)
{
- if (!_view!.Map!.Layers.Any())
+ await SetCursor("wait");
+ await Task.Delay(100);
+
+ try
{
- if (colorized)
+ if (!_view!.Map!.Layers.Any())
+ {
+ if (colorized)
+ {
+ await _view.AddLayer(_colorizedLayer!);
+ }
+ else
+ {
+ await _view.AddLayer(_blackAndWhiteLayer!);
+ }
+ }
+ else if (colorized)
{
- await _view.AddLayer(_colorizedLayer!);
+ await _view.RemoveLayer(_colorizedLayer!);
}
else
{
- await _view.AddLayer(_blackAndWhiteLayer!);
+ await _view.RemoveLayer(_blackAndWhiteLayer!);
}
}
- else if (colorized)
- {
- await _view.RemoveLayer(_colorizedLayer!);
- }
- else
+ finally
{
- await _view.RemoveLayer(_blackAndWhiteLayer!);
+ await SetCursor("default");
}
}
+ private async Task SetCursor(string cursor)
+ {
+ await _view!.CoreJsModule!.InvokeVoidAsync("setCursor", cursor, _view.Id);
+ }
+
private MapView? _view;
private bool _mapRendered;
diff --git a/samples/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/WMSLayers.razor b/samples/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/WMSLayers.razor
index feda6d1a5..38f3242a9 100644
--- a/samples/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/WMSLayers.razor
+++ b/samples/dymaptic.GeoBlazor.Core.Sample.Shared/Pages/WMSLayers.razor
@@ -21,12 +21,12 @@
This sample shows how to access a WMS Service using WMSLayer and add it to a scene as a Basemap. The WMSLayer is used to create layers based on OGC Web Map Services (WMS).
-
+
diff --git a/samples/dymaptic.GeoBlazor.Core.Sample.Shared/dymaptic.GeoBlazor.Core.Sample.Shared.csproj b/samples/dymaptic.GeoBlazor.Core.Sample.Shared/dymaptic.GeoBlazor.Core.Sample.Shared.csproj
index 83447a3cc..79c1b6a25 100644
--- a/samples/dymaptic.GeoBlazor.Core.Sample.Shared/dymaptic.GeoBlazor.Core.Sample.Shared.csproj
+++ b/samples/dymaptic.GeoBlazor.Core.Sample.Shared/dymaptic.GeoBlazor.Core.Sample.Shared.csproj
@@ -12,9 +12,9 @@
-
-
-
+
+
+
diff --git a/samples/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.Client/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.Client.csproj b/samples/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.Client/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.Client.csproj
index 81c1ffe44..92b619fa4 100644
--- a/samples/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.Client/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.Client.csproj
+++ b/samples/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.Client/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.Client.csproj
@@ -7,8 +7,8 @@
-
-
+
+
diff --git a/samples/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.csproj b/samples/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.csproj
index 07dfbd614..a44cc4a65 100644
--- a/samples/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.csproj
+++ b/samples/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh/dymaptic.GeoBlazor.Core.Sample.TokenRefresh.csproj
@@ -8,7 +8,7 @@
-
+
diff --git a/samples/dymaptic.GeoBlazor.Core.Sample.Wasm/dymaptic.GeoBlazor.Core.Sample.Wasm.csproj b/samples/dymaptic.GeoBlazor.Core.Sample.Wasm/dymaptic.GeoBlazor.Core.Sample.Wasm.csproj
index 60b8c4c69..565eec732 100644
--- a/samples/dymaptic.GeoBlazor.Core.Sample.Wasm/dymaptic.GeoBlazor.Core.Sample.Wasm.csproj
+++ b/samples/dymaptic.GeoBlazor.Core.Sample.Wasm/dymaptic.GeoBlazor.Core.Sample.Wasm.csproj
@@ -5,8 +5,8 @@
-
-
+
+
diff --git a/samples/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp.Client/dymaptic.GeoBlazor.Core.Sample.WebApp.Client.csproj b/samples/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp.Client/dymaptic.GeoBlazor.Core.Sample.WebApp.Client.csproj
index 5fb04f61b..7a531c895 100644
--- a/samples/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp.Client/dymaptic.GeoBlazor.Core.Sample.WebApp.Client.csproj
+++ b/samples/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp.Client/dymaptic.GeoBlazor.Core.Sample.WebApp.Client.csproj
@@ -7,7 +7,7 @@
-
+
diff --git a/samples/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp.csproj b/samples/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp.csproj
index e1ac12030..deb1536e3 100644
--- a/samples/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp.csproj
+++ b/samples/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp/dymaptic.GeoBlazor.Core.Sample.WebApp.csproj
@@ -8,7 +8,7 @@
-
+
diff --git a/src/dymaptic.GeoBlazor.Core.Analyzers/dymaptic.GeoBlazor.Core.Analyzers.csproj b/src/dymaptic.GeoBlazor.Core.Analyzers/dymaptic.GeoBlazor.Core.Analyzers.csproj
index 490621065..6ec3becf8 100644
--- a/src/dymaptic.GeoBlazor.Core.Analyzers/dymaptic.GeoBlazor.Core.Analyzers.csproj
+++ b/src/dymaptic.GeoBlazor.Core.Analyzers/dymaptic.GeoBlazor.Core.Analyzers.csproj
@@ -3,9 +3,7 @@
netstandard2.0false
- enablelatest
-
truetruedymaptic.GeoBlazor.Core.Analyzers
@@ -16,10 +14,11 @@
allruntime; build; native; contentfiles; analyzers; buildtransitive
-
+
+
diff --git a/src/dymaptic.GeoBlazor.Core.ESBuild/dymaptic.GeoBlazor.Core.ESBuild.csproj b/src/dymaptic.GeoBlazor.Core.ESBuild/dymaptic.GeoBlazor.Core.ESBuild.csproj
new file mode 100644
index 000000000..897eece33
--- /dev/null
+++ b/src/dymaptic.GeoBlazor.Core.ESBuild/dymaptic.GeoBlazor.Core.ESBuild.csproj
@@ -0,0 +1,16 @@
+
+
+ net8.0
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/ESBuildGenerator.cs b/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/ESBuildGenerator.cs
new file mode 100644
index 000000000..8836ece24
--- /dev/null
+++ b/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/ESBuildGenerator.cs
@@ -0,0 +1,121 @@
+using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.Diagnostics;
+using System.Collections.Immutable;
+using System.Diagnostics.CodeAnalysis;
+
+
+namespace dymaptic.GeoBlazor.Core.SourceGenerator.Shared;
+
+[SuppressMessage("MicrosoftCodeAnalysisCorrectness", "RS1035:Do not use APIs banned for analyzers")]
+public static class ESBuildGenerator
+{
+ public static Dictionary ConfigSelector(AnalyzerConfigOptionsProvider configProvider,
+ CancellationToken _)
+ {
+ Dictionary options = [];
+
+ if (configProvider.GlobalOptions.TryGetValue($"{BUILD_PROPERTY}.{GB_BUILD_TOOLS_PATH}",
+ out var gbBuildToolsPath))
+ {
+ options[GB_BUILD_TOOLS_PATH] = gbBuildToolsPath;
+ }
+
+ if (configProvider.GlobalOptions.TryGetValue($"{BUILD_PROPERTY}.{DESIGN_TIME_BUILD}",
+ out var designTimeBuild))
+ {
+ options[DESIGN_TIME_BUILD] = designTimeBuild;
+ }
+
+ return options;
+ }
+
+ public static void FilesChanged(SourceProductionContext context,
+ (ImmutableArray Files, Dictionary Options) pipeline)
+ {
+ if (pipeline.Files.Length == 0)
+ {
+ ProcessHelper.Log(nameof(ESBuildGenerator),
+ "ESBuild Source Generator no files changed.",
+ DiagnosticSeverity.Info,
+ context);
+
+ return;
+ }
+
+ var parsedOptions = ParseOptions(pipeline.Options, context);
+
+ if (parsedOptions is null)
+ {
+ return;
+ }
+
+ var options = parsedOptions.Value;
+
+ if (options.GBBuildToolsPath is null)
+ {
+ ProcessHelper.Log(nameof(ESBuildGenerator),
+ "ESBuild Source Generation skipped due to missing configuration settings.",
+ DiagnosticSeverity.Info,
+ context);
+
+ return;
+ }
+
+ ClearESBuildLocks(options, context);
+ }
+
+ private static ESBuildGeneratorOptions? ParseOptions(Dictionary options,
+ SourceProductionContext context)
+ {
+ try
+ {
+ // Use TryGetValue to safely access dictionary keys
+ options.TryGetValue(GB_BUILD_TOOLS_PATH, out var gbBuildToolsPath);
+
+ // For boolean values, provide defaults if not found
+ var designTimeBuild = false;
+
+ if (options.TryGetValue(DESIGN_TIME_BUILD, out var designTimeBuildStr))
+ {
+ bool.TryParse(designTimeBuildStr, out designTimeBuild);
+ }
+
+ return new ESBuildGeneratorOptions(gbBuildToolsPath, designTimeBuild);
+ }
+ catch (Exception ex)
+ {
+ ProcessHelper.Log(nameof(ESBuildGenerator),
+ $"Error parsing configuration settings: {ex.Message}",
+ DiagnosticSeverity.Error, context);
+
+ return null;
+ }
+ }
+
+ private static void ClearESBuildLocks(ESBuildGeneratorOptions options,
+ SourceProductionContext context)
+ {
+ string[] args = options.DesignTimeBuild
+ ? ["ESBuildClearLocks.dll"]
+
+ // only remove stale files during a full build
+ : ["ESBuildClearLocks.dll", "--stale-files"];
+
+ _ = Task.Run(async () => await ProcessHelper.Execute("Clear Locks",
+ options.GBBuildToolsPath!, "dotnet",
+ args, context, false, null));
+
+ ProcessHelper.Log(nameof(ESBuildGenerator),
+ "Cleared ESBuild Process Locks",
+ DiagnosticSeverity.Info,
+ context);
+ }
+
+ private const string GB_BUILD_TOOLS_PATH = "GBBuildToolsPath";
+ private const string DESIGN_TIME_BUILD = "DesignTimeBuild";
+ private const string BUILD_PROPERTY = "build_property";
+}
+
+public record struct ESBuildGeneratorOptions(
+ string? GBBuildToolsPath,
+ bool DesignTimeBuild);
\ No newline at end of file
diff --git a/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/ProcessHelper.cs b/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/ProcessHelper.cs
index 5b03afc2f..605bb5c80 100644
--- a/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/ProcessHelper.cs
+++ b/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/ProcessHelper.cs
@@ -15,6 +15,11 @@ namespace dymaptic.GeoBlazor.Core.SourceGenerator.Shared;
///
public static class ProcessHelper
{
+ ///
+ /// Set this to true to bypass actual process execution and script execution for testing purposes.
+ ///
+ public static bool TestBypass { get; set; }
+
///
/// Executes a PowerShell script file with the specified arguments.
///
@@ -22,12 +27,17 @@ public static class ProcessHelper
/// The working directory for the script execution.
/// The name of the PowerShell script file to execute.
/// Command-line arguments to pass to the script.
- /// A StringBuilder to accumulate log output.
/// The SourceProductionContext for diagnostic reporting.
+ ///
+ /// Whether to show console output for the process. If true, verbose output is shown.
+ ///
+ ///
+ /// The session ID to use for logging.
+ ///
/// Optional environment variables to set for the process.
public static async Task RunPowerShellScript(string processName, string workingDirectory,
- string powershellScriptName, string[] arguments, StringBuilder logBuilder, SourceProductionContext context,
- Dictionary? environmentVariables = null)
+ string powershellScriptName, string[] arguments, SourceProductionContext context, bool showConsole,
+ string? sessionId, Dictionary? environmentVariables = null)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
@@ -50,7 +60,7 @@ public static async Task RunPowerShellScript(string processName, string workingD
];
}
- await Execute(processName, workingDirectory, "pwsh", arguments, logBuilder, context,
+ await Execute(processName, workingDirectory, "pwsh", arguments, context, showConsole, sessionId,
environmentVariables);
}
@@ -60,11 +70,16 @@ await Execute(processName, workingDirectory, "pwsh", arguments, logBuilder, cont
/// A descriptive name for the process, used in logging.
/// The working directory for the command execution.
/// The PowerShell command to execute.
- /// A StringBuilder to accumulate log output.
/// The SourceProductionContext for diagnostic reporting.
+ ///
+ /// Whether to show console output for the process. If true, verbose output is shown.
+ ///
+ ///
+ /// The session ID to use for logging.
+ ///
/// Optional environment variables to set for the process.
public static async Task RunPowerShellCommand(string processName, string workingDirectory,
- string[] arguments, StringBuilder logBuilder, SourceProductionContext context,
+ string[] arguments, SourceProductionContext context, bool showConsole, string? sessionId,
Dictionary? environmentVariables = null)
{
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
@@ -81,7 +96,7 @@ public static async Task RunPowerShellCommand(string processName, string working
];
}
- await Execute(processName, workingDirectory, "pwsh", arguments, logBuilder, context,
+ await Execute(processName, workingDirectory, "pwsh", arguments, context, showConsole, sessionId,
environmentVariables);
}
@@ -92,25 +107,40 @@ await Execute(processName, workingDirectory, "pwsh", arguments, logBuilder, cont
/// The working directory for the process execution.
/// The executable file name. If null, uses the platform-specific shell command.
/// Command-line arguments to pass to the process.
- /// A StringBuilder to accumulate log output.
/// The SourceProductionContext for diagnostic reporting.
+ ///
+ /// Whether to show console output for the process. If true, verbose output is shown.
+ ///
+ ///
+ /// The session ID to use for logging.
+ ///
/// Optional environment variables to set for the process.
/// Thrown when the process exits with a non-zero exit code.
public static async Task Execute(string processName, string workingDirectory, string? fileName,
- string[] shellArguments, StringBuilder logBuilder, SourceProductionContext context,
+ string[] shellArguments, SourceProductionContext context, bool showConsole, string? sessionId,
Dictionary? environmentVariables = null)
{
fileName ??= shellCommand;
- StringBuilder outputBuilder = new();
+ Log(processName, $"Starting process execution: {processName} {string.Join(" ", shellArguments)}",
+ DiagnosticSeverity.Info, context, showConsole, sessionId);
+
+ if (TestBypass)
+ {
+ Log(processName, $"Command '{fileName} {string.Join(" ", shellArguments)}' completed successfully.",
+ DiagnosticSeverity.Info, context, showConsole, sessionId);
+
+ return;
+ }
+
int? processId = null;
int? exitCode = null;
context.CancellationToken.Register(() =>
{
- logBuilder.AppendLine($"{processName}: Command execution cancelled.");
- logBuilder.AppendLine(outputBuilder.ToString());
- outputBuilder.Clear();
+ Log(processName, "Command execution cancelled.",
+ DiagnosticSeverity.Info, context,
+ showConsole, sessionId);
});
Command cmd = Cli.Wrap(fileName)
@@ -119,49 +149,70 @@ public static async Task Execute(string processName, string workingDirectory, st
.WithValidation(CommandResultValidation.None)
.WithEnvironmentVariables(environmentVariables ?? new Dictionary());
+ bool retry = false;
+
+ // build up the input in case we need it for writing to an error
+ StringBuilder errorBuilder = new();
+ bool errorFound = false;
+
await foreach (var cmdEvent in cmd.ListenAsync(context.CancellationToken))
{
switch (cmdEvent)
{
case StartedCommandEvent started:
processId = started.ProcessId;
- outputBuilder.AppendLine($" - {processName} Process started: {started.ProcessId}");
- outputBuilder.AppendLine($" - {processName} - PID {processId}: Executing command: {fileName} {
- string.Join(" ", shellArguments)}");
+ Log(processName, $"Process {processId} started.",
+ DiagnosticSeverity.Info, context,
+ showConsole, sessionId);
break;
case StandardOutputCommandEvent stdOut:
string line = stdOut.Text.Trim();
- outputBuilder.AppendLine($" - {processName} - PID {processId}: [stdout] {line}");
+
+ Log(processName, $"Process {processId} - [stdout] {line}",
+ DiagnosticSeverity.Info, context,
+ showConsole, sessionId);
+
+ if (line.Contains("error", StringComparison.OrdinalIgnoreCase) || errorFound)
+ {
+ errorBuilder.AppendLine(line);
+ errorFound = true;
+ }
+
+ if (fileName == "dotnet" && stdOut.Text.Contains("The process cannot access the file"))
+ {
+ retry = true;
+ }
break;
case StandardErrorCommandEvent stdErr:
- outputBuilder.AppendLine($" - {processName} - PID {processId}: [stderr] {stdErr.Text}");
+ Log(processName, $"Process {processId} - [stderr] {stdErr.Text}",
+ DiagnosticSeverity.Warning, context,
+ showConsole, sessionId);
+
+ errorBuilder.AppendLine(stdErr.Text);
+
+ if (fileName == "dotnet" && stdErr.Text.Contains("The process cannot access the file"))
+ {
+ retry = true;
+ }
break;
case ExitedCommandEvent exited:
exitCode = exited.ExitCode;
- outputBuilder.AppendLine($" - {processName} - PID {processId}: Process exited with code: {
- exited.ExitCode}");
+ Log(processName, $"Process {processId} exited with code: {exited.ExitCode}",
+ DiagnosticSeverity.Info, context,
+ showConsole, sessionId);
break;
}
}
- // Append any accumulated output to the log
- if (outputBuilder.Length > 0)
- {
- logBuilder.AppendLine(outputBuilder.ToString());
- }
-
if (exitCode != 0)
{
- var response = logBuilder.ToString();
- Log(processName, response, DiagnosticSeverity.Info, context);
-
- if (response.Contains("The process cannot access the file") && (fileName == "dotnet"))
+ if (retry)
{
var programName = shellArguments[1]; // dotnet[fileName] run[arg[0]] ESBuild.cs[arg[1]]
@@ -183,24 +234,23 @@ public static async Task Execute(string processName, string workingDirectory, st
await Task.Delay(500);
- await Execute(processName, workingDirectory, fileName, shellArguments, logBuilder, context,
+ await Execute(processName, workingDirectory, fileName, shellArguments, context, showConsole, sessionId,
environmentVariables);
return;
}
Log(processName,
- $"Command '{fileName} {string.Join(" ", shellArguments)}' failed with exit code {exitCode}.",
+ $"Command '{fileName} {string.Join(" ", shellArguments)}' failed with exit code {exitCode}. {
+ errorBuilder}",
DiagnosticSeverity.Error,
context);
return;
}
- // Return the standard output if the process completed normally
- logBuilder.AppendLine($" - {processName}: Command '{string.Join(" ", shellArguments)
- }' completed successfully on process {processId
- }.");
+ Log(processName, $"Command '{fileName} {string.Join(" ", shellArguments)}' completed successfully.",
+ DiagnosticSeverity.Info, context, showConsole, sessionId);
}
///
@@ -314,12 +364,20 @@ private static void ShowOrUpdateConsole(string title, string message, string? se
}
}
+ var os = RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
+ ? "win"
+ : RuntimeInformation.IsOSPlatform(OSPlatform.OSX)
+ ? "osx"
+ : "linux";
+ var arch = RuntimeInformation.OSArchitecture.ToString().ToLowerInvariant();
+
var buildScriptPath = Path.GetFullPath(Path.Combine(
Path.GetDirectoryName(
callerFilePath)!, // GeoBlazor/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared
"..", // GeoBlazor/src
"..", // GeoBlazor Core repo root
- "build-tools"));
+ "build-tools",
+ $"{os}-{arch}"));
string[] args =
[
diff --git a/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/ProtobufDefinitionsGenerator.cs b/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/ProtobufDefinitionsGenerator.cs
index 76b3318dd..96b444222 100644
--- a/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/ProtobufDefinitionsGenerator.cs
+++ b/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/ProtobufDefinitionsGenerator.cs
@@ -36,7 +36,6 @@ public static Dictionary UpdateProtobufDefinitio
"\n" => "\\n",
_ => match.Value
});
- StringBuilder logBuilder = new();
var scriptPath = Path.Combine(corePath, "copyProtobuf.ps1");
@@ -45,15 +44,10 @@ public static Dictionary UpdateProtobufDefinitio
ProcessHelper.RunPowerShellScript("Copy Protobuf Definitions",
corePath, scriptPath,
["-Content", encoded],
- logBuilder, context)
+ context, showDialog, sessionId)
.GetAwaiter()
.GetResult();
- ProcessHelper.Log(nameof(ProtobufDefinitionsGenerator),
- logBuilder.ToString(),
- DiagnosticSeverity.Info,
- context, sessionId: sessionId);
-
ProcessHelper.Log(nameof(ProtobufDefinitionsGenerator),
"Protobuf definitions updated successfully.",
DiagnosticSeverity.Info,
diff --git a/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/SerializationGenerator.cs b/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/SerializationGenerator.cs
index 27d92c4d0..aea7c8b6b 100644
--- a/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/SerializationGenerator.cs
+++ b/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/SerializationGenerator.cs
@@ -1,4 +1,5 @@
using Microsoft.CodeAnalysis;
+using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using System.Collections.Immutable;
using System.Text;
@@ -121,36 +122,38 @@ private static string GenerateExtensionMethods(Dictionary
/// Convenience method to deserialize an to a specific type via protobuf.
///
- public static async Task ReadJsStreamReferenceAsProtobuf(this IJSStreamReference jsStreamReference,
- Type returnType, long maxAllowedSize = 1_000_000_000)
+ public static partial async Task ReadJsStreamReferenceAsProtobuf(this IJSStreamReference jsStreamReference,
+ Type returnType, long? maxAllowedSize, CancellationToken cancellationToken)
{
- await using Stream stream = await jsStreamReference.OpenReadStreamAsync(maxAllowedSize);
+ maxAllowedSize ??= 1_000_000_000L;
+ await using Stream stream = await jsStreamReference.OpenReadStreamAsync(maxAllowedSize.Value);
using MemoryStream memoryStream = new();
await stream.CopyToAsync(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
-
+
string typeName = returnType.Name.Replace("SerializationRecord", "");
- switch (typeName)
+ switch (typeName)
{
""");
StringBuilder readJsProtoCollectionStreamRefMethod = new("""
///
- /// Convenience method to deserialize an to a specific coolection type via protobuf.
+ /// Convenience method to deserialize an to a specific collection type via protobuf.
///
- public static async Task ReadJsStreamReferenceAsProtobufCollection(this IJSStreamReference jsStreamReference,
- Type returnType, long maxAllowedSize = 1_000_000_000)
+ public static partial async Task ReadJsStreamReferenceAsProtobufCollection(this IJSStreamReference jsStreamReference,
+ Type returnType, long? maxAllowedSize, CancellationToken cancellationToken)
{
- await using Stream stream = await jsStreamReference.OpenReadStreamAsync(maxAllowedSize);
+ maxAllowedSize ??= 1_000_000_000L;
+ await using Stream stream = await jsStreamReference.OpenReadStreamAsync(maxAllowedSize.Value);
using MemoryStream memoryStream = new();
await stream.CopyToAsync(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
-
+
string typeName = returnType.Name.Replace("SerializationRecord", "");
- switch (typeName)
+ switch (typeName)
{
""");
@@ -181,7 +184,7 @@ private static string GenerateExtensionMethods(Dictionary
/// Convenience method to generate a Protobuf serialized parameter.
///
- public static object ToProtobufParameter(this object value, Type serializableType, bool isServer)
+ public static partial object ToProtobufParameter(this object value, Type serializableType, bool isServer)
{
MemoryStream memoryStream = new();
switch (serializableType.Name)
@@ -193,7 +196,7 @@ public static object ToProtobufParameter(this object value, Type serializableTyp
///
/// Convenience method to generate a Protobuf serialized collection parameter.
///
- public static object ToProtobufCollectionParameter(this IList items, Type serializableType, bool isServer)
+ public static partial object ToProtobufCollectionParameter(this IList items, Type serializableType, bool isServer)
{
MemoryStream memoryStream = new();
string typeName = $"{serializableType.Name}Collection";
@@ -229,32 +232,31 @@ public static object ToProtobufCollectionParameter(this IList items, Type serial
readJsProtoStreamRefMethod.AppendLine($$"""
case "{{protoSerializableType}}":
- {{serializationRecordType}} {{variableName}} =
+ {{serializationRecordType}} {{variableName}} =
Serializer.Deserialize<{{serializationRecordType
}}>(memoryStream);
if ({{variableName}}.IsNull)
{
- return default!;
+ return null;
}
- return (T?)(object?){{variableName
- }}?.FromSerializationRecord();
+ return {{variableName}}.FromSerializationRecord();
""");
readJsProtoCollectionStreamRefMethod.AppendLine($$"""
case "{{protoSerializableType}}":
{{serializationCollectionRecordType}} {{
- variableName}} =
+ variableName}} =
Serializer.Deserialize<{{
serializationCollectionRecordType
}}>(memoryStream);
if ({{variableName}}.IsNull)
{
- return default!;
+ return null;
}
- return (T?)(object?){{variableName
+ return {{variableName
}}
- ?.Items?.Select(i => i.FromSerializationRecord()).Cast<{{
- protoSerializableType}}>().ToArray();
+ .Items?.Select(i => i.FromSerializationRecord()).Cast().ToArray();
+
""");
if (definition.Name == "Attribute")
@@ -295,15 +297,15 @@ public static object ToProtobufCollectionParameter(this IList items, Type serial
readJsProtoStreamRefMethod.AppendLine("""
}
-
- return default!;
+
+ return null;
}
""");
readJsProtoCollectionStreamRefMethod.AppendLine("""
}
-
- return default!;
+
+ return null;
}
""");
@@ -390,15 +392,25 @@ private static string GenerateSerializableMethodRecords(
""");
}
- foreach (var classGroup in serializedMethodsCollection.GroupBy(m => m.ClassName))
+ List> classGroups = serializedMethodsCollection
+ .GroupBy(m => m.ClassName)
+ .ToList();
+
+ for (int i = 0; i < classGroups.Count; i++)
{
+ IGrouping classGroup = classGroups[i];
+
outputBuilder.AppendLine($$"""
["{{classGroup.Key}}"] =
[
""");
- foreach (var methodRecord in classGroup)
+ List methodRecords = classGroup.ToList();
+
+ for (int j = 0; j < methodRecords.Count; j++)
{
+ SerializableMethodRecord methodRecord = methodRecords[j];
+
if (methodRecord.Parameters.Values.Contains("T")
|| methodRecord.Parameters.Values.Contains("T?")
|| (methodRecord.ReturnType == "T")
@@ -416,58 +428,58 @@ private static string GenerateSerializableMethodRecords(
[
""");
- foreach (var param in methodRecord.Parameters)
+ List parameters = methodRecord.Parameters.Values.ToList();
+
+ for (int k = 0; k < parameters.Count; k++)
{
- bool isNullable = param.Value.EndsWith("?");
- string value = isNullable ? param.Value.TrimEnd('?') : param.Value;
- string isNullableText = isNullable ? "true" : "false";
- string? collectionType = null;
+ string param = parameters[k];
+ outputBuilder.Append(GenerateSerializableParameterRecord(param, 24));
- if (value.EndsWith("[]"))
+ if (k < parameters.Count - 1)
{
- collectionType = value.Replace("[]", "");
+ outputBuilder.AppendLine(",");
}
- else if (value.Contains("<") && value.Contains(">"))
+ else
{
- int genericStart = value.IndexOf("<", StringComparison.OrdinalIgnoreCase);
- collectionType = value.Substring(genericStart + 1, value.Length - genericStart - 2);
+ outputBuilder.AppendLine();
}
-
- string collectionText = collectionType is null
- ? "null"
- : $"typeof({collectionType})";
-
- outputBuilder.AppendLine($" new SerializableParameterRecord(typeof({value
- }), {isNullableText}, {collectionText}),");
}
if (methodRecord.ReturnType != null)
{
- string returnValue = methodRecord.ReturnType.TrimEnd('?');
-
- bool isCollectionReturn = returnValue.EndsWith("[]") ||
- (returnValue.Contains("<") && returnValue.Contains(">"));
-
- string singleType = isCollectionReturn
- ? returnValue.Contains("<") && returnValue.Contains(">")
- ? $"typeof({returnValue.Substring(
- returnValue.IndexOf("<", StringComparison.OrdinalIgnoreCase) + 1,
- returnValue.Length - returnValue.IndexOf("<", StringComparison.OrdinalIgnoreCase) - 2)
- })"
- : $"typeof({returnValue.Replace("[]", "")})"
- : "null";
- string isNullable = methodRecord.ReturnType.EndsWith("?") ? "true" : "false";
-
- outputBuilder.AppendLine($" ], new SerializableParameterRecord(typeof({
- returnValue}), {isNullable}, {singleType})),");
+ outputBuilder.AppendLine(" ],");
+ outputBuilder.Append(GenerateSerializableParameterRecord(methodRecord.ReturnType, 20));
+
+ if (j < methodRecords.Count - 1)
+ {
+ outputBuilder.AppendLine("),");
+ }
+ else
+ {
+ outputBuilder.AppendLine(")");
+ }
}
else
{
- outputBuilder.AppendLine(" ])),");
+ if (j < methodRecords.Count - 1)
+ {
+ outputBuilder.AppendLine(" ]),");
+ }
+ else
+ {
+ outputBuilder.AppendLine(" ]");
+ }
}
}
- outputBuilder.AppendLine(" ],");
+ if (i < classGroups.Count - 1)
+ {
+ outputBuilder.AppendLine(" ],");
+ }
+ else
+ {
+ outputBuilder.AppendLine(" ]");
+ }
}
outputBuilder.AppendLine(" };");
@@ -475,6 +487,42 @@ private static string GenerateSerializableMethodRecords(
return outputBuilder.ToString();
}
+ private static string GenerateSerializableParameterRecord(string value, int indent)
+ {
+ bool isNullable = value.EndsWith("?");
+ string trimmedValue = value.Replace("?", ""); // replace all ?, even in the inner single type
+ string isNullableText = isNullable ? "true" : "false";
+ string? singleType = null;
+
+ if (trimmedValue.EndsWith("[]")) // check against the trimmed version without ?
+ {
+ // use untrimmed value again to restore ? in the single types
+ int arrayStart = value.IndexOf("[", StringComparison.OrdinalIgnoreCase);
+ singleType = value.Substring(0, arrayStart);
+ }
+ else if (value.Contains("<") && trimmedValue.Contains(">"))
+ {
+ // use param.Value again to restore ? in the single types
+ int genericStart = value.IndexOf("<", StringComparison.OrdinalIgnoreCase);
+ singleType = value.Substring(genericStart + 1, trimmedValue.Length - genericStart - 2);
+ }
+
+ bool singleTypeIsNullable = singleType?.EndsWith("?") == true;
+ string singleTypeIsNullableText = singleTypeIsNullable ? "true" : "false";
+ singleType = singleType?.Replace("?", "");
+
+ string collectionText = singleType is null
+ ? "null"
+ : $"typeof({singleType})";
+
+ string padding = new string(' ', indent);
+
+ return $"""
+ {padding}new SerializableParameterRecord(typeof({trimmedValue}), {isNullableText},
+ {padding} {collectionText}, {singleTypeIsNullableText})
+ """;
+ }
+
private static List ToSerializableMethodRecords(this BaseTypeDeclarationSyntax typeSyntax)
{
List methods = typeSyntax
@@ -497,10 +545,21 @@ private static List ToSerializableMethodRecords(this B
returnType = returnType.Substring(bracketIndex + 1, returnType.Length - bracketIndex - 2);
}
+ // For static extension methods, skip the 'this' parameter
+ var parameters = method.Modifiers
+ .Any(m => m.IsKind(SyntaxKind.StaticKeyword))
+ ? method.ParameterList.Parameters
+ .Where(p => !p.Modifiers
+ .Any(m => m.IsKind(SyntaxKind.ThisKeyword)))
+ .ToDictionary(p => p.Identifier.Text,
+ p => p.Type!.ToString())
+ : method.ParameterList.Parameters
+ .ToDictionary(p => p.Identifier.Text,
+ p => p.Type!.ToString());
+
SerializableMethodRecord record = new(typeSyntax.Identifier.Text,
method.Identifier.Text,
- method.ParameterList.Parameters.ToDictionary(p => p.Identifier.Text,
- p => p.Type!.ToString()),
+ parameters,
returnType);
methodRecords.Add(record);
diff --git a/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/dymaptic.GeoBlazor.Core.SourceGenerator.Shared.csproj b/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/dymaptic.GeoBlazor.Core.SourceGenerator.Shared.csproj
index 3737db384..4c762f2d3 100644
--- a/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/dymaptic.GeoBlazor.Core.SourceGenerator.Shared.csproj
+++ b/src/dymaptic.GeoBlazor.Core.SourceGenerator.Shared/dymaptic.GeoBlazor.Core.SourceGenerator.Shared.csproj
@@ -12,6 +12,6 @@
-
+
diff --git a/src/dymaptic.GeoBlazor.Core.SourceGenerator/CoreESBuildGenerator.cs b/src/dymaptic.GeoBlazor.Core.SourceGenerator/CoreESBuildGenerator.cs
new file mode 100644
index 000000000..93807bdc0
--- /dev/null
+++ b/src/dymaptic.GeoBlazor.Core.SourceGenerator/CoreESBuildGenerator.cs
@@ -0,0 +1,34 @@
+using dymaptic.GeoBlazor.Core.SourceGenerator.Shared;
+using Microsoft.CodeAnalysis;
+using System.Diagnostics.CodeAnalysis;
+
+
+namespace dymaptic.GeoBlazor.Core.SourceGenerator;
+
+///
+/// Triggers the ESBuild build process for the GeoBlazor project, so that your JavaScript code is up to date.
+///
+[Generator]
+[SuppressMessage("MicrosoftCodeAnalysisCorrectness", "RS1035:Do not use APIs banned for analyzers")]
+public class CoreESBuildGenerator : IIncrementalGenerator
+{
+ ///
+ public void Initialize(IncrementalGeneratorInitializationContext context)
+ {
+ // Tracks all TypeScript source files in the Scripts directories of Core and Pro.
+ // This will trigger the build any time a TypeScript file is added, removed, or changed.
+ var tsFilesProvider = context
+ .AdditionalTextsProvider
+ .Where(static text => text.Path.Contains("Scripts") && text.Path.EndsWith(".ts"))
+ .Collect();
+
+ // Reads the MSBuild properties to get the project directory and configuration.
+ var optionsProvider =
+ context.AnalyzerConfigOptionsProvider.Select(ESBuildGenerator.ConfigSelector);
+
+ var combined =
+ tsFilesProvider.Combine(optionsProvider);
+
+ context.RegisterSourceOutput(combined, (ctx, pipeline) => ESBuildGenerator.FilesChanged(ctx, pipeline));
+ }
+}
\ No newline at end of file
diff --git a/src/dymaptic.GeoBlazor.Core.SourceGenerator/ESBuildGenerator.cs b/src/dymaptic.GeoBlazor.Core.SourceGenerator/ESBuildGenerator.cs
deleted file mode 100644
index ea8489806..000000000
--- a/src/dymaptic.GeoBlazor.Core.SourceGenerator/ESBuildGenerator.cs
+++ /dev/null
@@ -1,279 +0,0 @@
-using dymaptic.GeoBlazor.Core.SourceGenerator.Shared;
-using Microsoft.CodeAnalysis;
-using System.Collections.Immutable;
-using System.Diagnostics.CodeAnalysis;
-using System.Text;
-
-
-namespace dymaptic.GeoBlazor.Core.SourceGenerator;
-
-///
-/// Triggers the ESBuild build process for the GeoBlazor project, so that your JavaScript code is up to date.
-///
-[Generator]
-[SuppressMessage("MicrosoftCodeAnalysisCorrectness", "RS1035:Do not use APIs banned for analyzers")]
-public class ESBuildGenerator : IIncrementalGenerator
-{
- private static string? BuildToolsPath => _corePath is null
- ? null
- : Path.GetFullPath(Path.Combine(_corePath, "..", "..", "build-tools"));
-
- ///
- public void Initialize(IncrementalGeneratorInitializationContext context)
- {
- // Tracks all TypeScript source files in the Scripts directories of Core and Pro.
- // This will trigger the build any time a TypeScript file is added, removed, or changed.
- IncrementalValueProvider> tsFilesProvider = context.AdditionalTextsProvider
- .Where(static text => text.Path.Contains("Scripts")
- && text.Path.EndsWith(".ts"))
- .Collect();
-
- // Reads the MSBuild properties to get the project directory and configuration.
- IncrementalValueProvider<(string?, string?, string?, string?)> optionsProvider =
- context.AnalyzerConfigOptionsProvider.Select((configProvider, _) =>
- {
- configProvider.GlobalOptions.TryGetValue("build_property.CoreProjectPath",
- out string? projectDirectory);
-
- configProvider.GlobalOptions.TryGetValue("build_property.Configuration",
- out string? configuration);
-
- configProvider.GlobalOptions.TryGetValue("build_property.PipelineBuild",
- out string? pipelineBuild);
-
- configProvider.GlobalOptions.TryGetValue("build_property.DesignTimeBuild",
- out var designTimeBuild);
-
- return (projectDirectory, configuration, pipelineBuild, designTimeBuild);
- });
-
- var
- combined =
- tsFilesProvider.Combine(optionsProvider);
-
- context.RegisterSourceOutput(combined, FilesChanged);
- }
-
- private void FilesChanged(SourceProductionContext context,
- (ImmutableArray Files,
- (string? ProjectDirectory, string? Configuration, string? PipelineBuild, string? DesignTimeBuild) Options)
- pipeline)
- {
- if (!SetProjectDirectoryAndConfiguration(pipeline.Options, context))
- {
- return;
- }
-
- ProcessHelper.Log(nameof(ESBuildGenerator),
- "ESBuild Source Generation triggered.",
- DiagnosticSeverity.Info,
- context);
-
- if (pipeline.Options.PipelineBuild == "true")
- {
- // If the pipeline build is enabled, we skip the ESBuild process.
- // This is to avoid race conditions where the files are not ready on time, and we do the build separately.
- ProcessHelper.Log(nameof(ESBuildGenerator),
- "Skipping ESBuild process as PipelineBuild is set to true.",
- DiagnosticSeverity.Info,
- context);
-
- return;
- }
-
- if (pipeline.Files.Length > 0)
- {
- LaunchESBuild(context);
- }
- }
-
- private bool SetProjectDirectoryAndConfiguration(
- (string? ProjectDirectory, string? Configuration, string? _, string? DesignTimeBuild) options,
- SourceProductionContext context)
- {
- string? projectDirectory = options.ProjectDirectory;
-
- if (projectDirectory is not null)
- {
- _corePath = Path.GetFullPath(projectDirectory);
-
- ProcessHelper.Log(nameof(ESBuildGenerator),
- $"Project directory set to {_corePath}",
- DiagnosticSeverity.Info,
- context);
-
- if (_corePath.Contains("GeoBlazor.Pro"))
- {
- // we are inside the Pro submodule, we should also set the Pro path to build the Pro JavaScript files
- string path = _corePath;
-
- while (!path.EndsWith("GeoBlazor.Pro"))
- {
- // move up the directory tree until we find the GeoBlazor.Pro directory
- path = Path.GetDirectoryName(path)!;
- }
-
- // set the pro path to the src/dymaptic.GeoBlazor.Pro directory
- _proPath = Path.GetFullPath(Path.Combine(path, "src", "dymaptic.GeoBlazor.Pro"));
- }
- }
- else
- {
- ProcessHelper.Log(nameof(ESBuildGenerator),
- "Invalid project directory.",
- DiagnosticSeverity.Error,
- context);
-
- return false;
- }
-
- if (options.Configuration is { } configuration)
- {
- _configuration = configuration;
- _isDesignTimeBuild = options.DesignTimeBuild == "true";
-
- return true;
- }
-
- ProcessHelper.Log(nameof(ESBuildGenerator),
- "Could not parse configuration setting, invalid configuration.",
- DiagnosticSeverity.Error,
- context);
-
- return false;
- }
-
- private void LaunchESBuild(SourceProductionContext context)
- {
- context.CancellationToken.ThrowIfCancellationRequested();
-
- ProcessHelper.Log(nameof(ESBuildGenerator),
- "Starting Core ESBuild process...",
- DiagnosticSeverity.Info,
- context);
-
- StringBuilder logBuilder = new StringBuilder(DateTime.Now.ToLongTimeString());
- logBuilder.AppendLine();
- logBuilder.AppendLine("Starting Core ESBuild process...");
-
- try
- {
- List tasks = [];
- bool buildSuccess = false;
- bool proBuildSuccess = false;
-
- // gets the ESBuild.cs script
- // Only show dialog on full compilation builds, not design-time builds
- string[] coreArgs =
- [
- "ESBuild.dll",
- "-c", _configuration!, // set config for ESBuild
- "-d" // show dialog
- ];
-
- if (!_isDesignTimeBuild)
- {
- coreArgs = [..coreArgs, "-v"]; // show verbose output
- }
-
- tasks.Add(Task.Run(async () =>
- {
- await ProcessHelper.Execute("Core",
- BuildToolsPath!, "dotnet",
- coreArgs, logBuilder, context);
- buildSuccess = true;
- }));
-
- if (_proPath is not null)
- {
- logBuilder.AppendLine("Starting Pro ESBuild process...");
-
- string[] proArgs =
- [
- "ESBuild.dll",
- "-c", _configuration!, // set config for ESBuild
- "-d", // show dialog
- "--pro" // build for Pro project
- ];
-
- if (!_isDesignTimeBuild)
- {
- proArgs = [..proArgs, "-v"]; // show verbose output
- }
-
- tasks.Add(Task.Run(async () =>
- {
- await ProcessHelper.Execute("Pro",
- BuildToolsPath!, "dotnet",
- proArgs, logBuilder, context);
- proBuildSuccess = true;
- }));
- }
-
- Task.WhenAll(tasks).GetAwaiter().GetResult();
-
- if (!buildSuccess)
- {
- ProcessHelper.Log(nameof(ESBuildGenerator),
- $"Core ESBuild process failed\r\n{logBuilder}",
- DiagnosticSeverity.Error,
- context);
-
- return;
- }
-
- logBuilder.AppendLine("Core ESBuild process completed successfully.");
- logBuilder.AppendLine();
-
- if (_proPath is not null)
- {
- if (!proBuildSuccess)
- {
- ProcessHelper.Log(nameof(ESBuildGenerator),
- $"Pro ESBuild process failed\r\n{logBuilder}",
- DiagnosticSeverity.Error,
- context);
-
- return;
- }
-
- logBuilder.AppendLine("Pro ESBuild process completed successfully.");
- logBuilder.AppendLine();
- }
-
- ProcessHelper.Log(nameof(ESBuildGenerator),
- logBuilder.ToString(),
- DiagnosticSeverity.Info,
- context);
- }
- catch (Exception ex)
- {
- ProcessHelper.Log(nameof(ESBuildGenerator),
- $"An error occurred while running ESBuild: {ex.Message}\r\n{ex.StackTrace}",
- DiagnosticSeverity.Error,
- context);
-
- ClearESBuildLocks(context);
- }
- }
-
- private void ClearESBuildLocks(SourceProductionContext context)
- {
- StringBuilder logBuilder = new();
-
- _ = Task.Run(async () => await ProcessHelper.Execute("Clear Locks",
- BuildToolsPath!, "dotnet",
- ["ESBuildClearLocks.dll"],
- logBuilder, context));
-
- ProcessHelper.Log(nameof(ESBuildGenerator),
- "Cleared ESBuild Process Locks",
- DiagnosticSeverity.Info,
- context);
- }
-
- private static string? _corePath;
- private static string? _proPath;
- private static string? _configuration;
- private static bool _isDesignTimeBuild;
-}
\ No newline at end of file
diff --git a/src/dymaptic.GeoBlazor.Core.SourceGenerator/ProtobufSourceGenerator.cs b/src/dymaptic.GeoBlazor.Core.SourceGenerator/ProtobufSourceGenerator.cs
index c1c6e068c..7cb8df618 100644
--- a/src/dymaptic.GeoBlazor.Core.SourceGenerator/ProtobufSourceGenerator.cs
+++ b/src/dymaptic.GeoBlazor.Core.SourceGenerator/ProtobufSourceGenerator.cs
@@ -22,43 +22,69 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
context.SyntaxProvider.CreateSyntaxProvider(static (syntaxNode, _) =>
syntaxNode is ClassDeclarationSyntax or StructDeclarationSyntax or RecordDeclarationSyntax
&& (((BaseTypeDeclarationSyntax)syntaxNode).AttributeLists.SelectMany(a => a.Attributes)
- .Any(a => a.Name.ToString() is ProtoContractAttribute or ProtoSerializableAttribute)
+ .Any(a => a.Name.ToString() is PROTO_CONTRACT_ATTRIBUTE or PROTO_SERIALIZABLE_ATTRIBUTE)
|| syntaxNode.ChildNodes()
.OfType()
.Any(m => m.AttributeLists
.SelectMany(a => a.Attributes)
- .Any(attr => attr.Name.ToString() == SerializedMethodAttributeName))),
+ .Any(attr => attr.Name.ToString() == SERIALIZED_METHOD_ATTRIBUTE_NAME))),
static (context, _) => (BaseTypeDeclarationSyntax)context.Node)
.Collect();
// Reads the MSBuild properties to get the project directory.
- IncrementalValueProvider<(string?, string?)> optionsProvider =
+ IncrementalValueProvider> optionsProvider =
context.AnalyzerConfigOptionsProvider.Select((configProvider, _) =>
{
- configProvider.GlobalOptions.TryGetValue("build_property.CoreProjectPath",
- out var projectDirectory);
+ Dictionary options = [];
- configProvider.GlobalOptions.TryGetValue("build_property.PipelineBuild",
- out var pipelineBuild);
+ if (configProvider.GlobalOptions.TryGetValue("build_property.CoreProjectPath",
+ out var projectDirectory))
+ {
+ options["CoreProjectPath"] = projectDirectory;
+ }
+
+ if (configProvider.GlobalOptions.TryGetValue("build_property.DesignTimeBuild",
+ out var designTimeBuild))
+ {
+ options["DesignTimeBuild"] = designTimeBuild;
+ }
- return (projectDirectory, pipelineBuild);
+ if (configProvider.GlobalOptions.TryGetValue("build_property.ShowScriptDialogs",
+ out var showDialog))
+ {
+ options["ShowScriptDialogs"] = showDialog;
+ }
+
+ return options;
});
- IncrementalValueProvider<(ImmutableArray Left, (string?, string?) Right)> combined =
+ IncrementalValueProvider<(ImmutableArray Left,
+ Dictionary Right)> combined =
typeProvider.Combine(optionsProvider);
context.RegisterSourceOutput(combined, FilesChanged);
}
private void FilesChanged(SourceProductionContext context,
- (ImmutableArray Types, (string? ProjectDirectory, string? PipelineBuild) Options)
+ (ImmutableArray Types, Dictionary Options)
pipeline)
{
- _corePath = pipeline.Options.ProjectDirectory;
- var showDialog = pipeline.Options.PipelineBuild != "true";
+ pipeline.Options.TryGetValue("CoreProjectPath", out _corePath);
+ pipeline.Options.TryGetValue("DesignTimeBuild", out string? designTimeBuildString);
+
+ bool designTimeBuild = designTimeBuildString is not null
+ && bool.TryParse(designTimeBuildString, out bool designTimeBuildBool)
+ && designTimeBuildBool;
+
+ pipeline.Options.TryGetValue("ShowScriptDialogs", out var showDialogString);
+
+ bool showDialog = designTimeBuild
+ && showDialogString is not null
+ && bool.TryParse(showDialogString, out bool showDialogBool)
+ && showDialogBool;
// Generate a unique session ID for this build session
- var sessionId = $"{nameof(ProtobufSourceGenerator)}_{Guid.NewGuid():N}";
+ string sessionId = $"{nameof(ProtobufSourceGenerator)}_{Guid.NewGuid():N}";
if (pipeline.Types.Length > 0)
{
@@ -100,7 +126,7 @@ private void FilesChanged(SourceProductionContext context,
}
private static string? _corePath;
- private const string ProtoContractAttribute = "ProtoContract";
- private const string ProtoSerializableAttribute = "ProtobufSerializable";
- private const string SerializedMethodAttributeName = "SerializedMethod";
+ private const string PROTO_CONTRACT_ATTRIBUTE = "ProtoContract";
+ private const string PROTO_SERIALIZABLE_ATTRIBUTE = "ProtobufSerializable";
+ private const string SERIALIZED_METHOD_ATTRIBUTE_NAME = "SerializedMethod";
}
\ No newline at end of file
diff --git a/src/dymaptic.GeoBlazor.Core.SourceGenerator/dymaptic.GeoBlazor.Core.SourceGenerator.csproj b/src/dymaptic.GeoBlazor.Core.SourceGenerator/dymaptic.GeoBlazor.Core.SourceGenerator.csproj
index f84022e51..c0e63c031 100644
--- a/src/dymaptic.GeoBlazor.Core.SourceGenerator/dymaptic.GeoBlazor.Core.SourceGenerator.csproj
+++ b/src/dymaptic.GeoBlazor.Core.SourceGenerator/dymaptic.GeoBlazor.Core.SourceGenerator.csproj
@@ -12,7 +12,7 @@
-
diff --git a/src/dymaptic.GeoBlazor.Core.sln b/src/dymaptic.GeoBlazor.Core.sln
deleted file mode 100644
index fa5d43162..000000000
--- a/src/dymaptic.GeoBlazor.Core.sln
+++ /dev/null
@@ -1,310 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 18
-VisualStudioVersion = 18.0.11012.119
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{CDCDDCD6-6958-4352-AF0C-C589ECD51C0D}"
- ProjectSection(SolutionItems) = preProject
- ..\Directory.Build.props = ..\Directory.Build.props
- EndProjectSection
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dymaptic.GeoBlazor.Core", "dymaptic.GeoBlazor.Core\dymaptic.GeoBlazor.Core.csproj", "{92A18016-170A-42F3-B1F5-12CC306F796C}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dymaptic.GeoBlazor.Core.Sample.Shared", "..\samples\dymaptic.GeoBlazor.Core.Sample.Shared\dymaptic.GeoBlazor.Core.Sample.Shared.csproj", "{C993832C-734A-485F-A42B-30B620F32345}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dymaptic.GeoBlazor.Core.Sample.Wasm", "..\samples\dymaptic.GeoBlazor.Core.Sample.Wasm\dymaptic.GeoBlazor.Core.Sample.Wasm.csproj", "{79F14352-ACAD-4A53-84A2-C88237AD1497}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dymaptic.GeoBlazor.Core.Sample.Maui", "..\samples\dymaptic.GeoBlazor.Core.Sample.Maui\dymaptic.GeoBlazor.Core.Sample.Maui.csproj", "{08193B44-3A32-4836-96A0-44DEEA1E7556}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dymaptic.GeoBlazor.Core.Test.Unit", "..\test\dymaptic.GeoBlazor.Core.Test.Unit\dymaptic.GeoBlazor.Core.Test.Unit.csproj", "{48E045E3-F3FF-4D50-8987-83C1B8663E39}"
-EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "dymaptic.GeoBlazor.Core.Test.Blazor.Shared", "..\test\dymaptic.GeoBlazor.Core.Test.Blazor.Shared\dymaptic.GeoBlazor.Core.Test.Blazor.Shared.csproj", "{41CD66DB-1487-4F37-B2C6-3DB569116E89}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.Sample.WebApp", "..\samples\dymaptic.GeoBlazor.Core.Sample.WebApp\dymaptic.GeoBlazor.Core.Sample.WebApp\dymaptic.GeoBlazor.Core.Sample.WebApp.csproj", "{E69BF0F0-C621-4484-89AB-62ADBD889B3D}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.Sample.WebApp.Client", "..\samples\dymaptic.GeoBlazor.Core.Sample.WebApp\dymaptic.GeoBlazor.Core.Sample.WebApp.Client\dymaptic.GeoBlazor.Core.Sample.WebApp.Client.csproj", "{2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.Test.WebApp", "..\test\dymaptic.GeoBlazor.Core.Test.WebApp\dymaptic.GeoBlazor.Core.Test.WebApp\dymaptic.GeoBlazor.Core.Test.WebApp.csproj", "{056F7BB7-B92B-4616-8D29-F4EA50B47C4B}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.Test.WebApp.Client", "..\test\dymaptic.GeoBlazor.Core.Test.WebApp\dymaptic.GeoBlazor.Core.Test.WebApp.Client\dymaptic.GeoBlazor.Core.Test.WebApp.Client.csproj", "{FE146E58-799C-47E8-A86A-AC19FB1C43D0}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.Sample.OAuth", "..\samples\dymaptic.GeoBlazor.Core.Sample.OAuth\dymaptic.GeoBlazor.Core.Sample.OAuth\dymaptic.GeoBlazor.Core.Sample.OAuth.csproj", "{20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.Sample.OAuth.Client", "..\samples\dymaptic.GeoBlazor.Core.Sample.OAuth\dymaptic.GeoBlazor.Core.Sample.OAuth.Client\dymaptic.GeoBlazor.Core.Sample.OAuth.Client.csproj", "{9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.SourceGenerator", "dymaptic.GeoBlazor.Core.SourceGenerator\dymaptic.GeoBlazor.Core.SourceGenerator.csproj", "{1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.SourceGenerator.Tests", "..\test\dymaptic.GeoBlazor.Core.SourceGenerator.Tests\dymaptic.GeoBlazor.Core.SourceGenerator.Tests.csproj", "{4A58D766-A1EB-4A91-A316-E111F662F145}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.Sample.TokenRefresh", "..\samples\dymaptic.GeoBlazor.Core.Sample.TokenRefresh\dymaptic.GeoBlazor.Core.Sample.TokenRefresh\dymaptic.GeoBlazor.Core.Sample.TokenRefresh.csproj", "{7FA48135-81F7-1219-F001-A870BFC4224E}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.Sample.TokenRefresh.Client", "..\samples\dymaptic.GeoBlazor.Core.Sample.TokenRefresh\dymaptic.GeoBlazor.Core.Sample.TokenRefresh.Client\dymaptic.GeoBlazor.Core.Sample.TokenRefresh.Client.csproj", "{6CB414BD-0536-A361-CEFF-C84EE3906931}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.Analyzers", "dymaptic.GeoBlazor.Core.Analyzers\dymaptic.GeoBlazor.Core.Analyzers.csproj", "{468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.SourceGenerator.Shared", "dymaptic.GeoBlazor.Core.SourceGenerator.Shared\dymaptic.GeoBlazor.Core.SourceGenerator.Shared.csproj", "{8FDFC824-2365-4467-9326-DFDFF6D6B775}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.Test.Automation", "..\test\dymaptic.GeoBlazor.Core.Test.Automation\dymaptic.GeoBlazor.Core.Test.Automation.csproj", "{679E2D83-C4D8-4350-83DC-9780364A0815}"
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "dymaptic.GeoBlazor.Core.Test.Automation.SourceGeneration", "..\test\dymaptic.GeoBlazor.Core.Test.Automation.SourceGeneration\dymaptic.GeoBlazor.Core.Test.Automation.SourceGeneration.csproj", "{B70AE99D-782B-48E7-8713-DFAEB57809FF}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|Any CPU = Release|Any CPU
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Debug|x64.ActiveCfg = Debug|Any CPU
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Debug|x64.Build.0 = Debug|Any CPU
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Debug|x86.ActiveCfg = Debug|Any CPU
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Debug|x86.Build.0 = Debug|Any CPU
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Release|Any CPU.Build.0 = Release|Any CPU
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Release|x64.ActiveCfg = Release|Any CPU
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Release|x64.Build.0 = Release|Any CPU
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Release|x86.ActiveCfg = Release|Any CPU
- {92A18016-170A-42F3-B1F5-12CC306F796C}.Release|x86.Build.0 = Release|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Debug|x64.ActiveCfg = Debug|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Debug|x64.Build.0 = Debug|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Debug|x86.ActiveCfg = Debug|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Debug|x86.Build.0 = Debug|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Release|Any CPU.Build.0 = Release|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Release|x64.ActiveCfg = Release|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Release|x64.Build.0 = Release|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Release|x86.ActiveCfg = Release|Any CPU
- {C993832C-734A-485F-A42B-30B620F32345}.Release|x86.Build.0 = Release|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Debug|x64.ActiveCfg = Debug|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Debug|x64.Build.0 = Debug|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Debug|x86.ActiveCfg = Debug|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Debug|x86.Build.0 = Debug|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Release|Any CPU.Build.0 = Release|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Release|x64.ActiveCfg = Release|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Release|x64.Build.0 = Release|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Release|x86.ActiveCfg = Release|Any CPU
- {79F14352-ACAD-4A53-84A2-C88237AD1497}.Release|x86.Build.0 = Release|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Debug|x64.ActiveCfg = Debug|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Debug|x64.Build.0 = Debug|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Debug|x86.ActiveCfg = Debug|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Debug|x86.Build.0 = Debug|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Release|Any CPU.Build.0 = Release|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Release|Any CPU.Deploy.0 = Release|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Release|x64.ActiveCfg = Release|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Release|x64.Build.0 = Release|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Release|x86.ActiveCfg = Release|Any CPU
- {08193B44-3A32-4836-96A0-44DEEA1E7556}.Release|x86.Build.0 = Release|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Debug|x64.ActiveCfg = Debug|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Debug|x64.Build.0 = Debug|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Debug|x86.ActiveCfg = Debug|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Debug|x86.Build.0 = Debug|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Release|Any CPU.Build.0 = Release|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Release|x64.ActiveCfg = Release|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Release|x64.Build.0 = Release|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Release|x86.ActiveCfg = Release|Any CPU
- {48E045E3-F3FF-4D50-8987-83C1B8663E39}.Release|x86.Build.0 = Release|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Debug|x64.ActiveCfg = Debug|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Debug|x64.Build.0 = Debug|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Debug|x86.ActiveCfg = Debug|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Debug|x86.Build.0 = Debug|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Release|Any CPU.Build.0 = Release|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Release|x64.ActiveCfg = Release|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Release|x64.Build.0 = Release|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Release|x86.ActiveCfg = Release|Any CPU
- {41CD66DB-1487-4F37-B2C6-3DB569116E89}.Release|x86.Build.0 = Release|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Debug|x64.ActiveCfg = Debug|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Debug|x64.Build.0 = Debug|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Debug|x86.ActiveCfg = Debug|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Debug|x86.Build.0 = Debug|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Release|Any CPU.Build.0 = Release|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Release|x64.ActiveCfg = Release|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Release|x64.Build.0 = Release|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Release|x86.ActiveCfg = Release|Any CPU
- {E69BF0F0-C621-4484-89AB-62ADBD889B3D}.Release|x86.Build.0 = Release|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Debug|x64.ActiveCfg = Debug|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Debug|x64.Build.0 = Debug|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Debug|x86.ActiveCfg = Debug|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Debug|x86.Build.0 = Debug|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Release|Any CPU.Build.0 = Release|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Release|x64.ActiveCfg = Release|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Release|x64.Build.0 = Release|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Release|x86.ActiveCfg = Release|Any CPU
- {2A9CE42F-322C-4AAD-8FB8-0D586F5215E1}.Release|x86.Build.0 = Release|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Debug|x64.ActiveCfg = Debug|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Debug|x64.Build.0 = Debug|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Debug|x86.ActiveCfg = Debug|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Debug|x86.Build.0 = Debug|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Release|Any CPU.Build.0 = Release|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Release|x64.ActiveCfg = Release|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Release|x64.Build.0 = Release|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Release|x86.ActiveCfg = Release|Any CPU
- {056F7BB7-B92B-4616-8D29-F4EA50B47C4B}.Release|x86.Build.0 = Release|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Debug|x64.ActiveCfg = Debug|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Debug|x64.Build.0 = Debug|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Debug|x86.ActiveCfg = Debug|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Debug|x86.Build.0 = Debug|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Release|Any CPU.Build.0 = Release|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Release|x64.ActiveCfg = Release|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Release|x64.Build.0 = Release|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Release|x86.ActiveCfg = Release|Any CPU
- {FE146E58-799C-47E8-A86A-AC19FB1C43D0}.Release|x86.Build.0 = Release|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Debug|x64.ActiveCfg = Debug|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Debug|x64.Build.0 = Debug|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Debug|x86.ActiveCfg = Debug|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Debug|x86.Build.0 = Debug|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Release|Any CPU.Build.0 = Release|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Release|x64.ActiveCfg = Release|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Release|x64.Build.0 = Release|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Release|x86.ActiveCfg = Release|Any CPU
- {20F1EBBE-A15F-40C0-A2E9-184CFDAD1326}.Release|x86.Build.0 = Release|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Debug|x64.ActiveCfg = Debug|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Debug|x64.Build.0 = Debug|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Debug|x86.ActiveCfg = Debug|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Debug|x86.Build.0 = Debug|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Release|Any CPU.Build.0 = Release|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Release|x64.ActiveCfg = Release|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Release|x64.Build.0 = Release|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Release|x86.ActiveCfg = Release|Any CPU
- {9C60EDCD-CA86-452F-9E6F-CDBAF3604EAB}.Release|x86.Build.0 = Release|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Debug|x64.ActiveCfg = Debug|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Debug|x64.Build.0 = Debug|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Debug|x86.ActiveCfg = Debug|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Debug|x86.Build.0 = Debug|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Release|Any CPU.Build.0 = Release|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Release|x64.ActiveCfg = Release|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Release|x64.Build.0 = Release|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Release|x86.ActiveCfg = Release|Any CPU
- {1E2AFAB9-32CD-4F79-A347-F29A0F1C7208}.Release|x86.Build.0 = Release|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Debug|x64.ActiveCfg = Debug|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Debug|x64.Build.0 = Debug|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Debug|x86.ActiveCfg = Debug|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Debug|x86.Build.0 = Debug|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Release|Any CPU.Build.0 = Release|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Release|x64.ActiveCfg = Release|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Release|x64.Build.0 = Release|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Release|x86.ActiveCfg = Release|Any CPU
- {4A58D766-A1EB-4A91-A316-E111F662F145}.Release|x86.Build.0 = Release|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Debug|x64.ActiveCfg = Debug|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Debug|x64.Build.0 = Debug|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Debug|x86.ActiveCfg = Debug|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Debug|x86.Build.0 = Debug|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Release|Any CPU.Build.0 = Release|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Release|x64.ActiveCfg = Release|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Release|x64.Build.0 = Release|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Release|x86.ActiveCfg = Release|Any CPU
- {7FA48135-81F7-1219-F001-A870BFC4224E}.Release|x86.Build.0 = Release|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Debug|x64.ActiveCfg = Debug|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Debug|x64.Build.0 = Debug|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Debug|x86.ActiveCfg = Debug|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Debug|x86.Build.0 = Debug|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Release|Any CPU.Build.0 = Release|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Release|x64.ActiveCfg = Release|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Release|x64.Build.0 = Release|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Release|x86.ActiveCfg = Release|Any CPU
- {6CB414BD-0536-A361-CEFF-C84EE3906931}.Release|x86.Build.0 = Release|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Debug|x64.ActiveCfg = Debug|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Debug|x64.Build.0 = Debug|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Debug|x86.ActiveCfg = Debug|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Debug|x86.Build.0 = Debug|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Release|Any CPU.Build.0 = Release|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Release|x64.ActiveCfg = Release|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Release|x64.Build.0 = Release|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Release|x86.ActiveCfg = Release|Any CPU
- {468F9CE4-A24F-4EE0-9C5B-2AF88A369C30}.Release|x86.Build.0 = Release|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Debug|x64.ActiveCfg = Debug|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Debug|x64.Build.0 = Debug|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Debug|x86.ActiveCfg = Debug|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Debug|x86.Build.0 = Debug|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Release|Any CPU.Build.0 = Release|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Release|x64.ActiveCfg = Release|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Release|x64.Build.0 = Release|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Release|x86.ActiveCfg = Release|Any CPU
- {679E2D83-C4D8-4350-83DC-9780364A0815}.Release|x86.Build.0 = Release|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Debug|x64.ActiveCfg = Debug|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Debug|x64.Build.0 = Debug|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Debug|x86.ActiveCfg = Debug|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Debug|x86.Build.0 = Debug|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Release|Any CPU.Build.0 = Release|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Release|x64.ActiveCfg = Release|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Release|x64.Build.0 = Release|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Release|x86.ActiveCfg = Release|Any CPU
- {B70AE99D-782B-48E7-8713-DFAEB57809FF}.Release|x86.Build.0 = Release|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Debug|x64.ActiveCfg = Debug|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Debug|x64.Build.0 = Debug|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Debug|x86.ActiveCfg = Debug|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Debug|x86.Build.0 = Debug|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Release|Any CPU.Build.0 = Release|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Release|x64.ActiveCfg = Release|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Release|x64.Build.0 = Release|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Release|x86.ActiveCfg = Release|Any CPU
- {8FDFC824-2365-4467-9326-DFDFF6D6B775}.Release|x86.Build.0 = Release|Any CPU
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {FA50C146-4061-45AA-A5B3-5DE48D47FF88}
- EndGlobalSection
-EndGlobal
diff --git a/src/dymaptic.GeoBlazor.Core/Components/ActionBase.cs b/src/dymaptic.GeoBlazor.Core/Components/ActionBase.cs
index 8bdff5798..4c875e679 100644
--- a/src/dymaptic.GeoBlazor.Core/Components/ActionBase.cs
+++ b/src/dymaptic.GeoBlazor.Core/Components/ActionBase.cs
@@ -18,7 +18,7 @@ public abstract partial class ActionBase : MapComponent, IProtobufSerializable
/// This adds a CSS class to the ActionButton's node.
///
@@ -39,12 +39,20 @@ public abstract partial class ActionBase : MapComponent, IProtobufSerializable? CallbackFunction { get; set; }
-
+
///
/// Identifies whether the action has a callback function.
///
public bool HasCallbackFunction => CallbackFunction != null;
-
+
+ ///
+ /// Specifies the type of action. Choose between "button" or "toggle".
+ ///
+ public abstract string Type { get; }
+
+ ///
+ public abstract ActionBaseSerializationRecord ToProtobuf();
+
///
/// JS-invokable method for triggering actions.
///
@@ -60,14 +68,6 @@ public async Task OnJsTriggerAction(PopupTriggerActionEvent triggerActionEvent)
await CallbackFunction!.Invoke();
}
}
-
- ///
- /// Specifies the type of action. Choose between "button" or "toggle".
- ///
- public abstract string Type { get; }
-
- ///
- public abstract ActionBaseSerializationRecord ToProtobuf();
}
internal class ActionBaseConverter : JsonConverter
diff --git a/src/dymaptic.GeoBlazor.Core/Components/ColorVariable.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/ColorVariable.gb.cs
index 7006d1b43..c4af2f7f0 100644
--- a/src/dymaptic.GeoBlazor.Core/Components/ColorVariable.gb.cs
+++ b/src/dymaptic.GeoBlazor.Core/Components/ColorVariable.gb.cs
@@ -50,7 +50,7 @@ public ColorVariable()
/// Arcade expression as defined in the valueExpression property.
/// ArcGIS Maps SDK for JavaScript
///
- public ColorVariable(string field,
+ public ColorVariable(string? field,
string? normalizationField = null,
IReadOnlyList? stops = null,
VisualVariableLegendOptions? legendOptions = null,
diff --git a/src/dymaptic.GeoBlazor.Core/Components/DynamicLayer.cs b/src/dymaptic.GeoBlazor.Core/Components/DynamicLayer.cs
index 6f91f3c7a..23cf386cf 100644
--- a/src/dymaptic.GeoBlazor.Core/Components/DynamicLayer.cs
+++ b/src/dymaptic.GeoBlazor.Core/Components/DynamicLayer.cs
@@ -12,7 +12,6 @@ public abstract class DynamicLayer : MapComponent
public abstract string Type { get; }
}
-
///
/// Abstract base class for data sources in a dynamic data layer.
///
@@ -25,7 +24,6 @@ public abstract class DynamicDataSource : MapComponent
public abstract DynamicDataSourceType Type { get; }
}
-
internal class DynamicLayerConverter : JsonConverter
{
public override DynamicLayer? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
@@ -64,7 +62,8 @@ public override void Write(Utf8JsonWriter writer, DynamicLayer value, JsonSerial
internal class DynamicDataSourceConverter : JsonConverter
{
- public override DynamicDataSource? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
+ public override DynamicDataSource? Read(ref Utf8JsonReader reader, Type typeToConvert,
+ JsonSerializerOptions options)
{
var newOptions = new JsonSerializerOptions(options)
{
diff --git a/src/dymaptic.GeoBlazor.Core/Components/Geometries/Point.cs b/src/dymaptic.GeoBlazor.Core/Components/Geometries/Point.cs
index 3d5870811..3dd143115 100644
--- a/src/dymaptic.GeoBlazor.Core/Components/Geometries/Point.cs
+++ b/src/dymaptic.GeoBlazor.Core/Components/Geometries/Point.cs
@@ -3,6 +3,94 @@ namespace dymaptic.GeoBlazor.Core.Components.Geometries;
[ProtobufSerializable]
public partial class Point : Geometry
{
+ ///
+ /// Parameterless constructor for use as a Razor Component.
+ ///
+ [ActivatorUtilitiesConstructor]
+ [CodeGenerationIgnore]
+ public Point()
+ {
+ }
+
+ ///
+ /// Constructor for use in C# code. Use named parameters (e.g., item1: value1, item2: value2) to set properties in any order.
+ ///
+ ///
+ /// The longitude of the point.
+ /// ArcGIS Maps SDK for JavaScript
+ ///
+ ///
+ /// The latitude of the point.
+ /// ArcGIS Maps SDK for JavaScript
+ ///
+ ///
+ /// The x-coordinate (easting) of the point in map units.
+ /// default 0
+ /// ArcGIS Maps SDK for JavaScript
+ ///
+ ///
+ /// The y-coordinate (northing) of the point in map units.
+ /// default 0
+ /// ArcGIS Maps SDK for JavaScript
+ ///
+ ///
+ /// The z-coordinate (or elevation) of the point in map units.
+ /// default undefined
+ /// ArcGIS Maps SDK for JavaScript
+ ///
+ ///
+ /// The spatial reference of the geometry.
+ /// default SpatialReference.WGS84 // wkid: 4326
+ /// ArcGIS Maps SDK for JavaScript
+ ///
+ ///
+ /// Indicates if the geometry has M values.
+ /// ArcGIS Maps SDK for JavaScript
+ ///
+ ///
+ /// Indicates if the geometry has z-values (elevation).
+ /// ArcGIS Maps SDK for JavaScript
+ ///
+ ///
+ /// The m-coordinate of the point in map units.
+ /// default undefined
+ /// ArcGIS Maps SDK for JavaScript
+ ///
+ [CodeGenerationIgnore]
+ public Point(double? longitude = null,
+ double? latitude = null,
+ double? x = null,
+ double? y = null,
+ double? z = null,
+ SpatialReference? spatialReference = null,
+ bool? hasM = null,
+ bool? hasZ = null,
+ double? m = null)
+ {
+ AllowRender = false;
+
+ if (x is null && longitude is null || y is null && latitude is null)
+ {
+ throw new ArgumentException("Points must have X and Y coordinates or longitude and latitude.");
+ }
+
+ if (x is null && y is null && spatialReference is { Wkid: not 4326 })
+ {
+ }
+
+#pragma warning disable BL0005
+ Longitude = longitude;
+ Latitude = latitude;
+ X = x;
+ Y = y;
+ Z = z;
+ SpatialReference = spatialReference;
+ HasM = hasM;
+ HasZ = hasZ;
+ M = m;
+#pragma warning restore BL0005
+ }
+
///
/// The latitude of the point.
///
@@ -66,7 +154,7 @@ public Point Clone()
///
public override GeometrySerializationRecord ToProtobuf()
{
- return new GeometrySerializationRecord(Id.ToString(), Type.ToString().ToKebabCase(),
+ return new GeometrySerializationRecord(Id.ToString(), Type.ToString().ToKebabCase(),
Extent?.ToProtobuf(),
SpatialReference?.ToProtobuf())
{
diff --git a/src/dymaptic.GeoBlazor.Core/Components/Geometries/Point.gb.cs b/src/dymaptic.GeoBlazor.Core/Components/Geometries/Point.gb.cs
index 1c3ffd2e5..accd60cd0 100644
--- a/src/dymaptic.GeoBlazor.Core/Components/Geometries/Point.gb.cs
+++ b/src/dymaptic.GeoBlazor.Core/Components/Geometries/Point.gb.cs
@@ -2,7 +2,6 @@
namespace dymaptic.GeoBlazor.Core.Components.Geometries;
-
///
/// GeoBlazor Docs
/// A location defined by X, Y, and Z coordinates.
@@ -10,85 +9,6 @@ namespace dymaptic.GeoBlazor.Core.Components.Geometries;
///
public partial class Point
{
-
- ///
- /// Parameterless constructor for use as a Razor Component.
- ///
- [ActivatorUtilitiesConstructor]
- public Point()
- {
- }
-
- ///
- /// Constructor for use in C# code. Use named parameters (e.g., item1: value1, item2: value2) to set properties in any order.
- ///
- ///
- /// The longitude of the point.
- /// ArcGIS Maps SDK for JavaScript
- ///
- ///
- /// The latitude of the point.
- /// ArcGIS Maps SDK for JavaScript
- ///
- ///
- /// The x-coordinate (easting) of the point in map units.
- /// default 0
- /// ArcGIS Maps SDK for JavaScript
- ///
- ///
- /// The y-coordinate (northing) of the point in map units.
- /// default 0
- /// ArcGIS Maps SDK for JavaScript
- ///
- ///
- /// The z-coordinate (or elevation) of the point in map units.
- /// default undefined
- /// ArcGIS Maps SDK for JavaScript
- ///
- ///
- /// The spatial reference of the geometry.
- /// default SpatialReference.WGS84 // wkid: 4326
- /// ArcGIS Maps SDK for JavaScript
- ///
- ///
- /// Indicates if the geometry has M values.
- /// ArcGIS Maps SDK for JavaScript
- ///
- ///
- /// Indicates if the geometry has z-values (elevation).
- /// ArcGIS Maps SDK for JavaScript
- ///
- ///
- /// The m-coordinate of the point in map units.
- /// default undefined
- /// ArcGIS Maps SDK for JavaScript
- ///
- public Point(
- double? longitude = null,
- double? latitude = null,
- double? x = null,
- double? y = null,
- double? z = null,
- SpatialReference? spatialReference = null,
- bool? hasM = null,
- bool? hasZ = null,
- double? m = null)
- {
- AllowRender = false;
-#pragma warning disable BL0005
- Longitude = longitude;
- Latitude = latitude;
- X = x;
- Y = y;
- Z = z;
- SpatialReference = spatialReference;
- HasM = hasM;
- HasZ = hasZ;
- M = m;
-#pragma warning restore BL0005
- }
-
-
#region Property Getters
///
@@ -100,8 +20,8 @@ public Point(
{
return Latitude;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -110,26 +30,28 @@ public Point(
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return Latitude;
}
// get the property value
- JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync("getNullableValueTypedProperty",
+ JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync(
+ "getNullableValueTypedProperty",
CancellationTokenSource.Token, JsComponentReference, "latitude");
+
if (result is { Value: not null })
{
#pragma warning disable BL0005
- Latitude = result.Value.Value;
+ Latitude = result.Value.Value;
#pragma warning restore BL0005
- ModifiedParameters[nameof(Latitude)] = Latitude;
+ ModifiedParameters[nameof(Latitude)] = Latitude;
}
-
+
return Latitude;
}
-
+
///
/// Asynchronously retrieve the current value of the Longitude property.
///
@@ -139,8 +61,8 @@ public Point(
{
return Longitude;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -149,26 +71,28 @@ public Point(
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return Longitude;
}
// get the property value
- JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync("getNullableValueTypedProperty",
+ JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync(
+ "getNullableValueTypedProperty",
CancellationTokenSource.Token, JsComponentReference, "longitude");
+
if (result is { Value: not null })
{
#pragma warning disable BL0005
- Longitude = result.Value.Value;
+ Longitude = result.Value.Value;
#pragma warning restore BL0005
- ModifiedParameters[nameof(Longitude)] = Longitude;
+ ModifiedParameters[nameof(Longitude)] = Longitude;
}
-
+
return Longitude;
}
-
+
///
/// Asynchronously retrieve the current value of the M property.
///
@@ -178,8 +102,8 @@ public Point(
{
return M;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -188,26 +112,28 @@ public Point(
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return M;
}
// get the property value
- JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync("getNullableValueTypedProperty",
+ JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync(
+ "getNullableValueTypedProperty",
CancellationTokenSource.Token, JsComponentReference, "m");
+
if (result is { Value: not null })
{
#pragma warning disable BL0005
- M = result.Value.Value;
+ M = result.Value.Value;
#pragma warning restore BL0005
- ModifiedParameters[nameof(M)] = M;
+ ModifiedParameters[nameof(M)] = M;
}
-
+
return M;
}
-
+
///
/// Asynchronously retrieve the current value of the X property.
///
@@ -217,8 +143,8 @@ public Point(
{
return X;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -227,26 +153,28 @@ public Point(
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return X;
}
// get the property value
- JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync("getNullableValueTypedProperty",
+ JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync(
+ "getNullableValueTypedProperty",
CancellationTokenSource.Token, JsComponentReference, "x");
+
if (result is { Value: not null })
{
#pragma warning disable BL0005
- X = result.Value.Value;
+ X = result.Value.Value;
#pragma warning restore BL0005
- ModifiedParameters[nameof(X)] = X;
+ ModifiedParameters[nameof(X)] = X;
}
-
+
return X;
}
-
+
///
/// Asynchronously retrieve the current value of the Y property.
///
@@ -256,8 +184,8 @@ public Point(
{
return Y;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -266,26 +194,28 @@ public Point(
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return Y;
}
// get the property value
- JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync("getNullableValueTypedProperty",
+ JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync(
+ "getNullableValueTypedProperty",
CancellationTokenSource.Token, JsComponentReference, "y");
+
if (result is { Value: not null })
{
#pragma warning disable BL0005
- Y = result.Value.Value;
+ Y = result.Value.Value;
#pragma warning restore BL0005
- ModifiedParameters[nameof(Y)] = Y;
+ ModifiedParameters[nameof(Y)] = Y;
}
-
+
return Y;
}
-
+
///
/// Asynchronously retrieve the current value of the Z property.
///
@@ -295,8 +225,8 @@ public Point(
{
return Z;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -305,28 +235,31 @@ public Point(
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return Z;
}
// get the property value
- JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync("getNullableValueTypedProperty",
+ JsNullableDoubleWrapper? result = await CoreJsModule!.InvokeAsync(
+ "getNullableValueTypedProperty",
CancellationTokenSource.Token, JsComponentReference, "z");
+
if (result is { Value: not null })
{
#pragma warning disable BL0005
- Z = result.Value.Value;
+ Z = result.Value.Value;
#pragma warning restore BL0005
- ModifiedParameters[nameof(Z)] = Z;
+ ModifiedParameters[nameof(Z)] = Z;
}
-
+
return Z;
}
-
+
#endregion
+
#region Property Setters
///
@@ -341,13 +274,13 @@ public async Task SetLatitude(double? value)
Latitude = value;
#pragma warning restore BL0005
ModifiedParameters[nameof(Latitude)] = value;
-
+
if (CoreJsModule is null)
{
return;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -356,16 +289,16 @@ public async Task SetLatitude(double? value)
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return;
}
-
+
await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
JsComponentReference, "latitude", value);
}
-
+
///
/// Asynchronously set the value of the Longitude property after render.
///
@@ -378,13 +311,13 @@ public async Task SetLongitude(double? value)
Longitude = value;
#pragma warning restore BL0005
ModifiedParameters[nameof(Longitude)] = value;
-
+
if (CoreJsModule is null)
{
return;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -393,16 +326,16 @@ public async Task SetLongitude(double? value)
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return;
}
-
+
await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
JsComponentReference, "longitude", value);
}
-
+
///
/// Asynchronously set the value of the M property after render.
///
@@ -415,13 +348,13 @@ public async Task SetM(double? value)
M = value;
#pragma warning restore BL0005
ModifiedParameters[nameof(M)] = value;
-
+
if (CoreJsModule is null)
{
return;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -430,16 +363,16 @@ public async Task SetM(double? value)
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return;
}
-
+
await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
JsComponentReference, "m", value);
}
-
+
///
/// Asynchronously set the value of the X property after render.
///
@@ -452,13 +385,13 @@ public async Task SetX(double? value)
X = value;
#pragma warning restore BL0005
ModifiedParameters[nameof(X)] = value;
-
+
if (CoreJsModule is null)
{
return;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -467,16 +400,16 @@ public async Task SetX(double? value)
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return;
}
-
+
await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
JsComponentReference, "x", value);
}
-
+
///
/// Asynchronously set the value of the Y property after render.
///
@@ -489,13 +422,13 @@ public async Task SetY(double? value)
Y = value;
#pragma warning restore BL0005
ModifiedParameters[nameof(Y)] = value;
-
+
if (CoreJsModule is null)
{
return;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -504,16 +437,16 @@ public async Task SetY(double? value)
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return;
}
-
+
await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
JsComponentReference, "y", value);
}
-
+
///
/// Asynchronously set the value of the Z property after render.
///
@@ -526,13 +459,13 @@ public async Task SetZ(double? value)
Z = value;
#pragma warning restore BL0005
ModifiedParameters[nameof(Z)] = value;
-
+
if (CoreJsModule is null)
{
return;
}
-
- try
+
+ try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
"getJsComponent", CancellationTokenSource.Token, Id);
@@ -541,18 +474,19 @@ public async Task SetZ(double? value)
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return;
}
-
+
await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
JsComponentReference, "z", value);
}
-
+
#endregion
+
#region Public Methods
///
@@ -570,7 +504,7 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
{
return null;
}
-
+
try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
@@ -580,18 +514,17 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return null;
}
-
- return await JsComponentReference!.InvokeAsync(
- "copy",
+
+ return await JsComponentReference!.InvokeAsync("copy",
CancellationTokenSource.Token,
other);
}
-
+
///
/// GeoBlazor Docs
/// Computes the Euclidean distance between this Point and a given Point.
@@ -607,7 +540,7 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
{
return null;
}
-
+
try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
@@ -617,18 +550,17 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return null;
}
-
- return await JsComponentReference!.InvokeAsync(
- "distance",
+
+ return await JsComponentReference!.InvokeAsync("distance",
CancellationTokenSource.Token,
other);
}
-
+
///
/// GeoBlazor Docs
/// Modifies the point geometry in-place by shifting the X-coordinate to within
@@ -642,7 +574,7 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
{
return null;
}
-
+
try
{
JsComponentReference ??= await CoreJsModule.InvokeAsync(
@@ -652,17 +584,15 @@ await CoreJsModule.InvokeVoidAsync("setProperty", CancellationTokenSource.Token,
{
// this is expected if the component is not yet built
}
-
+
if (JsComponentReference is null)
{
return null;
}
-
- return await JsComponentReference!.InvokeAsync(
- "normalize",
+
+ return await JsComponentReference!.InvokeAsync("normalize",
CancellationTokenSource.Token);
}
-
-#endregion
-}
+#endregion
+}
\ No newline at end of file
diff --git a/src/dymaptic.GeoBlazor.Core/Components/GeometryEngine.cs b/src/dymaptic.GeoBlazor.Core/Components/GeometryEngine.cs
deleted file mode 100644
index 417db6d05..000000000
--- a/src/dymaptic.GeoBlazor.Core/Components/GeometryEngine.cs
+++ /dev/null
@@ -1,1730 +0,0 @@
-// ReSharper disable RedundantEnumerableCastCall
-namespace dymaptic.GeoBlazor.Core.Components;
-///
-/// A client-side geometry engine for testing, measuring, and analyzing the spatial relationship between two or more 2D geometries. If more than one geometry is required for any of the methods below, all geometries must have the same spatial reference for the methods to work as expected.
-/// ArcGIS Maps SDK for JavaScript
-///
-[CodeGenerationIgnore]
-public class GeometryEngine : LogicComponent
-{
- ///
- /// Default Constructor
- ///
- ///
- /// Injected Identity Manager reference
- ///
- public GeometryEngine(AuthenticationManager authenticationManager) : base(authenticationManager)
- {
- }
-
- ///
- protected override string ComponentName => nameof(GeometryEngine);
-
- ///
- /// Creates planar (or Euclidean) buffer polygons at a specified distance around the input geometries.
- ///
- ///
- /// The GeometryEngine has two methods for buffering geometries client-side: buffer and geodesicBuffer. Use caution when deciding which method to use. As a general rule, use geodesicBuffer if the input geometries have a spatial
- /// reference of either WGS84 (wkid: 4326) or Web Mercator. Only use buffer (this method) when attempting to buffer
- /// geometries with a projected coordinate system other than Web Mercator. If you need to buffer geometries with a
- /// geographic coordinate system other than WGS84 (wkid: 4326), use geometryService.buffer().
- ///
- ///
- /// The buffer input geometries.
- ///
- ///
- /// The specified distance(s) for buffering. The length of the geometry array does not have to equal the length of the distance array. For example, if you pass an array of four geometries: [g1, g2, g3, g4] and an array with one distance: [d1], all four geometries will be buffered by the single distance value. If instead you use an array of three distances: [d1, d2, d3], g1 will be buffered by d1, g2 by d2, and g3 and g4 will both be buffered by d3. The value of the geometry array will be matched one to one with those in the distance array until the final value of the distance array is reached, in which case that value will be applied to the remaining geometries.
- ///
- ///
- /// The resulting buffers.
- ///
- public async Task Buffer(IEnumerable geometries, IEnumerable distances)
- {
- return await InvokeAsync("buffer", geometries, distances, null, null);
- }
-
- ///
- /// Creates planar (or Euclidean) buffer polygons at a specified distance around the input geometries.
- ///
- ///
- /// The GeometryEngine has two methods for buffering geometries client-side: buffer and geodesicBuffer. Use caution when deciding which method to use. As a general rule, use geodesicBuffer if the input geometries have a spatial
- /// reference of either WGS84 (wkid: 4326) or Web Mercator. Only use buffer (this method) when attempting to buffer
- /// geometries with a projected coordinate system other than Web Mercator. If you need to buffer geometries with a
- /// geographic coordinate system other than WGS84 (wkid: 4326), use geometryService.buffer().
- ///
- ///
- /// The buffer input geometries.
- ///
- ///
- /// The specified distance(s) for buffering. The length of the geometry array does not have to equal the length of the distance array. For example, if you pass an array of four geometries: [g1, g2, g3, g4] and an array with one distance: [d1], all four geometries will be buffered by the single distance value. If instead you use an array of three distances: [d1, d2, d3], g1 will be buffered by d1, g2 by d2, and g3 and g4 will both be buffered by d3. The value of the geometry array will be matched one to one with those in the distance array until the final value of the distance array is reached, in which case that value will be applied to the remaining geometries.
- ///
- ///
- /// Measurement unit of the distance(s). Defaults to the units of the input geometries.
- ///
- ///
- /// The resulting buffers.
- ///
- public async Task Buffer(IEnumerable geometries, IEnumerable distances,
- GeometryEngineLinearUnit? unit)
- {
- return await InvokeAsync("buffer", geometries, distances, unit, null);
- }
-
- ///
- /// Creates planar (or Euclidean) buffer polygons at a specified distance around the input geometries.
- ///
- ///
- /// The GeometryEngine has two methods for buffering geometries client-side: buffer and geodesicBuffer. Use caution when deciding which method to use. As a general rule, use geodesicBuffer if the input geometries have a spatial
- /// reference of either WGS84 (wkid: 4326) or Web Mercator. Only use buffer (this method) when attempting to buffer
- /// geometries with a projected coordinate system other than Web Mercator. If you need to buffer geometries with a
- /// geographic coordinate system other than WGS84 (wkid: 4326), use geometryService.buffer().
- ///
- ///
- /// The buffer input geometries.
- ///
- ///
- /// The specified distance(s) for buffering. The length of the geometry array does not have to equal the length of the distance array. For example, if you pass an array of four geometries: [g1, g2, g3, g4] and an array with one distance: [d1], all four geometries will be buffered by the single distance value. If instead you use an array of three distances: [d1, d2, d3], g1 will be buffered by d1, g2 by d2, and g3 and g4 will both be buffered by d3. The value of the geometry array will be matched one to one with those in the distance array until the final value of the distance array is reached, in which case that value will be applied to the remaining geometries.
- ///
- ///
- /// Measurement unit of the distance(s). Defaults to the units of the input geometries.
- ///
- ///
- /// Determines whether the output geometries should be unioned into a single polygon.
- ///
- ///
- /// The resulting buffers.
- ///
- public async Task Buffer(IEnumerable geometries, IEnumerable distances,
- GeometryEngineLinearUnit? unit, bool? unionResults)
- {
- return await InvokeAsync("buffer", geometries, distances, unit, unionResults);
- }
-
- ///
- /// Creates planar (or Euclidean) buffer polygons at a specified distance around the input geometries.
- ///
- ///
- /// The GeometryEngine has two methods for buffering geometries client-side: buffer and geodesicBuffer. Use caution when deciding which method to use. As a general rule, use geodesicBuffer if the input geometries have a spatial
- /// reference of either WGS84 (wkid: 4326) or Web Mercator. Only use buffer (this method) when attempting to buffer
- /// geometries with a projected coordinate system other than Web Mercator. If you need to buffer geometries with a
- /// geographic coordinate system other than WGS84 (wkid: 4326), use geometryService.buffer().
- ///
- ///
- /// The buffer input geometries.
- ///
- ///
- /// The specified distance(s) for buffering.
- ///
- ///
- /// The resulting buffer.
- ///
- public async Task Buffer(Geometry geometry, double distance)
- {
- return await InvokeAsync("buffer", geometry, distance, null);
- }
-
- ///
- /// Creates planar (or Euclidean) buffer polygons at a specified distance around the input geometries.
- ///
- ///
- /// The GeometryEngine has two methods for buffering geometries client-side: buffer and geodesicBuffer. Use caution when deciding which method to use. As a general rule, use geodesicBuffer if the input geometries have a spatial
- /// reference of either WGS84 (wkid: 4326) or Web Mercator. Only use buffer (this method) when attempting to buffer
- /// geometries with a projected coordinate system other than Web Mercator. If you need to buffer geometries with a
- /// geographic coordinate system other than WGS84 (wkid: 4326), use geometryService.buffer().
- ///
- ///
- /// The buffer input geometries.
- ///
- ///
- /// The specified distance(s) for buffering.
- ///
- ///
- /// Measurement unit of the distance(s). Defaults to the units of the input geometries.
- ///
- ///
- /// The resulting buffer.
- ///
- public async Task Buffer(Geometry geometry, double distance, GeometryEngineLinearUnit? unit)
- {
- return await InvokeAsync("buffer", geometry, distance, unit);
- }
-
- ///
- /// Calculates the clipped geometry from a target geometry by an envelope.
- ///
- ///
- /// The geometry to be clipped.
- ///
- ///
- /// The envelope used to clip.
- ///
- ///
- /// Clipped geometry.
- ///
- public async Task Clip(Geometry geometry, Extent extent)
- {
- return await InvokeAsync("clip", geometry, extent);
- }
-
- ///
- /// Indicates if one geometry contains another geometry.
- ///
- ///
- /// The geometry that is tested for the "contains" relationship to the other geometry. Think of this geometry as the potential "container" of the insideGeometry.
- ///
- ///
- /// The geometry that is tested for the "within" relationship to the containerGeometry.
- ///
- ///
- /// Returns true if the containerGeometry contains the insideGeometry.
- ///
- public async Task Contains(Geometry containerGeometry, Geometry insideGeometry)
- {
- return await InvokeAsync("contains", containerGeometry, insideGeometry);
- }
-
- ///
- /// Calculates the convex hull of one or more geometries. A convex hull is the smallest convex polygon that encloses a group of geometries or vertices. The input can be a single geometry (such as a polyline) or an array of any geometry type. The hull is typically a polygon but can also be a polyline or a point in degenerate cases.
- ///
- ///
- /// The input geometries used to calculate the convex hull. The input array can include various geometry types.
- ///
- ///
- /// Indicates whether to merge the output into a single geometry (usually a polygon).
- ///
- ///
- /// Returns the convex hull of the input geometries. This is usually a polygon, but can also be a polyline (if the
- /// input is a set of points or polylines forming a straight line), or a point (in degenerate cases).
- ///
- public async Task ConvexHull(IEnumerable geometries, bool? merge = null)
- {
- return await InvokeAsync("convexHull", geometries, merge);
- }
-
- ///
- /// Calculates the convex hull of one or more geometries. A convex hull is the smallest convex polygon that encloses a group of geometries or vertices. The input can be a single geometry (such as a polyline) or an array of any geometry type. The hull is typically a polygon but can also be a polyline or a point in degenerate cases.
- ///
- ///
- /// The input geometry used to calculate the convex hull.
- ///
- ///
- /// Returns the convex hull of the input geometries. This is usually a polygon, but can also be a polyline (if the
- /// input is a set of points or polylines forming a straight line), or a point (in degenerate cases).
- ///
- public async Task ConvexHull(Geometry geometry)
- {
- return await InvokeAsync("convexHull", geometry);
- }
-
- ///
- /// Indicates if one geometry crosses another geometry.
- ///
- ///
- /// The geometry to cross.
- ///
- ///
- /// The geometry being crossed.
- ///
- ///
- /// Returns true if geometry1 crosses geometry2.
- ///
- public async Task Crosses(Geometry geometry1, Geometry geometry2)
- {
- return await InvokeAsync("crosses", geometry1, geometry2);
- }
-
- ///
- /// Splits the input Polyline or Polygon where it crosses a cutting Polyline. For Polylines, all left cuts are grouped together in the first Geometry. Right cuts and coincident cuts are grouped in the second Geometry and each undefined cut, along with any uncut parts, are output as separate Polylines. For Polygons, all left cuts are grouped in the first Polygon, all right cuts are grouped in the second Polygon, and each undefined cut, along with any leftover parts after cutting, are output as a separate Polygon. If no cuts are returned then the array will be empty. An undefined cut will only be produced if a left cut or right cut was produced and there was a part left over after cutting, or a cut is bounded to the left and right of the cutter.
- ///
- ///
- /// The geometry to be cut.
- ///
- ///
- /// The polyline to cut the geometry.
- ///
- ///
- /// Returns an array of geometries created by cutting the input geometry with the cutter.
- ///
- public async Task Cut(Geometry geometry, Polyline cutter)
- {
- return await InvokeAsync("cut", geometry, cutter);
- }
-
- ///
- /// Densify geometries by plotting points between existing vertices.
- ///
- ///
- /// The geometry to be densified.
- ///
- ///
- /// The maximum segment length allowed. Must be a positive value.
- ///
- ///
- /// Measurement unit for maxSegmentLength. Defaults to the units of the input geometry.
- ///
- ///
- /// The densified geometry.
- ///
- public async Task Densify(Geometry geometry, double maxSegmentLength, GeometryEngineLinearUnit? maxSegmentLengthUnit = null)
- {
- return await InvokeAsync("densify", geometry, maxSegmentLength, maxSegmentLengthUnit);
- }
-
- ///
- /// Creates the difference of two geometries. The resultant geometry is the portion of inputGeometry not in the subtractor. The dimension of the subtractor has to be equal to or greater than that of the inputGeometry.
- ///
- ///
- /// The input geometries to subtract from.
- ///
- ///
- /// The geometry being subtracted from inputGeometry.
- ///
- ///
- /// Returns the geometry of inputGeometry minus the subtractor geometry.
- ///
- public async Task Difference(IEnumerable geometries, Geometry subtractor)
- {
- return await InvokeAsync("difference", geometries, subtractor);
- }
-
- ///
- /// Creates the difference of two geometries. The resultant geometry is the portion of inputGeometry not in the subtractor. The dimension of the subtractor has to be equal to or greater than that of the inputGeometry.
- ///
- ///
- /// The input geometry to subtract from.
- ///
- ///
- /// The geometry being subtracted from inputGeometry.
- ///
- ///
- /// Returns the geometry of inputGeometry minus the subtractor geometry.
- ///
- public async Task Difference(Geometry geometry, Geometry subtractor)
- {
- return await InvokeAsync("difference", geometry, subtractor);
- }
-
- ///
- /// Indicates if one geometry is disjoint (doesn't intersect in any way) with another geometry.
- ///
- ///
- /// The base geometry that is tested for the "disjoint" relationship to the other geometry.
- ///
- ///
- /// The comparison geometry that is tested for the "disjoint" relationship to the other geometry.
- ///
- ///
- /// Returns true if geometry1 and geometry2 are disjoint (don't intersect in any way).
- ///
- public async Task Disjoint(Geometry geometry1, Geometry geometry2)
- {
- return await InvokeAsync("disjoint", geometry1, geometry2);
- }
-
- ///
- /// Calculates the shortest planar distance between two geometries. Distance is reported in the linear units specified by distanceUnit or, if distanceUnit is null, the units of the spatialReference of input geometry.
- ///
- ///
- /// First input geometry.
- ///
- ///
- /// Second input geometry.
- ///
- ///
- /// Measurement unit of the return value. Defaults to the units of the input geometries.
- ///
- ///
- /// Distance between the two input geometries.
- ///
- public async Task Distance(Geometry geometry1, Geometry geometry2, GeometryEngineLinearUnit? distanceUnit = null)
- {
- return await InvokeAsync("distance", geometry1, geometry2, distanceUnit);
- }
-
- ///
- /// Indicates if two geometries are equal.
- ///
- ///
- /// In ArcGIS for JS, this method is called `Equals`. However, this term has special meaning in .NET, so we have renamed here.
- ///
- ///
- /// First input geometry.
- ///
- ///
- /// Second input geometry.
- ///
- ///
- /// Returns true if the two input geometries are equal.
- ///
- public async Task AreEqual(Geometry geometry1, Geometry geometry2)
- {
- return await InvokeAsync("equals", geometry1, geometry2);
- }
-
- ///
- /// Returns an object containing additional information about the input spatial reference.
- ///
- ///
- /// The input spatial reference.
- ///
- ///
- /// Resolves to a object.
- ///
- public async Task ExtendedSpatialReferenceInfo(SpatialReference spatialReference)
- {
- return await InvokeAsync("extendedSpatialReferenceInfo", spatialReference);
- }
-
- ///
- /// Flips a geometry on the horizontal axis. Can optionally be flipped around a point.
- ///
- ///
- /// The input geometry to be flipped.
- ///
- ///
- /// Point to flip the geometry around. Defaults to the centroid of the geometry.
- ///
- ///
- /// The flipped geometry.
- ///
- public async Task FlipHorizontal(Geometry geometry, Point? flipOrigin = null)
- {
- return await InvokeAsync("flipHorizontal", geometry, flipOrigin);
- }
-
- ///
- /// Flips a geometry on the vertical axis. Can optionally be flipped around a point.
- ///
- ///
- /// The input geometry to be flipped.
- ///
- ///
- /// Point to flip the geometry around. Defaults to the centroid of the geometry.
- ///
- ///
- /// The flipped geometry.
- ///
- public async Task FlipVertical(Geometry geometry, Point? flipOrigin = null)
- {
- return await InvokeAsync("flipVertical", geometry, flipOrigin);
- }
-
- ///
- /// Performs the generalize operation on the geometries in the cursor. Point and Multipoint geometries are left unchanged. Envelope is converted to a Polygon and then generalized.
- ///
- ///
- /// The input geometry to be generalized.
- ///
- ///
- /// The maximum allowed deviation from the generalized geometry to the original geometry.
- ///
- ///
- /// When true the degenerate parts of the geometry will be removed from the output (may be undesired for drawing).
- ///
- ///
- /// Measurement unit for maxDeviation. Defaults to the units of the input geometry.
- ///
- ///
- /// The generalized geometry.
- ///
- public async Task Generalize(Geometry geometry, double maxDeviation, bool? removeDegenerateParts = null, GeometryEngineLinearUnit? maxDeviationUnit = null)
- {
- return await InvokeAsync("generalize", geometry, maxDeviation, removeDegenerateParts, maxDeviationUnit);
- }
-
- ///
- /// Calculates the area of the input geometry. As opposed to planarArea(), geodesicArea takes into account the curvature of the earth when performing this calculation. Therefore, when using input geometries with a spatial reference of either WGS84 (wkid: 4326) or Web Mercator, it is best practice to calculate areas using geodesicArea(). If the input geometries have a projected coordinate system other than Web Mercator, use planarArea() instead.
- ///
- ///
- /// This method only works with WGS84 (wkid: 4326) and Web Mercator spatial references.
- ///
- ///
- /// The input polygon
- ///
- ///
- /// Measurement unit of the return value. Defaults to the units of the input geometries.
- ///
- ///
- /// Area of the input geometry.
- ///
- public async Task GeodesicArea(Polygon geometry, GeometryEngineAreaUnit? unit = null)
- {
- return await InvokeAsync("geodesicArea", geometry, unit);
- }
-
- ///
- /// Creates geodesic buffer polygons at a specified distance around the input geometries. When calculating distances, this method takes the curvature of the earth into account, which provides highly accurate results when dealing with very large geometries and/or geometries that spatially vary on a global scale where one projected coordinate system could not accurately plot coordinates and measure distances for all the geometries.
- ///
- ///
- /// This method only works with WGS84 (wkid: 4326) and Web Mercator spatial references. In general, if your input geometries are assigned one of those two spatial references, you should always use geodesicBuffer() to obtain the
- /// most accurate results for those geometries. If needing to buffer points assigned a projected coordinate system
- /// other than Web Mercator, use buffer() instead. If the input geometries have a geographic coordinate system other
- /// than WGS84 (wkid: 4326), use geometryService.buffer().
- ///
- ///
- /// The buffer input geometries
- ///
- ///
- /// The specified distance(s) for buffering. The length of the geometry array does not have to equal the length of the distance array. For example, if you pass an array of four geometries: [g1, g2, g3, g4] and an array with one distance: [d1], all four geometries will be buffered by the single distance value. If instead you use an array of three distances: [d1, d2, d3], g1 will be buffered by d1, g2 by d2, and g3 and g4 will both be buffered by d3. The value of the geometry array will be matched one to one with those in the distance array until the final value of the distance array is reached, in which case that value will be applied to the remaining geometries.
- ///
- ///
- /// The resulting buffers
- ///
- public async Task GeodesicBuffer(IEnumerable geometries, IEnumerable distances)
- {
- return await InvokeAsync("geodesicBuffer", geometries, distances, null, null);
- }
-
- ///
- /// Creates geodesic buffer polygons at a specified distance around the input geometries. When calculating distances, this method takes the curvature of the earth into account, which provides highly accurate results when dealing with very large geometries and/or geometries that spatially vary on a global scale where one projected coordinate system could not accurately plot coordinates and measure distances for all the geometries.
- ///
- ///
- /// This method only works with WGS84 (wkid: 4326) and Web Mercator spatial references. In general, if your input geometries are assigned one of those two spatial references, you should always use geodesicBuffer() to obtain the
- /// most accurate results for those geometries. If needing to buffer points assigned a projected coordinate system
- /// other than Web Mercator, use buffer() instead. If the input geometries have a geographic coordinate system other
- /// than WGS84 (wkid: 4326), use geometryService.buffer().
- ///
- ///
- /// The buffer input geometries
- ///
- ///
- /// The specified distance(s) for buffering. The length of the geometry array does not have to equal the length of the distance array. For example, if you pass an array of four geometries: [g1, g2, g3, g4] and an array with one distance: [d1], all four geometries will be buffered by the single distance value. If instead you use an array of three distances: [d1, d2, d3], g1 will be buffered by d1, g2 by d2, and g3 and g4 will both be buffered by d3. The value of the geometry array will be matched one to one with those in the distance array until the final value of the distance array is reached, in which case that value will be applied to the remaining geometries.
- ///
- ///
- /// Measurement unit of the distance(s). Defaults to the units of the input geometries.
- ///
- ///
- /// The resulting buffers
- ///
- public async Task GeodesicBuffer(IEnumerable geometries, IEnumerable distances,
- GeometryEngineLinearUnit? unit)
- {
- return await InvokeAsync("geodesicBuffer", geometries, distances, unit, null);
- }
-
- ///
- /// Creates geodesic buffer polygons at a specified distance around the input geometries. When calculating distances, this method takes the curvature of the earth into account, which provides highly accurate results when dealing with very large geometries and/or geometries that spatially vary on a global scale where one projected coordinate system could not accurately plot coordinates and measure distances for all the geometries.
- ///
- ///
- /// This method only works with WGS84 (wkid: 4326) and Web Mercator spatial references. In general, if your input geometries are assigned one of those two spatial references, you should always use geodesicBuffer() to obtain the
- /// most accurate results for those geometries. If needing to buffer points assigned a projected coordinate system
- /// other than Web Mercator, use buffer() instead. If the input geometries have a geographic coordinate system other
- /// than WGS84 (wkid: 4326), use geometryService.buffer().
- ///
- ///
- /// The buffer input geometries
- ///
- ///
- /// The specified distance(s) for buffering. The length of the geometry array does not have to equal the length of the distance array. For example, if you pass an array of four geometries: [g1, g2, g3, g4] and an array with one distance: [d1], all four geometries will be buffered by the single distance value. If instead you use an array of three distances: [d1, d2, d3], g1 will be buffered by d1, g2 by d2, and g3 and g4 will both be buffered by d3. The value of the geometry array will be matched one to one with those in the distance array until the final value of the distance array is reached, in which case that value will be applied to the remaining geometries.
- ///
- ///
- /// Measurement unit of the distance(s). Defaults to the units of the input geometries.
- ///
- ///
- /// Determines whether the output geometries should be unioned into a single polygon.
- ///
- ///
- /// The resulting buffers
- ///
- public async Task GeodesicBuffer(IEnumerable geometries, IEnumerable distances,
- GeometryEngineLinearUnit? unit, bool? unionResults)
- {
- return await InvokeAsync("geodesicBuffer", geometries, distances, unit, unionResults);
- }
-
- ///
- /// Creates geodesic buffer polygons at a specified distance around the input geometries. When calculating distances, this method takes the curvature of the earth into account, which provides highly accurate results when dealing with very large geometries and/or geometries that spatially vary on a global scale where one projected coordinate system could not accurately plot coordinates and measure distances for all the geometries.
- ///
- ///
- /// This method only works with WGS84 (wkid: 4326) and Web Mercator spatial references. In general, if your input geometries are assigned one of those two spatial references, you should always use geodesicBuffer() to obtain the
- /// most accurate results for those geometries. If needing to buffer points assigned a projected coordinate system
- /// other than Web Mercator, use buffer() instead. If the input geometries have a geographic coordinate system other
- /// than WGS84 (wkid: 4326), use geometryService.buffer().
- ///
- ///
- /// The buffer input geometru
- ///
- ///
- /// The specified distance for buffering.
- ///
- ///
- /// The resulting buffers
- ///
- public async Task GeodesicBuffer(Geometry geometry, double distance)
- {
- return await InvokeAsync("geodesicBuffer", geometry, distance, null);
- }
-
- ///
- /// Creates geodesic buffer polygons at a specified distance around the input geometries. When calculating distances, this method takes the curvature of the earth into account, which provides highly accurate results when dealing with very large geometries and/or geometries that spatially vary on a global scale where one projected coordinate system could not accurately plot coordinates and measure distances for all the geometries.
- ///
- ///
- /// This method only works with WGS84 (wkid: 4326) and Web Mercator spatial references. In general, if your input geometries are assigned one of those two spatial references, you should always use geodesicBuffer() to obtain the
- /// most accurate results for those geometries. If needing to buffer points assigned a projected coordinate system
- /// other than Web Mercator, use buffer() instead. If the input geometries have a geographic coordinate system other
- /// than WGS84 (wkid: 4326), use geometryService.buffer().
- ///
- ///
- /// The buffer input geometru
- ///
- ///
- /// The specified distance for buffering.
- ///
- ///
- /// Measurement unit of the distance. Defaults to the units of the input geometry.
- ///
- ///
- /// The resulting buffers
- ///
- public async Task GeodesicBuffer(Geometry geometry, double distance, GeometryEngineLinearUnit? unit)
- {
- return await InvokeAsync("geodesicBuffer", geometry, distance, unit);
- }
-
- ///
- /// Returns a geodesically densified version of the input geometry. Use this function to draw the line(s) of the geometry along great circles.
- ///
- ///
- /// A polyline or polygon to densify.
- ///
- ///
- /// The maximum segment length allowed (in meters if a maxSegmentLengthUnit is not provided). This must be a positive value.
- ///
- ///
- /// Returns the densified geometry.
- ///
- public async Task GeodesicDensify(Geometry geometry, double maxSegmentLength)
- {
- return await InvokeAsync("geodesicDensify", geometry, maxSegmentLength, null);
- }
-
- ///
- /// Returns a geodesically densified version of the input geometry. Use this function to draw the line(s) of the geometry along great circles.
- ///
- ///
- /// A polyline or polygon to densify.
- ///
- ///
- /// The maximum segment length allowed (in meters if a maxSegmentLengthUnit is not provided). This must be a positive value.
- ///
- ///
- /// Measurement unit for maxSegmentLength. If not provided, the unit will default to meters.
- ///
- ///
- /// Returns the densified geometry.
- ///
- public async Task GeodesicDensify(Geometry geometry, double maxSegmentLength,
- GeometryEngineLinearUnit? maxSegmentLengthUnit)
- {
- return await InvokeAsync("geodesicDensify", geometry, maxSegmentLength, maxSegmentLengthUnit);
- }
-
- ///
- /// Calculates the length of the input geometry. As opposed to planarLength(), geodesicLength() takes into account the curvature of the earth when performing this calculation. Therefore, when using input geometries with a spatial reference of either WGS84 (wkid: 4326) or Web Mercator, it is best practice to calculate lengths using geodesicLength(). If the input geometries have a projected coordinate system other than Web Mercator, use planarLength() instead.
- ///
- ///
- /// This method only works with WGS84 (wkid: 4326) and Web Mercator spatial references.
- ///
- ///
- /// The input geometry.
- ///
- ///
- /// Measurement unit of the return value. Defaults to the units of the input geometry.
- ///
- ///
- /// Length of the input geometry.
- ///
- public async Task GeodesicLength(Geometry geometry, GeometryEngineLinearUnit? unit = null)
- {
- return await InvokeAsync("geodesicLength", geometry, unit);
- }
-
- ///
- /// Creates new geometries from the intersections between two geometries. If the input geometries have different dimensions (i.e. point = 0; polyline = 1; polygon = 2), then the result's dimension will be equal to the lowest dimension of the inputs. The table below describes the expected output for various combinations of geometry types.
- ///
- ///
- /// The input array of geometries.
- ///
- ///
- /// The geometry to intersect with geometries1.
- ///
- ///
- /// The intersections of the geometries.
- ///
- public async Task Intersect(IEnumerable geometries1, Geometry geometry2)
- {
- return await InvokeAsync("intersect", geometries1, geometry2);
- }
-
- ///
- /// Creates new geometries from the intersections between two geometries. If the input geometries have different dimensions (i.e. point = 0; polyline = 1; polygon = 2), then the result's dimension will be equal to the lowest dimension of the inputs.
- ///
- ///
- /// The input geometry.
- ///
- ///
- /// The geometry to intersect with geometry1.
- ///
- ///
- /// The intersections of the geometries.
- ///
- public async Task Intersect(Geometry geometry1, Geometry geometry2)
- {
- return await InvokeAsync("intersect", geometry1, geometry2);
- }
-
- ///
- /// Indicates if one geometry intersects another geometry.
- ///
- ///
- /// The geometry that is tested for the intersects relationship to the other geometry.
- ///
- ///
- /// The geometry being intersected.
- ///
- ///
- /// Returns true if the input geometries intersect each other.
- ///
- public async Task Intersects(Geometry geometry1, Geometry geometry2)
- {
- return await InvokeAsync("intersects", geometry1, geometry2);
- }
-
- ///
- /// Indicates if the given geometry is topologically simple. In a simplified geometry, no polygon rings or polyline paths will overlap, and no self-intersection will occur.
- ///
- ///
- /// The input geometry.
- ///
- ///
- /// Returns true if the geometry is topologically simple.
- ///
- public async Task IsSimple(Geometry geometry)
- {
- return await InvokeAsync("isSimple", geometry);
- }
-
- ///
- /// Finds the coordinate of the geometry that is closest to the specified point.
- ///
- ///
- /// The geometry to consider.
- ///
- ///
- /// The point used to search the nearest coordinate in the geometry.
- ///
- ///
- /// Returns an object containing the nearest coordinate.
- ///
- public async Task NearestCoordinate(Geometry geometry, Point inputPoint)
- {
- return await InvokeAsync("nearestCoordinate", geometry, inputPoint);
- }
-
- ///
- /// Finds the vertex on the geometry nearest to the specified point.
- ///
- ///
- /// The geometry to consider.
- ///
- ///
- /// The point used to search the nearest vertex in the geometry.
- ///
- ///
- /// Returns an object containing the nearest vertex.
- ///
- public async Task NearestVertex(Geometry geometry, Point inputPoint)
- {
- return await InvokeAsync("nearestVertex", geometry, inputPoint);
- }
-
- ///
- /// Finds all vertices in the given distance from the specified point, sorted from the closest to the furthest and returns them as an array of Objects.
- ///
- ///
- /// The geometry to consider.
- ///
- ///
- /// The point from which to measure.
- ///
- ///
- /// The distance to search from the inputPoint in the units of the view's spatial reference.
- ///
- ///
- /// The maximum number of vertices to return.
- ///
- ///
- /// An array of objects containing the nearest vertices within the given searchRadius.
- ///
- public async Task NearestVertices(Geometry geometry, Point inputPoint, double searchRadius, int maxVertexCountToReturn)
- {
- return await InvokeAsync("nearestVertices", geometry, inputPoint, searchRadius, maxVertexCountToReturn);
- }
-
- ///
- /// The offset operation creates a geometry that is a constant planar distance from an input polyline or polygon. It is similar to buffering, but produces a one-sided result.
- ///
- ///
- /// The geometries to offset.
- ///
- ///
- /// The planar distance to offset from the input geometry. If offsetDistance > 0, then the offset geometry is constructed to the right of the oriented input geometry, if offsetDistance = 0, then there is no change in the geometries, otherwise it is constructed to the left. For a simple polygon, the orientation of outer rings is clockwise and for inner rings it is counter clockwise. So the "right side" of a simple polygon is always its inside.
- ///
- ///
- /// The offset geometries.
- ///
- public async Task Offset(IEnumerable geometries, double offsetDistance)
- {
- return await InvokeAsync("offset", geometries, offsetDistance, null, null, null, null);
- }
-
- ///
- /// The offset operation creates a geometry that is a constant planar distance from an input polyline or polygon. It is similar to buffering, but produces a one-sided result.
- ///
- ///
- /// The geometries to offset.
- ///
- ///
- /// The planar distance to offset from the input geometry. If offsetDistance > 0, then the offset geometry is constructed to the right of the oriented input geometry, if offsetDistance = 0, then there is no change in the geometries, otherwise it is constructed to the left. For a simple polygon, the orientation of outer rings is clockwise and for inner rings it is counter clockwise. So the "right side" of a simple polygon is always its inside.
- ///
- ///
- /// Measurement unit of the offset distance. Defaults to the units of the input geometries.
- ///
- ///
- /// The offset geometries.
- ///
- public async Task Offset(IEnumerable geometries, double offsetDistance,
- GeometryEngineLinearUnit? offsetUnit)
- {
- return await InvokeAsync("offset", geometries, offsetDistance,
- offsetUnit, null, null, null);
- }
-
- ///
- /// The offset operation creates a geometry that is a constant planar distance from an input polyline or polygon. It is similar to buffering, but produces a one-sided result.
- ///
- ///
- /// The geometries to offset.
- ///
- ///
- /// The planar distance to offset from the input geometry. If offsetDistance > 0, then the offset geometry is constructed to the right of the oriented input geometry, if offsetDistance = 0, then there is no change in the geometries, otherwise it is constructed to the left. For a simple polygon, the orientation of outer rings is clockwise and for inner rings it is counter clockwise. So the "right side" of a simple polygon is always its inside.
- ///
- ///
- /// Measurement unit of the offset distance. Defaults to the units of the input geometries.
- ///
- ///
- /// The
- ///
- ///
- /// The offset geometries.
- ///
- public async Task Offset(IEnumerable geometries, double offsetDistance,
- GeometryEngineLinearUnit? offsetUnit, JoinType? joinType)
- {
- return await InvokeAsync("offset", geometries, offsetDistance,
- offsetUnit, joinType, null, null);
- }
-
- ///
- /// The offset operation creates a geometry that is a constant planar distance from an input polyline or polygon. It is similar to buffering, but produces a one-sided result.
- ///
- ///
- /// The geometries to offset.
- ///
- ///
- /// The planar distance to offset from the input geometry. If offsetDistance > 0, then the offset geometry is constructed to the right of the oriented input geometry, if offsetDistance = 0, then there is no change in the geometries, otherwise it is constructed to the left. For a simple polygon, the orientation of outer rings is clockwise and for inner rings it is counter clockwise. So the "right side" of a simple polygon is always its inside.
- ///
- ///
- /// Measurement unit of the offset distance. Defaults to the units of the input geometries.
- ///
- ///
- /// The
- ///
- ///
- /// Applicable when joinType = 'miter'; bevelRatio is multiplied by the offset distance and the result determines how far a mitered offset intersection can be located before it is beveled.
- ///
- ///
- /// The offset geometries.
- ///
- public async Task Offset(IEnumerable geometries, double offsetDistance,
- GeometryEngineLinearUnit? offsetUnit, JoinType? joinType, double? bevelRatio)
- {
- return await InvokeAsync("offset", geometries, offsetDistance,
- offsetUnit, joinType, bevelRatio, null);
- }
-
- ///
- /// The offset operation creates a geometry that is a constant planar distance from an input polyline or polygon. It is similar to buffering, but produces a one-sided result.
- ///
- ///
- /// The geometries to offset.
- ///
- ///
- /// The planar distance to offset from the input geometry. If offsetDistance > 0, then the offset geometry is constructed to the right of the oriented input geometry, if offsetDistance = 0, then there is no change in the geometries, otherwise it is constructed to the left. For a simple polygon, the orientation of outer rings is clockwise and for inner rings it is counter clockwise. So the "right side" of a simple polygon is always its inside.
- ///
- ///
- /// Measurement unit of the offset distance. Defaults to the units of the input geometries.
- ///
- ///
- /// The
- ///
- ///
- /// Applicable when joinType = 'miter'; bevelRatio is multiplied by the offset distance and the result determines how far a mitered offset intersection can be located before it is beveled.
- ///
- ///
- /// Applicable when joinType = 'round'; flattenError determines the maximum distance of the resulting segments compared to the true circular arc. The algorithm never produces more than around 180 vertices for each round join.
- ///
- ///
- /// The offset geometries.
- ///
- public async Task Offset(IEnumerable geometries, double offsetDistance,
- GeometryEngineLinearUnit? offsetUnit, JoinType? joinType, double? bevelRatio,
- double? flattenError)
- {
- return await InvokeAsync("offset", geometries, offsetDistance, offsetUnit, joinType, bevelRatio, flattenError);
- }
-
- ///
- /// The offset operation creates a geometry that is a constant planar distance from an input polyline or polygon. It is similar to buffering, but produces a one-sided result.
- ///
- ///
- /// The geometry to offset.
- ///
- ///
- /// The planar distance to offset from the input geometry. If offsetDistance > 0, then the offset geometry is constructed to the right of the oriented input geometry, if offsetDistance = 0, then there is no change in the geometries, otherwise it is constructed to the left. For a simple polygon, the orientation of outer rings is clockwise and for inner rings it is counter clockwise. So the "right side" of a simple polygon is always its inside.
- ///
- ///
- /// The offset geometry.
- ///
- public async Task Offset(Geometry geometry, double offsetDistance)
- {
- return await InvokeAsync("offset", geometry, offsetDistance, null, null, null, null);
- }
-
- ///
- /// The offset operation creates a geometry that is a constant planar distance from an input polyline or polygon. It is similar to buffering, but produces a one-sided result.
- ///
- ///
- /// The geometry to offset.
- ///
- ///
- /// The planar distance to offset from the input geometry. If offsetDistance > 0, then the offset geometry is constructed to the right of the oriented input geometry, if offsetDistance = 0, then there is no change in the geometries, otherwise it is constructed to the left. For a simple polygon, the orientation of outer rings is clockwise and for inner rings it is counter clockwise. So the "right side" of a simple polygon is always its inside.
- ///
- ///
- /// Measurement unit of the offset distance. Defaults to the units of the input geometries.
- ///
- ///
- /// The offset geometry.
- ///
- public async Task Offset(Geometry geometry, double offsetDistance,
- GeometryEngineLinearUnit? offsetUnit)
- {
- return await InvokeAsync("offset", geometry, offsetDistance,
- offsetUnit, null, null, null);
- }
-
- ///
- /// The offset operation creates a geometry that is a constant planar distance from an input polyline or polygon. It is similar to buffering, but produces a one-sided result.
- ///
- ///
- /// The geometry to offset.
- ///
- ///
- /// The planar distance to offset from the input geometry. If offsetDistance > 0, then the offset geometry is constructed to the right of the oriented input geometry, if offsetDistance = 0, then there is no change in the geometries, otherwise it is constructed to the left. For a simple polygon, the orientation of outer rings is clockwise and for inner rings it is counter clockwise. So the "right side" of a simple polygon is always its inside.
- ///
- ///
- /// Measurement unit of the offset distance. Defaults to the units of the input geometries.
- ///
- ///
- /// The
- ///
- ///
- /// The offset geometry.
- ///
- public async Task Offset(Geometry geometry, double offsetDistance,
- GeometryEngineLinearUnit? offsetUnit, JoinType? joinType)
- {
- return await InvokeAsync("offset", geometry, offsetDistance,
- offsetUnit, joinType, null, null);
- }
-
- ///
- /// The offset operation creates a geometry that is a constant planar distance from an input polyline or polygon. It is similar to buffering, but produces a one-sided result.
- ///
- ///
- /// The geometry to offset.
- ///
- ///
- /// The planar distance to offset from the input geometry. If offsetDistance > 0, then the offset geometry is constructed to the right of the oriented input geometry, if offsetDistance = 0, then there is no change in the geometries, otherwise it is constructed to the left. For a simple polygon, the orientation of outer rings is clockwise and for inner rings it is counter clockwise. So the "right side" of a simple polygon is always its inside.
- ///
- ///
- /// Measurement unit of the offset distance. Defaults to the units of the input geometries.
- ///
- ///
- /// The
- ///
- ///
- /// Applicable when joinType = 'miter'; bevelRatio is multiplied by the offset distance and the result determines how far a mitered offset intersection can be located before it is beveled.
- ///
- ///
- /// The offset geometry.
- ///
- public async Task Offset(Geometry geometry, double offsetDistance,
- GeometryEngineLinearUnit? offsetUnit, JoinType? joinType, double? bevelRatio)
- {
- return await InvokeAsync("offset", geometry, offsetDistance,
- offsetUnit, joinType, bevelRatio, null);
- }
-
- ///
- /// The offset operation creates a geometry that is a constant planar distance from an input polyline or polygon. It is similar to buffering, but produces a one-sided result.
- ///
- ///
- /// The geometry to offset.
- ///
- ///
- /// The planar distance to offset from the input geometry. If offsetDistance > 0, then the offset geometry is constructed to the right of the oriented input geometry, if offsetDistance = 0, then there is no change in the geometries, otherwise it is constructed to the left. For a simple polygon, the orientation of outer rings is clockwise and for inner rings it is counter clockwise. So the "right side" of a simple polygon is always its inside.
- ///
- ///
- /// Measurement unit of the offset distance. Defaults to the units of the input geometries.
- ///
- ///
- /// The
- ///
- ///
- /// Applicable when joinType = 'miter'; bevelRatio is multiplied by the offset distance and the result determines how far a mitered offset intersection can be located before it is beveled.
- ///
- ///
- /// Applicable when joinType = 'round'; flattenError determines the maximum distance of the resulting segments compared to the true circular arc. The algorithm never produces more than around 180 vertices for each round join.
- ///
- ///
- /// The offset geometry.
- ///
- public async Task Offset(Geometry geometry, double offsetDistance,
- GeometryEngineLinearUnit? offsetUnit, JoinType? joinType, double? bevelRatio,
- double? flattenError)
- {
- return await InvokeAsync("offset", geometry, offsetDistance, offsetUnit, joinType, bevelRatio, flattenError);
- }
-
- ///
- /// Indicates if one geometry overlaps another geometry.
- ///
- ///
- /// The base geometry that is tested for the "overlaps" relationship with the other geometry.
- ///
- ///
- /// The comparison geometry that is tested for the "overlaps" relationship with the other geometry.
- ///
- ///
- /// Returns true if the two geometries overlap.
- ///
- public async Task Overlaps(Geometry geometry1, Geometry geometry2)
- {
- return await InvokeAsync("overlaps", geometry1, geometry2);
- }
-
- ///
- /// Calculates the area of the input geometry. As opposed to geodesicArea(), planarArea() performs this calculation using projected coordinates and does not take into account the earth's curvature. When using input geometries with a spatial reference of either WGS84 (wkid: 4326) or Web Mercator, it is best practice to calculate areas using geodesicArea(). If the input geometries have a projected coordinate system other than Web Mercator, use planarArea() instead.
- ///
- ///
- /// The input polygon.
- ///
- public async Task PlanarArea(Polygon geometry)
- {
- return await InvokeAsync("planarArea", geometry, null);
- }
-
- ///
- /// Calculates the area of the input geometry. As opposed to geodesicArea(), planarArea() performs this calculation using projected coordinates and does not take into account the earth's curvature. When using input geometries with a spatial reference of either WGS84 (wkid: 4326) or Web Mercator, it is best practice to calculate areas using geodesicArea(). If the input geometries have a projected coordinate system other than Web Mercator, use planarArea() instead.
- ///
- ///
- /// The input polygon.
- ///
- ///
- /// Measurement unit of the return value. Defaults to the units of the input geometries.
- ///
- ///
- /// The area of the input geometry.
- ///
- public async Task PlanarArea(Polygon geometry, GeometryEngineAreaUnit? unit)
- {
- return await InvokeAsync("planarArea", geometry, unit);
- }
-
- ///
- /// Calculates the length of the input geometry. As opposed to geodesicLength(), planarLength() uses projected coordinates and does not take into account the curvature of the earth when performing this calculation. When using input geometries with a spatial reference of either WGS84 (wkid: 4326) or Web Mercator, it is best practice to calculate lengths using geodesicLength(). If the input geometries have a projected coordinate system other than Web Mercator, use planarLength() instead.
- ///
- ///
- /// The input geometry.
- ///
- ///
- /// The length of the input geometry.
- ///
- public async Task PlanarLength(Geometry geometry)
- {
- return await InvokeAsync("planarLength", geometry);
- }
-
- ///
- /// Calculates the length of the input geometry. As opposed to geodesicLength(), planarLength() uses projected coordinates and does not take into account the curvature of the earth when performing this calculation. When using input geometries with a spatial reference of either WGS84 (wkid: 4326) or Web Mercator, it is best practice to calculate lengths using geodesicLength(). If the input geometries have a projected coordinate system other than Web Mercator, use planarLength() instead.
- ///
- ///
- /// The input geometry.
- ///
- ///
- /// Measurement unit of the return value. Defaults to the units of the input geometries.
- ///
- ///
- /// The length of the input geometry.
- ///
- public async Task PlanarLength(Geometry geometry, GeometryEngineLinearUnit? unit)
- {
- return await InvokeAsync("planarLength", geometry, unit);
- }
-
- ///
- /// Indicates if the given DE-9IM relation is true for the two geometries.
- ///
- ///
- /// The first geometry for the relation.
- ///
- ///
- /// The second geometry for the relation.
- ///
- ///
- /// The Dimensionally Extended 9 Intersection Model (DE-9IM) matrix relation (encoded as a string) to test against the relationship of the two geometries. This string contains the test result of each intersection represented in the DE-9IM matrix. Each result is one character of the string and may be represented as either a number (maximum dimension returned: 0,1,2), a Boolean value (T or F), or a mask character (for ignoring results: '*'). For example, each of the following DE-9IM string codes are valid for testing whether a polygon geometry completely contains a line geometry: TTTFFTFFT (Boolean), 'T******FF*' (ignore irrelevant intersections), or '102FF*FF*' (dimension form). Each returns the same result. See
- /// this article and
- ///
- /// this
- /// ArcGIS help page
- ///
- /// for more information about the DE-9IM model and how string codes are constructed.
- ///
- ///
- /// Returns true if the relation of the input geometries is accurate.
- ///
- public async Task Relate(Geometry geometry1, Geometry geometry2, string relation)
- {
- return await InvokeAsync("relate", geometry1, geometry2, relation);
- }
-
- ///
- /// Rotates a geometry counterclockwise by the specified number of degrees. Rotation is around the centroid, or a given rotation point.
- ///
- ///
- /// The geometry to rotate.
- ///
- ///
- /// The rotation angle in degrees.
- ///
- ///
- /// Point to rotate the geometry around. Defaults to the centroid of the geometry.
- ///
- ///
- /// The rotated geometry.
- ///
- public async Task Rotate(Geometry geometry, double angle, Point rotationOrigin)
- {
- return await InvokeAsync("rotate", geometry, angle, rotationOrigin);
- }
-
- ///
- /// Performs the simplify operation on the geometry, which alters the given geometries to make their definitions topologically legal with respect to their geometry type. At the end of a simplify operation, no polygon rings or polyline paths will overlap, and no self-intersection will occur.
- ///
- ///
- /// The geometry to be simplified.
- ///
- ///
- /// The simplified geometry.
- ///
- public async Task Simplify(Geometry geometry)
- {
- return await InvokeAsync("simplify", geometry);
- }
-
- ///
- /// Creates the symmetric difference of two geometries. The symmetric difference includes the parts that are in either of the sets, but not in both.
- ///
- ///
- /// One of the Geometry instances in the XOR operation.
- ///
- ///
- /// One of the Geometry instances in the XOR operation.
- ///
- ///
- /// The symmetric differences of the two geometries.
- ///
- public async Task SymmetricDifference(IEnumerable leftGeometries, Geometry rightGeometry)
- {
- return await InvokeAsync("symmetricDifference", leftGeometries, rightGeometry);
- }
-
- ///
- /// Creates the symmetric difference of two geometries. The symmetric difference includes the parts that are in either of the sets, but not in both.
- ///
- ///
- /// One of the Geometry instances in the XOR operation.
- ///
- ///
- /// One of the Geometry instances in the XOR operation.
- ///
- ///
- /// The symmetric differences of the two geometries.
- ///
- public async Task SymmetricDifference(Geometry leftGeometry, Geometry rightGeometry)
- {
- return await InvokeAsync("symmetricDifference", leftGeometry, rightGeometry);
- }
-
- ///
- /// Indicates if one geometry touches another geometry.
- ///
- ///
- /// The geometry to test the "touches" relationship with the other geometry.
- ///
- ///
- /// The geometry to be touched.
- ///
- ///
- /// When true, geometry1 touches geometry2.
- ///
- public async Task Touches(Geometry geometry1, Geometry geometry2)
- {
- return await InvokeAsync("touches", geometry1, geometry2);
- }
-
- ///
- /// All inputs must be of the same type of geometries and share one spatial reference.
- ///
- ///
- /// An array of Geometries to union.
- ///
- ///
- /// The union of the geometries
- ///
- public async Task Union(params Geometry[] geometries)
- {
- return await InvokeAsync("union", geometries.Cast