Files
ShrlAlgoToolkit/ShrlAlgoToolkit.RevitAddins/RvIndependent/MetroGauges/LandXMLData/Region.cs

163 lines
4.7 KiB
C#
Raw Normal View History

2025-04-24 20:56:44 +08:00
using System.Xml.Serialization;
using ShrlAlgoToolkit.RevitAddins.RvIndependent.MetroGauges.LandXMLData.Interfaces;
2025-04-24 20:56:44 +08:00
namespace ShrlAlgoToolkit.RevitAddins.RvIndependent.MetroGauges.LandXMLData
{
[XmlType("Region")]
[Serializable]
public class Region : GenerationRange, IComparableStructure<Region>
{
public Region()
{
Import = true;
Parts = new List<Part>();
}
[XmlIgnore]
public string NamePart => Name + (Part != 0 ? " " + Part : string.Empty);
[XmlIgnore]
public string NameRange => string.Concat(Name, ": ", StartStation.ToString(), " - ", EndStation.ToString());
[XmlIgnore]
public string RegionId => string.Concat(RegionIdBase, " (", StartStation.ToString(), "-", EndStation.ToString(), ")");
[XmlIgnore]
internal string RegionIdBase => (Alignment != null ? Alignment.AlignmentId : string.Empty) + AssemblyId;
[XmlIgnore]
public Alignment Alignment { get; internal set; }
[XmlAttribute("import")]
public bool Import { get; set; }
[XmlAttribute("id")]
public int Id { get; set; }
[XmlAttribute("part")]
public int Part { get; set; }
[XmlElement("Part")]
public List<Part> Parts { get; set; }
[XmlAttribute]
public string AssemblyId { get; set; }
[XmlAttribute("name")]
public string Name { get; set; }
public bool DifferentDescendants(Region region)
{
if (Parts.Count == region.Parts.Count)
{
for (int i = 0; i < Parts.Count; i++)
{
if (!Parts[i].Equals(region.Parts[i]))
{
return true;
}
}
return false;
}
return true;
}
public bool DifferentItem(Region region)
{
return Import != region.Import
|| StartStation != region.StartStation
|| EndStation != region.EndStation
|| GenerationStartStation != region.GenerationStartStation
|| GenerationEndStation != region.GenerationEndStation;
}
public bool Equals(Region region)
{
return !ReferenceEquals(region, null) && !DifferentItem(region) && !DifferentDescendants(region);
}
public void AddPart(
DesignShape designShape,
PartType type,
int fColor,
int bColor,
bool import = true,
double start = double.NegativeInfinity,
double end = double.PositiveInfinity
)
{
Part part = Parts.FirstOrDefault(item => item.NameSideSegment == designShape.NameSideSegment);
if (part == null)
{
Part part2 = new Part(designShape);
part2.Type = type;
part2.FillColorARGB = fColor;
part2.BorderColorARGB = bColor;
part2.Import = import;
part2.Region = this;
Part part3 = part2;
int id;
if (Parts.Count <= 0)
{
id = 1;
}
else
{
id = Parts.Max(item => item.Id) + 1;
}
part3.Id = id;
AddPart(part2, start, end);
return;
}
Range range = part.Ranges.Last();
if (range.EndStation < end)
{
range.EndStation = end;
}
}
public void ConnectParts()
{
foreach (Part part in Parts)
{
part.Region = this;
}
}
public override bool Equals(object obj)
{
return Equals(obj as Region);
}
public Part FindPart(Part reference)
{
return Parts.FirstOrDefault(item => item.NameSideSegment == reference.NameSideSegment);
}
public override int GetHashCode()
{
return base.GetHashCode();
}
internal void AddPart(Part part, double start = double.NegativeInfinity, double end = double.PositiveInfinity)
{
if (part.Ranges == null)
{
part.Ranges = new List<Range>();
}
Parts.Add(part);
if (part.Ranges.Count == 0)
{
Range range = new Range { Parent = part };
range.SetRange(Math.Max(start, StartStation), Math.Min(end, EndStation));
part.AddRange(range);
}
}
}
}