/// <summary> /// Adds a new cross section to the CrossSectionData object /// </summary> /// <param name="csData">Cross section data object</param> public static void AddCrossSection(CrossSectionData csData) { // Note: Raw data must be ordered from left to right in order for hydraulic radius to be processed correctly // Creates a class representing a cross section with raw data attached. CrossSectionFactory builder = new CrossSectionFactory(); builder.BuildOpen(""); // Defines the location of the current cross section. The Z-coordinate // is the bottom level of the cross section (unless defined by the // raw data (the open cross sections)). builder.SetLocation(new ZLocation("river B", 500) { Z = 0 }); // Create a number of points CrossSectionPointList points = new CrossSectionPointList(); points.Add(new CrossSectionPoint(-1.0, 2.0)); points.Add(new CrossSectionPoint(0.0, 1.0)); points.Add(new CrossSectionPoint(0.0, 0.0)); points.Add(new CrossSectionPoint(1.0, 0.0)); points.Add(new CrossSectionPoint(1.0, 1.0)); points.Add(new CrossSectionPoint(2.0, 2.0)); points.Add(new CrossSectionPoint(3.0, 2.0)); // dummy point, outside right levee bank marker // Sets the markers at left/right side and lowest point. builder.SetRawPoints(points); builder.SetLeftLeveeBank(points[0]); builder.SetLowestPoint(points[3]); builder.SetRightLeveeBank(points[5]); // Set flow resistance FlowResistance flowResistance = new FlowResistance(); flowResistance.ResistanceDistribution = ResistanceDistribution.Uniform; flowResistance.ResistanceValue = 1; flowResistance.Formulation = ResistanceFormulation.Relative; builder.SetFlowResistance(flowResistance); builder.SetRadiusType(RadiusType.ResistanceRadius); // Get cross section from builder CrossSectionLocated cs = builder.GetCrossSection(); cs.TopoID = "1"; // Calculates the processed levels, storage areas, radii, etc, ie, fill in all // ProcessedXXX properties. cs.BaseCrossSection.CalculateProcessedData(); // Validates the data. The constraints are that the levels and the areas after sorting // must be monotonically increasing. IDiagnostics diagnostics = cs.Validate(); if (diagnostics.ErrorCountRecursive > 0) { throw new Exception(String.Format("Number of errors: {0}", diagnostics.Errors.Count)); } // Add the cross section csData.Add(cs); }