Editor/Roof/ArchRoofExpectedReport.cs

Editor UI/report helper for roof parts. It implements IArchExpectedReport and returns a serializable anonymous object describing an ArchRoofPart, its properties, gutter runs and some building/kit-derived values for previewing or reporting in the editor.

File Access
using System.Linq;
using Sandbox;

namespace Sunless.Architecture;

public sealed class ArchRoofExpectedReport : IArchExpectedReport
{
	public ArchKind Kind => ArchKind.Roof;

	public object Describe( object payload, ArchTarget target, ArchTool tool )
	{
		if ( payload is not ArchRoofPart roof || target.Building is null )
		{
			return null;
		}

		var building = target.Building;
		var kit = tool.Kit;
		var runs = ArchRoofGen.GutterRuns( roof, building, kit, tool.Plan );

		return new
		{
			roof.Name,
			Style = roof.Style.ToString(),
			roof.Level,
			roof.BaseHeight,
			roof.Pitch,
			roof.Overhang,
			roof.RidgeAlongX,
			roof.Fascia,
			roof.Soffit,
			roof.Gutters,
			roof.Parapet,
			roof.Ceiling,
			roof.EndWalls,
			building.GuttersEnabled,
			FasciaDepth = ArchProfiles.FasciaDepth( kit ),
			Corners = roof.Outline().Count,
			GutterRuns = runs.Select( run => new
			{
				Loop = run.Closed,
				Points = run.Points.Count,
				From = Say( run.Raised().First() ),
				To = Say( run.Raised().Last() ),
				run.Length
			} ).ToList()
		};
	}

	static string Say( Vector3 point ) => $"{point.x:0.#},{point.y:0.#},{point.z:0.#}";
}