private void RetornaRespostaParaUsuario(RespostasUsuario respostasUsuario, List <Regra> regrasPossiveis) { if (regrasPossiveis.Count == 0) { var noContent = new CustomMsgBox("FIM", "Não existe resultado possível!", MessageBoxType.E_OK); noContent.ShowDialog(); return; } else if (regrasPossiveis.Count == 1) { string msg = ""; foreach (var objetivo in regrasPossiveis.First().condicaoObjetivos) { msg += $"{objetivo.Fato.Nome} {Util.ParseOperador(objetivo.Operador)} {objetivo.Resposta.Descricao}\n"; } var msgBox = new CustomMsgBox("Resultado", msg, MessageBoxType.E_OK); msgBox.ShowDialog(); return; } else { string msg = ""; foreach (var regra in regrasPossiveis) { foreach (var objetivo in regra.condicaoObjetivos) { msg += $"{objetivo.Fato.Nome} {Util.ParseOperador(objetivo.Operador)} {objetivo.Resposta.Descricao}\n"; } } var msgBox = new CustomMsgBox("Possibilidades", msg, MessageBoxType.E_OK); msgBox.ShowDialog(); return; } }
private void button3_Click(object sender, EventArgs e) { var regras = ObterRegrasComObjetivosAlvo().ToList(); if (regras.Count() == 0) { var noContent = new CustomMsgBox("Falha na inicialização", "É necessário selecionar pelomenos um objetivo antes de inicializar.", MessageBoxType.E_OK); noContent.ShowDialog(); return; } var fatos = GetDistinctFatos(regras); if (fatos.Count == 0) { return; } var respostasUsuario = new RespostasUsuario(); var regrasPossiveis = new List <Regra>(); bool boolPrimeiroLoop = true; foreach (var fato in fatos) { using (var perguntas = new Perguntas(fato)) { perguntas.ShowDialog(); var resposta = GetResposta(fato, perguntas); if (boolPrimeiroLoop) { boolPrimeiroLoop = false; foreach (var regra in regras) { if (!regra.Condicao.Any(c => c.Fato.Nome == fato.Nome)) //na regra, nao importa o fato atual, somente outro { regrasPossiveis.Add(regra); } else { foreach (var condicao in regra.Condicao) { if (fato.Nome == condicao.Fato.Nome) { if (VerificaRespostaBaseadoNoTipo(fato.Tipo, condicao.Operador, condicao.Resposta, resposta)) { regrasPossiveis.Add(regra); if (regra.Condicao.Count == 1 && regrasPossiveis.Count == 1 && regras.Count == 1) { RetornaRespostaParaUsuario(respostasUsuario, regrasPossiveis); return; } } } } } } if (regrasPossiveis.Count == 0) { RetornaRespostaParaUsuario(respostasUsuario, regrasPossiveis); return; } } else { var copy = new List <Regra>(); copy.AddRange(regrasPossiveis); foreach (var regra in copy) { var possuiConectorOu = regra.Condicao.Any(c => c.Conectivo == Conectivo.OU); if (regra.Condicao.Any(c => c.Fato.Nome == fato.Nome)) { foreach (var condicao in regra.Condicao) { if (fato.Nome == condicao.Fato.Nome) { if (!VerificaRespostaBaseadoNoTipo(fato.Tipo, condicao.Operador, condicao.Resposta, resposta)) { regrasPossiveis.Remove(regra); } } } } } } respostasUsuario.AdicionaResposta(fato, resposta); } } RetornaRespostaParaUsuario(respostasUsuario, regrasPossiveis); }