UsrMaterialTemplate.cs 11.9 KB
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Asa.FaceControl;
using Model;

namespace SmartScan
{
    public partial class UsrMaterialTemplate : UserControl, ISetMenu
    {
        private List<MaterialTemplate> mateCopy;
        private int mateIndex = -1;
        private int codeIndex = -1;
        private Bitmap bmp = null;

        public UsrMaterialTemplate()
        {
            InitializeComponent();
            BtnOcrCode.Enabled = Common.config.EnabledOCR;
            LstMate.Items.AddRange(Common.mateEdit.Name);
            mateCopy = Common.mateEdit.ToCopy();
            Language.SetLanguage(this);
            BtnCameraImage.Enabled = Common.cameraVision.Count > 0;
            LstMate.SelectedFirst();
        }

        public FacePanel GetPanel()
        {
            return facePanel1;
        }

        public void Save()
        {
            Common.mateEdit.Save(ref mateCopy);
        }




        private PointF[] LabelCenter()
        {
            List<PointF> item = new();
            float x, y;
            for (int i = 0; i < mateCopy[mateIndex].Code.Count; i++)
            {
                x = mateCopy[mateIndex].Code[i].CenterX;
                y = mateCopy[mateIndex].Code[i].CenterY;
                item.Add(new PointF(x, y));
            }
            return item.ToArray();
        }

        private string[] FormatCode()
        {
            List<string> item = new();
            for (int i = 0; i < mateCopy[mateIndex].Code.Count; i++)
                item.Add(FormatCode(i));
            return item.ToArray();
        }

        private string FormatCode(int index)
        {
            MaterialCode code = mateCopy[mateIndex].Code[index];
            string text = code.Text.Replace("\r", "");
            text = text.Replace("\n", "");

            //主键
            string s = string.Format("({0}) ", index + 1) + text;
            if (code.ID == mateCopy[mateIndex].PrimaryCode)
                s += " <P>";

            //条码的关键字
            List<string> arr = new();
            for (int i = 0; i < mateCopy[mateIndex].Match.Count; i++)
            {
                if (code.ID == mateCopy[mateIndex].Match[i].CodeID)
                    arr.Add(mateCopy[mateIndex].Match[i].Keyword);
            }
            if (arr.Count > 0)
                s += " [" + string.Join(",", arr) + "]";

            //OCR的关键字
            arr = new();
            List<MaterialCodeOCR> codeOcr = mateCopy[mateIndex].Ocr.FindAll(s => s.CodeID == code.ID);
            for (int i = 0; i < codeOcr.Count; i++)
            {
                List<MaterialCodeMatch> math = mateCopy[mateIndex].Match.FindAll(s => s.CodeID == codeOcr[i].ID);
                for (int j = 0; j < math.Count; j++)
                    arr.Add(math[j].Keyword);
            }
            if (arr.Count > 0)
                s += " [OCR:" + string.Join(",", arr) + "]";

            return s;
        }

        private void LstMate_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (LstMate.SelectedIndex == -1) return;
            mateIndex = LstMate.SelectedIndex;
            Common.mateMaxCodeID = mateCopy[mateIndex].GetMaxID();

            ImgShow.Image = mateCopy[mateIndex].Image;
            ImgShow.CodeCenterClear();
            ImgShow.AddCodeCenter(LabelCenter());
            LstCode.Items.Clear();
            LstCode.Items.AddRange(FormatCode());
            LstCode.SelectedIndex = -1;
            bmp = mateCopy[mateIndex].Image;
        }

        private void BtnAddMate_Click(object sender, EventArgs e)
        {
            string text = Language.Dialog(LanguageDialogKey.MATERIAL_TEMPLATE_ADD);
            FaceInputBox input = new(BtnAddMate.Text, text);
            DialogResult dr = input.ShowDialog();
            if (dr != DialogResult.OK) return;
            if (string.IsNullOrWhiteSpace(input.InputValue)) return;

            mateCopy.Add(new() { Name = input.InputValue });
            mateCopy[mateCopy.Count - 1].State = TemplateState.Unsaved;

            LstMate.Items.Add(input.InputValue);
            LstMate.SelectedLast();
        }

        private void BtnDelMate_Click(object sender, EventArgs e)
        {
            if (mateIndex == -1) return;
            string text = Language.Dialog(LanguageDialogKey.MATERIAL_TEMPLATE_DEL);
            text = text.Replace("[name]", LstMate.Text);
            FaceMessageBox msg = new(BtnDelMate.Text, text, MessageBoxButtons.YesNo);
            DialogResult dr = msg.ShowDialog();
            if (dr != DialogResult.Yes) return;

            if (mateCopy[mateIndex].Image != null)
                mateCopy[mateIndex].Image.Dispose();
            mateCopy.RemoveAt(mateIndex);

            LstMate.Items.RemoveAt(mateIndex);
            if (LstMate.Items.Count > 0)
                LstMate.SelectedFirst();
            else
                mateIndex = -1;
        }

        private void BtnRenameMate_Click(object sender, EventArgs e)
        {
            if (mateIndex == -1) return;
            string text = Language.Dialog(LanguageDialogKey.MATERIAL_TEMPLATE_RENAME);
            text = text.Replace("[name]", LstMate.Text);
            FaceInputBox input = new(BtnRenameMate.Text, text);
            DialogResult dr = input.ShowDialog();
            if (dr != DialogResult.OK) return;
            if (string.IsNullOrWhiteSpace(input.InputValue)) return;

            mateCopy[mateIndex].Name = input.InputValue;
            mateCopy[mateIndex].State = TemplateState.Unsaved;
            LstMate.Items[mateIndex] = input.InputValue;
        }

        private void BtnOpenLight_Click(object sender, EventArgs e)
        {
            Common.lightSource.TurnOn();
        }

        private void BtnCloseLight_Click(object sender, EventArgs e)
        {
            Common.lightSource.TurnOff();
        }

        private void BtnCameraImage_Click(object sender, EventArgs e)
        {
            Common.cameraVision.Open();
            Bitmap[] result = Common.cameraVision.GetImage();
            Common.cameraVision.Close();
            if (result.Length == 0) return;

            bmp = result[0];
            LstCode.Items.Clear();
            ImgShow.CodeCenterClear();

            mateCopy[mateIndex].State = TemplateState.Unsaved;
            mateCopy[mateIndex].ImagePath = "";
            mateCopy[mateIndex].Image = bmp;
            ImgShow.Image = bmp;

        }

        private void BtnLocalImage_Click(object sender, EventArgs e)
        {
            using OpenFileDialog dlg = new() { Filter = "Image Files|*.jpg;*.jpeg;*.png;*.bmp;*.gif|All Files|*.*" };
            if (dlg.ShowDialog() != DialogResult.OK) return;

            bmp = ObjConversion.ReadImageFile(dlg.FileName);
            LstCode.Items.Clear();
            ImgShow.CodeCenterClear();

            mateCopy[mateIndex].State = TemplateState.Unsaved;
            mateCopy[mateIndex].ImagePath = "";
            mateCopy[mateIndex].Image = bmp;
            ImgShow.Image = bmp;
        }

        private void BtnScanCode_Click(object sender, EventArgs e)
        {
            if (bmp == null) return;
            List<CameraVisionLib.Model.BarcodeInfo> info = Common.cameraVision.GetBarCode(bmp);
            LstCode.Items.Clear();
            ImgShow.CodeCenterClear();
            mateCopy[mateIndex].Code.Clear();
            mateCopy[mateIndex].Ocr.Clear();
            mateCopy[mateIndex].Match.Clear();
            mateCopy[mateIndex].PrimaryCode = -1;
            mateCopy[mateIndex].State = TemplateState.Unsaved;
            Common.mateMaxCodeID = info.Count;

            if (info.Count == 0)
            {
                string text = Language.Dialog(LanguageDialogKey.CODE_COUNT);
                new FaceMessageBox("", text, MessageBoxButtons.OK).ShowDialog();
                return;
            }

            PointF[] lst = new PointF[info.Count];
            for (int i = 0; i < info.Count; i++)
            {
                //info[i].Text = info[i].Text.Replace("\r", "");
                //info[i].Text = info[i].Text.Replace("\n", "");
                MaterialCode code = new()
                {
                    ID = i,
                    Text = info[i].Text,
                    CodeType = info[i].CodeType,
                    CenterX = info[i].Center.X,
                    CenterY = info[i].Center.Y,
                    Angle = info[i].Angle,
                    Width = info[i].Size.Width,
                    Height = info[i].Size.Height,
                    Distance = info[i].Distance
                };
                mateCopy[mateIndex].Code.Add(code);
                lst[i] = info[i].Center;
            }

            LstCode.Items.AddRange(FormatCode());
            LstCode.SelectedIndex = codeIndex = -1;
            ImgShow.AddCodeCenter(lst);
        }

        private void BtnExtractCode_Click(object sender, EventArgs e)
        {
            if (codeIndex == -1) return;
            MaterialCode code = mateCopy[mateIndex].Code[codeIndex];

            List <MaterialCodeMatch> match = mateCopy[mateIndex].Match.FindAll(s => s.CodeID == code.ID);
            FrmCodeExtract frm = new(code.Text, code.ID, code.CodeType, match);
            DialogResult dr = frm.ShowDialog();
            if (dr == DialogResult.OK)
            {
                mateCopy[mateIndex].Match.RemoveAll(s => s.CodeID == code.ID);
                mateCopy[mateIndex].Match.AddRange(frm.CodeMatch);
                mateCopy[mateIndex].State = TemplateState.Unsaved;

                mateCopy[mateIndex].Match.RemoveAll(x => { return mateCopy[mateIndex].Code.FindIndex(c => c.ID == x.CodeID) == -1 && mateCopy[mateIndex].Ocr.FindIndex(c => c.ID == x.CodeID) == -1; });

                LstCode.Items[codeIndex] = FormatCode(codeIndex);
            }
        }

        private void BtnOcrCode_Click(object sender, EventArgs e)
        {
            if (codeIndex == -1) return;

            var m = mateCopy[mateIndex].Match.Find(m=>m.CodeID==codeIndex);
            if (m == null) {
                string text = Language.Dialog("OcrNeedCodeSetKey");
                new FaceMessageBox("", text, MessageBoxButtons.OK).ShowDialog();
                return;
            }
            List<MaterialCodeOCR> codeOcr = mateCopy[mateIndex].Ocr.FindAll(s => s.CodeID == mateCopy[mateIndex].Code[codeIndex].ID);

            FrmCodeOCR frm = new(mateCopy[mateIndex].Code[codeIndex], codeOcr, mateCopy[mateIndex].Match, mateCopy[mateIndex].Image);
            DialogResult dr = frm.ShowDialog();
            if (dr == DialogResult.OK)
            {
                for (int i = 0; i < frm.codeOcr.Count; i++)
                    mateCopy[mateIndex].Match.RemoveAll(s => s.CodeID == frm.codeOcr[i].ID);
                mateCopy[mateIndex].Ocr.RemoveAll(s => s.CodeID == mateCopy[mateIndex].Code[codeIndex].ID);
                mateCopy[mateIndex].Ocr.AddRange(frm.codeOcr);

                mateCopy[mateIndex].Match.AddRange(frm.codeMatch);
                mateCopy[mateIndex].State = TemplateState.Unsaved;
                LstCode.Items[codeIndex] = FormatCode(codeIndex);
            }
        }

        private void BtnPrimaryCode_Click(object sender, EventArgs e)
        {
            if (codeIndex == -1) return;

            if (mateCopy[mateIndex].Code[codeIndex].ID == mateCopy[mateIndex].PrimaryCode)
            {
                mateCopy[mateIndex].PrimaryCode = -1;
            }
            else
            {
                int oldIndex = mateCopy[mateIndex].Code.FindIndex(c => c.ID == mateCopy[mateIndex].PrimaryCode);
                mateCopy[mateIndex].PrimaryCode = mateCopy[mateIndex].Code[codeIndex].ID;
                if (oldIndex > -1)
                    LstCode.Items[oldIndex] = FormatCode(oldIndex);
            }

            LstCode.Items[codeIndex] = FormatCode(codeIndex);
            mateCopy[mateIndex].State = TemplateState.Unsaved;
        }

        private void LstCode_SelectedIndexChanged(object sender, EventArgs e)
        {
            codeIndex = LstCode.SelectedIndex;
        }
    }
}