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

📄 editdlg.cpp

📁 一个面向对象的产生式推理模型
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// EditDlg.cpp : implementation file
//

#include "stdafx.h"
#include "test.h"
#include "editdlg.h" 
#include "TestDlg.h"

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

/////////////////////////////////////////////////////////////////////////////
// EditDlg dialog


EditDlg::EditDlg(CWnd* pParent /*=NULL*/)
	: CDialog(EditDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(EditDlg)
	m_FMention = _T("");
	m_Abbreviation = _T("");
	m_TMention = _T("");
	m_ExpertName = _T("");
	m_RuleWffs = _T("");
	m_FactValue = -1;
	m_GetVersa = FALSE;
	m_NeedAsk = FALSE;
	m_mtCanUnknow = FALSE;
	m_QMention = _T("");
	m_IsMultiGoal = FALSE;
	//}}AFX_DATA_INIT
	m_RulePre = NULL;
	m_ExpertGoal = NULL;
	m_pParent = pParent;
}


void EditDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(EditDlg)
	DDX_Control(pDX, IDC_LIST_GOAL, m_ListGoal);
	DDX_Control(pDX, IDC_COMBO_RULE_MT, m_RuleMt);
	DDX_Control(pDX, IDC_LIST_RULE, m_ListRule);
	DDX_Control(pDX, IDC_LIST_MT, m_ListMt);
	DDX_Text(pDX, IDC_EDIT_F_MENTION, m_FMention);
	DDX_Text(pDX, IDC_EDIT_ABBREVIATION, m_Abbreviation);
	DDX_Text(pDX, IDC_EDIT_T_MENTION, m_TMention);
	DDX_Text(pDX, IDC_EXPERT_NAME, m_ExpertName);
	DDX_Text(pDX, IDC_EDIT_RULE_PRE, m_RuleWffs);
	DDX_Radio(pDX, IDC_RADIO_T, m_FactValue);
	DDX_Check(pDX, IDC_CHECK_GET_VERSA, m_GetVersa);
	DDX_Check(pDX, IDC_CHECK_NEED_ASK, m_NeedAsk);
	DDX_Check(pDX, IDC_CHECK_CAN_UNKNOW, m_mtCanUnknow);
	DDX_Text(pDX, IDC_EDIT_Q_MENTION, m_QMention);
	DDX_Check(pDX, IDC_CHECK_MULTI_GOAL, m_IsMultiGoal);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(EditDlg, CDialog)
	//{{AFX_MSG_MAP(EditDlg)
	ON_BN_CLICKED(ID_OK, OnDlgOk)
	ON_BN_CLICKED(ID_CANCEL, OnDlgCancel)
	ON_BN_CLICKED(IDC_BUTTON_DELETE_LAST_MT, OnButtonDeleteLastMt)
	ON_BN_CLICKED(IDC_BUTTON_MT_ADD, OnButtonMtAdd)
	ON_BN_CLICKED(IDC_BUTTON_MT_BACK, OnButtonMtBack)
	ON_BN_CLICKED(IDC_BUTTON_RULE_ADD, OnButtonRuleAdd)
	ON_BN_CLICKED(IDC_BUTTON_RULE_DELETE, OnButtonRuleDelete)
	ON_BN_CLICKED(IDC_CHECK_GET_VERSA, OnCheckGetVersa)
	ON_NOTIFY(NM_DBLCLK, IDC_LIST_MT, OnDblclkListMt)
	ON_BN_CLICKED(IDC_BUTTON_MT_OVERWRITE, OnButtonMtOverwrite)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_MT, OnItemchangedListMt)
	ON_EN_CHANGE(IDC_EDIT_ABBREVIATION, OnChangeEditAbbreviation)
	ON_EN_CHANGE(IDC_EDIT_F_MENTION, OnChangeEditFMention)
	ON_EN_CHANGE(IDC_EDIT_T_MENTION, OnChangeEditTMention)
	ON_CBN_DROPDOWN(IDC_COMBO_RULE_MT, OnDropdownComboRuleMt)
	ON_BN_CLICKED(IDC_BUTTON_RULE_REFRESH, OnButtonRuleRefresh)
	ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_RULE, OnItemchangedListRule)
	ON_CBN_CLOSEUP(IDC_COMBO_RULE_MT, OnCloseupComboRuleMt)
	ON_BN_CLICKED(IDC_BUTTON_GOAL_ADD, OnButtonGoalAdd)
	ON_LBN_DBLCLK(IDC_LIST_GOAL, OnDblclkListGoal)
	ON_BN_CLICKED(IDC_CHECK_NEED_ASK, OnCheckNeedAsk)
	ON_BN_CLICKED(IDC_CHECK_CAN_UNKNOW, OnCheckCanUnknow)
	ON_BN_CLICKED(IDC_BUTTON_MT_REFRESH, OnButtonMtRefresh)
	ON_WM_VSCROLL()
	ON_BN_CLICKED(IDC_CHECK_MULTI_GOAL, OnCheckMultiGoal)
	ON_BN_CLICKED(IDC_SAVE_TO_FILE, OnSaveToFile)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// EditDlg message handlers
BOOL EditDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	CString title = "   ";
	GetWindowText(title);
	title+=filename;
	SetWindowText(title);

	InitDlgData();

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void EditDlg::OnCancel() 
{
}

void EditDlg::OnOK() 
{
}

void EditDlg::OnDlgOk() 
{
	UpdateData(true);
	myExpert->SetESName(m_ExpertName);
	//
	myExpert->SetIsMultiGoal(m_IsMultiGoal);
	myExpert->StoreToFile(filename);
	DestroyWindow();
}

void EditDlg::OnDlgCancel() 
{
	DestroyWindow();
}


void EditDlg::InitDlgData()
{
	//myExpert->LoadFromFile(filename);
	m_ExpertName = myExpert->GetESName();
	m_ExpertGoal = myExpert->GetExpertGoalObList();
	m_SelectedMtId = 0;
	m_SelectedRuleIndex = 0;
	InitListMt();
	InitListRule();
	InitListGoal();
	m_IsMultiGoal = myExpert->GetIsMultiGoal();
	m_NeedAsk = 1;
	m_mtCanUnknow = 1;
	//?
	UpdateData(false);

	GetDlgItem(IDC_BUTTON_MT_ADD)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_MT_BACK)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_MT_OVERWRITE)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_RULE_ADD)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_RULE_DELETE)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_DELETE_LAST_MT)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_GOAL_ADD)->EnableWindow(false);
	GetDlgItem(IDC_SCROLLBAR_RULE_MOVE)->EnableWindow(false);

	CheckRadioButton(IDC_RADIO_T,IDC_RADIO_U,IDC_RADIO_U);
}

void EditDlg::OnButtonMtAdd() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	int value = GetCheckedRadioButton(IDC_RADIO_T,IDC_RADIO_U);
	AiAssert T(m_TMention,m_FMention);
	int id = myExpert->GetNumAssert() -1;
	myExpert->SetAbbreviationMention(id,m_Abbreviation);
	myExpert->SetAssertQuestionMention(id,m_QMention);
	switch(value)
	{
	case IDC_RADIO_T:
		myExpert->SetFactTrue(id);
		break;
	case IDC_RADIO_F:
		myExpert->SetFactFalse(id);
		break;
	case IDC_RADIO_U:
		break;
	default:
		ASSERT(0);
	}
	if (m_NeedAsk)
		myExpert->SetMtNeedAsk(id);
	else 
		myExpert->SetMtNeedNotAsk(id);
	if (m_mtCanUnknow)
		myExpert->SetMtCanUnknow(id);
	else
		myExpert->SetMtCannotUnknow(id);
	AddListMtItem(id,id);
	//reset
	CheckRadioButton(IDC_RADIO_T,IDC_RADIO_U,IDC_RADIO_U);
	m_Abbreviation = "";
	m_TMention = "";
	m_FMention = "";
	m_QMention = "";
	m_NeedAsk = true;
	m_mtCanUnknow = true;
	UpdateData(false);
	GetDlgItem(IDC_BUTTON_MT_ADD)->EnableWindow(false);
}
void EditDlg::InitListMt()
{

	CStringArray fields;
	fields.SetSize(7,-1);
	fields.SetAt(0,"编号");
	fields.SetAt(1,"缩写");
	fields.SetAt(2,"说明(T)");
	fields.SetAt(3,"说明(F)");
	fields.SetAt(4,"值");
	fields.SetAt(5,"询问");
	fields.SetAt(6,"¤");

	LV_COLUMN icolum;

	icolum.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;
	icolum.fmt=LVCFMT_LEFT;
	
	icolum.iSubItem=0;
	icolum.pszText=(LPSTR)LPCTSTR(fields[0]);
	icolum.cx=m_ListMt.GetStringWidth(icolum.pszText)+13;
	m_ListMt.InsertColumn(0,&icolum);

	icolum.iSubItem=1;
	icolum.pszText=(LPSTR)LPCTSTR(fields[1]);
	icolum.cx=m_ListMt.GetStringWidth(icolum.pszText)+20;
	m_ListMt.InsertColumn(1,&icolum);

	icolum.iSubItem=2;
	icolum.pszText=(LPSTR)LPCTSTR(fields[2]);
	icolum.cx=m_ListMt.GetStringWidth(icolum.pszText)+100;
	m_ListMt.InsertColumn(2,&icolum);

	icolum.iSubItem=3;
	icolum.pszText=(LPSTR)LPCTSTR(fields[3]);
	icolum.cx=m_ListMt.GetStringWidth(icolum.pszText)+100;
	m_ListMt.InsertColumn(3,&icolum);

	icolum.iSubItem=4;
	icolum.pszText=(LPSTR)LPCTSTR(fields[4]);
	icolum.cx=m_ListMt.GetStringWidth(icolum.pszText)+15;
	m_ListMt.InsertColumn(4,&icolum);
	
	icolum.iSubItem=5;
	icolum.pszText=(LPSTR)LPCTSTR(fields[5]);
	icolum.cx=m_ListMt.GetStringWidth(icolum.pszText)+20;
	m_ListMt.InsertColumn(5,&icolum);

	icolum.iSubItem=6;
	icolum.pszText=(LPSTR)LPCTSTR(fields[6]);
	icolum.cx=m_ListMt.GetStringWidth(icolum.pszText)+20;
	m_ListMt.InsertColumn(6,&icolum);
    
    //
	LV_ITEM lv_Item;
	lv_Item.mask=LVIF_TEXT;
	int iNum=0;
	for(iNum=0;iNum<myExpert->GetNumAssert();iNum++)
	{
		AddListMtItem(iNum,iNum);
	}
}

void EditDlg::InitListRule()
{	
	CStringArray fields;
	fields.SetSize(2,-1);
	fields.SetAt(0,"序号");
	fields.SetAt(1,"规则");
	//fields.SetAt(2,"可信度");

	LV_COLUMN icolum;
	icolum.mask=LVCF_FMT|LVCF_SUBITEM|LVCF_TEXT|LVCF_WIDTH;
	icolum.fmt=LVCFMT_LEFT;
	
	icolum.iSubItem=0;
	icolum.pszText=(LPSTR)LPCTSTR(fields[0]);
	icolum.cx=m_ListMt.GetStringWidth(icolum.pszText)+14;
	m_ListRule.InsertColumn(0,&icolum);
	
	icolum.iSubItem=1;
	icolum.pszText=(LPSTR)LPCTSTR(fields[1]);
	icolum.cx=m_ListRule.GetStringWidth(icolum.pszText)+170;
	m_ListRule.InsertColumn(1,&icolum);
	
	LV_ITEM lv_Item;
	lv_Item.mask=LVIF_TEXT;
	int iNum=0;
	CString str;
	for(iNum=0;iNum<myExpert->GetNumRule();iNum++)
	{
		str = myExpert->GetRuleString(iNum);
		AddListRuleItem(iNum,str);
	}
}

void EditDlg::AddListMtItem(int pos,int id)
{
	LV_ITEM lv_Item;
	lv_Item.mask=LVIF_TEXT;

	lv_Item.iItem=pos;
	lv_Item.iSubItem=0;
	char temp[4];
	itoa(id,temp,10);
	CString baseString = temp;
	lv_Item.pszText=(LPSTR)LPCTSTR(baseString);
		int index=m_ListMt.InsertItem(&lv_Item);


	lv_Item.iItem=pos;
	lv_Item.iSubItem=1;
	CString firstString = myExpert->GetAbbreviationMention(id);
	lv_Item.pszText=(LPSTR)LPCTSTR(firstString);
		m_ListMt.SetItem(&lv_Item);

	lv_Item.iItem=index;
	lv_Item.iSubItem=2;
	CString secondString = myExpert->GetAssertMention(id,NeedNotVersa);
	lv_Item.pszText=(LPSTR)LPCTSTR(secondString);
		m_ListMt.SetItem(&lv_Item);

	lv_Item.iItem=index;
	lv_Item.iSubItem=3;
	CString thirdString = myExpert->GetAssertMention(id,NeedVersa);
	lv_Item.pszText=(LPSTR)LPCTSTR(thirdString);
		 m_ListMt.SetItem(&lv_Item);

	lv_Item.iItem=index;
	lv_Item.iSubItem=4;
	CString forthString;
	int value = myExpert->GetIdFact(id);
	if (value == FactTrue)
		forthString = "√";
	else if (value == FactFalse)
		forthString = "×";
	else {
		ASSERT(value == FactUnknow);
		forthString = "⊙";
	}
	lv_Item.pszText=(LPSTR)LPCTSTR(forthString);
	   m_ListMt.SetItem(&lv_Item);

	lv_Item.iItem=index;
	lv_Item.iSubItem=5;
	CString fifthString;
	value = myExpert->GetMtNeedNotAsk(id);
	if (value)
		fifthString = "⊙";
	else 
		fifthString = " ";
	lv_Item.pszText=(LPSTR)LPCTSTR(fifthString);
	   m_ListMt.SetItem(&lv_Item);

	lv_Item.iItem=index;
	lv_Item.iSubItem=6;
	CString sixthString;
	value = myExpert->GetMtCanUnknow(id);
	if (value)
		sixthString = " ";
	else
		sixthString = "¤";
	lv_Item.pszText=(LPSTR)LPCTSTR(sixthString);
	   m_ListMt.SetItem(&lv_Item);
	
}

void EditDlg::OnButtonMtOverwrite() 
{
	// TODO: Add your control notification handler code here
	UpdateData(true);
	int id = m_SelectedMtId; 
	myExpert->SetMention(id,m_TMention,m_FMention);
	myExpert->SetAbbreviationMention(id,m_Abbreviation);
	myExpert->SetAssertQuestionMention(id,m_QMention);
	int value = GetCheckedRadioButton(IDC_RADIO_T,IDC_RADIO_U);
	switch(value)
	{
	case IDC_RADIO_T:
		myExpert->SetFactTrue(id);
		break;
	case IDC_RADIO_F:
		myExpert->SetFactFalse(id);
		break;
	case IDC_RADIO_U:
		myExpert->SetFactUnknow(id);
		break;
	default:
		ASSERT(0);
	}
	if (m_NeedAsk)
		myExpert->SetMtNeedAsk(id);
	else
		myExpert->SetMtNeedNotAsk(id);
	if (m_mtCanUnknow)
		myExpert->SetMtCanUnknow(id);
	else
		myExpert->SetMtCannotUnknow(id);
	RewriteListMtItem(id,id);
	GetDlgItem(IDC_BUTTON_MT_BACK)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_MT_OVERWRITE)->EnableWindow(false);
}
void EditDlg::OnItemchangedListMt(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
	m_SelectedMtId = pNMListView->iItem;
	GetDlgItem(IDC_BUTTON_MT_BACK)->EnableWindow(true);

	*pResult = 0;
}
void EditDlg::OnButtonMtBack() 
{
	// TODO: Add your control notification handler code here
	int id = m_SelectedMtId;
	m_Abbreviation = myExpert->GetAbbreviationMention(id);
	m_TMention = myExpert->GetAssertMention(id,NeedNotVersa);
	m_FMention = myExpert->GetAssertMention(id,NeedVersa);
	m_QMention = myExpert->GetAssertQuestionMention(id);
	int value = myExpert->GetIdFact(id);
	if (myExpert->GetMtNeedNotAsk(id))
		m_NeedAsk = 0;
	else
		m_NeedAsk = 1;
	if (myExpert->GetMtCanUnknow(id))
		m_mtCanUnknow = 1;
	else
		m_mtCanUnknow = 0;
	UpdateData(false);
	switch(value)
	{
	case FactTrue:
		CheckRadioButton(IDC_RADIO_T,IDC_RADIO_U,IDC_RADIO_T);
		break;
	case FactFalse:
		CheckRadioButton(IDC_RADIO_T,IDC_RADIO_U,IDC_RADIO_F);
		break;
	case FactUnknow:
		CheckRadioButton(IDC_RADIO_T,IDC_RADIO_U,IDC_RADIO_U);
		break;
	default:
		ASSERT(0);
	}
	GetDlgItem(IDC_BUTTON_MT_BACK)->EnableWindow(false);
	GetDlgItem(IDC_BUTTON_MT_OVERWRITE)->EnableWindow(true);
}

void EditDlg::CheckButtonMtAddReady()
{
	UpdateData(true);
	if (!m_Abbreviation.IsEmpty() 
		&& !m_TMention.IsEmpty()
		&& !m_FMention.IsEmpty()
		&& !m_QMention.IsEmpty()
		)
		GetDlgItem(IDC_BUTTON_MT_ADD)->EnableWindow(true);
	else
		GetDlgItem(IDC_BUTTON_MT_ADD)->EnableWindow(false);
}

void EditDlg::OnChangeEditAbbreviation() 
{
	CheckButtonMtAddReady();
}

void EditDlg::OnChangeEditFMention() 
{
	CheckButtonMtAddReady();
}

⌨️ 快捷键说明

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