private static ISiteSelector CopySiteSelector(ISiteSelector siteSelector) { ISiteSelector siteSelectorCopy; if (siteSelector is CompleteStand) { siteSelectorCopy = new CompleteStand(); } else if (siteSelector is PartialStandSpreading partialStandSpreading) { var minTargetSize = GetTypePrivateField <double>(partialStandSpreading, "minTargetSize"); var maxTargetSize = GetTypePrivateField <double>(partialStandSpreading, "maxTargetSize"); siteSelectorCopy = new PartialStandSpreading(minTargetSize, maxTargetSize); } else if (siteSelector is CompleteStandSpreading completeStandSpreading) { var minTargetSize = GetTypePrivateField <double>(completeStandSpreading, "minTargetSize"); var maxTargetSize = GetTypePrivateField <double>(completeStandSpreading, "maxTargetSize"); siteSelectorCopy = new CompleteStandSpreading(minTargetSize, maxTargetSize); } else if (siteSelector is PatchCutting patchCutting) { var percent = GetTypePrivateField <double>(patchCutting, "percent"); var patchSize = GetTypePrivateField <double>(patchCutting, "patch_size"); var allowOverlap = GetTypePrivateField <bool>(patchCutting, "allowOverlap"); siteSelectorCopy = new PatchCutting(new Percentage(percent), patchSize, allowOverlap ? "AllowOverlap" : string.Empty); } else { throw new Exception(); } return(siteSelectorCopy); }
//--------------------------------------------------------------------- new protected InputValue<ISiteSelector> ReadSiteSelector(StringReader reader, out int index) { TextReader.SkipWhitespace(reader); index = reader.Index; string name = TextReader.ReadWord(reader); if (name == "") throw new InputValueException(); // Missing value ISiteSelector selector; StringBuilder valueAsStr = new StringBuilder(name); // Site selection -- Complete stand if (name == SiteSelection.Complete) { selector = new CompleteStand(); } // Site selection -- Target size with partial or complete spread else if (name == SiteSelection.CompleteAndSpreading || name == SiteSelection.TargetAndSpreading) { InputVar<double> minTargetSize = new InputVar<double>("the minimum target harvest size"); ReadValue(minTargetSize, reader); InputVar<double> maxTargetSize = new InputVar<double>("the maximum target harvest size"); ReadValue(maxTargetSize, reader); //validate the target size for spreading algorithms StandSpreading.ValidateTargetSizes(minTargetSize.Value, maxTargetSize.Value); standSpreadMinTargetSize = minTargetSize.Value; standSpreadMaxTargetSize = maxTargetSize.Value; if (name == SiteSelection.TargetAndSpreading) { // Site selection -- partial spread selector = new PartialStandSpreading(minTargetSize.Value.Actual, maxTargetSize.Value.Actual); } else { // Site selection -- complete stand selector = new CompleteStandSpreading(minTargetSize.Value.Actual, maxTargetSize.Value.Actual); } valueAsStr.AppendFormat(" {0}", minTargetSize.Value.String); valueAsStr.AppendFormat(" {0}", maxTargetSize.Value.String); //validate the target size for spreading algorithms //StandSpreading.ValidateTargetSize(targetSize.Value); //standSpreadTargetSize = targetSize.Value; //if (name == SiteSelection.TargetAndSpreading) { // Site selection -- partial spread // selector = new PartialStandSpreading(targetSize.Value.Actual); //} //else { // Site selection -- complete stand // selector = new CompleteStandSpreading(targetSize.Value.Actual); //} //valueAsStr.AppendFormat(" {0}", targetSize.Value.String); } // Site selection -- Patch cutting else if (name == SiteSelection.Patch) { InputVar<Percentage> percentage = new InputVar<Percentage>("the site percentage for patch cutting"); ReadValue(percentage, reader); PatchCutting.ValidatePercentage(percentage.Value); InputVar<double> size = new InputVar<double>("the target patch size"); ReadValue(size, reader); PatchCutting.ValidateSize(size.Value); selector = new PatchCutting(percentage.Value.Actual, size.Value.Actual); valueAsStr.AppendFormat(" {0} {1}", percentage.Value.String, size.Value.String); } else { string[] methodList = new string[]{"Site selection methods:", " " + SiteSelection.Complete, " " + SiteSelection.CompleteAndSpreading, " " + SiteSelection.TargetAndSpreading, " " + SiteSelection.Patch}; throw new InputValueException(name, name + " is not a valid site selection method", new MultiLineText(methodList)); } return new InputValue<ISiteSelector>(selector, valueAsStr.ToString()); }