/// <inheritdoc/> public override string ModelSummary() { using (StringWriter htmlWriter = new StringWriter()) { htmlWriter.Write("\r\n<div class=\"activityentry\">"); htmlWriter.Write(CLEMModel.DisplaySummaryValueSnippet(FeedTypeName, "Pasture not set", HTMLSummaryStyle.Resource)); htmlWriter.Write(" occupies "); Land parentLand = null; if (LandTypeNameToUse != null && LandTypeNameToUse != "") { parentLand = this.FindInScope(LandTypeNameToUse.Split('.')[0]) as Land; } if (UseAreaAvailable) { htmlWriter.Write("the unallocated portion of "); } else { if (parentLand == null) { htmlWriter.Write("<span class=\"setvalue\">" + AreaRequested.ToString("#,##0.###") + "</span> <span class=\"errorlink\">[UNITS NOT SET]</span> of "); } else { htmlWriter.Write("<span class=\"setvalue\">" + AreaRequested.ToString("#,##0.###") + "</span> " + parentLand.UnitsOfArea + " of "); } } htmlWriter.Write(CLEMModel.DisplaySummaryValueSnippet(LandTypeNameToUse, "Land not set", HTMLSummaryStyle.Resource)); htmlWriter.Write("</div>"); return(htmlWriter.ToString()); } }
/// <summary> /// Provides the description of the model settings for summary (GetFullSummary) /// </summary> /// <param name="formatForParentControl">Use full verbose description</param> /// <returns></returns> public override string ModelSummary(bool formatForParentControl) { string html = ""; html += "\n<div class=\"activityentry\">"; if (FeedTypeName == null || FeedTypeName == "") { html += "<span class=\"errorlink\">[PASTURE TYPE NOT SET]</span>"; } else { html += "<span class=\"resourcelink\">" + FeedTypeName + "</span>"; } html += " occupies "; Land parentLand = null; if (LandTypeNameToUse != null && LandTypeNameToUse != "") { parentLand = Apsim.Find(this, LandTypeNameToUse.Split('.')[0]) as Land; } if (UseAreaAvailable) { html += "the unallocated portion of "; } else { if (parentLand == null) { html += "<span class=\"setvalue\">" + AreaRequested.ToString("#,##0.###") + "</span> <span class=\"errorlink\">[UNITS NOT SET]</span> of "; } else { html += "<span class=\"setvalue\">" + AreaRequested.ToString("#,##0.###") + "</span> " + parentLand.UnitsOfArea + " of "; } } if (LandTypeNameToUse == null || LandTypeNameToUse == "") { html += "<span class=\"errorlink\">[LAND NOT SET]</span>"; } else { html += "<span class=\"resourcelink\">" + LandTypeNameToUse + "</span>"; } html += "</div>"; html += "\n<div class=\"activityentry\">"; html += "The simulation starts with <span class=\"setvalue\">" + StartingAmount.ToString("#,##0.##") + "</span> kg/ha"; html += "</div>"; return(html); }
private void OnCLEMInitialiseResource(object sender, EventArgs e) { // activity is performed in CLEMUpdatePasture not CLEMGetResources and has no labour this.AllocationStyle = ResourceAllocationStyle.Manual; // locate Land Type resource for this forage. LinkedLandItem = Resources.GetResourceItem(this, LandTypeNameToUse, OnMissingResourceActionTypes.ReportErrorAndStop, OnMissingResourceActionTypes.ReportErrorAndStop) as LandType; LandConditionIndex = Apsim.Children(this, typeof(Relationship)).Where(a => a.Name == "LandConditionIndex").FirstOrDefault() as Relationship; GrassBasalArea = Apsim.Children(this, typeof(Relationship)).Where(a => a.Name == "GrassBasalArea").FirstOrDefault() as Relationship; FileGRASP = Apsim.ChildrenRecursively(ZoneCLEM.Parent).Where(a => a.Name == ModelNameFileGRASP).FirstOrDefault() as IFileGRASP; if (UseAreaAvailable) { LinkedLandItem.TransactionOccurred += LinkedLandItem_TransactionOccurred; } if (Area == 0 && AreaRequested > 0) { ResourceRequestList = new List <ResourceRequest> { new ResourceRequest() { AllowTransmutation = false, Required = UseAreaAvailable ? LinkedLandItem.AreaAvailable : AreaRequested, ResourceType = typeof(Land), ResourceTypeName = LandTypeNameToUse.Split('.').Last(), ActivityModel = this, Reason = "Assign", FilterDetails = null } }; } // if we get here we assume some land has been supplied if (ResourceRequestList != null && ResourceRequestList.Count() > 0) { CheckResources(ResourceRequestList, Guid.NewGuid()); gotLandRequested = TakeResources(ResourceRequestList, false); } //Now the Land has been allocated we have an Area if (gotLandRequested) { //get the units of area for this run from the Land resource parent. unitsOfArea2Ha = Resources.Land().UnitsOfAreaToHaConversion; // locate Pasture Type resource LinkedNativeFoodType = Resources.GetResourceItem(this, FeedTypeName, OnMissingResourceActionTypes.ReportErrorAndStop, OnMissingResourceActionTypes.ReportErrorAndStop) as GrazeFoodStoreType; //Assign the area actually got after taking it. It might be less than AreaRequested (if partial) Area = ResourceRequestList.FirstOrDefault().Provided; // ensure no other activity has set the area of this GrazeFoodStore LinkedNativeFoodType.Manager = this as IPastureManager; soilIndex = ((LandType)ResourceRequestList.FirstOrDefault().Resource).SoilType; LinkedNativeFoodType.CurrentEcologicalIndicators.LandConditionIndex = LandConditionIndex.StartingValue; LinkedNativeFoodType.CurrentEcologicalIndicators.GrassBasalArea = GrassBasalArea.StartingValue; LinkedNativeFoodType.CurrentEcologicalIndicators.StockingRate = StartingStockingRate; StockingRateSummed = StartingStockingRate; //Now we have a stocking rate and we have starting values for Land Condition and Grass Basal Area //get the starting pasture data list from GRASP GetPastureDataList_TodayToNextEcolCalculation(); SetupStartingPasturePools(StartingAmount); } }
private void OnCLEMInitialiseResource(object sender, EventArgs e) { // activity is performed in CLEMUpdatePasture not CLEMGetResources and has no labour this.AllocationStyle = ResourceAllocationStyle.Manual; // locate Land Type resource for this forage. LinkedLandItem = Resources.GetResourceItem(this, LandTypeNameToUse, OnMissingResourceActionTypes.ReportErrorAndStop, OnMissingResourceActionTypes.ReportErrorAndStop) as LandType; LandConditionIndex = FindAllDescendants <RelationshipRunningValue>().Where(a => (new string[] { "lc", "landcondition", "landcon", "landconditionindex" }).Contains(a.Name.ToLower())).FirstOrDefault() as RelationshipRunningValue; GrassBasalArea = FindAllDescendants <RelationshipRunningValue>().Where(a => (new string[] { "gba", "basalarea", "grassbasalarea" }).Contains(a.Name.ToLower())).FirstOrDefault() as RelationshipRunningValue; FilePasture = ZoneCLEM.Parent.FindAllDescendants().Where(a => a.Name == PastureDataReader).FirstOrDefault() as IFilePasture; if (FilePasture != null) { // check that database has region id and land id ZoneCLEM clem = FindAncestor <ZoneCLEM>(); int recs = FilePasture.RecordsFound((FilePasture as FileSQLitePasture).RegionColumnName, clem.ClimateRegion); if (recs == 0) { throw new ApsimXException(this, $"No pasture production records were located by [x={(FilePasture as Model).Name}] for [a={this.Name}] given [Region id] = [{clem.ClimateRegion}] as specified in [{clem.Name}]"); } LandType land = Resources.GetResourceItem(this, LandTypeNameToUse, OnMissingResourceActionTypes.ReportErrorAndStop, OnMissingResourceActionTypes.ReportErrorAndStop) as LandType; if (land != null) { recs = FilePasture.RecordsFound((FilePasture as FileSQLitePasture).LandIdColumnName, land.SoilType); if (recs == 0) { throw new ApsimXException(this, $"No pasture production records were located by [x={(FilePasture as Model).Name}] for [a={this.Name}] given [Land id] = [{land.SoilType}] as specified in [{land.Name}] used to manage the pasture"); } } } if (UseAreaAvailable) { LinkedLandItem.TransactionOccurred += LinkedLandItem_TransactionOccurred; } ResourceRequestList = new List <ResourceRequest> { new ResourceRequest() { AllowTransmutation = false, Required = UseAreaAvailable ? LinkedLandItem.AreaAvailable : AreaRequested, ResourceType = typeof(Land), ResourceTypeName = LandTypeNameToUse.Split('.').Last(), ActivityModel = this, Category = UseAreaAvailable ?"Assign unallocated":"Assign", FilterDetails = null } }; CheckResources(ResourceRequestList, Guid.NewGuid()); gotLandRequested = TakeResources(ResourceRequestList, false); //Now the Land has been allocated we have an Area if (gotLandRequested) { //get the units of area for this run from the Land resource parent. unitsOfArea2Ha = Resources.Land().UnitsOfAreaToHaConversion; // locate Pasture Type resource LinkedNativeFoodType = Resources.GetResourceItem(this, FeedTypeName, OnMissingResourceActionTypes.ReportErrorAndStop, OnMissingResourceActionTypes.ReportErrorAndStop) as GrazeFoodStoreType; //Assign the area actually got after taking it. It might be less than AreaRequested (if partial) Area = ResourceRequestList.FirstOrDefault().Provided; // ensure no other activity has set the area of this GrazeFoodStore LinkedNativeFoodType.Manager = this as IPastureManager; soilIndex = ((LandType)ResourceRequestList.FirstOrDefault().Resource).SoilType; if (!(LandConditionIndex is null)) { LinkedNativeFoodType.CurrentEcologicalIndicators.LandConditionIndex = LandConditionIndex.StartingValue; } if (!(GrassBasalArea is null)) { LinkedNativeFoodType.CurrentEcologicalIndicators.GrassBasalArea = GrassBasalArea.StartingValue; } LinkedNativeFoodType.CurrentEcologicalIndicators.StockingRate = StartingStockingRate; StockingRateSummed = StartingStockingRate; //Now we have a stocking rate and we have starting values for Land Condition and Grass Basal Area //get the starting pasture data list from Pasture reader if (FilePasture != null) { GetPastureDataList_TodayToNextEcolCalculation(); SetupStartingPasturePools(StartingAmount); } } }