📄 formmain.cs
字号:
private void templatereasonsetting_Click(object sender, System.EventArgs e)
{
if(dlgTemplateReasonSetting.ShowDialog()==DialogResult.OK)
{
}
}
private void templateReason_Click(object sender, System.EventArgs e)
{
TemplateReason();
}
//模板推理的方法
public void TemplateReason()
{
int idData;
bool suc;
DataGridCell myDataGridCell = examdg.CurrentCell;
BindingManagerBase bm = BindingContext[examdg.DataSource, examdg.DataMember];
for(int i=0;i<bm.Count;i++)
{
if(!examdg.IsSelected(i))
continue;
examdg.CurrentCell = new DataGridCell(i,1);
DataRowView drv = (DataRowView) bm.Current;
idData=Convert.ToInt16(drv["序号"]);
ShowMessage("对样品 "+ Convert.ToString(idData)+" 进行判断:\r\n");
suc=TemplateReasonSingleRow(idData);
if(!suc)
{
ShowMessage("\t模板库不能完全匹配此样品!\r\n");
}
}
}//end function
private bool TemplateReasonSingleRow(int idData)
{
bool ma=false;
//for(int bittoignore=0;bittoignore<=Convert.ToInt16(dlgTemplateReasonSetting.bittoignore.Text);bittoignore++)
//for(int bittoignore=Convert.ToInt16(dlgTemplateReasonSetting.bittoignore.Text); bittoignore<=Convert.ToInt16(dlgTemplateReasonSetting.bittoignore.Text);bittoignore++)
int bittoignore=Convert.ToInt16(dlgTemplateReasonSetting.bittoignore.Text);
{
if(false)
{
ShowMessage("\t忽略参数基因后"+Convert.ToString(bittoignore)+"位进行推理......\r\n");
}
ma=TemplateReasonSingleRow(idData,bittoignore);
if(ma)
return true;
}//end for
return false;
}
private bool TemplateReasonSingleRow(int idData,int bitstoignore)
{
bool ma=false;
int idTemp=0;
Hashtable scores= new Hashtable();//用来存放实际得分
Hashtable scoresIdeal= new Hashtable();//用来存放理想得分
double score=0;
double scoreIdeal=0;
foreach(DataRow dr in TemplateSet.TemplateTable.Rows)
{
idTemp=Convert.ToInt16(dr["序号"]);
score=0;
scoreIdeal=0;
if(TemplateReasonSingleRow(idTemp,idData,bitstoignore,ref score,ref scoreIdeal))
{
ma=true;
}
scores.Add(idTemp,score);
scoresIdeal.Add(idTemp,scoreIdeal);
}
//以下计算
if(scores.Count<=0)
return false;
IDictionaryEnumerator myEnumerator = scores.GetEnumerator();
int idMaxTemp=0;
if( myEnumerator.MoveNext() )
idMaxTemp=((int)(myEnumerator.Key));
myEnumerator.Reset();
while ( myEnumerator.MoveNext() )
{
idTemp=((int)(myEnumerator.Key));
score=Convert.ToDouble(myEnumerator.Value);
if(score>Convert.ToDouble(scores[(object)idMaxTemp]))
idMaxTemp=idTemp;
}
double matchrate=Convert.ToDouble(scores[(object)idMaxTemp]);
matchrate/=Convert.ToDouble(scoresIdeal[(object)idMaxTemp]);
matchrate*=100.0f;
DataRow[] drMaxTemplate=TemplateSet.TemplateTable.Select("序号="+Convert.ToString(idMaxTemp));
string s="";
s+="\ttemplate:"+Convert.ToString(idMaxTemp)+",\tscore:"+Convert.ToString(matchrate)+"%\r\n";
s+=ma ? "\t完全匹配," : "\t部分匹配,";
s+="\t结论为:\t"+Convert.ToString(drMaxTemplate[0]["结论"]);
s+="\r\n";
ShowMessage(s);
AddTemplateReasonResult(idData,Convert.ToString(drMaxTemplate[0]["结论"]),idMaxTemp,matchrate);
//UpdateTemplateResultinExamSet(idData,Convert.ToString(drMaxTemplate[0]["结论"]),idMaxTemp,matchrate);
return ma;
}//end function
void UpdateTemplateResultinExamSet(int idData,string resulttype,int idTemp,double matchrate)
{
string select="[序号]=" + Convert.ToString(idData);
DataRow[] dr1=ResultTableG.Select(select);
DataRow temp;
if(dr1.Length<=0)
{
temp=ResultTableG.NewRow();
ResultTableG.Rows.Add(temp);
temp["序号"]=idData;
}
else
temp=dr1[0];
temp[myExamDataSet.NAME_TEMPLATERESUTL_FIELDNAME]=resulttype;
temp[myExamDataSet.NAME_TEMPLATERNUM_FIELDNAME]=idTemp;
temp[myExamDataSet.NAME_TEMPLATER_MATCHDEGREE_FIELDNAME]=matchrate;
}
void AddTemplateReasonResult(int idData,string resulttype,int idTemp,double matchrate)
{
//生成空的结果表
//将空的结果表加入到结果数据集中
if(TemplateResultTable==null)
TemplateResultTable=ExamSet.CreateTemplateResultTable();
DataRow rowResult=TemplateResultTable.NewRow();
rowResult["序号"]=idData;
rowResult["结论"]=resulttype;
rowResult["匹配模板"]=idTemp;
rowResult["匹配度"]=matchrate;
DataRow[] drData=ExamTable.Select("序号="+idData);
if(drData.Length<=0)
{
ShowMessage("can not find the corresponding source recorde in examdatatable!");
return;
}
rowResult["井号"]=drData[0]["井号"];
rowResult["井段"]=drData[0]["井段"];
TemplateResultTable.Rows.Add(rowResult);
}
private bool TemplateReasonSingleRow(int idTemp,int idData,int bitstoignore,ref double score,ref double scoreIdeal)
{
string filterTemp="序号="+idTemp;
string filterData="序号="+idData;
DataRow[] drTemplate=TemplateSet.TemplateTable.Select(filterTemp);
DataRow[] drTemplateMax=TemplateSet.TemplateMaxTable.Select(filterTemp);
DataRow[] drTemplateMin=TemplateSet.TemplateMinTable.Select(filterTemp);
DataRow[] drData=ExamTable.Select(filterData);
if(drTemplate.Length<=0)
return false;
if(drData.Length<=0)
return false;
if(drTemplateMin.Length<=0)
return false;
if(drTemplateMax.Length<=0)
return false;
bool b=MatchRow(drData[0],drTemplate[0],drTemplateMin[0],drTemplateMax[0],bitstoignore,ref score,ref scoreIdeal);
return b;
}//enf fuction
#endregion
private void Application_Idle(object sender, EventArgs e)
{
}
private void autocreatetemplatemdb_Click(object sender, System.EventArgs e)
{
if(SampleTable==null)
{
ShowMessage("请先打开标准样本数据库");
return;
}
string mbDb="";//模板数据库
OpenFileDialog openFileDialog1 = new OpenFileDialog();
//openFileDialog1.InitialDirectory = "c:\\" ;
openFileDialog1.Filter = "access文件(*.mdb)|*.mdb|All files (*.*)|*.*" ;
openFileDialog1.FilterIndex = 2 ;
openFileDialog1.RestoreDirectory = true ;
openFileDialog1.Title="打开模板数据库";
if(openFileDialog1.ShowDialog() == DialogResult.OK)
mbDb= openFileDialog1.FileName;
else
return ;
string s="";
s+=@";Provider=Microsoft.Jet.OLEDB.4.0";
s+=@";Prompt=Complete";
s+=@";Password=""""";
s+=@";User ID=Admin";
s+=@";Mode=ReadWrite|Share Deny None";
s+=@";Extended Properties=""""";
s+=@";Jet OLEDB:System database=""""";
s+=@";Jet OLEDB:Registry Path=""""";
s+=@";Jet OLEDB:Database Password=""""";
s+=@";Jet OLEDB:Engine Type=5";
s+=@";Jet OLEDB:Database Locking Mode=1";
s+=@";Jet OLEDB:Global Partial Bulk Ops=2";
s+=@";Jet OLEDB:Global Bulk Transactions=1";
s+=@";Jet OLEDB:New Database Password=""""";
s+=@";Jet OLEDB:Create System Database=False";
s+=@";Jet OLEDB:Encrypt Database=False";
s+=@";Jet OLEDB:Don't Copy Locale on Compact=False";
s+=@";Jet OLEDB:Compact Without Replica Repair=False";
s+=@";Jet OLEDB:SFP=False";
s+=";Data Source="+mbDb;
OleDbConnection cnnexpert=new OleDbConnection(s);
cnnexpert.Open();
OleDbCommand cmm=new OleDbCommand();
cmm.Connection=cnnexpert;
string sqlcmd="";
//************get template database scheme
//
DataTable schemaTable = cnnexpert.GetOleDbSchemaTable(OleDbSchemaGuid.Columns,
new object[] {null, null, myTemplateDataSet.NAME_TEMPLATETABLENAME, null});
//*********************
foreach(DataColumn col in this.SampleTable.Columns)
{
//此字段是否为判断参数字段
if(!myCriDataSet.IsCriField(col))
continue;
//此字段是否已存在于模板库中
DataRow[] dr=schemaTable.Select("COLUMN_NAME like "+"\'"+col.ColumnName+"\'");
if(dr.Length >=3)
continue;
//在模板库的三个表中加入相应的字段
try
{
sqlcmd= "ALTER TABLE ";
sqlcmd+= myTemplateDataSet.NAME_TEMPLATETABLENAME;
sqlcmd+= " ADD [" +col.ColumnName+ "] ";
sqlcmd+= "TEXT(50)";
cmm.CommandText=sqlcmd;
cmm.ExecuteNonQuery();
}
catch(Exception ex)
{
ShowMessage(ex.Message);
}
try
{
sqlcmd= "ALTER TABLE ";
sqlcmd+= myTemplateDataSet.NAME_TEMPLATE_MIN_TABLENAME;
sqlcmd+= " ADD [" +col.ColumnName+ "] ";
sqlcmd+= "FLOAT";
cmm.CommandText=sqlcmd;
cmm.ExecuteNonQuery();
}
catch(Exception ex)
{
ShowMessage(ex.Message);
}
try
{
sqlcmd= "ALTER TABLE ";
sqlcmd+= myTemplateDataSet.NAME_TEMPLATE_MAX_TABLENAME;
sqlcmd+= " ADD [" +col.ColumnName+ "] ";
sqlcmd+= "FLOAT";
cmm.CommandText=sqlcmd;
cmm.ExecuteNonQuery();
}
catch(Exception ex)
{
ShowMessage(ex.Message);
}
}
cnnexpert.Close();
}
private void menuSETTING_Click(object sender, System.EventArgs e)
{
//use fileopendialog to get the setting file;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
//openFileDialog1.InitialDirectory = "c:\\" ;
openFileDialog1.Filter = "XML文件(*.xml)|*.xml|All files (*.*)|*.*" ;
openFileDialog1.FilterIndex =1 ;
openFileDialog1.RestoreDirectory = true ;
openFileDialog1.Title ="打开用户定义设置文件";
if(openFileDialog1.ShowDialog() != DialogResult.OK)
return ;
SettingFile=openFileDialog1.FileName;
XMLConfig();
}
void XMLConfig()
{
try
{
FileStream astream=File.Open(SettingFile,System.IO.FileMode.Open);
SettingXmlDoc = new XmlDocument();
SettingXmlDoc.Load(astream);
TablenameSetting();
FieldnameSetting();
myDataSet.FieldSetting=FieldDomainSetting();
tableFuzzyKbfResultType =FuzzyKbfResultTypeSetting();
strKbfSuperFile =FuzzyKbfSuperSetting();
astream.Close();
DatabaseAutoOpen();
}
catch(Exception ex)
{
ShowMessage("设置文件操作错误!",ex.ToString());
}
}
private void auotTablenameAndFieldsSetting()
{
DirectoryInfo dirinfo=Directory.GetParent(Application.ExecutablePath).Parent;
DirectoryInfo[] dirs = dirinfo.GetDirectories("database");
FileInfo[] files;
if(dirs.Length<=0)
{
ShowMessage("找不到database 目录!");
return;
}
files=dirs[0].GetFiles("EXPERTSETTING.xml");
if(files.Length<=0)
{
MessageBox.Show("在指定的路径下没有找到设置文件:"+files[0].FullName);
return;
}
SettingFile=files[0].FullName;
XMLConfig();
}
private void TablenameSetting()
{
XmlElement root=SettingXmlDoc["YQExpert_SETTING"];
root=root["表名定义"];
XmlElement ele;
ele=root["标准样本表"];
if(ele!=null)
myCriDataSet.NAME_SAMPLE_TABLENAME=ele.InnerText;
ele=root["模板串表"];
if(ele!=null)
myTemplateDataSet.NAME_TEMPLATETABLENAME=ele.InnerText;
ele=root["模板下限值表"];
if(ele!=null)
myTemplateDataSet.NAME_TEMPLATE_MIN_TABLENAME=ele.InnerText;
ele=root["模板上限值表"];
if(ele!=null)
myTemplateDataSet.NAME_TEMPLATE_MAX_TABLENAME=ele.InnerText;
ele=root["参数统计表"];
if(ele!=null)
myCriDataSet.NAME_PARAM_TABLENAME=ele.InnerText;
ele=root["待测数据表"];
if(ele!=null)
myExamDataSet.NAME_EXAM_TABLENAME=ele.InnerText;
ele=root["推理结论表"];
if(ele!=null)
myExamDataSet.NAME_RESULT_TABLENAME=ele.InnerText;
ele=root["直接打印的表"];
if(ele!=null)
myDataSet.NAME_ALL_DIRECTPRINT_TABLENAME=ele.InnerText;
return;
}
private void FuzzySetting()
{
XmlElement root=SettingXmlDoc["YQExpert_SETTING"];
root=root["模糊推理设置"];
XmlElement ele;
ele=root["分类结果知识库"];
return;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -