/// <summary> /// Monta o modelo. /// </summary> /// <param name="idProjeto"></param> /// <param name="idItemProjeto"></param> /// <param name="idProjetoModelo"></param> /// <param name="medidaExata"></param> /// <returns></returns> public Glass.Api.Projeto.IModelo MontaModelo(int idProjeto, int idItemProjeto, int idProjetoModelo, bool medidaExata) { // Recupera item projeto. Glass.Data.Model.ItemProjeto itemProj = Glass.Data.DAL.ItemProjetoDAO.Instance.GetElement((uint)idItemProjeto); // Recupera modelo. Glass.Data.Model.ProjetoModelo projetoModelo = Glass.Data.DAL.ProjetoModeloDAO.Instance.GetElementByPrimaryKey(idProjetoModelo); // Obtém as medidas. var medidas = ObterMedidasAreaInstalacao(itemProj, projetoModelo, medidaExata); var pecas = ObterPecas(itemProj); return(new Modelo(medidas, pecas, itemProj.ImagemUrl.Replace("../../", ServiceLocator.Current.GetInstance <Api.IConfiguracao>().EnderecoServicoImagem))); }
/// <summary> /// Obter medidas da área de instalação. /// </summary> /// <param name="itemProj"></param> /// <param name="projetoModelo"></param> /// <param name="medidaExata"></param> /// <returns></returns> private List <Glass.Api.Projeto.IEditableItemValued> ObterMedidasAreaInstalacao(Glass.Data.Model.ItemProjeto itemProj, Glass.Data.Model.ProjetoModelo projetoModelo, bool medidaExata) { List <MedidaProjetoModelo> medidasProjModel = Glass.Data.DAL.MedidaProjetoModeloDAO.Instance.GetByProjetoModelo(projetoModelo.IdProjetoModelo, false); var retorno = new List <Glass.Api.Projeto.IEditableItemValued>(); foreach (var mpm in medidasProjModel) { bool enable = true; int valorMedida = Glass.Data.DAL.MedidaItemProjetoDAO.Instance.GetByItemProjeto(itemProj.IdItemProjeto, mpm.IdMedidaProjeto, false); if (valorMedida == 0) { valorMedida = Glass.Data.DAL.MedidaProjetoDAO.Instance.ObtemValorPadrao(mpm.IdMedidaProjeto); } if (medidaExata) { enable = Glass.Data.DAL.MedidaProjetoDAO.Instance.ExibirCalcMedidaExata(mpm.IdMedidaProjeto); } // pegar o valor if (Data.DAL.ProjetoModeloDAO.Instance.IsBoxPadrao(projetoModelo.IdProjetoModelo) && mpm.IdMedidaProjeto == 3) { retorno.Add(new EditableItemValued <MedidaProjetoModelo>(mpm, itemProj.EspessuraVidro == 6 ? ProjetoConfig.AlturaPadraoProjetoBox6mm : ProjetoConfig.AlturaPadraoProjetoBoxAcima6mm, false)); } else { retorno.Add(new EditableItemValued <MedidaProjetoModelo>(mpm, valorMedida, enable)); } } if (projetoModelo.EixoPuxador) { int valorDistEixoPux = 0; if (projetoModelo.TipoMedidasInst > 0) { valorDistEixoPux = Glass.Data.DAL.MedidaItemProjetoDAO.Instance.GetByItemProjeto(itemProj.IdItemProjeto, 17, false); } if (valorDistEixoPux == 0) { valorDistEixoPux = 50; } retorno.Add(new EditableItemValued <MedidaProjetoModelo>( new MedidaProjetoModelo() { DescrMedida = "Dist. Eixo Puxador", IdMedidaProjeto = 17 }, valorDistEixoPux, true)); } return(retorno); }
/// <summary> /// Calcula Medidas das peças do projeto e depois insere os cálculos na tabela /// </summary> private List <PecaProjetoModelo> CalcMedidasPecas(GDA.GDASession sessao, Glass.Data.Model.ItemProjeto itemProj, Glass.Data.Model.ProjetoModelo projModelo, bool calcPecaAuto, bool pcp, bool medidasAlteradas, out string retornoValidacao, Glass.Api.Implementacao.Projeto.CalcModelo calcModelo) { retornoValidacao = string.Empty; // Carrega a lista de medidas do modelo de projeto List <MedidaProjetoModelo> lstMedProjMod = Glass.Data.DAL.MedidaProjetoModeloDAO.Instance.GetByProjetoModelo(sessao, itemProj.IdProjetoModelo, true); var isBoxPadrao = Glass.Data.DAL.ProjetoModeloDAO.Instance.IsBoxPadrao(sessao, projModelo.IdProjetoModelo); var qtd = 0; var largVao = 0; var altVao = 0; var largPorta = 0; var largVaoEsq = 0; var largVaoDir = 0; Glass.Data.Helper.UtilsProjeto.BuscarMedidasVaoItemProjeto(sessao, itemProj, isBoxPadrao, out qtd, out largVao, out altVao, out largPorta, out largVaoEsq, out largVaoDir); // Recupera a quantidade da tabela. var medidaQtd = new MedidaItemProjeto(); // TextBox txtQtd = ((TextBox)tbPecaModelo.FindControl("txtQtdMedInst")); medidaQtd.IdItemProjeto = itemProj.IdItemProjeto; medidaQtd.IdMedidaProjeto = 1; EditableItemValued <MedidaProjetoModelo> mQtd = calcModelo.Medidas.Where(f => f.Item.DescrMedida == "Qtd").FirstOrDefault(); medidaQtd.Valor = mQtd == null && mQtd.Value < 1 ? 1 : mQtd.Value; itemProj.Qtde = medidaQtd.Valor; // Busca as peças deste item, que serão utilizadas nas expressões List <PecaItemProjeto> lstPecaItemProj = Glass.Data.DAL.PecaItemProjetoDAO.Instance.GetByItemProjeto(sessao, itemProj.IdItemProjeto, projModelo.IdProjetoModelo); var pecas = Glass.Data.DAL.PecaProjetoModeloDAO.Instance.GetByModelo(sessao, itemProj.IdProjetoModelo); // Busca as peças com as medidas e produtos inseridos na tela List <PecaProjetoModelo> lstPecas = calcModelo.Pecas.Select(f => new PecaProjetoModelo { IdPecaProjMod = f.Item.IdPecaProjMod, IdPecaItemProj = f.Item.IdPecaItemProj, IdProd = f.Item.IdProd.Value, Qtde = f.Item.Qtde, Obs = f.Item.Obs, Largura = f.Item.Largura, Altura = f.Item.Altura, CalculoAltura = pecas.Where(p => p.IdPecaProjMod == f.Item.IdPecaProjMod).FirstOrDefault().CalculoAltura, CalculoLargura = pecas.Where(p => p.IdPecaProjMod == f.Item.IdPecaProjMod).FirstOrDefault().CalculoLargura, CalculoQtde = pecas.Where(p => p.IdPecaProjMod == f.Item.IdPecaProjMod).FirstOrDefault().CalculoQtde }).ToList(); //= Glass.Data.Helper.UtilsProjeto.GetPecasFromTable(tbPecaModelo, pcp); // Chamado 15837: Se alguma das peças tiver beneficiamento, não permite que as mesmas sejam trocadas // Chamado 16671: Se for projeto de box, uma das peças pode ser diferente da outra (fixo e instalação) para resolver foi criada // a validação lstPecaItemProj[i].IdProd != lstPecas[i].IdProd //for (int i = 0; i < lstPecaItemProj.Count; i++) // foreach (var pecaNova in lstPecas) // if (lstPecaItemProj[i].IdProd != pecaNova.IdProd && lstPecaItemProj[i].IdProd != lstPecas[i].IdProd) // { // var mater = Glass.Data.DAL.MaterialItemProjetoDAO.Instance.GetMaterialByPeca(lstPecaItemProj[i].IdPecaItemProj); // if (mater != null && mater.Beneficiamentos.Count > 0) // throw new Exception("Não é permitido trocar peças que possuam beneficiamentos associados."); // } // Se for para calcular as medidas das peças de vidro automaticamente if ((calcPecaAuto || medidasAlteradas) && !itemProj.MedidaExata) { // Busca as peças do modelo cadastrados por padrão para inserir qtd,altura e largura padrão, // e não as medidas inseridas na tela, isto e feito para manter as peças de vidro selecionadas List <PecaProjetoModelo> lstPecasModelo = Glass.Data.DAL.PecaProjetoModeloDAO.Instance.GetByModelo(sessao, itemProj.IdProjetoModelo); for (int i = 0; i < lstPecas.Count; i++) { // Verifica se há fórmula para calcular a qtd de peças int qtdPeca = !System.String.IsNullOrEmpty(lstPecasModelo[i].CalculoQtde) ? (int)Glass.Data.Helper.UtilsProjeto.CalcExpressao(sessao, lstPecasModelo[i].CalculoQtde, itemProj, null, lstMedProjMod) : lstPecasModelo[i].Qtde; lstPecas[i].Qtde = qtdPeca; lstPecas[i].Altura = Configuracoes.ProjetoConfig.SelecionarEspessuraAoCalcularProjeto ? (itemProj.EspessuraVidro == 6 ? lstPecasModelo[i].Altura06MM : itemProj.EspessuraVidro == 8 ? lstPecasModelo[i].Altura08MM : itemProj.EspessuraVidro == 10 ? lstPecasModelo[i].Altura10MM : itemProj.EspessuraVidro == 12 ? lstPecasModelo[i].Altura12MM : lstPecasModelo[i].Altura) : lstPecasModelo[i].Altura; lstPecas[i].Largura = Configuracoes.ProjetoConfig.SelecionarEspessuraAoCalcularProjeto ? (itemProj.EspessuraVidro == 6 ? lstPecasModelo[i].Largura06MM : itemProj.EspessuraVidro == 8 ? lstPecasModelo[i].Largura08MM : itemProj.EspessuraVidro == 10 ? lstPecasModelo[i].Largura10MM : itemProj.EspessuraVidro == 12 ? lstPecasModelo[i].Largura12MM : lstPecasModelo[i].Largura) : lstPecasModelo[i].Largura; lstPecas[i].IdAplicacao = lstPecasModelo[i].IdAplicacao; lstPecas[i].IdProcesso = lstPecasModelo[i].IdProcesso; lstPecas[i].Redondo = lstPecasModelo[i].Redondo; } // Se o projeto possuir espessura de tubo, a altura da última (e penúltima) peça deve ser subtraída deste valor if (projModelo.TipoMedidasInst == 8 || projModelo.TipoMedidasInst == 9) { int espTuboMedInst = Glass.Data.DAL.MedidaItemProjetoDAO.Instance.GetByItemProjeto(sessao, itemProj.IdItemProjeto, 16, false); // Se este modelo tiver apenas 3 peças, sempre a última peça deverá ter sua altura subtraída da espessura do tubo, // mas se este modelo tiver 4 peças, as duas últimas peças terão suas alturas subtraídas da espessura do tubo if (lstPecas.Count >= 3) { lstPecas[2].Altura -= espTuboMedInst; } if (lstPecas.Count == 4) { lstPecas[3].Altura -= espTuboMedInst; } } // Pega a quantidade de peças int qtdPecas = 0; foreach (PecaProjetoModelo ppm in lstPecas) { // Verifica se há fórmula para calcular a qtd de peças int qtdPeca = !System.String.IsNullOrEmpty(ppm.CalculoQtde) ? (int)Glass.Data.Helper.UtilsProjeto.CalcExpressao(sessao, ppm.CalculoQtde, itemProj, null, lstMedProjMod) : ppm.Qtde; qtdPecas += qtdPeca; } // Pega a quantidade de peças por projeto, considerando apenas um projeto qtdPecas /= qtd; #region Calcula as medidas das peças float larguraPecas = 0; foreach (PecaProjetoModelo ppm in lstPecas) { #region Cálculo de Box Padrão if (isBoxPadrao) { int qtdPecasBP = (largVaoDir > 0 ? qtdPecas / 2 : qtdPecas); float largVaoOriginal = largVao > 0 ? largVao : ppm.CalculoLargura.Contains("LARGVAODIR") ? largVaoDir : largVaoEsq; float largVaoCalc = largVaoOriginal; largVaoCalc = largVaoCalc % 100 == 0 ? largVaoCalc : largVaoCalc % 100 <= 20 ? (largVaoCalc - (largVaoCalc % 100) + 50) : largVaoCalc % 100 > 70 ? (largVaoCalc - (largVaoCalc % 100) + 150) : (largVaoCalc - (largVaoCalc % 100) + 100); if (ppm.Largura == 50 && (largVaoCalc / qtdPecasBP) % 50 == 25) { ppm.Largura = 25; } else if (ppm.Largura == 0 && (largVaoCalc / qtdPecasBP) % 50 == 25) { ppm.Largura = -25; } else if (largVaoOriginal % 100 != 0) { ppm.Largura = 0; } if (qtdPecas % 2 == 1) { if (ppm.Largura > 0) { ppm.Largura -= (int)((largVaoCalc / qtdPecasBP) % 50); } else { ppm.Largura -= (int)((largVaoCalc / qtdPecasBP) % 50); } } ppm.Altura += (int)Glass.Data.Helper.UtilsProjeto.CalcExpressao(sessao, ppm.CalculoAltura, itemProj, lstPecaItemProj, lstMedProjMod); ppm.Largura += (int)(largVaoCalc / qtdPecasBP); // Modificação necessária para que caso seja box de 4 peças e o total do vão dividido por 4 // não dê múltiplo de 50, o ajuste abaixo corrija esta situação if (qtdPecas == 4) { if (ppm.Largura % 50 > 0) { if (ppm.Tipo == 1) { ppm.Largura -= ppm.Largura % 50; } else { ppm.Largura += 50 - (ppm.Largura % 50); } } } larguraPecas += ppm.Largura * (ppm.Qtde / qtd); continue; } #endregion ppm.Altura += (int)System.Math.Ceiling(Glass.Data.Helper.UtilsProjeto.CalcExpressao(sessao, ppm.CalculoAltura, itemProj, lstPecaItemProj, lstMedProjMod)); ppm.Largura += (int)System.Math.Ceiling(Glass.Data.Helper.UtilsProjeto.CalcExpressao(sessao, ppm.CalculoLargura, itemProj, lstPecaItemProj, lstMedProjMod)); } #region Ajuste box padrão 3 ou 4 peças // Ajusta a largura da porta de um box padrão de 3 peças de 50 em 50 até ficar maior que a largura do vão if (isBoxPadrao && qtdPecas == 3) { if ((larguraPecas - largVao) < 30) { while ((larguraPecas - largVao) < 30) { foreach (PecaProjetoModelo ppm in lstPecas) { if (ppm.Tipo == 1) { ppm.Largura += 50; larguraPecas += 50; } } } } else if ((larguraPecas - largVao) > 75) { while ((larguraPecas - largVao) > 75) { foreach (PecaProjetoModelo ppm in lstPecas) { if (ppm.Tipo == 1) { ppm.Largura -= 50; larguraPecas -= 50; } } } } } // Calcula o transpasse de box 4 folhas int transpasse = 0; if (larguraPecas != largVao && qtdPecas == 4) { transpasse = 50; } // Modifica a largura do vão a fim de calcular corretamente o transpasse das peças móveis if (largVao % 50 != 0) { largVao = largVao + (50 - (largVao % 50)); } else { largVao += 50; } // Ajusta a largura da porta de um box padrão de 4 peças de 50 em 50 até ficar maior que a largura do vão if (isBoxPadrao && qtdPecas == 4 && ((larguraPecas - transpasse) < largVao || larguraPecas == largVao)) { do { foreach (PecaProjetoModelo ppm in lstPecas) { if (ppm.Tipo == 1) { ppm.Largura += 50; larguraPecas += 50; } } }while (larguraPecas + transpasse <= largVao); } // Se a largura do fixo for maior que a da porta, inverte, para que o transpasse fique na porta if (isBoxPadrao && qtdPecas == 4 && lstPecas.Count == 2) { if ((lstPecas[0].Tipo == 1 && lstPecas[0].Largura < lstPecas[1].Largura) || (lstPecas[1].Tipo == 1 && lstPecas[0].Largura > lstPecas[1].Largura)) { int larguraTemp = lstPecas[0].Largura; lstPecas[0].Largura = lstPecas[1].Largura; lstPecas[1].Largura = larguraTemp; } } #endregion #endregion } else if (itemProj.MedidaExata) { // Busca as peças do modelo cadastrados para atribuir processo e aplicação List <PecaProjetoModelo> lstPecasModelo = Glass.Data.DAL.PecaProjetoModeloDAO.Instance.GetByModelo(sessao, itemProj.IdProjetoModelo); for (int i = 0; i < lstPecas.Count; i++) { lstPecas[i].IdAplicacao = lstPecasModelo[i].IdAplicacao; lstPecas[i].IdProcesso = lstPecasModelo[i].IdProcesso; } } Glass.Data.Helper.UtilsProjeto.ValidarMedidasPecas(sessao, itemProj, lstPecas, lstMedProjMod, out retornoValidacao); return(lstPecas); }