using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text.RegularExpressions; using AR; namespace Project { public partial class FMain { Tuple> BarcodeRegExProcess( List patterns, List patternsEx, Class.VisionData vdata, string barcodeSymbol, string bcd, out bool IgnoreBarcode, out bool findregex) { //var patterns = PUB.Result.BCDPattern; IgnoreBarcode = false; findregex = false; if (barcodeSymbol == "6") barcodeSymbol = "11"; //250930 //get : same symbol data List pats; if (patterns != null) { if (barcodeSymbol.isEmpty() == false) pats = patterns.Where(t => t.IsEnable == true && (string.IsNullOrEmpty(t.Symbol) || t.Symbol == barcodeSymbol)).OrderBy(t => t.Seq).ToList(); else pats = patterns.Where(t => t.IsEnable == true).OrderBy(t => t.Seq).ToList(); } else pats = new List(); List patsEx; if (patternsEx == null) patsEx = new List(); else { if (barcodeSymbol.isEmpty() == false) patsEx = patternsEx.Where(t => string.IsNullOrEmpty(t.Symbol) || t.Symbol == barcodeSymbol).OrderBy(t => t.Seq).ToList(); else patsEx = patternsEx.Where(t => t.IsEnable == true).OrderBy(t => t.Seq).ToList(); } //모델정보의 허용 심볼인지 확인한다 221017 var vm = PUB.Result.vModel; if (vm != null) { if (vm.BCD_DM == false && barcodeSymbol == "2") { PUB.log.AddAT($"Inactive in model Symbol Setting(DM):{bcd}"); IgnoreBarcode = true; return new Tuple>(0, new List()); } else if (vm.BCD_1D == false && (barcodeSymbol == "6" || barcodeSymbol == "11")) { PUB.log.AddAT($"Inactive in model Symbol Setting(1D):{bcd}"); IgnoreBarcode = true; return new Tuple>(0, new List()); } else if (vm.BCD_QR == false && (barcodeSymbol == "1")) { PUB.log.AddAT($"Inactive in model Symbol Setting(QR):{bcd}"); IgnoreBarcode = true; return new Tuple>(0, new List()); } } //check barcode pattern if (pats.Any() == false) { PUB.log.AddAT($"No registered pattern(SYM={barcodeSymbol}) Model:{vm.Title}"); return new Tuple>(0, new List()); } //이 바코드가 무시바코드에 있는지 먼저 검사한다 220718 foreach (var pt in patsEx) { //skip disable item if (pt.IsEnable == false) continue; //check regex var regx = new Regex(pt.Pattern, RegexOptions.IgnoreCase, new TimeSpan(0, 0, 10)); if (regx.IsMatch(bcd)) { PUB.log.AddAT($"Ignore barcode:{bcd},PAT:{pt.Pattern},SYM:{pt.Symbol}"); IgnoreBarcode = true; break; } } if (IgnoreBarcode) { return new Tuple>(0, new List()); } //동작중에 들어오는 바코드의 자동처리코드 추가 250926 if (PUB.sm.Step == eSMStep.RUN || PUB.sm.Step == eSMStep.PAUSE || PUB.sm.Step == eSMStep.WAITSTART) { var OPT_PrinterOff = VAR.BOOL[eVarBool.Opt_DisablePrinter]; var OPT_CameraOff = PUB.OPT_CAMERA(); var OPT_BYPASS = PUB.OPT_BYPASS(); if (OPT_BYPASS == false) { //기본 벤더이름 if (PUB.Result.vModel.Def_Vname.isEmpty() == false) { if (vdata.VNAME.Equals(PUB.Result.vModel.Def_Vname) == false) { vdata.VNAME = PUB.Result.vModel.Def_Vname; vdata.VNAME_Trust = true; PUB.log.Add($"Defaul V.Name Set to {PUB.Result.vModel.Def_Vname}"); } } //기본 MFG if (PUB.Result.vModel.Def_MFG.isEmpty() == false) { if (vdata.MFGDATE.Equals(PUB.Result.vModel.Def_MFG) == false) { vdata.MFGDATE = PUB.Result.vModel.Def_MFG; vdata.MFGDATE_Trust = true; PUB.log.Add($"Defaul MFGDATE Set to {PUB.Result.vModel.Def_MFG}"); } } //파트넘버무시 if (PUB.Result.vModel.IgnorePartNo) { vdata.PARTNO_Trust = true; } //배치무시 if (PUB.Result.vModel.IgnoreBatch) { } //프린트를 하지 않는 경우에는 프린트 위치를 자동으로 처리한다. if (OPT_PrinterOff == true) { vdata.PrintPositionData = "0"; vdata.PrintPositionCheck = true; } } else { if (vdata.VNAME_Trust == false) { vdata.VNAME = "BYPASS"; vdata.VNAME_Trust = true; } } } var ValueApplyCount = 0; ValueApplyCount = 0; List list = new List(); findregex = false; foreach (var pt in pats) { //skip disable item if (pt.IsEnable == false) continue; var regx = new Regex(pt.Pattern, RegexOptions.IgnoreCase, new TimeSpan(0, 0, 5)); try { if (regx.IsMatch(bcd)) { findregex = true; //find data var matchs = regx.Matches(bcd); foreach (System.Text.RegularExpressions.Match mat in matchs) { if (vdata == null) ValueApplyCount += 1; else { foreach (var matchdata in pt.Groups) { if (matchdata.GroupNo <= mat.Groups.Count) { var data = mat.Groups[matchdata.GroupNo]; if (PUB.SetBCDValue(vdata, matchdata.TargetPos, data.Value, pt.IsTrust)) ValueApplyCount += 1; } } } } if (vdata != null && pt.IsAmkStd)// && bcdObj.barcodeSymbol == "1") { vdata.QRInputRaw = bcd; } if (vdata != null) PUB.log.AddI($"[{pt.Description}]=>{bcd}"); list.Add(pt.Customer + "|" + pt.Description); } else { //PUB.log.AddAT($"(X)Match ({pt.Pattern}) Data={bcd}"); } } catch (Exception ex) { PUB.log.AddE($"BarcodeRegEx Error : {ex.Message}"); } } return new Tuple>(ValueApplyCount, list); } /// /// barcod eprocess /// void BarcodeProcess() { var itemC = PUB.Result.ItemDataC; var vdata = itemC.VisionData; //No Run - Confirm Data if (vdata.Confirm) return; var vm = PUB.Result.vModel; lock (vdata.barcodelist) { foreach (var item in vdata.barcodelist) { //var src = item.Value.barcodeSource; var bcd = item.Value.Data; var bcdObj = item.Value; //already checked if (bcdObj.RegExConfirm) continue; lock (PUB.Result.BCDPatternLock) { var ValueApplyCount = BarcodeRegExProcess(PUB.Result.BCDPattern, PUB.Result.BCDIgnorePattern, vdata, bcdObj.barcodeSymbol, bcd, out bool IgnoreBcd, out bool findregex); bcdObj.Ignore = IgnoreBcd; //기타바코드 무시기능 적용 221018 if (vm != null && vm.IgnoreOtherBarcode == true && findregex == false) bcdObj.Ignore = true; bcdObj.RefExApply = (ValueApplyCount?.Item1 ?? 0); bcdObj.RegExConfirm = true; } } } //all process sequence if (BCDProcess_ALL(itemC, "SPS", PUB.sm.Step == eSMStep.RUN) != EResultKeyence.Nothing) { //nothing : multisid condition } } } }