public LetterResult(char letter, int percent, int totalPixels, int length, int least, LetterResult connected, int optional) { this.letter = letter; this.percent = percent; this.totalPixels = totalPixels; this.length = length; this.least = least; this.connected = connected; this.optional = optional; }
public LetterResult(Letter letter, int totalPixels, LetterResult connected) { Letter = letter; TotalPixels = totalPixels; Connected = connected; }
// Checks for a chat letter at the input X and Y value. private LetterResult CheckLetter(int x, int y, int[] color) { // Possible letters List <LetterResult> letterresult = new List <LetterResult>(); // For each letter for (int li = 0; li < letters.Length; li++) { int totalpixels = 0; int successcount = 0; int optional = 0; // For each pixel in letter for (int pi = 0; pi < letters[li].Pixel.GetLength(0); pi++) { int checkX = x + letters[li].Pixel[pi, 0], checkY = y + letters[li].Pixel[pi, 1]; if (letters[li].Optional == null || letters[li].Optional.Contains(pi) == false) { totalpixels++; if (Capture.CompareColor(checkX, checkY, color, Chat.ChatFade)) { successcount++; } } // Check optional pixels else if (Capture.CompareColor(checkX, checkY, color, Chat.ChatFade)) { optional++; } } // Check for ignore. These are pixels that shouldn't equal the seed. if (letters[li].Ignore != null) { for (int pi = 0; pi < letters[li].Ignore.GetLength(0); pi++) { int checkX = x + letters[li].Ignore[pi, 0], checkY = y + letters[li].Ignore[pi, 1]; if (Capture.CompareColor(checkX, checkY, color, Chat.ChatFade)) { totalpixels++; } } } float result = (float)successcount / totalpixels; if (result == 1) { LetterResult connected = null; // The letter L can connect to other letters. LM can be confused for U1. This checks for the letter that the L could be connected to. if (letters[li].Char == 'L') { connected = CheckLetter(x + letters[li].Length + 1, y, color); } letterresult.Add(new LetterResult(letters[li], letters[li].Pixel.GetLength(0) + optional, connected) #if DEBUG { Location = new Point(x, y) } #endif ); // Add letter to possible letters. } } LetterResult bestletter = null; // The most likely letter that the letter found is. for (int bi = 0; bi < letterresult.Count; bi++) { if (bestletter == null) { bestletter = letterresult[bi]; } // If letterresult[bi]'s pixel count is higher than bestletter's pixel count, make bestletter letterresult[bi] // Also, make sure LM/LN/LX/LL/LU isn't confused for something else. if (letterresult[bi].TotalPixels > bestletter.TotalPixels) { if (bestletter.Connected != null) { // M, N, X, L, U are the letters L can connect to. if ((bestletter.Letter.Char == 'L' && letterresult[bi].Letter.Char == 'U' && TouchingCharacters.Contains(bestletter.Connected.Letter.Char)) == false) { bestletter = letterresult[bi]; } } else { bestletter = letterresult[bi]; } } } return(bestletter); }
// Checks for a chat letter at the input X and Y value. LetterResult CheckLetter(Bitmap bmp, int x, int y, int[] seed, int seedfade) { // Possible letters List <LetterResult> letterresult = new List <LetterResult>(); // For each letter for (int li = 0; li < letters.Length; li++) { int totalpixels = 0; int successcount = 0; int optional = 0; // For each pixel in letter for (int pi = 0; pi < letters[li].pixel.GetLength(0); pi++) { if (letters[li].optional == null || letters[li].optional.Contains(pi) == false) { totalpixels++; // check if not out of bounds of BMP if (x + letters[li].pixel[pi, 0] >= 0 && y + letters[li].pixel[pi, 1] >= 0 && x + letters[li].pixel[pi, 0] < Rectangles.LOBBY_CHATBOX.Width && y + letters[li].pixel[pi, 1] < Rectangles.LOBBY_CHATBOX.Height) { if (bmp.CompareColor(x + letters[li].pixel[pi, 0], y + letters[li].pixel[pi, 1], seed, seedfade)) { successcount++; } } } // Check optional pixels else if (x + letters[li].pixel[pi, 0] >= 0 && y + letters[li].pixel[pi, 1] >= 0 && x + letters[li].pixel[pi, 0] < Rectangles.LOBBY_CHATBOX.Width && y + letters[li].pixel[pi, 1] < Rectangles.LOBBY_CHATBOX.Height) { if (bmp.CompareColor(x + letters[li].pixel[pi, 0], y + letters[li].pixel[pi, 1], seed, seedfade)) { optional++; } } } // Check for ignore. These are pixels that shouldn't equal the seed. if (letters[li].ignore != null) { for (int pi = 0; pi < letters[li].ignore.GetLength(0); pi++) { if (x + letters[li].ignore[pi, 0] > 0 && y + letters[li].ignore[pi, 1] > 0 && x + letters[li].ignore[pi, 0] < Rectangles.LOBBY_CHATBOX.Width && y + letters[li].ignore[pi, 1] < Rectangles.LOBBY_CHATBOX.Height) { if (bmp.CompareColor(x + letters[li].ignore[pi, 0], y + letters[li].ignore[pi, 1], seed, seedfade)) { totalpixels++; } } } } // Get percent. double percent = Convert.ToDouble(successcount) / Convert.ToDouble(totalpixels) * 100; if (percent == 100) { LetterResult connected = null; // The letter L can connect to other letters. LM can be confused for U1. This checks for the letter that the L could be connected to. if (letters[li].letter == 'L') { connected = CheckLetter(bmp, x + letters[li].length + 1, y, seed, seedfade); } letterresult.Add(new LetterResult(letters[li].letter, (int)percent, letters[li].pixel.GetLength(0), letters[li].length, letters[li].least, connected, optional)); // Add letter to possible letters. } } LetterResult bestletter = null; // The most likely letter that the letter found is. for (int bi = 0; bi < letterresult.Count; bi++) { if (bestletter == null) { bestletter = letterresult[bi]; } /* * If letterresult[bi]'s pixel count is higher than bestletter's pixel count, make bestletter letterresult[bi] * * Also, make sure LM/LN/LX/LL/LU isn't confused for something else. */ if (letterresult[bi].totalPixels + letterresult[bi].optional > bestletter.totalPixels + bestletter.optional) { if (bestletter.connected != null) { // The letters L can connect to. if ((bestletter.letter == 'L' && letterresult[bi].letter == 'U' && new char[] { 'M', 'N', 'X', 'L', 'U' }.Contains(bestletter.connected.letter)) == false) { bestletter = letterresult[bi]; } } else { bestletter = letterresult[bi]; } } } // Return the best possible letter. if (bestletter != null) { return(bestletter); } return(null); }
public LetterResult UpdateLetter(LetterDTO message, DR_Requester requester) { BizTableDrivedEntity bizTableDrivedEntity = new BizTableDrivedEntity(); if (!bizTableDrivedEntity.DataIsAccessable(requester, message.DataItem.TargetEntityID, new List <SecurityAction>() { SecurityAction.LetterEdit })) { throw new Exception("عدم دسترسی ثبت نامه"); } LetterResult result = new LetterResult(); bool isNew = message.ID == 0; var letterSetting = GetLetterSetting(); if (letterSetting != null) { if (letterSetting.BeforeLetterSaveCodeID != 0) { var resultFunction = codeFunctionHandler.GetCodeFunctionResult(requester, letterSetting.BeforeLetterSaveCodeID, message); if (resultFunction.Exception != null) { var logResult = bizLogManager.AddLog(GetBeforeUpdateExceptionLog(message, resultFunction.Exception, isNew ? DataLogType.LetterInsert : DataLogType.LetterUpdate), requester); if (!string.IsNullOrEmpty(logResult)) { ResultDetail logException = new ResultDetail(); logException.Title = "خطای ثبت لاگ"; logException.Description = "خطای لاگ برای اقدام قبل از ثبت نامه"; logException.TechnicalDescription = logResult; result.Details.Add(logException); } result.Message = "اقدامات مرتبط قبل از ثبت نامه با خطا همراه بود"; return(result); } } } using (var letterModel = new MyIdeaDataDBEntities()) { try { var dbLetter = letterModel.Letter.FirstOrDefault(x => x.ID == message.ID); if (dbLetter == null) { dbLetter = new Letter(); dbLetter.CreationDate = DateTime.Now; dbLetter.UserID = requester.Identity; //var dataItemID = bizDataItem.GetOrCreateDataItem(message.DataItem); if (message.DataItem.DataItemID == 0) { dbLetter.MyDataItemID = bizDataItem.GetOrCreateDataItem(message.DataItem); message.DataItem.DataItemID = dbLetter.MyDataItemID; } else { dbLetter.MyDataItemID = message.DataItem.DataItemID; } } dbLetter.ID = message.ID; dbLetter.Desc = message.Desc; dbLetter.LetterNumber = message.LetterNumber; dbLetter.IsGeneratedOrSelected = message.IsGeneratedOrSelected; dbLetter.FromExternalSource = message.IsExternalOrInternal; dbLetter.ExternalSourceKey = message.ExternalCode; dbLetter.LetterNumber = message.LetterNumber; dbLetter.LetterDate = message.LetterDate; dbLetter.LetterTemplateID = message.LetterTemplateID == 0 ? (int?)null : message.LetterTemplateID; dbLetter.LetterTypeID = message.LetterTypeID; dbLetter.RelatedLetterID = message.RelatedLetterID == 0 ? (int?)null : message.RelatedLetterID; dbLetter.Title = message.Title; if (dbLetter.FileRepository == null) { if (message.AttechedFile != null && message.AttechedFile.Content != null) { dbLetter.FileRepository = bizFileRepository.ToFileRepository(letterModel, message.AttechedFile); } } if (dbLetter.ID == 0) { letterModel.Letter.Add(dbLetter); } letterModel.SaveChanges(); message.ID = dbLetter.ID; result.SavedID = dbLetter.ID; result.Result = true; } catch (Exception ex) { result.Result = false; result.Message = ex.Message; } finally { var logResult = bizLogManager.AddLog(GetUpdateLetterDataLog(message, result.Message, isNew ? DataLogType.LetterInsert : DataLogType.LetterUpdate), requester); if (!string.IsNullOrEmpty(logResult)) { ResultDetail logException = new ResultDetail(); logException.Title = "خطای ثبت لاگ"; logException.Description = "خطای لاگ برای ثبت نامه"; logException.TechnicalDescription = logResult; result.Details.Add(logException); } } } if (result.Result == false) { result.Message = "عملیات ثبت با خطا همراه بود"; return(result); } else { bool afterSaveException = false; if (letterSetting != null) { if (letterSetting.AfterLetterSaveCodeID != 0) { var resultFunction = codeFunctionHandler.GetCodeFunctionResult(requester, letterSetting.AfterLetterSaveCodeID, message); if (resultFunction.Exception != null) { afterSaveException = true; var logResult = bizLogManager.AddLog(GetAfterUpdateExceptionLog(message, resultFunction.Exception, isNew ? DataLogType.LetterInsert : DataLogType.LetterUpdate), requester); if (!string.IsNullOrEmpty(logResult)) { ResultDetail logException = new ResultDetail(); logException.Title = "خطای ثبت لاگ"; logException.Description = "خطای لاگ برای اقدام بعد از ثبت نامه"; logException.TechnicalDescription = logResult; result.Details.Add(logException); } return(result); } } } if (afterSaveException) { result.Message = "عملیات ثبت با موفقیت انجام شد اما اقدامات بعد از ثبت با خطا همراه بود"; } else { result.Message = "عملیات ثبت با موفقیت انجام شد"; } return(result); } }