public void GetGeometryWidthYZDefinitionShouldBeFast() { var yz = new CrossSectionDefinitionYZ(""); yz.YZDataTable.AddCrossSectionYZRow(10, 100, 0); yz.YZDataTable.AddCrossSectionYZRow(9, 90, 0); yz.YZDataTable.AddCrossSectionYZRow(8, 80, 0); yz.YZDataTable.AddCrossSectionYZRow(7, 60, 0); yz.YZDataTable.AddCrossSectionYZRow(6, 70, 0); yz.YZDataTable.AddCrossSectionYZRow(5, 40, 0); yz.YZDataTable.AddCrossSectionYZRow(4, 40, 0); yz.YZDataTable.AddCrossSectionYZRow(3, 20, 0); var network = HydroNetworkHelper.GetSnakeHydroNetwork(1); var branch = network.Channels.First(); var crossSection = HydroNetworkHelper.AddCrossSectionDefinitionToBranch(branch, yz, 30); TestHelper.AssertIsFasterThan(50, () => { for (int i = 0; i < 10000; i++) { var geo = crossSection.Geometry; } }); }
public void AddManyBranchesWithCrossSections() { TestHelper.AssertIsFasterThan(2275, () => { const int count = 10000; var network = new HydroNetwork(); for (int i = 0; i < count; i++) { var from = new HydroNode(); var to = new HydroNode(); network.Nodes.Add(from); network.Nodes.Add(to); var channel = new Channel { Source = from, Target = to }; HydroNetworkHelper.AddCrossSectionDefinitionToBranch(channel, new CrossSectionDefinitionXYZ(), 0); } int crossSectionCount = 0; foreach (var crossSection in network.CrossSections) { // access all CrossSections should be also fast crossSectionCount++; } }); }
public void ChangeInDefinitionUpdatesGeometry() { //v-shaped cs 100 wide var crossSectionDefinitionYZ = new CrossSectionDefinitionYZ(""); crossSectionDefinitionYZ.YZDataTable.AddCrossSectionYZRow(0, 100, 0); crossSectionDefinitionYZ.YZDataTable.AddCrossSectionYZRow(50, 0, 0); crossSectionDefinitionYZ.YZDataTable.AddCrossSectionYZRow(100, 100, 0); crossSectionDefinitionYZ.Thalweg = 50; //horizontal line var network = HydroNetworkHelper.GetSnakeHydroNetwork(new Point(0, 0), new Point(100, 0)); var branch = network.Channels.First(); ICrossSection crossSection = HydroNetworkHelper.AddCrossSectionDefinitionToBranch(branch, crossSectionDefinitionYZ, 50); var expectedGeometry = new LineString(new[] { new Coordinate(50, 50), new Coordinate(50, -50) }); //use equals exact because rounding errors occur Assert.IsTrue(expectedGeometry.EqualsExact(crossSection.Geometry, 0.0001)); //action : change the profile crossSectionDefinitionYZ.YZDataTable[0].Yq = -20; expectedGeometry = new LineString(new[] { new Coordinate(50, 70), new Coordinate(50, -50) }); Assert.IsTrue(expectedGeometry.EqualsExact(crossSection.Geometry, 0.0001)); //action: change the thalweg crossSectionDefinitionYZ.Thalweg = 40; expectedGeometry = new LineString(new[] { new Coordinate(50, 60), new Coordinate(50, -60) }); Assert.IsTrue(expectedGeometry.EqualsExact(crossSection.Geometry, 0.0001)); }
public void CloneHydroNetworkWithVariousBranchFeatures() { var network = new HydroNetwork(); var from = new HydroNode(); var to = new HydroNode(); network.Nodes.Add(from); network.Nodes.Add(to); var channel = new Channel { Source = from, Target = to }; network.Branches.Add(channel); var compositeBranchStructure = new CompositeBranchStructure(); NetworkHelper.AddBranchFeatureToBranch(compositeBranchStructure, channel, 0); HydroNetworkHelper.AddStructureToComposite(compositeBranchStructure, new Weir()); HydroNetworkHelper.AddStructureToComposite(compositeBranchStructure, new Pump()); var crossSectionXYZ = new CrossSectionDefinitionXYZ { Geometry = new LineString(new[] { new Coordinate(0, 0), new Coordinate(10, 0) }) }; HydroNetworkHelper.AddCrossSectionDefinitionToBranch(channel, crossSectionXYZ, 0); var clonedHydroNetwork = (IHydroNetwork)network.Clone(); clonedHydroNetwork.CrossSections.Should().Have.Count.EqualTo(1); clonedHydroNetwork.CompositeBranchStructures.Should().Have.Count.EqualTo(1); clonedHydroNetwork.Weirs.Should().Have.Count.EqualTo(1); clonedHydroNetwork.Pumps.Should().Have.Count.EqualTo(1); }
public void CannotRemoveSectionTypesThatAreUsedByCrossSections() { //setup a network with a crossection and a sectiontype that is used var channel = new Channel(); var network = new HydroNetwork(); var crossSectionZW = new CrossSectionDefinitionZW(); var crossSectionSectionType = new CrossSectionSectionType(); crossSectionZW.Sections.Add(new CrossSectionSection { SectionType = crossSectionSectionType }); HydroNetworkHelper.AddCrossSectionDefinitionToBranch(channel, crossSectionZW, 0.0); network.CrossSectionSectionTypes.Add(crossSectionSectionType); network.Branches.Add(channel); //action! remove the sectiontype network.CrossSectionSectionTypes.Remove(crossSectionSectionType); //still have 2. one plus a 'default'? Assert.AreEqual(2, network.CrossSectionSectionTypes.Count); Assert.IsTrue(network.CrossSectionSectionTypes.Contains(crossSectionSectionType)); }
private HydroNetwork GetNetwork() { var network = new HydroNetwork(); var crossSectionSectionType = new CrossSectionSectionType { Name = "Jan" }; network.CrossSectionSectionTypes.Add(crossSectionSectionType); crossSectionSectionType.Id = 666;//debug easy by idd var from = new HydroNode(); var to = new HydroNode(); network.Nodes.Add(from); network.Nodes.Add(to); var channel = new Channel { Source = from, Target = to }; network.Branches.Add(channel); var crossSectionXYZ = new CrossSectionDefinitionXYZ { Geometry = new LineString(new[] { new Coordinate(0, 0), new Coordinate(10, 0) }) }; crossSectionXYZ.Sections.Add(new CrossSectionSection { SectionType = crossSectionSectionType }); HydroNetworkHelper.AddCrossSectionDefinitionToBranch(channel, crossSectionXYZ, 0); return(network); }
public void SetDefaultGeometryWithBrancheGeometry() { var hydroNetwork = new HydroNetwork(); var channel = new Channel { Geometry = new LineString(new[] { new Coordinate(0, 0), new Coordinate(20, 0) }) }; var crossSectionDefinition = new CrossSectionDefinitionYZ(); crossSectionDefinition.YZDataTable.AddCrossSectionYZRow(0, 5, 0); crossSectionDefinition.YZDataTable.AddCrossSectionYZRow(2, 0, 1); crossSectionDefinition.YZDataTable.AddCrossSectionYZRow(4, 5, 0); crossSectionDefinition.Thalweg = 2; hydroNetwork.Branches.Add(channel); int offset = 12; var crossSection = HydroNetworkHelper.AddCrossSectionDefinitionToBranch(channel, crossSectionDefinition, offset); Assert.AreEqual(4, crossSection.Geometry.Length); Assert.AreEqual(2, crossSection.Geometry.Coordinates.Length); Assert.IsTrue(crossSection.Geometry.Coordinates.All(c => c.X == offset)); Assert.AreEqual(new[] { 2d, -2d }, crossSection.Geometry.Coordinates.Select(c => c.Y).ToList()); }
public void CloneHydroNetworkWithProxyDefinitions() { var network = HydroNetworkHelper.GetSnakeHydroNetwork(1); var sharedDefinition = new CrossSectionDefinitionYZ(); network.SharedCrossSectionDefinitions.Add(sharedDefinition); HydroNetworkHelper.AddCrossSectionDefinitionToBranch(network.Channels.First(), new CrossSectionDefinitionProxy(sharedDefinition), 10.0d); var clone = (HydroNetwork)network.Clone(); TestReferenceHelper.AssertStringRepresentationOfGraphIsEqual(network, clone); }
public void BranchCrossSectionShouldRaiseCollectionChangedEvent() { var crossSection = new CrossSectionDefinitionXYZ(); var branch = new Channel(new HydroNode("from"), new HydroNode("To")); int count = 0; Post.Cast <Channel, INotifyCollectionChange>(branch).CollectionChanged += delegate { count++; }; HydroNetworkHelper.AddCrossSectionDefinitionToBranch(branch, crossSection, 0.0); Assert.AreEqual(1, count); branch.BranchFeatures.Clear(); Assert.AreEqual(2, count); }
public void CloneRewiresProxyDefinitions() { var network = HydroNetworkHelper.GetSnakeHydroNetwork(1); var sharedDefinition = new CrossSectionDefinitionYZ(); network.SharedCrossSectionDefinitions.Add(sharedDefinition); var crossSectionDefinitionProxy = new CrossSectionDefinitionProxy(sharedDefinition); HydroNetworkHelper.AddCrossSectionDefinitionToBranch(network.Branches.First(), crossSectionDefinitionProxy, 10.0); var clonedNetwork = (HydroNetwork)network.Clone(); Assert.AreEqual(1, clonedNetwork.SharedCrossSectionDefinitions.Count); //check the proxy got rewired var crossSectionClone = clonedNetwork.CrossSections.First(); var clonedProxyDefinition = (CrossSectionDefinitionProxy)crossSectionClone.Definition; Assert.AreEqual(clonedProxyDefinition.InnerDefinition, clonedNetwork.SharedCrossSectionDefinitions.First()); }
public void CloneHydroNetworkWithCrossSectionSectionTypes() { var network = new HydroNetwork(); var crossSectionSectionType = new CrossSectionSectionType { Name = "Jan" }; network.CrossSectionSectionTypes.Add(crossSectionSectionType); crossSectionSectionType.Id = 666;//debug easy by idd var from = new HydroNode(); var to = new HydroNode(); network.Nodes.Add(from); network.Nodes.Add(to); var channel = new Channel { Source = from, Target = to }; network.Branches.Add(channel); var crossSectionXYZ = new CrossSectionDefinitionXYZ { Geometry = new LineString(new[] { new Coordinate(0, 0), new Coordinate(10, 0) }) }; crossSectionXYZ.Sections.Add(new CrossSectionSection { SectionType = crossSectionSectionType }); HydroNetworkHelper.AddCrossSectionDefinitionToBranch(channel, crossSectionXYZ, 0); var clonedHydroNetwork = (IHydroNetwork)network.Clone(); clonedHydroNetwork.CrossSections.Should().Have.Count.EqualTo(1); var cloneCrossSection = clonedHydroNetwork.CrossSections.FirstOrDefault(); var clonedType = clonedHydroNetwork.CrossSectionSectionTypes.FirstOrDefault(t => t.Name == "Jan"); //the type should be cloned Assert.AreNotEqual(clonedType, crossSectionSectionType); //the crosssection reference should be updated to use the cloned type Assert.AreEqual(clonedType, cloneCrossSection.Definition.Sections[0].SectionType); }
public void CloneHydroNetworkWithCrossSection() { var network = new HydroNetwork(); var from = new HydroNode(); var to = new HydroNode(); network.Nodes.Add(from); network.Nodes.Add(to); var channel = new Channel { Source = from, Target = to }; network.Branches.Add(channel); var crossSectionXYZ = new CrossSectionDefinitionXYZ { Geometry = new LineString(new[] { new Coordinate(0, 0), new Coordinate(10, 0) }) }; HydroNetworkHelper.AddCrossSectionDefinitionToBranch(channel, crossSectionXYZ, 0); var clonedHydroNetwork = (IHydroNetwork)network.Clone(); clonedHydroNetwork.CrossSections.Should().Have.Count.EqualTo(1); }