⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testjdlg.cpp

📁 一个面向对象的产生式推理模型
💻 CPP
字号:
// TestJDlg.cpp : implementation file
//

#include "stdafx.h"
#include "test.h"
#include "TestJDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// TestJDlg dialog


TestJDlg::TestJDlg(CWnd* pParent /*=NULL*/)
	: CDialog(TestJDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(TestJDlg)
	m_question = _T("");
	m_conclusion = _T("");
	//}}AFX_DATA_INIT
	m_existConclusion = 0;
}


void TestJDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(TestJDlg)
	DDX_Control(pDX, IDC_TREE, m_tree);
	DDX_Text(pDX, IDC_QUESTION, m_question);
	DDX_Text(pDX, IDC_CONCLUSION, m_conclusion);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(TestJDlg, CDialog)
	//{{AFX_MSG_MAP(TestJDlg)
	ON_BN_CLICKED(IDC_BUTTON_NEXT, OnButtonNext)
	ON_BN_CLICKED(IDC_BUTTON_END, OnButtonEnd)
	ON_BN_CLICKED(IDC_BUTTON_BEGIN, OnButtonBegin)
	ON_BN_CLICKED(IDC_BUTTON_OK, OnButtonOk)
	ON_BN_CLICKED(IDC_BUTTON_CANCEL, OnButtonCancel)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// TestJDlg message handlers



BOOL TestJDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	if (m_existConclusion){
		GetDlgItem(IDC_TREE)->ShowWindow(SW_SHOW);
		GetDlgItem(IDC_QUESTION)->ShowWindow(SW_HIDE);
	}
	else{
		GetDlgItem(IDC_TREE)->ShowWindow(SW_HIDE);
		GetDlgItem(IDC_QUESTION)->ShowWindow(SW_SHOW);
	}
	GetDlgItem(IDC_BUTTON_BEGIN)->EnableWindow(true);		
	GetDlgItem(IDC_BUTTON_NEXT)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_END)->EnableWindow(false);
	GetDlgItem(IDC_RADIO_YES)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_RADIO_UNKNOW)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_RADIO_NO)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_CONCLUSION)->ShowWindow(SW_HIDE);
	//
	CString abb = myExpert.GetAbbreviationMention(0);
	if (abb == "HAVE")
		m_question = "判断集料碱活性,请选择开始搜索";
	else if (abb == "Q0")
		m_question = "工程破坏原因诊断,请选择开始搜索";
	UpdateData(false);
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}
void TestJDlg::OnButtonBegin() 
{
	if (myExpert.LoadFromFile(filename) == false)
		return ;
	GetDlgItem(IDC_TREE)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_QUESTION)->ShowWindow(SW_SHOW);
	GetDlgItem(IDC_CONCLUSION)->ShowWindow(SW_HIDE);
	
	myExpert.InitForSearch();
	int s;
	myExpert.SearchSingle();
	s = myExpert.CheckResultState();
	if (s == ResultSingleCertitude
		|| s == ResultMultiAllOk){
		m_existConclusion = true;
		MessageBeep(-1);
		ShowAnswerTree();
		return;
	}
	//
	s = myExpert.SearchBackward();
	if (s == ResultSingleCertitude 
		|| s == ResultMultiAllOk){
		m_existConclusion = true;
		MessageBeep(-1);
		ShowAnswerTree();
		return;
	}
	if (!myExpert.GetIsMultiGoal() &&
		myExpert.CheckResultStateIsAnyoneTrue()){
		m_existConclusion = true;
		MessageBeep(-1);
		ShowAnswerTree();
		return; 
	}
	AiMt unknowMt;
	myExpert.SearchBackwardWithAsk(unknowMt);
	SetNextQuestion(unknowMt.GetId());
	GetDlgItem(IDC_BUTTON_BEGIN)->EnableWindow(false);		
	GetDlgItem(IDC_BUTTON_NEXT)->EnableWindow(true);
	GetDlgItem(IDC_BUTTON_END)->EnableWindow(true);
}

void TestJDlg::OnButtonNext() 
{
	// TODO: Add your control notification handler code here
	int w = GetCheckedRadioButton(IDC_RADIO_YES,IDC_RADIO_NO);
	switch(w)
	{
	case IDC_RADIO_YES:
		myExpert.SetAskFactTrue(m_presentMtId);
		break;
	case IDC_RADIO_UNKNOW:
		break;
	case IDC_RADIO_NO:
		myExpert.SetAskFactFalse(m_presentMtId);
		break;
	}
	myExpert.SearchSingle();//进行及时的推理
	if (!myExpert.GetIsMultiGoal() &&
		myExpert.CheckResultStateIsAnyoneTrue()){
		m_existConclusion = true;
		MessageBeep(-1);
		ShowAnswerTree();
		return;
	}
	//myExpert.SearchBackward(); 
	AiMt unknowMt;
	if (myExpert.SearchBackwardWithAsk(unknowMt)){
		SetNextQuestion(unknowMt.GetId());
		return;
	}
	else{
		int s = myExpert.SearchBackward();
		if (s == ResultSingleIncertitude 
			|| s == ResultMultiAllNotOk){
			m_question = "无法推出目标结论";
			UpdateData(FALSE);
			GetDlgItem(IDC_BUTTON_BEGIN)->EnableWindow(true);		
			GetDlgItem(IDC_BUTTON_NEXT)->EnableWindow(false);
			GetDlgItem(IDC_BUTTON_END)->EnableWindow(false);
			GetDlgItem(IDC_RADIO_YES)->ShowWindow(SW_HIDE);
			GetDlgItem(IDC_RADIO_UNKNOW)->ShowWindow(SW_HIDE);
			GetDlgItem(IDC_RADIO_NO)->ShowWindow(SW_HIDE);
			return;
		}		
		m_existConclusion = true;
		MessageBeep(-1);
		ShowAnswerTree();
	}
}

void TestJDlg::OnButtonEnd() 
{
	// TODO: Add your control notification handler code here
	GetDlgItem(IDC_BUTTON_BEGIN)->EnableWindow(true);		
	GetDlgItem(IDC_BUTTON_NEXT)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_END)->EnableWindow(false);
	GetDlgItem(IDC_RADIO_YES)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_RADIO_UNKNOW)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_RADIO_NO)->ShowWindow(SW_HIDE);
	int s = myExpert.SearchBackward();
		if (s == ResultSingleIncertitude 
			|| s == ResultMultiAllNotOk){
			m_question = "无法推出目标结论";
			UpdateData(FALSE);
			return;
		}		
	m_existConclusion = true;
	MessageBeep(-1);
	ShowAnswerTree();
	return;
}

int TestJDlg::SetNextQuestion(int id)
{
	m_presentMtId = id;
	m_question = myExpert.GetAssertQuestionMention(id);
	UpdateData(false);
	GetDlgItem(IDC_RADIO_YES)->ShowWindow(SW_SHOW);
	if (myExpert.GetMtCanUnknow(id))
		GetDlgItem(IDC_RADIO_UNKNOW)->ShowWindow(SW_SHOW);
	else 
		GetDlgItem(IDC_RADIO_UNKNOW)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_RADIO_NO)->ShowWindow(SW_SHOW);
	CheckRadioButton(IDC_RADIO_YES,IDC_RADIO_NO,IDC_RADIO_YES);
	return true;
}

int TestJDlg::ShowAnswerTree()
{
	GetDlgItem(IDC_TREE)->ShowWindow(SW_SHOW);
	GetDlgItem(IDC_QUESTION)->ShowWindow(SW_HIDE);
	
	CImageList *pImageList;
	pImageList=new CImageList();
	pImageList->Create(15, 15, TRUE, 6, 4);
	CBitmap bitmap;
	for(int nID=IDB_BITMAP1;nID<=IDB_BITMAP6;nID++)
	{
	 bitmap.LoadBitmap(nID);
	 pImageList->Add(&bitmap,(COLORREF)0xFFFFFF);
	 bitmap.DeleteObject();
	}
	m_tree.SetImageList(pImageList,TVSIL_NORMAL);
	myExpert.SetAnswerTreeCtrl(&m_tree);
	myExpert.ShowTreeCtrlAnswer();
	//
	GetDlgItem(IDC_BUTTON_BEGIN)->EnableWindow(true);		
	GetDlgItem(IDC_BUTTON_NEXT)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_END)->EnableWindow(false);
	GetDlgItem(IDC_RADIO_YES)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_RADIO_UNKNOW)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_RADIO_NO)->ShowWindow(SW_HIDE);
	GetDlgItem(IDC_CONCLUSION)->ShowWindow(SW_SHOW);
	m_conclusion = "";
	CString abb = myExpert.GetAbbreviationMention(0);
	if (abb == "HAVE")
	{	
		if (myExpert.CheckAssertTorF(1))
			m_conclusion = "集料具有ASR碱活性,需进行AAR抑制";
		else if (myExpert.CheckAssertTorF(2))  
			m_conclusion = "集料具有ACR碱活性,需进行AAR抑制";
		else if (myExpert.CheckAssertTorF(3))
			m_conclusion = "集料具有ASR和ACR碱活性,需进行AAR抑制";
		else if (!myExpert.CheckAssertTorF(0))
			m_conclusion = "集料不具有碱活性,可直接用于混凝土工程";
		else if (myExpert.CheckAssertTorF(0))
			m_conclusion = "集料具有碱活性,需进行AAR抑制";
	}
	else if (abb == "Q0")
	{
		if (myExpert.CheckAssertTorF(0))
			m_conclusion = "不是遭受ASR或ACR破坏,请研究其它问题";
		else if (myExpert.CheckAssertTorF(1))  
			m_conclusion = "混凝土遭受ASR破坏";
		else if (myExpert.CheckAssertTorF(2))
			m_conclusion = "混凝土遭受ACR破坏";
	}
	UpdateData(false);
	return true;
}

void TestJDlg::OnButtonOk() 
{
	CDialog::OnOK();
	
}

void TestJDlg::OnButtonCancel() 
{
	CDialog::OnCancel();	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -