| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744 | using Aitex.Core.RT.Log;using Caliburn.Micro.Core;using MECF.Framework.Common.RecipeCenter;using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;using RecipeEditorLib.RecipeModel.Params;using System;using System.Collections.Generic;using System.Collections.ObjectModel;using System.Linq;using System.Reflection;using System.Text;using System.Windows;using System.Xml;namespace FurnaceUI.Views.Recipes{    public class RecipeDataLayout : PropertyChangedBase    {        public bool IsChanged        {            get            {                bool changed = !IsSavedDesc;                if (!changed)                {                    //changed = ChkChanged(Steps) || ChkChanged(PopSettingSteps) || ChkChanged(StepTolerances);                }                if (!changed)                {                    foreach (Param config in this.ConfigItems)                    {                        if (!config.IsSaved)                        {                            changed = true;                            break;                        }                    }                }                return changed;            }        }        private bool _isSavedDesc;        public bool IsSavedDesc        {            get { return _isSavedDesc; }            set            {                this._isSavedDesc = value;                this.NotifyOfPropertyChange("IsSavedDesc");            }        }        private string name;        public string Name        {            get { return this.name; }            set            {                this.name = value;                this.NotifyOfPropertyChange("Name");            }        }        private string _chamberType;        public string RecipeChamberType        {            get { return this._chamberType; }            set            {                this._chamberType = value;                this.NotifyOfPropertyChange("RecipeChamberType");            }        }        private string _recipePermission;        public string RecipePermission        {            get { return this._recipePermission; }            set            {                this._recipePermission = value;                this.NotifyOfPropertyChange("RecipePermisson");            }        }        private string _recipeLevel;        public string RecipeLevel        {            get { return this._recipeLevel; }            set            {                this._recipeLevel = value;                this.NotifyOfPropertyChange("RecipeLevel");            }        }        private string _recipeVersion;        public string RecipeVersion        {            get { return this._recipeVersion; }            set            {                this._recipeVersion = value;                this.NotifyOfPropertyChange("RecipeVersion");            }        }        private string _prefixPath;        public string PrefixPath        {            get { return _prefixPath; }            set            {                _prefixPath = value;                this.NotifyOfPropertyChange("PrefixPath");            }        }        private string creator;        public string Creator        {            get { return this.creator; }            set            {                this.creator = value;                this.NotifyOfPropertyChange("Creator");            }        }        private DateTime createTime;        public DateTime CreateTime        {            get { return this.createTime; }            set            {                this.createTime = value;                this.NotifyOfPropertyChange("CreateTime");            }        }        private string description;        public string Description        {            get { return this.description; }            set            {                this.description = value;                this.NotifyOfPropertyChange("Description");            }        }        private string devisor;        public string Revisor        {            get { return this.devisor; }            set            {                this.devisor = value;                this.NotifyOfPropertyChange("Revisor");            }        }        private DateTime deviseTime;        public DateTime ReviseTime        {            get { return this.deviseTime; }            set            {                this.deviseTime = value;                this.NotifyOfPropertyChange("ReviseTime");            }        }        public ObservableCollection<RecipeLayoutEntityNormal> NormalSteps { get; private set; } = new ObservableCollection<RecipeLayoutEntityNormal>();        public ObservableCollection<RecipeLayoutEntityExpert> ExpertSteps { get; private set; } = new ObservableCollection<RecipeLayoutEntityExpert>();        public ObservableCollection<Param> ConfigItems { get; private set; }        public ObservableCollection<Param> Configs        {            get;            set;        }        private XmlDocument _doc;        private string _module;        public bool ToleranceEnable { get; set; }        public bool IsCompatibleWithCurrentFormat { get; set; }        private RecipeProvider _recipeProvider = new RecipeProvider();        private Dictionary<string, ObservableCollection<RecipeTemplateColumnBase>> RecipeTemplate;        public bool ChkChanged(Dictionary<string, ObservableCollection<ObservableCollection<Param>>> PopSteps)        {            //foreach (ObservableCollection<ObservableCollection<Param>> parameters in PopSteps.Values)            //{            //    if (ChkChanged(parameters))            //    {            //        return true;            //    }            //}            return false;        }        public RecipeDataLayout()        {            ConfigItems = new ObservableCollection<Param>();            IsSavedDesc = true;            _doc = new XmlDocument();            XmlElement node = _doc.CreateElement("Aitex");            _doc.AppendChild(node);            node.AppendChild(_doc.CreateElement("TableRecipeData"));            string vars = _recipeProvider.GetRecipeFormatXml(MECF.Framework.Common.Equipment.ModuleName.PM1);            RecipeTemplate = _recipeProvider.GetGroupRecipeTemplate();        }        public void Clear()        {            NormalSteps.Clear();            ExpertSteps.Clear();            ConfigItems.Clear();            RecipeChamberType = "";            RecipeVersion = "";            IsSavedDesc = true;            _module = "";        }        private void LoadSteps(XmlNodeList steps)        {            NormalSteps.Clear();            ExpertSteps.Clear();            foreach (XmlNode stepNode in steps)            {                if (stepNode.Attributes["Name"].Value == "Normal")                {                    RecipeLayoutEntityNormal step = new RecipeLayoutEntityNormal();                    //遍历Step节点                    foreach (XmlAttribute att in stepNode.Attributes)                    {                        PropertyInfo pi = step.GetType().GetProperty(att.Name);                        if (pi != null && pi.Name == att.Name)                        {                            pi.SetValue(step, att.Value);                        }                    }                    NormalSteps.Add(step);                }                else                {                    RecipeLayoutEntityExpert step = new RecipeLayoutEntityExpert();                    //遍历Step节点                    for (int i = 0; i < stepNode.Attributes.Count; i++)                    {                        BoatWaferItem item = new BoatWaferItem();                        if (stepNode.Attributes[i].Name.StartsWith("slot"))                        {                            item.Slot = i + 1;                            item.Description = stepNode.Attributes[i].Value;                            step.Items.Add(item);                        }                        else                        {                            PropertyInfo pi = step.GetType().GetProperty(stepNode.Attributes[i].Name);                            if (pi.Name == stepNode.Attributes[i].Name)                            {                                pi.SetValue(step, stepNode.Attributes[i].Value);                            }                        }                    }                    ExpertSteps.Add(step);                }            }        }        public void InitData(string prefixPath, string recipeName, string recipeContent, ObservableCollection<Param> configDefine, string module)        {            IsCompatibleWithCurrentFormat = false;            _module = module;            Name = recipeName;            PrefixPath = prefixPath;            try            {                _doc = new XmlDocument();                _doc.LoadXml(recipeContent);                if (!LoadHeader(_doc.SelectSingleNode("Aitex/TableRecipeData")))                    return;                XmlNodeList nodeSteps = _doc.SelectNodes($"Aitex/TableRecipeData/Module[@Name='{module}']/Step");                if (nodeSteps == null)                    nodeSteps = _doc.SelectNodes($"Aitex/TableRecipeData/Step");                LoadSteps(nodeSteps);                XmlNode nodeConfig =                    _doc.SelectSingleNode($"Aitex/TableRecipeData/Module[@Name='{module}']/Config");                if (nodeSteps == null)                    nodeConfig = _doc.SelectSingleNode($"Aitex/TableRecipeData/Config");                LoadConfigs(configDefine, nodeConfig);                IsCompatibleWithCurrentFormat = true;            }            catch (Exception ex)            {                LOG.Write(ex);            }        }        private void LoadConfigs(ObservableCollection<Param> configDefine, XmlNode configNode)        {            ConfigItems.Clear();            foreach (var param in configDefine)            {                if (param is DoubleParam param1)                {                    var config = new DoubleParam()                    {                        Name = param.Name,                        Value = param1.Value,                        DisplayName = param.DisplayName,                        Minimun = param1.Minimun,                        Maximun = param1.Maximun,                        Resolution = param1.Resolution                    };                    if (configNode != null && configNode.Attributes[param1.Name] != null)                        config.Value = configNode.Attributes[param1.Name].Value;                    ConfigItems.Add(config);                }                if (param is NumParam paramInt)                {                    var config = new NumParam()                    {                        Name = paramInt.Name,                        Value = paramInt.Value,                        DisplayName = paramInt.DisplayName,                    };                    if (configNode != null && configNode.Attributes[paramInt.Name] != null)                    {                        int.TryParse(configNode.Attributes[paramInt.Name].Value, out int intValue);                        config.Value = intValue;                    }                    ConfigItems.Add(config);                }                if (param is StringParam paramString)                {                    var config = new StringParam()                    {                        Name = param.Name,                        Value = paramString.Value,                        DisplayName = param.DisplayName,                    };                    if (configNode != null && configNode.Attributes[paramString.Name] != null)                        config.Value = configNode.Attributes[paramString.Name].Value;                    ConfigItems.Add(config);                }            }        }        public string GetXmlString()        {            try            {                XmlElement nodeData = _doc.SelectSingleNode($"Aitex/TableRecipeData") as XmlElement;                nodeData.SetAttribute("CreatedBy", Creator);                nodeData.SetAttribute("CreationTime", CreateTime.ToString("yyyy-MM-dd HH:mm:ss"));                nodeData.SetAttribute("LastRevisedBy", Revisor);                nodeData.SetAttribute("LastRevisionTime", ReviseTime.ToString("yyyy-MM-dd HH:mm:ss"));                nodeData.SetAttribute("Description", Description);                nodeData.SetAttribute("RecipeChamberType", RecipeChamberType);                nodeData.SetAttribute("RecipeVersion", RecipeVersion);                nodeData.SetAttribute("RecipePermission", RecipePermission);                nodeData.SetAttribute("RecipeLevel", RecipeLevel);                XmlNode nodeModule = _doc.SelectSingleNode($"Aitex/TableRecipeData/Module[@Name='{_module}']");                if (nodeModule == null)                {                    nodeModule = _doc.CreateElement("Module");                    nodeData.AppendChild(nodeModule);                }                nodeModule.RemoveAll();                (nodeModule as XmlElement).SetAttribute("Name", _module);                foreach (var parameters in NormalSteps)                {                    XmlElement nodeStep = _doc.CreateElement("Step");                    nodeStep.SetAttribute("Name", parameters.Name);                    //遍历属性                    foreach (var prop in parameters.GetType().GetProperties())                    {                        if (prop.Name == "IsNotifying")                            continue;                        string strValue = prop.GetValue(parameters) == null ? "" : prop.GetValue(parameters).ToString();                        nodeStep.SetAttribute(prop.Name, strValue);                    }                    nodeModule.AppendChild(nodeStep);                }                foreach (var parameters in ExpertSteps)                {                    XmlElement nodeStep = _doc.CreateElement("Step");                    nodeStep.SetAttribute("Name", parameters.Name);                    for (int i = 0; i < parameters.Items.Count; i++)                    {                        nodeStep.SetAttribute($"slot{i + 1}", parameters.Items[i].Description);                    }                    nodeModule.AppendChild(nodeStep);                }                XmlElement nodeConfig = _doc.CreateElement("Config");                foreach (Param parameter in ConfigItems)                {                    if (parameter.Visible == System.Windows.Visibility.Visible)                    {                        if (parameter is IntParam)                            nodeConfig.SetAttribute(parameter.Name, ((IntParam)parameter).Value.ToString());                        if (parameter is NumParam)                            nodeConfig.SetAttribute(parameter.Name, ((NumParam)parameter).Value.ToString());                        else if (parameter is DoubleParam)                        {                            string strValue = ((DoubleParam)parameter).Value;                            bool succed = double.TryParse(strValue, out double dValue);                            if (!succed)                            {                                MessageBox.Show($"The set value of {parameter.DisplayName} is {strValue}, not a valid value");                                return null;                            }                            var config = ConfigItems.Where(m => m.Name == parameter.Name).FirstOrDefault();                            if (config is DoubleParam param1)                            {                                if (param1.Minimun == 0 && param1.Maximun == 0)                                {                                    //没有设定范围                                }                                else if (dValue > param1.Maximun || dValue < param1.Minimun)                                {                                    MessageBox.Show($"The set value of {parameter.DisplayName} is {dValue}, out of the range {param1.Minimun}~{param1.Maximun}");                                    return null;                                }                            }                            nodeConfig.SetAttribute(parameter.Name, ((DoubleParam)parameter).Value.ToString());                        }                        else if (parameter is StringParam)                            nodeConfig.SetAttribute(parameter.Name, ((StringParam)parameter).Value.ToString());                        else if (parameter is ComboxParam)                            nodeConfig.SetAttribute(parameter.Name, ((ComboxParam)parameter).Value.ToString());                        else if (parameter is LoopComboxParam)                            nodeConfig.SetAttribute(parameter.Name, ((LoopComboxParam)parameter).Value.ToString());                        else if (parameter is PositionParam)                            nodeConfig.SetAttribute(parameter.Name, ((PositionParam)parameter).Value.ToString());                        else if (parameter is BoolParam)                            nodeConfig.SetAttribute(parameter.Name, ((BoolParam)parameter).Value.ToString());                        else if (parameter is StepParam)                            nodeConfig.SetAttribute(parameter.Name, ((StepParam)parameter).Value.ToString());                        else if (parameter is MultipleSelectParam)                        {                            List<string> selected = new List<string>();                            ((MultipleSelectParam)parameter).Options.Apply(                                 opt =>                                 {                                     if (opt.IsChecked)                                         selected.Add(opt.ControlName);                                 }                                                        );                            nodeConfig.SetAttribute(parameter.Name, string.Join(",", selected));                        }                    }                }                nodeModule.AppendChild(nodeConfig);            }            catch (Exception ex)            {                LOG.Write(ex);                return _doc.OuterXml;            }            return _doc.OuterXml;        }        public void SaveTo(string[] moduleList)        {            //GetXmlString();            XmlNode nodeModule = _doc.SelectSingleNode($"Aitex/TableRecipeData/Module[@Name='{_module}']");            if (nodeModule == null)            {                LOG.Write("recipe not find modules," + Name);                return;            }            XmlNode nodeData = nodeModule.ParentNode;            foreach (var module in moduleList)            {                if (module == _module)                {                    continue;                }                var child = _doc.SelectSingleNode($"Aitex/TableRecipeData/Module[@Name='{module}']");                if (child != null)                    nodeData.RemoveChild(child);                XmlElement node = nodeModule.Clone() as XmlElement;                node.SetAttribute("Name", module);                nodeData.AppendChild(node);            }        }        public string DictionaryStepTime(Dictionary<string, string> steptimes)        {            if (steptimes == null && steptimes.Count == 0) return null;            StringBuilder rtn = new StringBuilder();            foreach (var item in steptimes.Keys)            {                if (steptimes[item] == "00:00:00") continue;                rtn.Append($"{item},{steptimes[item]};");            }            if (rtn.Length > 0) rtn.Remove(rtn.Length - 1, 1);            return rtn.ToString();        }        public Dictionary<string, string> StepTimeToDictionary(string stepTime)        {            Dictionary<string, string> steptimes = new Dictionary<string, string>();            string[] tempTimes = stepTime.Split(';');            foreach (var item in tempTimes)            {                string[] subTimes = item.Split(',');                steptimes.Add(subTimes[0], subTimes[1]);            }            return steptimes;        }        private bool LoadHeader(XmlNode nodeHeader)        {            if (nodeHeader == null)                return false;            if (nodeHeader.Attributes["CreatedBy"] != null)                this.Creator = nodeHeader.Attributes["CreatedBy"].Value;            if (nodeHeader.Attributes["CreationTime"] != null)                this.CreateTime = DateTime.Parse(nodeHeader.Attributes["CreationTime"].Value);            if (nodeHeader.Attributes["LastRevisedBy"] != null)                this.Revisor = nodeHeader.Attributes["LastRevisedBy"].Value;            if (nodeHeader.Attributes["LastRevisionTime"] != null)                this.ReviseTime = DateTime.Parse(nodeHeader.Attributes["LastRevisionTime"].Value);            if (nodeHeader.Attributes["Description"] != null)                this.Description = nodeHeader.Attributes["Description"].Value;            string chamberType = string.Empty;            if (nodeHeader.Attributes["RecipeChamberType"] != null)                chamberType = nodeHeader.Attributes["RecipeChamberType"].Value;            if (!string.IsNullOrEmpty(chamberType) && chamberType != RecipeChamberType)            {                LOG.Write($"{chamberType} is not accordance with {RecipeChamberType}");                return false;            }            string version = string.Empty;            if (nodeHeader.Attributes["RecipeVersion"] != null)                version = nodeHeader.Attributes["RecipeVersion"].Value;            //if (!string.IsNullOrEmpty(version) && version != RecipeVersion)            //{            //    LOG.Write($"{version} is not accordance with {RecipeVersion}");            //    return false;            //}            return true;        }    }    public class RecipeLayoutEntityNormal : PropertyChangedBase    {        public RecipeLayoutEntityNormal()        {            Name = "Normal";        }        private string name;        public string Name        {            get { return name; }            set { name = value; this.NotifyOfPropertyChange(nameof(Name)); }        }        private string dummyUpperSlot;        public string DummyUpperSlot        {            get { return dummyUpperSlot; }            set { dummyUpperSlot = value; this.NotifyOfPropertyChange(nameof(DummyUpperSlot)); }        }        private string dummyLowerSlot;        public string DummyLowerSlot        {            get { return dummyLowerSlot; }            set { dummyLowerSlot = value; this.NotifyOfPropertyChange(nameof(DummyLowerSlot)); }        }        private string centeringSlotPosition;        public string CenteringSlotPosition        {            get { return centeringSlotPosition; }            set { centeringSlotPosition = value; this.NotifyOfPropertyChange(nameof(CenteringSlotPosition)); }        }        private string productPosition;        public string ProductPosition        {            get { return productPosition; }            set { productPosition = value; this.NotifyOfPropertyChange(nameof(ProductPosition)); }        }        private string productSlotNo;        public string ProductSlotNo        {            get { return productSlotNo; }            set { productSlotNo = value; this.NotifyOfPropertyChange(nameof(ProductSlotNo)); }        }        private string monitorPosition;        public string MonitorPosition        {            get { return monitorPosition; }            set { monitorPosition = value; this.NotifyOfPropertyChange(nameof(MonitorPosition)); }        }        private string monitor1SlotNo;        public string Monitor1SlotNo        {            get { return monitor1SlotNo; }            set { monitor1SlotNo = value; this.NotifyOfPropertyChange(nameof(Monitor1SlotNo)); }        }        private string monitor2SlotNo;        public string Monitor2SlotNo        {            get { return monitor2SlotNo; }            set { monitor2SlotNo = value; this.NotifyOfPropertyChange(nameof(Monitor2SlotNo)); }        }        private string sdDummySlotNo;        public string SDDummySlotNo        {            get { return sdDummySlotNo; }            set { sdDummySlotNo = value; this.NotifyOfPropertyChange(nameof(SDDummySlotNo)); }        }        private string fdDummySlotNo;        public string FDDummySlotNo        {            get { return fdDummySlotNo; }            set { fdDummySlotNo = value; this.NotifyOfPropertyChange(nameof(FDDummySlotNo)); }        }        private string whenPWaferShort = "LeaveAs";        public string WhenPWaferShort        {            get { return whenPWaferShort; }            set { whenPWaferShort = value; this.NotifyOfPropertyChange(nameof(WhenPWaferShort)); }        }        private string sdRule = "DonotMove";        public string SDRule        {            get { return sdRule; }            set { sdRule = value; this.NotifyOfPropertyChange(nameof(SDRule)); }        }        private string whenCassetteInBatchAreShort = "LeaveAs";        public string WhenCassetteInBatchAreShort        {            get { return whenCassetteInBatchAreShort; }            set { whenCassetteInBatchAreShort = value; this.NotifyOfPropertyChange(nameof(WhenCassetteInBatchAreShort)); }        }        private string whenWaferInCassetteAreShort = "LeaveAs";        public string WhenWaferInCassetteAreShort        {            get { return whenWaferInCassetteAreShort; }            set { whenWaferInCassetteAreShort = value; this.NotifyOfPropertyChange(nameof(WhenWaferInCassetteAreShort)); }        }        private string whenEDAreShort = "LeaveAs";        public string WhenEDAreShort        {            get { return whenEDAreShort; }            set { whenEDAreShort = value; this.NotifyOfPropertyChange(nameof(WhenEDAreShort)); }        }        private string ruleOfSpaceInBoat = "LeaveAs";        public string RuleOfSpaceInBoat        {            get { return ruleOfSpaceInBoat; }            set { ruleOfSpaceInBoat = value; this.NotifyOfPropertyChange(nameof(RuleOfSpaceInBoat)); }        }    }    public class RecipeLayoutEntityExpert    {        public RecipeLayoutEntityExpert()        {            Name = "Expert";        }        public string Name { get; set; }        public List<BoatWaferItem> Items { get; set; } = new List<BoatWaferItem>();    }}
 |