public static MaterialCommodityData EnsurePresent(string cat, string fdname) // By FDNAME { if (!cachelist.ContainsKey(fdname.ToLowerInvariant())) { MaterialCommodityData mcdb = new MaterialCommodityData(cat, fdname.SplitCapsWordFull(), fdname, "Unknown", "", Color.Green, false); mcdb.SetCache(); System.Diagnostics.Debug.WriteLine("Material not present: " + cat + "," + fdname); } return(cachelist[fdname.ToLowerInvariant()]); }
private static bool AddEntry(string catname, Color colour, string aliasname, string typeofit, string shortname, string fdName, bool comrare = false) { System.Diagnostics.Debug.Assert(!shortname.HasChars() || cachelist.Values.ToList().Find(x => x.Shortname.Equals(shortname, StringComparison.InvariantCultureIgnoreCase)) == null, "ShortName repeat " + aliasname + " " + shortname); System.Diagnostics.Debug.Assert(cachelist.ContainsKey(fdName) == false, "Repeated entry " + fdName); string fdn = (fdName.Length > 0) ? fdName.ToLowerInvariant() : FDNameCnv(aliasname); // always lower case fdname MaterialCommodityData mc = new MaterialCommodityData(catname, aliasname, fdn, typeofit, shortname, colour, comrare); mc.SetCache(); return(true); }
public void Set(string catname, string fdname, int num, double price) { var cat = MaterialCommodityData.CategoryFrom(catname); if (cat.HasValue) { Set(cat.Value, fdname, num, price); } else { System.Diagnostics.Debug.WriteLine("Unknown Cat " + catname); } }
public void Change(string catname, string fdname, int num, long price, bool ignorecatonsearch = false) { var cat = MaterialCommodityData.CategoryFrom(catname); if (cat.HasValue) { Change(cat.Value, fdname, num, price, ignorecatonsearch); } else { System.Diagnostics.Debug.WriteLine("Unknown Cat " + catname); } }
public static string RMat(string fdname) // fix up fdname into a nicer name { MaterialCommodityData mc = MaterialCommodityData.GetCachedMaterial(fdname); if (mc != null) { return(mc.name); } else { return(fdname.SplitCapsWordFull()); } }
static public List <MaterialCommodities> GetShoppingList(List <Tuple <Recipes.Recipe, int> > target, List <MaterialCommodities> list) { List <MaterialCommodities> shoppingList = new List <MaterialCommodities>(); foreach (Tuple <Recipes.Recipe, int> want in target) { Recipes.Recipe r = want.Item1; int wanted = want.Item2; for (int i = 0; i < r.ingredients.Length; i++) { string ingredient = r.ingredients[i]; int mi = list.FindIndex(x => x.Details.Shortname.Equals(ingredient)); int got = (mi >= 0) ? list[mi].scratchpad : 0; int need = r.count[i] * wanted; if (got < need) { int shopentry = shoppingList.FindIndex(x => x.Details.Shortname.Equals(ingredient)); if (shopentry >= 0) { shoppingList[shopentry].scratchpad += (need - got); } else { MaterialCommodityData db = MaterialCommodityData.GetByShortName(ingredient); if (db != null) // MUST be there, its well know, but will check.. { MaterialCommodities mc = new MaterialCommodities(db); // make a new entry mc.scratchpad = (need - got); shoppingList.Add(mc); } } if (mi >= 0) { list[mi].scratchpad = 0; } } else { if (mi >= 0) { list[mi].scratchpad -= need; } } } } return(shoppingList); }
// ifnorecatonsearch is used if you don't know if its a material or commodity.. for future use. private MaterialCommodities GetNewCopyOf(MaterialCommodityData.CatType cat, string fdname, bool ignorecatonsearch = false) { int index = List.FindIndex(x => x.Details.FDName.Equals(fdname, StringComparison.InvariantCultureIgnoreCase) && (ignorecatonsearch || x.Details.Category == cat)); if (index >= 0) { List[index] = new MaterialCommodities(List[index]); // fresh copy.. return(List[index]); } else { MaterialCommodityData mcdb = MaterialCommodityData.EnsurePresent(cat, fdname); // get a MCDB of this MaterialCommodities mc = new MaterialCommodities(mcdb); // make a new entry List.Add(mc); return(mc); } }
// ifnorecatonsearch is used if you don't know if its a material or commodity.. for future use. private MaterialCommodities GetNewCopyOf(string cat, string fdname, SQLiteConnectionUser conn, bool ignorecatonsearch = false) { int index = list.FindIndex(x => x.Details.FDName.Equals(fdname, StringComparison.InvariantCultureIgnoreCase) && (ignorecatonsearch || x.Details.Category.Equals(cat, StringComparison.InvariantCultureIgnoreCase))); if (index >= 0) { list[index] = new MaterialCommodities(list[index]); // fresh copy.. return(list[index]); } else { MaterialCommodityData mcdb = MaterialCommodityData.EnsurePresent(cat, fdname); // get a MCDB of this MaterialCommodities mc = new MaterialCommodities(mcdb); // make a new entry list.Add(mc); //log.WriteLine("MC Made:" + cat + " " + fdname + " >> " + mc.fdname + mc.name ); return(mc); } }
public MaterialCommodities Find(MaterialCommodityData other) { return(list.Find(x => x.Details.FDName.Equals(other.FDName, StringComparison.InvariantCultureIgnoreCase))); }
} // for synthesis dialog.. public MaterialCommodities(MaterialCommodityData c) { Count = scratchpad = 0; Price = 0; this.Details = c; }
//return maximum can make, how many made, needed string. static public Tuple <int, int, string, string> HowManyLeft(List <MaterialCommodities> list, Recipes.Recipe r, int tomake = 0) { int max = int.MaxValue; System.Text.StringBuilder needed = new System.Text.StringBuilder(64); System.Text.StringBuilder neededlong = new System.Text.StringBuilder(64); for (int i = 0; i < r.ingredients.Length; i++) { string ingredient = r.ingredients[i]; int mi = list.FindIndex(x => x.Details.Shortname.Equals(ingredient)); int got = (mi >= 0) ? list[mi].scratchpad : 0; int sets = got / r.count[i]; max = Math.Min(max, sets); int need = r.count[i] * tomake; if (got < need) { string dispshort; string displong; if (mi > 0) // if got one.. { dispshort = (list[mi].Details.IsEncodedOrManufactured) ? " " + list[mi].Details.Name : list[mi].Details.Shortname; displong = " " + list[mi].Details.Name; } else { MaterialCommodityData db = MaterialCommodityData.GetByShortName(ingredient); dispshort = (db.Category == MaterialCommodityData.MaterialEncodedCategory || db.Category == MaterialCommodityData.MaterialManufacturedCategory) ? " " + db.Name : db.Shortname; displong = " " + db.Name; } string sshort = (need - got).ToStringInvariant() + dispshort; string slong = (need - got).ToStringInvariant() + " x " + displong + Environment.NewLine; if (needed.Length == 0) { needed.Append("Need:" + sshort); neededlong.Append("Need:" + Environment.NewLine + slong); } else { needed.Append("," + sshort); neededlong.Append(slong); } } } int made = 0; if (max > 0 && tomake > 0) // if we have a set, and use it up { made = Math.Min(max, tomake); // can only make this much System.Text.StringBuilder usedstrshort = new System.Text.StringBuilder(64); System.Text.StringBuilder usedstrlong = new System.Text.StringBuilder(64); for (int i = 0; i < r.ingredients.Length; i++) { int mi = list.FindIndex(x => x.Details.Shortname.Equals(r.ingredients[i])); System.Diagnostics.Debug.Assert(mi != -1); int used = r.count[i] * made; list[mi].scratchpad -= used; string dispshort = (list[mi].Details.IsEncodedOrManufactured) ? " " + list[mi].Details.Name : list[mi].Details.Shortname; string displong = " " + list[mi].Details.Name; usedstrshort.AppendPrePad(used.ToStringInvariant() + dispshort, ","); usedstrlong.AppendPrePad(used.ToStringInvariant() + " x " + displong, Environment.NewLine); } needed.AppendPrePad("Used: " + usedstrshort.ToString(), ", "); neededlong.Append("Used: " + Environment.NewLine + usedstrlong.ToString()); } return(new Tuple <int, int, string, string>(max, made, needed.ToNullSafeString(), neededlong.ToNullSafeString())); }
static public string FDNameTranslation(string old) { return(MaterialCommodityData.FDNameTranslation(old)); }
// return shopping list/count given receipe list, list of current materials. static public List <Tuple <MaterialCommodities, int> > GetShoppingList(List <Tuple <Recipes.Recipe, int> > wantedrecipes, List <MaterialCommodities> list) { var shoppingList = new List <Tuple <MaterialCommodities, int> >(); var totals = TotalList(list); foreach (Tuple <Recipes.Recipe, int> want in wantedrecipes) { Recipes.Recipe r = want.Item1; int wanted = want.Item2; for (int i = 0; i < r.Ingredients.Length; i++) { string ingredient = r.Ingredients[i].Shortname; int mi = list.FindIndex(x => x.Details.Shortname.Equals(ingredient)); // see if we have any in list MaterialCommodities matc = mi != -1 ? list[mi] : new MaterialCommodities(MaterialCommodityData.GetByShortName(ingredient)); // if not there, make one if (mi == -1) // if not there, make an empty total entry { totals[matc.Details.FDName] = 0; } int got = totals[matc.Details.FDName]; // what we have left from totals int need = r.Amount[i] * wanted; int left = got - need; if (left < 0) // if not enough { int shopentry = shoppingList.FindIndex(x => x.Item1.Details.Shortname.Equals(ingredient)); // have we already got it in the shopping list if (shopentry >= 0) // found, update list with new wanted total { shoppingList[shopentry] = new Tuple <MaterialCommodities, int>(shoppingList[shopentry].Item1, shoppingList[shopentry].Item2 - left); // need this more } else { shoppingList.Add(new Tuple <MaterialCommodities, int>(matc, -left)); // a new shop entry with this many needed } totals[matc.Details.FDName] = 0; // clear count } else { totals[matc.Details.FDName] -= need; // decrement total } } } shoppingList.Sort(delegate(Tuple <MaterialCommodities, int> left, Tuple <MaterialCommodities, int> right) { return(left.Item1.Details.Name.CompareTo(right.Item1.Details.Name)); }); return(shoppingList); }
public MaterialCommodities(MaterialCommodities c) { count = c.count; // clone these price = c.price; this.Details = c.Details; // can copy this, its fixed }