using SourceGrid; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Xml; using System.Xml.Linq; namespace OTSPartA_STDEditor { public partial class Form_Main : Form { OTSDockWindow m_DockWindow = null; public STDRuleslist m_STDRuleslist = null; public Attributes m_Attributes = null; public SubMidWindow m_SubMidWindow = null; public Dictionary STDDictionary = new Dictionary(); private Dictionary STDDictionaryInitial=new Dictionary(); public Dictionary GroupIdDictionaryFromId = new Dictionary(); public Dictionary GroupIdDictionaryFromName = new Dictionary(); string STDDBAddress_backupDirectory = Application.StartupPath + "\\Config\\SysData\\LibBackup\\"; public string STDDBAddress = ""; /// /// 0:正在打开的标准库路径;1:所增加标准的颗粒所在结果库位置;2:所增加标准的颗粒FieldId;3:所增加标准的颗粒ParticleId;4:所增加标准的颗粒XRayId /// List ImportArgs = new List(); //国际化 public Language lan; Hashtable table; //是否做出过更改 public bool IsModified { set; get; } public bool Isoldversion { set; get; } public Form_Main() { InitializeComponent(); m_STDRuleslist = new STDRuleslist(this); m_Attributes = new Attributes(this); m_SubMidWindow = new SubMidWindow(this); m_DockWindow = new OTSDockWindow(this); } public Form_Main(string[] ImportStandardLibraryArgs) { InitializeComponent(); m_STDRuleslist = new STDRuleslist(this); m_Attributes = new Attributes(this); m_SubMidWindow = new SubMidWindow(this); m_DockWindow = new OTSDockWindow(this); foreach (var it in ImportStandardLibraryArgs) { ImportArgs.Add(it); } } private void Form_ConstantsEditor2_Load(object sender, EventArgs e) { lan = new Language(this); table = lan.GetNameTable("Form_ConstantsEditor2"); if (STDDBAddress != "") { InitForms(STDDBAddress); this.Text = this.Text.Split(' ')[0] + " " + STDDBAddress; IsModified = false; if (ImportArgs.Count > 1) { ImportStandardLibraryTypeSelection m_importStandardLibraryTypeSelection = new ImportStandardLibraryTypeSelection(); var result = m_importStandardLibraryTypeSelection.ShowDialog(); if (m_importStandardLibraryTypeSelection.SelectEvent == "expression") { int STDId = AddSTDDictionaryItem(); m_STDRuleslist.AddNewRow(STDId, "NewClassify", Color.Gray); } } } } void LoadConstants(string STDDBAddress) { try { System.Data.SQLite.SQLiteConnection m_dbConnection = new System.Data.SQLite.SQLiteConnection("data source='" + STDDBAddress + "'"); m_dbConnection.Open(); System.Data.SQLite.SQLiteDataAdapter m_dataAdapter = new System.Data.SQLite.SQLiteDataAdapter("select * from Constants", m_dbConnection); DataSet ds = new DataSet(); m_dataAdapter.Fill(ds); DataTable dt = ds.Tables[0]; if (dt.Rows.Count > 0) { string ConstantsStr = dt.Rows[0][0].ToString(); ConstantsStr = ConstantsStr.Replace(" ", ""); string[] ConstantsStr2 = ConstantsStr.Split(','); m_SubMidWindow.m_STDEditor.comboBox_Constants.Items.Clear(); m_SubMidWindow.m_STDEditor.comboBox_Constants.Items.AddRange(ConstantsStr2); } m_dbConnection.Close(); } catch (Exception ee) { MessageBox.Show(ee.ToString()); } } bool LoadClassifyToDictionary(string DBAddress, ref Dictionary STDDictionary) { try { //STDDictionaryInitial.Clear(); System.Data.SQLite.SQLiteConnection m_dbConnection = new System.Data.SQLite.SQLiteConnection("data source='" + DBAddress + "'"); m_dbConnection.Open(); System.Data.SQLite.SQLiteDataAdapter m_dataAdapter = new System.Data.SQLite.SQLiteDataAdapter("select * from ClassifySTD order by ListNum", m_dbConnection); DataSet ds = new DataSet(); m_dataAdapter.Fill(ds); DataTable dt = ds.Tables[0]; if (dt != null) { if ((dt.Columns.Contains("IfElementAnalysis"))) { rbSave.Enabled = true; Isoldversion = false; } else { MessageBox.Show("该标准库为旧版本,只能进行另存操作!", "注意"); rbSave.Enabled = false; Isoldversion = true; } if (dt.Rows.Count > 0) { foreach (DataRow item in dt.Rows) { STDdata new_STDdata = new STDdata(); new_STDdata.Hardness = item["Hardness"].ToString(); new_STDdata.Density = item["Density"].ToString(); new_STDdata.Electrical_conductivity = item["Electrical_conductivity"].ToString(); new_STDdata.BSE = item["BSE"].ToString(); new_STDdata.Formula = item["Formula"].ToString(); new_STDdata.Element = item["Element"].ToString(); new_STDdata.StrName = item["StrName"].ToString(); new_STDdata.Expression = item["Expression"].ToString(); new_STDdata.Color = item["Color"].ToString(); new_STDdata.KeyElementList = item["KeyElementList"].ToString(); new_STDdata.SubElementList = item["SubElementList"].ToString(); new_STDdata.GroupId = item["GroupId"].ToString(); new_STDdata.ListNum= item["ListNum"].ToString(); new_STDdata.GroupId = item["GroupId"].ToString(); if(dt.Columns.Contains("IfElementAnalysis")) { if (Convert.ToBoolean(item["IfElementAnalysis"])) { new_STDdata.IfElementAnalysis = true; } else { new_STDdata.IfElementAnalysis = false; } } STDDictionary.Add(int.Parse(item["STDId"].ToString()), new_STDdata); } } } return true; } catch /*(Exception ee)*/ { MessageBox.Show("The selected standard library is formatted incorrectly, please open the correct standard library!", "Tip"); return false; } } public void ChangeSTDEditorAndGrid_Attributes(int STDId) { m_SubMidWindow.ChangeText_textbox_STDEditor(STDId); m_Attributes.SetDatatoGrid_Attributes(STDId); } private void rbBackup_Click(object sender, EventArgs e) { if (m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row >= 0) { if (CheckAttributes()) { if (Checktextbox_STDEditor()) { SaveDataOfSelRule(m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row, m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Column); try { SaveFileDialog saveFile = new SaveFileDialog(); saveFile.Title = "Please select the path which to save the file"; saveFile.Filter = "Database File(*.db)|*.db"; saveFile.InitialDirectory = Application.StartupPath + "\\Config\\SysData\\"; saveFile.OverwritePrompt = true; //是否覆盖当前文件 //saveFile.RestoreDirectory = true; //还原上次目录 if (saveFile.ShowDialog() == DialogResult.OK) { System.IO.File.Copy(STDDBAddress, saveFile.FileName, true); bool result = SaveAsDictionaryToClassify(saveFile.FileName); STDDBAddress = saveFile.FileName; this.Text = this.Text.Split(' ')[0] + " " + saveFile.FileName; } else { return; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } else { MessageBox.Show("The name of rulecannot be empty!", "Tip"); } } else { try { SaveFileDialog saveFile = new SaveFileDialog(); saveFile.Title = "Please select the path which to save the file"; saveFile.Filter = "Database File(*.db)|*.db"; saveFile.OverwritePrompt = true; //是否覆盖当前文件 saveFile.RestoreDirectory = true; //还原上次目录 if (saveFile.ShowDialog() == DialogResult.OK) { System.IO.File.Copy(STDDBAddress, saveFile.FileName, true); bool result = SaveDictionaryToClassify(saveFile.FileName); if (result) { MessageBox.Show("Export file successful!", "Tip", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else { return; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } } public bool ClearDb(string DBAddress, string DBTableName) { try { System.Data.SQLite.SQLiteConnection m_dbConnection = new System.Data.SQLite.SQLiteConnection("data source='" + DBAddress + "'"); m_dbConnection.Open(); System.Data.SQLite.SQLiteCommand cmm = m_dbConnection.CreateCommand(); cmm.CommandText = "delete from " + DBTableName; cmm.ExecuteNonQuery(); m_dbConnection.Close(); return true; } catch (Exception ex) { MessageBox.Show(ex.ToString()); return false; } } object Clone(Dictionary STDDictionary) { Dictionary STDDictionaryInitial = new Dictionary(); foreach (var key in STDDictionary.Keys) { STDdata tDdata = new STDdata(); tDdata = tDdata.Clone(STDDictionary[key]) as STDdata; STDDictionaryInitial.Add(key, tDdata); } return STDDictionaryInitial; } private void rbSave_Click(object sender, EventArgs e) { if (m_STDRuleslist.Grid_Minerals.RowsCount > 1) { if (m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row > 0) { if (m_STDRuleslist.Grid_Minerals[m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row, 0].Value.ToString().Replace(" ", "").Trim() != "") { if (CheckAttributes()) { if (Checktextbox_STDEditor()) { FormForWaiting forWaiting = new FormForWaiting(); forWaiting.Show(); SaveDataOfSelRule(m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row, 0); bool result = SaveDictionaryToClassify(STDDBAddress); if (result) { STDDictionaryInitial.Clear(); STDDictionaryInitial = Clone(STDDictionary) as Dictionary; forWaiting.Close(); IsModified = false; } else { forWaiting.Close(); MessageBox.Show("Save failed!", "Tip"); } } } } } else { Position pos = new Position(1, 0); m_STDRuleslist.Grid_Minerals[1, 0].Grid.Select(); if (m_STDRuleslist.Grid_Minerals[m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row, 0].Value.ToString().Replace(" ", "").Trim() != "") { if (CheckAttributes()) { if (Checktextbox_STDEditor()) { FormForWaiting forWaiting = new FormForWaiting(); forWaiting.Show(); SaveDataOfSelRule(m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row, 0); bool result = SaveDictionaryToClassify(STDDBAddress); if (result) { STDDictionaryInitial.Clear(); STDDictionaryInitial = new Dictionary(STDDictionary); forWaiting.Close(); IsModified = false; MessageBox.Show("Save successful!", "Tip"); } else { forWaiting.Close(); MessageBox.Show("Save failed!", "Tip"); } } } } } } } /// /// [颜色:RGB转成16进制] /// /// 红 int /// 绿 int /// 蓝 int /// public static string colorRGBtoHx16(int R, int G, int B) { return System.Drawing.ColorTranslator.ToHtml(System.Drawing.Color.FromArgb(R, G, B)); } //表达式规则检查 public bool Checktextbox_STDEditor() { string str_RemoveBlank = m_SubMidWindow.m_STDEditor.textbox_STDEditor.Text.ToString().Replace(" ", ""); if (str_RemoveBlank != "") { str_RemoveBlank = str_RemoveBlank.Replace("\r\n", ""); //分割符号检验 string[] Symbol = { "and", "or", "+", "-", "*", "/", "=", ">", "<" }; for (int i = 0; i < Symbol.Length; i++) { for (int j = 0; j < Symbol.Length; j++) { if ((Symbol[i] + Symbol[j]) != ">=" && (Symbol[i] + Symbol[j]) != "<=") { if (str_RemoveBlank.Contains(Symbol[i] + Symbol[j])) { MessageBox.Show("Invalid string exists:" + Symbol[i] + Symbol[j], "Tip", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } } } if (str_RemoveBlank.Contains(Symbol[i] + ")") || str_RemoveBlank.Contains("(" + Symbol[i])) { MessageBox.Show("Invalid string exists:" + Symbol[i] + ")", "Tip", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } if (str_RemoveBlank.Contains("(" + Symbol[i])) { MessageBox.Show("Invalid string exists:" + "(" + Symbol[i], "Tip", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } } if ((str_RemoveBlank != null) && (str_RemoveBlank != "")) { //左右括号匹配检验 int BracketsNum = 0; for (int i = 0; i < str_RemoveBlank.Length; i++) { if (str_RemoveBlank[i] == '(') BracketsNum++; if (str_RemoveBlank[i] == ')') BracketsNum--; } if (BracketsNum != 0) { MessageBox.Show("Number of left and right parentheses does not match!", "Tip", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } //首字符检测 if ((str_RemoveBlank[0] == '+') || (str_RemoveBlank[0] == '-') || (str_RemoveBlank[0] == '*') || (str_RemoveBlank[0] == '/') || (str_RemoveBlank[0] == '>') || (str_RemoveBlank[0] == '<') || (str_RemoveBlank[0] == '=') || (str_RemoveBlank[0] == ')') || (str_RemoveBlank[str_RemoveBlank.Length - 1] == '(')) { MessageBox.Show("First character is error!", "Tip", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } if (str_RemoveBlank.Length >= 3) { if ((str_RemoveBlank.Substring(0, 3) == "and") || (str_RemoveBlank.Substring(0, 3) == "end")) { MessageBox.Show("First character is error!", "Tip", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } } } //forth_elem干扰or分隔符,故先行去掉 str_RemoveBlank = str_RemoveBlank.Replace("forth_elem", ""); string[] str_Removeand = System.Text.RegularExpressions.Regex.Split(str_RemoveBlank, "and", System.Text.RegularExpressions.RegexOptions.None); List str_Removeandor = new List(); for (int i = 0; i < str_Removeand.Length; i++) { str_Removeandor.AddRange(System.Text.RegularExpressions.Regex.Split(str_Removeand[i], "or", System.Text.RegularExpressions.RegexOptions.None)); } List list_all = new List(); for (int i = 0; i < str_Removeandor.Count; i++) { list_all.AddRange(str_Removeandor[i].Split(new char[] { '+', '-', '*', '/', '=', '>', '<', '(', ')' })); } //常量 List Constantslist = new List(); for (int j = 0; j < m_SubMidWindow.m_STDEditor.comboBox_Constants.Items.Count; j++) { Constantslist.Add(m_SubMidWindow.m_STDEditor.comboBox_Constants.Items[j].ToString().Split('=')[0]); } for (int i = 0; i < list_all.Count; i++) { //周期元素? if (this.m_SubMidWindow.m_STDEditor.comboBox_PeriodicTable.Items.Contains(list_all[i])) { continue; } //first_elem? if (this.m_SubMidWindow.m_STDEditor.comboBox_Elem1.Items.Contains(list_all[i])) { continue; } //Element1? if (this.m_SubMidWindow.m_STDEditor.comboBox_Elem.Items.Contains(list_all[i])) { continue; } //其它元素? if (this.m_SubMidWindow.m_STDEditor.comboBox_ImgProperty.Items.Contains(list_all[i])) { continue; } //常量? if (Constantslist.Contains(list_all[i])) { continue; } //数字? double DNum = 0; if (double.TryParse(list_all[i], out DNum)) { continue; } //>=? <=?等其它情况 if (list_all[i] == "") { continue; } //true false? if ((list_all[i] == "true") || (list_all[i] == "false")) { continue; } MessageBox.Show("Please check whether the input rules are correct, error characters:" + list_all[i], "Tip", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } //检测是否有<>= true,false if (!m_SubMidWindow.m_STDEditor.textbox_STDEditor.Text.ToString().Contains("<") && !m_SubMidWindow.m_STDEditor.textbox_STDEditor.Text.ToString().Contains(">") && !m_SubMidWindow.m_STDEditor.textbox_STDEditor.Text.ToString().Contains("=") && m_SubMidWindow.m_STDEditor.textbox_STDEditor.Text.ToString() != "true" && m_SubMidWindow.m_STDEditor.textbox_STDEditor.Text.ToString() != "false") { MessageBox.Show("Expressions have no effect!", "Tip", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } } return true; } //属性检测 public bool CheckAttributes() { //if (double.Parse(m_Attributes.Grid_Attributes[4, 1].Value.ToString()) <= 0) //{ // Position pos = new Position(4, 1); // m_Attributes.Grid_Attributes.Selection.Focus(pos, true); // MessageBox.Show(table["message10"].ToString(), table["message32"].ToString(), MessageBoxButtons.OK, MessageBoxIcon.Information); // return false; //} //if (double.Parse(m_Attributes.Grid_Attributes[5, 1].Value.ToString()) <= 0) //{ // Position pos = new Position(5, 1); // m_Attributes.Grid_Attributes.Selection.Focus(pos, true); // MessageBox.Show(table["message11"].ToString(), table["message32"].ToString(), MessageBoxButtons.OK, MessageBoxIcon.Information); // return false; //} //if (double.Parse(m_Attributes.Grid_Attributes[6, 1].Value.ToString()) <= 0) //{ // Position pos = new Position(6, 1); // m_Attributes.Grid_Attributes.Selection.Focus(pos, true); // MessageBox.Show(table["message12"].ToString(), table["message32"].ToString(), MessageBoxButtons.OK, MessageBoxIcon.Information); // return false; //} //if (int.Parse(m_Attributes.Grid_Attributes[7, 1].Value.ToString()) <= 0) //{ // Position pos = new Position(7, 1); // m_Attributes.Grid_Attributes.Selection.Focus(pos, true); // MessageBox.Show(table["message9"].ToString(), table["message32"].ToString(), MessageBoxButtons.OK, MessageBoxIcon.Information); // return false; //} if (m_Attributes.Grid_Attributes[10, 1].Value != null) { if (!GroupIdDictionaryFromName.ContainsKey(m_Attributes.Grid_Attributes[11, 1].Value.ToString())) { Position pos = new Position(11, 1); m_Attributes.Grid_Attributes.Selection.Focus(pos, true); MessageBox.Show("This group name is not included, please fill in again!", "Tip", MessageBoxButtons.OK, MessageBoxIcon.Information); return false; } } #region 化学式和元素暂无限制 //if (m_Attributes.Grid_Attributes[7, 1].Value.ToString()) //{ // Position pos = new Position(7, 1); // m_Attributes.Grid_Attributes.Selection.Focus(pos, true); // MessageBox.Show(table["message10"].ToString(), table["message32"].ToString(), MessageBoxButtons.OK, MessageBoxIcon.Information); // return false; //} //if (m_Attributes.Grid_Attributes[8, 1].Value.ToString()) //{ // Position pos = new Position(8, 1); // m_Attributes.Grid_Attributes.Selection.Focus(pos, true); // MessageBox.Show(table["message10"].ToString(), table["message32"].ToString(), MessageBoxButtons.OK, MessageBoxIcon.Information); // return false; //} #endregion return true; } public void SaveDataOfSelRule(int PreRow, int PreColumn) { STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].StrName = m_Attributes.Grid_Attributes[2, 1].Value.ToString(); STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].Color = colorRGBtoHx16(m_Attributes.Grid_Attributes[3, 1].View.BackColor.R, m_Attributes.Grid_Attributes[3, 1].View.BackColor.G, m_Attributes.Grid_Attributes[3, 1].View.BackColor.B); STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].IfElementAnalysis = Convert.ToBoolean(m_Attributes.Grid_Attributes[4, 1].Value); STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].Hardness = m_Attributes.Grid_Attributes[5, 1].Value.ToString(); STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].Density = m_Attributes.Grid_Attributes[6, 1].Value.ToString(); STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].Electrical_conductivity = m_Attributes.Grid_Attributes[7, 1].Value.ToString(); STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].BSE = m_Attributes.Grid_Attributes[8, 1].Value.ToString(); if (m_Attributes.Grid_Attributes[9, 1].Value!= null) { STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].Formula = m_Attributes.Grid_Attributes[9, 1].Value.ToString(); } else { STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].Formula = ""; } if (m_Attributes.Grid_Attributes[10, 1].Value != null) { STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].Element = m_Attributes.Grid_Attributes[10, 1].Value.ToString(); } else { STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].Element = ""; } if (m_Attributes.Grid_Attributes[11, 1].Value != null) { STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].GroupId = GroupIdDictionaryFromName[m_Attributes.Grid_Attributes[11, 1].Value.ToString()].ToString(); } else { STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].GroupId = "0"; } STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].Expression = m_SubMidWindow.m_STDEditor.textbox_STDEditor.Text.ToString(); string sKeyElements = ""; for (int i = 0; i < m_SubMidWindow.m_STDEditor.dataGridView_KeyElements.Columns.Count; i++) { sKeyElements += m_SubMidWindow.m_STDEditor.dataGridView_KeyElements.Rows[0].Cells[i].Value.ToString() + ","; } if (sKeyElements.Length > 0) { sKeyElements = sKeyElements.Substring(0, sKeyElements.Length - 1); } string sSubElements = ""; for (int i = 0; i < m_SubMidWindow.m_STDEditor.dataGridView_SubElements.Columns.Count; i++) { sSubElements += m_SubMidWindow.m_STDEditor.dataGridView_SubElements.Rows[0].Cells[i].Value.ToString() + ","; } if (sSubElements.Length > 0) { sSubElements = sSubElements.Substring(0, sSubElements.Length - 1); } STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].KeyElementList = sKeyElements; STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[PreRow, 0].Tag.ToString())].SubElementList = sSubElements; } /// /// 保存ClassifySTD库和MineralElements库 /// /// /// bool SaveDictionaryToClassify(string DBAddress) { //保存列表顺序 for(int i=1;i kv in STDDictionary) { string UsingElementList = ""; string UsingImgPropertyList = ""; string UsingOtherPropertyList = ""; List UsingElementL = new List(); List UsingImgPropertyL = new List(); List UsingOtherPropertyL = new List(); string str_RemoveBlank = kv.Value.Expression; //forth_elem干扰or分隔符,故先行去掉 if (str_RemoveBlank.Contains("forth_elem")) { str_RemoveBlank = str_RemoveBlank.Replace("forth_elem", ""); UsingOtherPropertyList = "forth_elem,"; } str_RemoveBlank = str_RemoveBlank.Replace(" ", ""); string[] str_Removeand = System.Text.RegularExpressions.Regex.Split(str_RemoveBlank, "and", System.Text.RegularExpressions.RegexOptions.None); List str_Removeandor = new List(); for (int i = 0; i < str_Removeand.Length; i++) { str_Removeandor.AddRange(System.Text.RegularExpressions.Regex.Split(str_Removeand[i], "or", System.Text.RegularExpressions.RegexOptions.None)); } List list_all = new List(); for (int i = 0; i < str_Removeandor.Count; i++) { list_all.AddRange(str_Removeandor[i].Split(new char[] { '+', '-', '*', '/', '=', '>', '<', '(', ')' })); } for (int i = 0; i < list_all.Count; i++) { //周期元素? if (m_SubMidWindow.m_STDEditor.comboBox_PeriodicTable.Items.Contains(list_all[i])) { if (!UsingElementL.Contains(list_all[i])) { UsingElementL.Add(list_all[i]); } } //first_elem? if (m_SubMidWindow.m_STDEditor.comboBox_Elem1.Items.Contains(list_all[i])) { if (!UsingOtherPropertyL.Contains(list_all[i])) { UsingOtherPropertyL.Add(list_all[i]); } } //Element1? if (m_SubMidWindow.m_STDEditor.comboBox_Elem.Items.Contains(list_all[i])) { if (!UsingOtherPropertyL.Contains(list_all[i])) { UsingOtherPropertyL.Add(list_all[i]); } } //其它元素? if (m_SubMidWindow.m_STDEditor.comboBox_ImgProperty.Items.Contains(list_all[i])) { if (!UsingImgPropertyL.Contains(list_all[i])) { UsingImgPropertyL.Add(list_all[i]); } } } if (UsingElementL.Count > 0) { for (int i = 0; i < UsingElementL.Count - 1; i++) { UsingElementList += UsingElementL[i] + ","; } UsingElementList += UsingElementL[UsingElementL.Count - 1]; } if (UsingImgPropertyL.Count > 0) { for (int i = 0; i < UsingImgPropertyL.Count - 1; i++) { UsingImgPropertyList += UsingImgPropertyL[i] + ","; } UsingImgPropertyList += UsingImgPropertyL[UsingImgPropertyL.Count - 1]; } if (UsingOtherPropertyL.Count > 0) { for (int i = 0; i < UsingOtherPropertyL.Count - 1; i++) { UsingOtherPropertyList += UsingOtherPropertyL[i] + ","; } UsingOtherPropertyList += UsingOtherPropertyL[UsingOtherPropertyL.Count - 1]; } DataRow newRow = dt.NewRow(); newRow["STDId"] = kv.Key; newRow["StrName"] = kv.Value.StrName; newRow["Color"] = kv.Value.Color; newRow["KeyElementList"] = kv.Value.KeyElementList; newRow["SubElementList"] = kv.Value.SubElementList; newRow["UsingImgPropertyList"] = UsingImgPropertyList; newRow["UsingOtherPropertyList"] = UsingOtherPropertyList; newRow["Expression"] = kv.Value.Expression; newRow["Hardness"] = kv.Value.Hardness; newRow["Density"] = kv.Value.Density; newRow["Electrical_conductivity"] = kv.Value.Electrical_conductivity; newRow["BSE"] = int.Parse(kv.Value.BSE); newRow["Formula"] = kv.Value.Formula; newRow["Element"] = kv.Value.Element; newRow["IfElementAnalysis"] = kv.Value.IfElementAnalysis; newRow["GroupId"] = int.Parse(kv.Value.GroupId); newRow["ListNum"] = kv.Value.ListNum; dt.Rows.Add(newRow); } m_dataAdapter.Update(ds,"ClassifySTD"); m_dbConnection.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); return false; } return true; } bool SaveAsDictionaryToClassify(string DBAddress) { //保存列表顺序 for (int i = 1; i < m_STDRuleslist.Grid_Minerals.RowsCount; i++) { STDDictionary[(int)m_STDRuleslist.Grid_Minerals[i, 0].Tag].ListNum = i.ToString(); } try { System.Data.SQLite.SQLiteConnection m_dbConnection = new System.Data.SQLite.SQLiteConnection("data source='" + DBAddress + "'"); m_dbConnection.Open(); System.Data.SQLite.SQLiteCommand cmm = m_dbConnection.CreateCommand(); cmm.CommandText = "drop table ClassifySTD"; cmm.ExecuteNonQuery(); cmm.CommandText = "CREATE TABLE ClassifySTD (STDId INTEGER,StrName TEXT, Color TEXT,KeyElementList TEXT,SubElementList TEXT,UsingImgPropertyList TEXT,UsingOtherPropertyList TEXT,Expression TEXT,Hardness TEXT,Density TEXT,Electrical_conductivity TEXT,BSE INTEGER,Formula TEXT,Element TEXT,IfElementAnalysis BOOLEAN,ListNum INT,GroupId INT)"; cmm.ExecuteNonQuery(); System.Data.Common.DbTransaction trans = m_dbConnection.BeginTransaction(); trans.Commit(); System.Data.SQLite.SQLiteDataAdapter m_dataAdapter = new System.Data.SQLite.SQLiteDataAdapter("select * from ClassifySTD", m_dbConnection); System.Data.SQLite.SQLiteCommandBuilder qLiteCommandBuilder = new System.Data.SQLite.SQLiteCommandBuilder(m_dataAdapter); DataSet ds = new DataSet(); m_dataAdapter.Fill(ds, "ClassifySTD"); DataTable dt = ds.Tables["ClassifySTD"]; foreach (KeyValuePair kv in STDDictionary) { string UsingElementList = ""; string UsingImgPropertyList = ""; string UsingOtherPropertyList = ""; List UsingElementL = new List(); List UsingImgPropertyL = new List(); List UsingOtherPropertyL = new List(); string str_RemoveBlank = kv.Value.Expression; //forth_elem干扰or分隔符,故先行去掉 if (str_RemoveBlank.Contains("forth_elem")) { str_RemoveBlank = str_RemoveBlank.Replace("forth_elem", ""); UsingOtherPropertyList = "forth_elem,"; } str_RemoveBlank = str_RemoveBlank.Replace(" ", ""); string[] str_Removeand = System.Text.RegularExpressions.Regex.Split(str_RemoveBlank, "and", System.Text.RegularExpressions.RegexOptions.None); List str_Removeandor = new List(); for (int i = 0; i < str_Removeand.Length; i++) { str_Removeandor.AddRange(System.Text.RegularExpressions.Regex.Split(str_Removeand[i], "or", System.Text.RegularExpressions.RegexOptions.None)); } List list_all = new List(); for (int i = 0; i < str_Removeandor.Count; i++) { list_all.AddRange(str_Removeandor[i].Split(new char[] { '+', '-', '*', '/', '=', '>', '<', '(', ')' })); } for (int i = 0; i < list_all.Count; i++) { //周期元素? if (m_SubMidWindow.m_STDEditor.comboBox_PeriodicTable.Items.Contains(list_all[i])) { if (!UsingElementL.Contains(list_all[i])) { UsingElementL.Add(list_all[i]); } } //first_elem? if (m_SubMidWindow.m_STDEditor.comboBox_Elem1.Items.Contains(list_all[i])) { if (!UsingOtherPropertyL.Contains(list_all[i])) { UsingOtherPropertyL.Add(list_all[i]); } } //Element1? if (m_SubMidWindow.m_STDEditor.comboBox_Elem.Items.Contains(list_all[i])) { if (!UsingOtherPropertyL.Contains(list_all[i])) { UsingOtherPropertyL.Add(list_all[i]); } } //其它元素? if (m_SubMidWindow.m_STDEditor.comboBox_ImgProperty.Items.Contains(list_all[i])) { if (!UsingImgPropertyL.Contains(list_all[i])) { UsingImgPropertyL.Add(list_all[i]); } } } if (UsingElementL.Count > 0) { for (int i = 0; i < UsingElementL.Count - 1; i++) { UsingElementList += UsingElementL[i] + ","; } UsingElementList += UsingElementL[UsingElementL.Count - 1]; } if (UsingImgPropertyL.Count > 0) { for (int i = 0; i < UsingImgPropertyL.Count - 1; i++) { UsingImgPropertyList += UsingImgPropertyL[i] + ","; } UsingImgPropertyList += UsingImgPropertyL[UsingImgPropertyL.Count - 1]; } if (UsingOtherPropertyL.Count > 0) { for (int i = 0; i < UsingOtherPropertyL.Count - 1; i++) { UsingOtherPropertyList += UsingOtherPropertyL[i] + ","; } UsingOtherPropertyList += UsingOtherPropertyL[UsingOtherPropertyL.Count - 1]; } DataRow newRow = dt.NewRow(); newRow["STDId"] = kv.Key; newRow["StrName"] = kv.Value.StrName; newRow["Color"] = kv.Value.Color; newRow["KeyElementList"] = kv.Value.KeyElementList; newRow["SubElementList"] = kv.Value.SubElementList; newRow["UsingImgPropertyList"] = UsingImgPropertyList; newRow["UsingOtherPropertyList"] = UsingOtherPropertyList; newRow["Expression"] = kv.Value.Expression; newRow["Hardness"] = kv.Value.Hardness; newRow["Density"] = kv.Value.Density; newRow["Electrical_conductivity"] = kv.Value.Electrical_conductivity; newRow["BSE"] = int.Parse(kv.Value.BSE); newRow["Formula"] = kv.Value.Formula; newRow["Element"] = kv.Value.Element; newRow["IfElementAnalysis"] = kv.Value.IfElementAnalysis; newRow["GroupId"] = int.Parse(kv.Value.GroupId); newRow["ListNum"] = kv.Value.ListNum; dt.Rows.Add(newRow); } m_dataAdapter.Update(ds, "ClassifySTD"); m_dbConnection.Close(); } catch (Exception ex) { MessageBox.Show(ex.ToString()); return false; } return true; } public int AddSTDDictionaryItem() { STDdata new_STDdata = new STDdata();//定义一个TreeNode节点对象 new_STDdata.Hardness = "1"; new_STDdata.Density = "1"; new_STDdata.Electrical_conductivity = "1"; new_STDdata.BSE = "1"; new_STDdata.Formula = "1"; new_STDdata.Element = "1"; new_STDdata.StrName = "NewRuleName"; //new_STDdata.Expression = "NewRules"; new_STDdata.Expression = ""; new_STDdata.KeyElementList = ""; new_STDdata.SubElementList = ""; new_STDdata.Color = colorRGBtoHx16(Color.Gray.R, Color.Gray.G, Color.Gray.B); int STDId = 40000; foreach (KeyValuePair kv in STDDictionary) { if (STDId < kv.Key) { STDId = kv.Key; } } STDDictionary.Add(STDId + 1, new_STDdata); return STDId + 1; } public void RemoveSTDDictionaryItem(int STDId) { STDDictionary.Remove(STDId); } public void ChangeStrName(int RowNum, string NewStrName) { STDDictionary[(int)m_STDRuleslist.Grid_Minerals[RowNum, 0].Tag].StrName = NewStrName; m_Attributes.Grid_Attributes[2, 1].Value = NewStrName; } public void ChangeSTDRulesLISTBackColor() { int stdid=m_STDRuleslist.ChangeSTDRulesLISTBackColor(); } public void ChangeSTDRuleName(String RuleName) { m_STDRuleslist.Grid_Minerals[m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row, 0].Value = RuleName; } public void SetNull() { m_SubMidWindow.m_STDEditor.textbox_STDEditor.Text = ""; for (int i = 1; i= 0) { GroupIdDictionaryFromId.Clear(); GroupIdDictionaryFromName.Clear(); if (dt.Select("id='0'").Length==0) { GroupIdDictionaryFromId.Add(0, "Default"); GroupIdDictionaryFromName.Add("Default", 0); } List ss = new List(); foreach (DataRow item in dt.Rows) { ss.Add(item["name"].ToString()); GroupIdDictionaryFromName.Add(item["name"].ToString(), int.Parse(item["id"].ToString())); GroupIdDictionaryFromId.Add(int.Parse(item["id"].ToString()),item["name"].ToString()); } SourceGrid.Cells.Editors.ComboBox GroupIdCBBox = new SourceGrid.Cells.Editors.ComboBox(typeof(string)); GroupIdCBBox.StandardValues = ss; GroupIdCBBox.EditableMode = SourceGrid.EditableMode.SingleClick| SourceGrid.EditableMode.Focus; m_Attributes.Grid_Attributes[11, 1] = new SourceGrid.Cells.Cell("Default", GroupIdCBBox); } } //string ConstantsStr = dt.Rows[0][0].ToString(); m_dbConnection.Close(); } catch (Exception ee) { MessageBox.Show(ee.ToString()); } } void SetNonexistentGroupsToDefault() { foreach (KeyValuePair kv in STDDictionary) { if(!GroupIdDictionaryFromId.Keys.Contains(int.Parse(kv.Value.GroupId))) { kv.Value.GroupId = "0"; } } m_Attributes.Grid_Attributes.Refresh(); } private void ribbon_GroupNameMaintenance_Click(object sender, EventArgs e) { //STDDictionary[int.Parse(m_STDRuleslist.Grid_Minerals[m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row, 0].Tag.ToString())].GroupId = GroupIdDictionaryFromName[m_Attributes.Grid_Attributes[10, 1].Value.ToString()].ToString(); int selGroupId = GroupIdDictionaryFromName[m_Attributes.Grid_Attributes[11, 1].Value.ToString()]; Form_GroupId form_GroupId = new Form_GroupId(STDDBAddress,this); DialogResult dialogResult = form_GroupId.ShowDialog(); if (dialogResult == DialogResult.Yes) { AddSTDGroupsToAttribute(); //SetNonexistentGroupsToDefault(); m_Attributes.Grid_Attributes[11, 1].Value = GroupIdDictionaryFromId[selGroupId]; } } private void ribbon_Exit_Click(object sender, EventArgs e) { this.Close(); } private void rbClose_Click(object sender, EventArgs e) { if (!Isoldversion) { if (!EqualsBetweenDictionary(STDDictionaryInitial, STDDictionary) || IsModified) { DialogResult dr = MessageBox.Show("Whether to save the current modification?", "Tip", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (dr == DialogResult.Yes) { if (m_STDRuleslist.Grid_Minerals.RowsCount > 1) { if ((m_STDRuleslist.Grid_Minerals[m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row, 0].Value.ToString().Replace(" ", "").Trim() != "") && CheckAttributes() && Checktextbox_STDEditor()) { SaveDataOfSelRule(m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row, 0); } else { return; } } else { STDDictionaryInitial.Clear(); } FormForWaiting forWaiting = new FormForWaiting(); forWaiting.Show(); bool result = SaveDictionaryToClassify(STDDBAddress); if (result) { forWaiting.Close(); } else { forWaiting.Close(); MessageBox.Show("Save failed!", "Tip"); } } } } m_Attributes.Close(); m_STDRuleslist.Close(); m_SubMidWindow.m_STDEditor.Close(); m_SubMidWindow.m_ComparativeLibrary.Close(); m_SubMidWindow.Close(); ButtonStatusClose(); if (this.Text.Split(' ').Count() != 0) { this.Text = this.Text.Split(' ')[0]; } } private void rbOpen_Click(object sender, EventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "(*.db)|*.db"; openFileDialog.RestoreDirectory = true; openFileDialog.InitialDirectory = Application.StartupPath + "\\Config\\SysData\\"; openFileDialog.FilterIndex = 1; if (openFileDialog.ShowDialog() == DialogResult.OK) { try { STDDBAddress = openFileDialog.FileName; InitForms(STDDBAddress); this.Text = this.Text.Split(' ')[0] + " " + STDDBAddress; IsModified = false; } catch { MessageBox.Show("The selected standard library is formatted incorrectly, please open the correct standard library!", "Tip"); } } } void ButtonStatusOpen() { rbOpen.Enabled = false; rbClose.Enabled = true; //rbRecover.Enabled = true; rbBackup.Enabled = true; rbSave.Enabled = true; rbNew.Enabled = false; ribbon_ZeroRules.Enabled = true; ribbon_ESDMaxRules.Enabled = true; ribbon_UserConstants.Enabled = true; ribbon_GroupNameMaintenance.Enabled = true; } void ButtonStatusClose() { rbOpen.Enabled = true; rbClose.Enabled = false; //rbRecover.Enabled = false; rbBackup.Enabled = false; rbSave.Enabled = false; rbNew.Enabled = true; ribbon_ZeroRules.Enabled = false; ribbon_ESDMaxRules.Enabled = false; ribbon_UserConstants.Enabled = false; ribbon_GroupNameMaintenance.Enabled = false; } void InitForms(string DBAddress) { STDDictionary.Clear(); ButtonStatusOpen(); bool ret = LoadClassifyToDictionary(DBAddress, ref STDDictionary); STDDictionaryInitial = Clone(STDDictionary) as Dictionary; if (!ret) { return; } m_STDRuleslist = new STDRuleslist(this); m_Attributes = new Attributes(this); m_SubMidWindow = new SubMidWindow(this); m_DockWindow = new OTSDockWindow(this); m_DockWindow.CreateMainWindow(); if (m_SubMidWindow.m_STDEditor.m_sc != null) { m_SubMidWindow.m_STDEditor.m_sc.CloseDB(); } m_SubMidWindow.m_STDEditor.m_sc = new SqlLiteClass(DBAddress); LoadConstants(DBAddress); AddSTDGroupsToAttribute(); m_SubMidWindow.m_STDEditor.textbox_STDEditor.Text = ""; if (m_STDRuleslist.Grid_Minerals.RowsCount > 1) { m_STDRuleslist.button_UpOrder.Enabled = false; if (m_STDRuleslist.Grid_Minerals.RowsCount == 2) //就一条时向下按钮置灰 { m_STDRuleslist.button_DownOrder.Enabled = false; } ChangeSTDEditorAndGrid_Attributes(int.Parse(m_STDRuleslist.Grid_Minerals[1, 0].Tag.ToString())); Position pos = new Position(1, 0); m_STDRuleslist.Grid_Minerals[1, 0].Grid.Select(); m_STDRuleslist.Grid_Minerals.Selection.Focus(pos, true); } } bool EqualsBetweenDictionary(Dictionary STDDictionaryInitial, Dictionary STDDictionary) { if(STDDictionaryInitial.Count!= STDDictionary.Count) { return false; } foreach(var key in STDDictionaryInitial.Keys) { if (STDDictionary.Keys.Contains(key)) { if(!STDDictionaryInitial[key].Equals(STDDictionary[key])) { return false; } } else { return false; } } return true; } private void Form_ConstantsEditor2_FormClosing(object sender, FormClosingEventArgs e) { if(Isoldversion) { return; } if (m_STDRuleslist.Text != "") { if (!EqualsBetweenDictionary(STDDictionaryInitial, STDDictionary)|| IsModified) { DialogResult dr = MessageBox.Show("Whether to save the current modification", "Tip", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (dr == DialogResult.Yes) { if (m_STDRuleslist.Grid_Minerals.RowsCount > 1) { if ((m_STDRuleslist.Grid_Minerals[m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row, 0].Value.ToString().Replace(" ", "").Trim() != "") && CheckAttributes() && Checktextbox_STDEditor()) { SaveDataOfSelRule(m_STDRuleslist.Grid_Minerals.Selection.ActivePosition.Row, 0); } else { e.Cancel = true; return; } } else { STDDictionaryInitial.Clear(); } FormForWaiting forWaiting = new FormForWaiting(); forWaiting.Show(); bool result = SaveDictionaryToClassify(STDDBAddress); if (result) { forWaiting.Close(); } else { forWaiting.Close(); MessageBox.Show("Save failed!", "Tip"); } } else { foreach (KeyValuePair kv in STDDictionary) { if (!GroupIdDictionaryFromId.Keys.Contains(int.Parse(kv.Value.GroupId))) { MessageBox.Show("There is non-existent grouping informations in the classification, please adjust!"); e.Cancel = true; return; } } } } } } private void rbNew_Click(object sender, EventArgs e) { SaveFileDialog saveFile = new SaveFileDialog(); saveFile.Title = table["message23"].ToString(); saveFile.Filter = table["message36"].ToString(); saveFile.OverwritePrompt = true; //是否覆盖当前文件 saveFile.RestoreDirectory = true; //还原上次目录 if (saveFile.ShowDialog() == DialogResult.OK) { try { System.Data.SQLite.SQLiteConnection.CreateFile(saveFile.FileName); System.Data.SQLite.SQLiteConnection m_OtsDatabaseConnection = new System.Data.SQLite.SQLiteConnection("data source='" + saveFile.FileName + "'"); m_OtsDatabaseConnection.Open(); System.Data.SQLite.SQLiteCommand OtsDatabaseCommand = m_OtsDatabaseConnection.CreateCommand(); OtsDatabaseCommand.CommandText = "CREATE TABLE ClassifySTD (STDId INTEGER,StrName TEXT, Color TEXT,KeyElementList TEXT,SubElementList TEXT,UsingImgPropertyList TEXT,UsingOtherPropertyList TEXT,Expression TEXT,Hardness TEXT,Density TEXT,Electrical_conductivity TEXT,BSE INTEGER,Formula TEXT,Element TEXT,IfElementAnalysis BOOLEAN,ListNum INT,GroupId INT)"; OtsDatabaseCommand.ExecuteNonQuery(); OtsDatabaseCommand.CommandText = "CREATE TABLE Constants (value TEXT)"; OtsDatabaseCommand.ExecuteNonQuery(); OtsDatabaseCommand.CommandText = "CREATE TABLE MaxEDSRules (MaxEDSTime INT,UsingElementList TEXT, UsingImgPropertyList TEXT,UsingOtherPropertyList TEXT,Expression TEXT)"; OtsDatabaseCommand.ExecuteNonQuery(); OtsDatabaseCommand.CommandText = "CREATE TABLE STDGroups (id INTEGER,name TEXT, color TEXT,iorder INTEGER)"; OtsDatabaseCommand.ExecuteNonQuery(); OtsDatabaseCommand.CommandText = "CREATE TABLE STDMinerals (id INTEGER,SPEC BLOB)"; OtsDatabaseCommand.ExecuteNonQuery(); OtsDatabaseCommand.CommandText = "CREATE TABLE ZeroElementRules (ZeroElement TEXT,UsingElementList TEXT, UsingImgPropertyList TEXT,UsingOtherPropertyList TEXT,Expression TEXT)"; OtsDatabaseCommand.ExecuteNonQuery(); System.Data.Common.DbTransaction trans = m_OtsDatabaseConnection.BeginTransaction(); trans.Commit(); } catch(Exception ex) { MessageBox.Show(ex.ToString()); return; } STDDBAddress = saveFile.FileName; InitForms(STDDBAddress); this.Text = this.Text.Split(' ')[0] + " " + STDDBAddress; IsModified = false; } else { return; } } } }