//--------------------------------------------------------------------- /// <summary> /// Creates a cohort selection method for a specific set of ages and /// age ranges. /// </summary> /// <remarks> /// This overrides the base method so it can use the PartialThinning /// class to handle cohort selections with percentages. Added support /// for InsectDefoliation via LandCover cohort selections /// </remarks> protected override void CreateCohortSelectionMethodFor(ISpecies species, IList <ushort> ages, IList <AgeRange> ranges) { if (LandCover.LandCover.DontParseTrees) { if (!DensityThinning.CreateCohortSelectorFor(species, ages, ranges)) { base.CreateCohortSelectionMethodFor(species, ages, ranges); } //else if (!PartialThinning.CreateCohortSelectorFor(species, ages, ranges)) //{ // base.CreateCohortSelectionMethodFor(species, ages, ranges); //} } else if (!LandCover.LandCover.CreateCohortSelectorFor(species, ages, ranges)) { base.CreateCohortSelectionMethodFor(species, ages, ranges); } }
//--------------------------------------------------------------------- protected void ReadLandUses() { InputVar <string> name = new InputVar <string>("LandUse"); InputVar <ushort> mapCode = new InputVar <ushort>("MapCode"); InputVar <bool> allowHarvest = new InputVar <bool>("AllowHarvest?"); InputVar <string> landCoverChangeType = new InputVar <string>("LandCoverChange"); Dictionary <string, int> nameLineNumbers = new Dictionary <string, int>(); Dictionary <ushort, int> mapCodeLineNumbers = new Dictionary <ushort, int>(); PartialThinning.InitializeClass(); DensityThinning.InitializeClass(); while (!AtEndOfInput) { int nameLineNum = LineNumber; ReadVar(name); int lineNumber; if (nameLineNumbers.TryGetValue(name.Value.Actual, out lineNumber)) { throw new InputValueException(name.Value.String, "The land use \"{0}\" was previously used on line {1}", name.Value.Actual, lineNumber); } else { nameLineNumbers[name.Value.Actual] = nameLineNum; } int mapCodeLineNum = LineNumber; ReadVar(mapCode); if (mapCodeLineNumbers.TryGetValue(mapCode.Value.Actual, out lineNumber)) { throw new InputValueException(mapCode.Value.String, "The map code \"{0}\" was previously used on line {1}", mapCode.Value.Actual, lineNumber); } else { mapCodeLineNumbers[mapCode.Value.Actual] = mapCodeLineNum; } ReadVar(allowHarvest); // By default, a land use allows trees to establish. bool allowEstablishment = true; if (ReadPreventEstablishment()) { allowEstablishment = false; } Dictionary <string, LandCover.IChange> landCoverChanges = new Dictionary <string, LandCover.IChange>(); List <LandCover.IChange> landCoverList = new List <LandCover.IChange>(); ReadVar(landCoverChangeType); LandCover.IChange landCoverChange = ProcessLandCoverChange(landCoverChangeType); landCoverChanges[landCoverChange.Type] = landCoverChange; landCoverList.Add(landCoverChange); while (ReadOptionalVar(landCoverChangeType)) //Get extra LandCoverChanges { if (landCoverChanges.TryGetValue(landCoverChangeType.Value.Actual, out landCoverChange)) { throw new InputValueException(landCoverChangeType.Value.String, "The land cover change \"{0}\" has already been defined for land use: {1}", landCoverChangeType.Value.Actual, name.Value.Actual); } else { landCoverChange = ProcessLandCoverChange(landCoverChangeType); landCoverChanges[landCoverChange.Type] = landCoverChange; landCoverList.Add(landCoverChange); } } LandCover.IChange[] changes = new LandCover.IChange[landCoverList.Count]; for (int i = 0; i < landCoverList.Count; i++) { changes[i] = landCoverList[i]; } LandUse landUse = new LandUse(name.Value.Actual, mapCode.Value.Actual, allowHarvest.Value.Actual, allowEstablishment, changes); LandUseRegistry.Register(landUse); } }