Пример #1
0
        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());
        }