/// <summary> /// Returns the link to the matching resource in the market place if found or creates a new clone copy for future transactions /// This allows this action to be performed once to store the link rather than at every transaction /// This functionality allows resources not in the market at the start of the simulation to be traded. /// </summary> /// <param name="resourceType">The resource type to trade</param> /// <returns>Whether the search was successful</returns> public IResourceWithTransactionType LinkToMarketResourceType(CLEMResourceTypeBase resourceType) { if (!(this.Parent is Market)) { throw new ApsimXException(this, $"Logic error in code. Trying to link a resource type [r={resourceType.Name}] from the market with the same market./nThis is a coding issue. Please contact the developers"); } // find parent group type ResourceBaseWithTransactions parent = (resourceType as Model).Parent as ResourceBaseWithTransactions; ResourceBaseWithTransactions resGroup = GetResourceGroupByType(parent.GetType()) as ResourceBaseWithTransactions; if (resGroup is null) { // add warning the market is not currently trading in this resource string zoneName = FindAncestor <Zone>().Name; string warn = $"[{zoneName}] is currently not accepting resources of type [r={parent.GetType().ToString()}]\nOnly resources groups provided in the [r=ResourceHolder] in the simulation tree will be traded."; if (!Warnings.Exists(warn) & Summary != null) { Summary.WriteWarning(this, warn); Warnings.Add(warn); } return(null); } // TODO: do some group checks. land units, currency // TODO: if market and looking for finance only return or create "Bank" // find resource type in group object resType = resGroup.GetByName((resourceType as IModel).Name) as IResourceWithTransactionType; if (resType is null) { // clone resource // too many problems with linked events to clone these objects and setup again // it will be the responsibility of the user to ensure the resources and details are in the market // resType = Apsim.Clone(resourceType); if (resType is null) { // add warning the market does not have the resource string zoneName = FindAncestor <Zone>().Name; string warn = $"The resource [r={resourceType.Parent.Name}.{resourceType.Name}] does not exist in [m={this.Parent.Name}].\nAdd resource and associated components to the market to permit trading."; if (!Warnings.Exists(warn) & Summary != null) { Summary.WriteWarning(this, warn); Warnings.Add(warn); } return(null); } else { (resType as IModel).Parent = resGroup; (resType as CLEMModel).CLEMParentName = resGroup.CLEMParentName; // add new resource type resGroup.AddNewResourceType(resType as IResourceWithTransactionType); } } return(resType as IResourceWithTransactionType); }
/// <summary> /// Returns the link to the matching resource in the market place if found or creates a new clone copy for future transactions /// This allows this action to be performed once to store the link rather than at every transaction /// This functionality allows resources not in the market at the start of the simulation to be traded. /// </summary> /// <param name="resourceType">The resource type to trade</param> /// <param name="linkToResourceType">A link to the associated resource type</param> /// <returns>Whether the search was successful</returns> public bool ResourceTypeExists(CLEMResourceTypeBase resourceType, out object linkToResourceType) { linkToResourceType = null; // find parent group type ResourceBaseWithTransactions parent = (resourceType as Model).Parent as ResourceBaseWithTransactions; ResourceBaseWithTransactions resGroup = GetResourceGroupByType(parent.GetType()) as ResourceBaseWithTransactions; if (resGroup is null) { // add warning the market is not currently trading in this resource string zoneName = Apsim.Parent(this, typeof(Zone)).Name; Warnings.Add($"[{zoneName}] is currently not accepting resources of type [r={parent.GetType().ToString()}]\nOnly resources groups provided in the [r=ResourceHolder] in the simulation tree will be traded."); return(false); } // TODO: do some group checks. land units, currency // TODO: if market and looking for finance only return or create "Bank" // find resource type in group var resType = resGroup.GetByName((resourceType as IModel).Name); if (resType is null) { // clone resource resType = resourceType.Clone as CLEMResourceTypeBase; (resType as IModel).Parent = resGroup; // wire up events resGroup.AddChildEvents(resType as IResourceWithTransactionType); } linkToResourceType = resType; return(true); }
/// <summary> /// Returns the link to the matching resource in the market place if found or creates a new clone copy for future transactions /// This allows this action to be performed once to store the link rather than at every transaction /// This functionality allows resources not in the market at the start of the simulation to be traded. /// </summary> /// <param name="resourceType">The resource type to trade</param> /// <returns>Whether the search was successful</returns> public IResourceWithTransactionType LinkToMarketResourceType(CLEMResourceTypeBase resourceType) { if (!this.Parent.GetType().Name.Contains("Market")) { throw new ApsimXException(this, "ooops"); } // find parent group type ResourceBaseWithTransactions parent = (resourceType as Model).Parent as ResourceBaseWithTransactions; ResourceBaseWithTransactions resGroup = GetResourceGroupByType(parent.GetType()) as ResourceBaseWithTransactions; if (resGroup is null) { // add warning the market is not currently trading in this resource string zoneName = Apsim.Parent(this, typeof(Zone)).Name; Warnings.Add($"[{zoneName}] is currently not accepting resources of type [r={parent.GetType().ToString()}]\nOnly resources groups provided in the [r=ResourceHolder] in the simulation tree will be traded."); return(null); } // TODO: do some group checks. land units, currency // TODO: if market and looking for finance only return or create "Bank" // find resource type in group object resType = resGroup.GetByName((resourceType as IModel).Name) as IResourceWithTransactionType; if (resType is null) { // clone resource resType = Apsim.Clone(resourceType); if (resType is null) { // add warning the market does not have the resource string zoneName = Apsim.Parent(this, typeof(Zone)).Name; Warnings.Add($"The resource [r={resourceType.Name}] does not exist in the market and the resource of type [r={resourceType.GetType().ToString()}] cannot be cloned\nAdd resource and associated components to the market."); return(null); } else { (resType as IModel).Parent = resGroup; // add new resource type resGroup.AddNewResourceType(resType as IResourceWithTransactionType); } } return(resType as IResourceWithTransactionType); }
/// <summary> /// Returns the link to the matching resource in the market place if found or creates a new clone copy for future transactions /// This allows this action to be performed once to store the link rather than at every transaction /// This functionality allows resources not in the market at the start of the simulation to be traded. /// </summary> /// <param name="resourceType">The resource type to trade</param> /// <returns>Whether the search was successful</returns> public IResourceWithTransactionType LinkToMarketResourceType(CLEMResourceTypeBase resourceType) { if (!(this.Parent is Market)) { throw new ApsimXException(this, $"Logic error in code. Trying to link a resource type [r={resourceType.Name}] from the market with the same market./nThis is a coding issue. Please contact the developers"); } // find parent group type ResourceBaseWithTransactions parent = (resourceType as Model).Parent as ResourceBaseWithTransactions; if (!(FindResource(parent.GetType()) is ResourceBaseWithTransactions resourceGroupInMarket)) { // add warning the market is not currently trading in this resource string zoneName = FindAncestor <Zone>().Name; string warn = $"[{zoneName}] is currently not accepting resources of type [r={parent.GetType().Name}]\r\nOnly resources groups provided in the [r=ResourceHolder] in the simulation tree will be traded."; Warnings.CheckAndWrite(warn, Summary, this); return(null); } // TODO: do some group checks. land units, currency // TODO: if market and looking for finance only return or create "Bank" // find resource type in group object resType = resourceGroupInMarket.FindChild <IResourceWithTransactionType>(resourceType.Name); // clone resource: too many problems with linked events to clone these objects and setup again // it will be the responsibility of the user to ensure the resources and details are in the market if (resType is null) { // add warning the market does not have the resource string warn = $"The resource [r={resourceType.Parent.Name}.{resourceType.Name}] does not exist in [m={this.Parent.Name}].\r\nAdd resource and associated components to the market to permit trading."; Warnings.CheckAndWrite(warn, Summary, this); return(null); } // TODO: create a clone of the resource and put it in the market return(resType as IResourceWithTransactionType); }