OliviaAddInPro/Services/LimpiezaServ.cs

257 lines
8.6 KiB
C#

using ArcGIS.Core.Data;
using ArcGIS.Core.Geometry;
using ArcGIS.Core.Internal.CIM;
using OliviaAddInPro.Helper;
using OliviaAddInPro.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace OliviaAddInPro.Services
{
public class LimpiezaServ : EjecServ
{
private Limpieza limp;
public LimpiezaServ(Limpieza _limp)
{
limp = _limp;
}
/**
* Acciones para comenzar ejecución
* Modo 0, sectorizar
* Modo 1, planificar
*/
public bool Sectoriza()
{
string nombFileAmbs = string.Empty;
//Prepara consulta
if (!PreparaConsulta(out nombFileAmbs))
{
ErrStr = "No se ha seleccionado una consulta válida" + limp.ConsultaAmbs;
return false;
}
//Prepara nombre
string fechaHora = string.Empty;
string nombreDatExport = string.Empty;
//se consigue el tiempo en este instante para añadirlo a los nombres de los archivos de salida (shapefiles)
fechaHora = DateTime.Now.ToString("yyyyMMdd_Hmmss");
//Pone nombre al shape en función de los ámbitos, el tratamiento, y los polígonos + timestamp
nombreDatExport = prefNameExport + "T" + limp.TipoTto.ToString("00") + nombFileAmbs + DameStrPoligs() + "_" + fechaHora + extShp;
//comienza ejecucion
com = (TratamientoComun)limp;
if(!ComienzaEjec(ModosEjec.Sectoriza))
{
return false;
}
return true;
}
public bool PreparaConsulta(out string nombFileAmbs)
{
nombFileAmbs = string.Empty;
limp.ConsultaAmbs = DameAmbsConsulta(out nombFileAmbs);
if (string.IsNullOrEmpty(limp.ConsultaAmbs))
{
return false;
}
return true;
}
public bool Planifica()
{
//se asegura que tiene todo para planif
if(!CompruebaPlanif())
{
ErrStr = "En la capa de ámbitos seleccionada no se encuentran columnas de SECTOR y/o SECUENCIA, necesarias para planificar";
return false;
}
//Prepara consulta
string nombFileAmbs = string.Empty;
//Prepara consulta
if (!PreparaConsulta(out nombFileAmbs))
{
ErrStr = "No se ha seleccionado una consulta válida" + limp.ConsultaAmbs;
return false;
}
return true;
}
public string DameAmbsConsulta(out string ambs_file)
{
string consulta, orstr;
consulta = string.Empty;
ambs_file = "";
orstr = null;
for (int i = 0; i < limp.AmbitosSel.Length; i++)
{
if (limp.AmbitosSel[i])
{
consulta = consulta + orstr + "(" + LimpiezaDef.filtro_str[i] + ")";
ambs_file = ambs_file + i.ToString("00");
if (orstr == null)
orstr = " OR ";
}
}
ambs_file = "_A" + ambs_file;
if (consulta == "()")
consulta = "";
return consulta;
}
/**
* Comprueba lo necesario para ver si hay campos para la planificación
*/
public bool CompruebaPlanif()
{
string path = null;
//si ha importado no hace falta que compruebe, seguro que las tiene
if (OliviaGlob.IsConfig2())
return true;
if (ComprCamposPlanif(limp.CapaElems))
return true;
if (!HelperGlobal.ponMsg("En la capa de ámbitos seleccionada no se encuentran columnas de SECTOR y/o SECUENCIA, " +
"necesarias para planificar. ¿Desea utilizar la sectorización de otra capa?",MessageBoxImage.Question,"OLIVIA",
MessageBoxButton.YesNo))
return false;
//saca diálogo para elegir capa
path = HelperGdb.OpenFileDialog(HelperGdb.TiposOpenFileDlg.OpenFtrClassLine | HelperGdb.TiposOpenFileDlg.OpenFtrClassPoint);
if (string.IsNullOrEmpty(path))
{
return false;
}
//comprueba que en la nueva capa haya columnas de planif
if (!ComprCamposPlanif(path))
{
return false;
}
//almacena la info de secto auxiliar
limp.CapaAuxPlanif = path;
return true;
}
public bool ComprCamposPlanif(string pathCapa)
{
int NCAMPS = 2;
string[] camps;
int i;
camps = new string[NCAMPS];
camps[0] = LimpiezaDef.Campos.consulta_sector;
camps[1] = LimpiezaDef.Campos.consulta_secuen;
if (string.IsNullOrEmpty(pathCapa))
return false;
for (i = 0; i < NCAMPS; i++)
{
if (!HelperGdb.CheckField(pathCapa, camps[i]))
{
break;
}
}
if (i < NCAMPS)
return false;
return true;
}
/*
* Lee la capa que se ha seleccionzdo de limpieza y se comprueba que los campos que se han editado corresponden con la capa
* (es decir, se puede leer la capa con los campos configurados)
*/
public bool CompruebaCamposLimp(string pathCapa)
{
int NCAMPS = 5;
string[] camps;
int i;
camps = new string[NCAMPS];
camps[0] = LimpiezaDef.Campos.consulta_entidad;
camps[1] = LimpiezaDef.Campos.consulta_mecan;
camps[2] = LimpiezaDef.Campos.consulta_observ;
camps[3] = LimpiezaDef.Campos.consulta_anch_tip;
camps[4] = LimpiezaDef.Campos.consulta_tipolo;
if (string.IsNullOrEmpty(pathCapa))
return false;
for (i = 0; i < NCAMPS; i++)
{
if (!HelperGdb.CheckField(pathCapa, camps[i]))
{
break;
}
}
if (i < NCAMPS)
return false;
return true;
}
/**
* Lee la gdb y devuelve el array de ámbitos en función de si hay en la gdb o no
*/
public bool[] BuscAmbGdb(string pathCapa)
{
string consulta;
int numero_lin;
bool[] amb_gdb = new bool[(int)LimpiezaDef.AmbitsTra.AmbN];//se inician a false
string ftclass;
//mira a ver si hay ejes de calle
ftclass = LimpiezaDef.ftclass[(int)LimpiezaDef.AmbitsTra.AmbEjeCalle];
consulta = LimpiezaDef.filtro_str[(int)LimpiezaDef.AmbitsTra.AmbEjeCalle];
numero_lin = HelperGdb.GetNumElems(OliviaGlob.Paths.PathGdbNw, ftclass, consulta);
if (numero_lin > 0)
{
amb_gdb[(int)LimpiezaDef.AmbitsTra.AmbEjeCalle] = true;
}
//mira a ver si hay el resto de capas y tienen entidades
for (int i = (int)LimpiezaDef.AmbitsTra.AmbBordLibreMec; i < (int)LimpiezaDef.AmbitsTra.AmbN; i++)
{
consulta = LimpiezaDef.filtro_str[i];
numero_lin = HelperGdb.GetNumElems(pathCapa, consulta);
if (numero_lin > 0)
{
amb_gdb[i] = true;
}
}
return amb_gdb;
}
/**Devuelve el array de los ámbitos comunes y no comunes de las opciones de un tratamiento tto
* Es un array de longitud el número de ámbitos totales, con true en las posiciones en los que el ámbito sea común o
* no común en las opciones
*/
public bool[] DameAmbTto(int tto)
{
int i;
bool sig;
bool[] amb_com = new bool[(int)LimpiezaDef.AmbitsTra.AmbN];
for (int j = 0; j < (int)LimpiezaDef.AmbitsTra.AmbN; j++)
{
sig = false;
for (i = 0; i < LimpiezaDef.ambs_val[tto].n_ops && !sig; i++)
{
if (LimpiezaDef.ambs_val[tto].ambs_ops[i].ambs[j]) //con que encuentre uno true lo pone y pasa al siguiente
{
amb_com[j] = sig = true;
}
}
}
return amb_com;
}
}
}