📄 minedabseview.cpp
字号:
// mineDabseView.cpp : implementation of the CMineDabseView class
//
#include "stdafx.h"
#include "mineDabse.h"
#include "mineDabseDoc.h"
#include "mineDabseView.h"
extern CMineDabseApp theApp;
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMineDabseView
IMPLEMENT_DYNCREATE(CMineDabseView, CView)
BEGIN_MESSAGE_MAP(CMineDabseView, CView)
//{{AFX_MSG_MAP(CMineDabseView)
ON_COMMAND(ID_MENU_NETINPUT, OnMenuNetinput)
ON_COMMAND(ID_GAS_DETECT, OnGasDetect)
ON_COMMAND(ID_MAINBLOWER, OnMainblower)
ON_COMMAND(ID_LOCALBLOWER, OnLocalblower)
ON_COMMAND(ID_JueJinFengLiang, OnJueJinFengLiang)
ON_COMMAND(ID_HuiCaiFengLiang, OnHuiCaiFengLiang)
ON_COMMAND(ID_AUTODETECT, OnAutodetect)
ON_COMMAND(ID_MENUITEMJIESUAN, OnMenuitemjiesuan)
ON_COMMAND(ID_KNOWLEGEBASE, OnKnowlegebase)
ON_BN_CLICKED(IDC_BUTTONPRE, OnButtonpre)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMineDabseView construction/destruction
CMineDabseView::CMineDabseView()
{
// TODO: add construction code here
ruleChain=new RuleChain();
factChain=new CFactChain();
// showResultDlg.m_editShow="";
str_showText="";
}
CMineDabseView::~CMineDabseView()
{
delete ruleChain;
}
BOOL CMineDabseView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMineDabseView drawing
void CMineDabseView::OnDraw(CDC* pDC)
{
CMineDabseDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// pDC->TextOut(0,0,"诊断结果");
//pDC->TextOut(10,10,str_showText);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CMineDabseView printing
BOOL CMineDabseView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMineDabseView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMineDabseView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMineDabseView diagnostics
#ifdef _DEBUG
void CMineDabseView::AssertValid() const
{
CView::AssertValid();
}
void CMineDabseView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CMineDabseDoc* CMineDabseView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMineDabseDoc)));
return (CMineDabseDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMineDabseView message handlers
void CMineDabseView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
;
}
void CMineDabseView::OnMenuNetinput()
{
// TODO: Add your command handler code here
mineWindDlg=new CMineWindDlg();
mineWindDlg->DoModal();
}
void CMineDabseView::OnAutodetect()
{
// TODO: Add your command handler code here
// 读取rule
CString ruleName,rulePre,ruleCon;
// _variant_t vRuleName,vRulePre,vRuleCon;
try
{
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM rule",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
while(!m_pRecordset->adoEOF)
{
ruleName=(char*)(_bstr_t)m_pRecordset->GetCollect("ruleName");
rulePre=(char*)(_bstr_t)m_pRecordset->GetCollect("pre");
ruleCon=(char*)(_bstr_t)m_pRecordset->GetCollect("con");
ruleChain->appendRule(ruleName,rulePre,ruleCon,false);
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
}
catch(_com_error e)///捕捉异常
{
CString str=e.ErrorMessage();
str=str+"读取数据库失败!";
AfxMessageBox(str);///显示错误信息
}
//生成事实
//int i=0;
try
{
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset->Open("SELECT * FROM fact",_variant_t((IDispatch*)theApp.m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);
CString fact;//factName,
while(!m_pRecordset->adoEOF)
{
//factName[i]=(char*)(_bstr_t)m_pRecordset->GetCollect("id");
fact=(char*)(_bstr_t)m_pRecordset->GetCollect("fact");
factChain->appendFact(fact);
showResultDlg.m_editShow+=fact+"\r\n";
// i++;
m_pRecordset->MoveNext();
}
m_pRecordset->Close();
}
catch(_com_error e)///捕捉异常
{
CString str=e.ErrorMessage();
str=str+"读取数据库失败!";
AfxMessageBox(str);///显示错误信息
}
//推理
RuleNode* node=ruleChain->getFirstRule();
while (node!=NULL){
ruleName=node->name;
rulePre=node->premise;
ruleCon=node->conclusion;
if(!findCon(ruleName,rulePre,ruleCon)){
//该规则没有触发,查找下一条规则
node=node->next;
// if(NULL==node)//没有任何规则匹配,结束推理
// break;
}
else{
//findCon在事实列表中查找,有匹配的规则,该规则标志为真,
//删除匹配事实并且把结论加入事实列表中,
// 重新检查,是否有匹配的事实和规则
node=ruleChain->getFirstRule();
}
}//while
////推理完毕,输出事实列表中的结论
//showResultDlg.m_listCtr
CFact* nodeFact=factChain->getHead();
while(nodeFact!=NULL){//只显示推理结论
// showResultDlg.m_editShow+=nodeFact->fact;
//str_showText+="\r\n"+nodeFact->fact;
showResultDlg.m_showResult+=nodeFact->fact+"\r\n";
nodeFact=nodeFact->next;
}
UpdateData(false);
showResultDlg.DoModal();
showResultDlg.m_showResult="";
showResultDlg.m_editShow="";
}
bool CMineDabseView::findCon(CString ruleName,CString rulePre,CString con)
{
CString pre_str[10],pre_str1[10],rulePreTemp;//存放规则前提, pre_str1[10]存放or的前提条件
int i,j,temp_int,findAndFlag,findOrFlag,matchResult;
bool loopEnd=false;
findAndFlag=0;
findOrFlag=0;
j=i=-1;//只能是-1;为了和matchResult=-2相对应
rulePreTemp=rulePre;
findAndFlag=rulePreTemp.Find("and");
findOrFlag=rulePreTemp.Find("or");
if (findOrFlag!=-1)
matchResult=-2;//每次匹配初始化,有or关键字,需要匹配前提or一次
else matchResult=-1;
// if ((findAndFlag>0)||(-1==findOrFlag)){
while (!loopEnd){
findAndFlag=rulePreTemp.Find("and");//分离多个前提,findAndFlag记录and的位置
if (findAndFlag!=-1){
// while(rulePre->GetLength()>0){
i++;
pre_str[i]=rulePreTemp.Left(findAndFlag);
pre_str[i].TrimLeft();
pre_str[i].TrimRight();
// rulePreTemp.TrimLeft();
rulePreTemp.Delete(0,findAndFlag+3);
//}
}
else {
if(-1==findOrFlag){//前提中无论有没有and,都要执行这句
i++;
pre_str[i]=rulePreTemp;
pre_str[i].TrimLeft();
pre_str[i].TrimRight();
loopEnd=true;
}
else{
rulePreTemp.TrimLeft();
rulePreTemp.Delete(0,rulePreTemp.Find("(")+1);
findOrFlag=rulePreTemp.Find("or");
while(!loopEnd){ //提取or的关键字
if(findOrFlag!=-1){
j++;
pre_str1[j]=rulePreTemp.Left(findOrFlag);
pre_str1[j].TrimLeft();
pre_str1[j].TrimRight();
//rulePreTemp.TrimLeft();
rulePreTemp.Delete(0,findOrFlag+2);
findOrFlag=rulePreTemp.Find("or");
}
else{
j++;
pre_str1[j]=rulePreTemp;
pre_str1[j].TrimLeft();
pre_str1[j].TrimRight();
int temp_int=pre_str1[j].Find(")");
pre_str1[j].Delete(temp_int);
loopEnd=true;
}
}
}
}
}// while (!loopEnd)
/*}//if(findAndFlag>0)
else{
}*/
///在事实列表中匹配该规则前提
temp_int=i;
for(;i>=0;i--){
CFact* node=factChain->getHead();
while (node!=NULL){
// CString factName=node->name;
// fact=node->fact;
if(0==node->fact.Compare(pre_str[i])){
matchResult++;//匹配成功
break;
}
else{
//找出下一个事实
node=node->next;
if(NULL==node)//没有匹配的事实
i=-1;//没有匹配规则的事实,匹配结束
}
}//while(node!=NULL)
}//for(;i>=0;i--)
int temp_intJ=j;
for(;j>=0;j--){
CFact* node=factChain->getHead();
while (node!=NULL){
// CString factName=node->name;
// fact=node->fact;
if(0==node->fact.Compare(pre_str1[j])){
matchResult++;//匹配成功
j=-1;//or关键字中有一个匹配,则匹配结束
}
else{
//找出下一个事实
node=node->next;
if(NULL==node)//没有匹配的事实
j=-1;//没有匹配规则的事实,匹配结束
}
}//while(node!=NULL)
}//for(;i>=0;i--)
if(matchResult==temp_int){//相等则表示and匹配成功
//从事实列表中删出匹配成功的事实
for(;temp_int>=0;temp_int--){
//CFact* node=factChain->getHead();
// while (node!=NULL){
// CString factName=*node->name;
//if(0==node->fact.CompareNoCase(pre_str[temp_int])){
factChain->deleteFact(pre_str[temp_int]);
// break;
// }
// else{
//找出下一个事实
// node=node->next;
// if(NULL==node)//没有匹配的事实
// break;
//}
//}//while
}//if(matchResult==temp_int)
for(;temp_intJ>=0;temp_intJ--){
factChain->deleteFact(pre_str1[temp_intJ]);
}
//把结论加入事实列表中
factChain->appendFact(con);
//showResultDlg.m_editShow+=con+"\r\n";//显示推理过程
// str_showText+=con;
// RuleNode *nodep;
// InvalidateRect(NULL);
setRuleFlag(*ruleChain->getFirstRule(),ruleName);
return true;
}
else return false;
}
void CMineDabseView::OnGasDetect()
{
// TODO: Add your command handler code here
}
void CMineDabseView::OnMainblower()
{
// TODO: Add your command handler code here
}
void CMineDabseView::OnLocalblower()
{
// TODO: Add your command handler code here
}
void CMineDabseView::OnJueJinFengLiang()
{
// TODO: Add your command handler code here
}
void CMineDabseView::OnHuiCaiFengLiang()
{
// TODO: Add your command handler code here
}
void CMineDabseView::setRuleFlag(RuleNode &head, CString ruleName)
{
RuleNode *pRule=&head;
while (pRule!=NULL){
if(0==pRule->name.CompareNoCase(ruleName))
{
pRule->flag=true;
break;
}
else
pRule=pRule->next;
}
}
void CMineDabseView::OnMenuitemjiesuan()
{
// TODO: Add your command handler code here
////////////////////////////////////////////////////////////////////////////////
//找出回路
// if (m_intArcNum>0)//弧的个数
inputWeight.DoModal();
}
void CMineDabseView::OnKnowlegebase()
{
// TODO: Add your command handler code here
ruleMaintenance.DoModal();
}
void CMineDabseView::OnButtonpre()
{
// TODO: Add your control notification handler code here
// multiPreDlg.DoModal();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -