From 55d87b0edf3aae965df564c10769d9e55ea45fd8 Mon Sep 17 00:00:00 2001 From: Elena Date: Fri, 30 Jul 2021 15:46:23 +0200 Subject: [PATCH] Avances --- Helper/HelperGdb.cs | 74 ++++++- Model/Comun.cs | 8 +- Model/ILimpieza.cs | 31 +++ Model/Limpieza.cs | 105 ++-------- OliviaAddInPro.csproj | 2 + Services/LimpiezaServ.cs | 88 ++++++++ View/DockpaneLimpieza.xaml | 4 +- View/PaneEjecutar.xaml | 12 +- View/PaneLimpieza.xaml | 4 +- View/PaneLimpiezaSub1.xaml | 15 +- View/PaneLimpiezaSub1.xaml.cs | 35 +++- ViewModel/PaneLimpiezaSub1ViewModel.cs | 265 +++++++++++++++++++++---- ViewModel/PaneLimpiezaViewModel.cs | 45 ++++- 13 files changed, 519 insertions(+), 169 deletions(-) create mode 100644 Model/ILimpieza.cs create mode 100644 Services/LimpiezaServ.cs diff --git a/Helper/HelperGdb.cs b/Helper/HelperGdb.cs index 10780e3..bf27222 100644 --- a/Helper/HelperGdb.cs +++ b/Helper/HelperGdb.cs @@ -22,10 +22,11 @@ namespace OliviaAddInPro.Helper public static string OutStr { get { - string val = ""; + /*string val = ""; val.CopyFrom(out_str); out_str = string.Empty; //lo borra cada vez que se consulta - return val; + return val;*/ + return out_str; } set { out_str = value; } } @@ -33,10 +34,12 @@ namespace OliviaAddInPro.Helper public static string TextoSal { get { - string val = ""; + /*string val = ""; val.CopyFrom(texto_sal); texto_sal = string.Empty; //lo borra cada vez que se consulta - return val; } + return val; */ + return texto_sal; + } set { texto_sal = value; } } @@ -333,15 +336,46 @@ namespace OliviaAddInPro.Helper return attribs_st; })); } + /** + * Devuelve una geometría que es la suma de la inicial y la que se añade Add + */ + public static ArcGIS.Core.Geometry.Geometry IntersectGeom(ArcGIS.Core.Geometry.Geometry geomIni, ArcGIS.Core.Geometry.Geometry geomInters) + { + if (geomIni == null) + return geomInters; + if (geomInters == null) + return geomIni; + ArcGIS.Core.Geometry.Geometry geomSal = null; + try + { + geomSal=GeometryEngine.Instance.Intersection(geomIni, geomInters); + return geomSal; + } + catch + { + return null; + } + } /** * Devuelve una geometría que es la suma de la inicial y la que se añade Add - */ + */ public static ArcGIS.Core.Geometry.Geometry UneGeom(ArcGIS.Core.Geometry.Geometry geomIni, ArcGIS.Core.Geometry.Geometry geomUne) { if (geomIni == null) return geomUne; - return GeometryEngine.Instance.Union(geomIni, geomUne); + if (geomUne == null) + return geomIni; + ArcGIS.Core.Geometry.Geometry geomSal = null; + try + { + geomSal = GeometryEngine.Instance.Union(geomIni, geomUne); + return geomSal; + } + catch + { + return null; + } } /** @@ -349,7 +383,20 @@ namespace OliviaAddInPro.Helper */ public static ArcGIS.Core.Geometry.Geometry QuitaGeom(ArcGIS.Core.Geometry.Geometry geomIni, ArcGIS.Core.Geometry.Geometry geomQuita) { - return GeometryEngine.Instance.Union(geomIni, geomQuita); + if (geomIni == null) + return geomQuita; + if (geomQuita == null) + return geomIni; + ArcGIS.Core.Geometry.Geometry geomSal = null; + try + { + geomSal = GeometryEngine.Instance.Difference(geomIni, geomQuita); + return geomSal; + } + catch + { + return null; + } } /** @@ -361,7 +408,18 @@ namespace OliviaAddInPro.Helper ArcGIS.Core.Geometry.Geometry geomIni = null; geomIni = GetGeomUnica(fclss, filter); if (geomIni != null) - return GeometryEngine.Instance.ConvexHull(geomIni); + { + ArcGIS.Core.Geometry.Geometry geomSal = null; + try + { + geomSal = GeometryEngine.Instance.ConvexHull(geomIni); + return geomSal; + } + catch + { + return null; + } + } else return null; } diff --git a/Model/Comun.cs b/Model/Comun.cs index 6432b5c..3972548 100644 --- a/Model/Comun.cs +++ b/Model/Comun.cs @@ -8,7 +8,7 @@ using ArcGIS.Desktop.Internal.Layouts.Utilities; namespace OliviaAddInPro.Model { - class Comun + public abstract class Comun { /** * Capa de ámbitos @@ -81,10 +81,12 @@ namespace OliviaAddInPro.Model public string ErrStr { get { - string val = string.Empty; + /*string val = string.Empty; val.CopyFrom(err_str); err_str = string.Empty; - return val; } + return val; */ + return err_str; + } set { err_str = value;} } } diff --git a/Model/ILimpieza.cs b/Model/ILimpieza.cs new file mode 100644 index 0000000..6c5bcf2 --- /dev/null +++ b/Model/ILimpieza.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OliviaAddInPro.Model +{ + public interface ILimpieza + { + //********************************************** + //Se recogen en PaneLimpiezaSub1 + /** + * Tipo de tratamiento elegidos + */ + int TipoTto { get; } + /** + * Ámbitos de trabajo elegidos + */ + bool[] AmbitosSel { get; } + /** + * Indica si respeta el sentido de circulación o no + */ + bool RespCirc { get; } + /** + * Tipo de unidades del tiempo de tto + */ + int UdsTTto { get; } + + } +} diff --git a/Model/Limpieza.cs b/Model/Limpieza.cs index 3861b86..d4d6ed9 100644 --- a/Model/Limpieza.cs +++ b/Model/Limpieza.cs @@ -8,10 +8,11 @@ using OliviaAddInPro.Helper; using System.Collections.ObjectModel; using ArcGIS.Core.CIM; using ArcGIS.Core.Data; +using OliviaAddInPro.Services; namespace OliviaAddInPro.Model { - class Limpieza : Comun + public class Limpieza : Comun { //********************************************** //Se recogen en PaneLimpiezaSub1 @@ -31,98 +32,18 @@ namespace OliviaAddInPro.Model * Tipo de unidades del tiempo de tto */ public int UdsTTto = (int)GeneralDef.OlvTiposTto.OlvTipTtoNoDef; - + /** + * Instancia para las funciones de exportación y demás + */ + public LimpiezaServ Serv = null; + /** + * Almacena la consulta para exportar los ámbitos + */ + public string ConsultaAmbs = ""; public Limpieza() { - - } - /** - * Lee la gdb y devuelve el array de ámbitos en función de si hay en la gdb o no - */ - public bool[] BuscAmbGdb() - { - 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(CapaElems, 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; - } - - /* - * 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() - { - int NCAMPS = 2; - string[] camps; - int i; - camps = new string[NCAMPS]; - camps[0] = LimpiezaDef.Campos.consulta_entidad; - camps[1] = LimpiezaDef.Campos.consulta_mecan; - FeatureClass fc = HelperGdb.GetFtClass(CapaElems); - if (fc == null) - { - ErrStr = "No se puede abrir la capa"; - return false; - } - - ObservableCollection fields = HelperGdb.GetFields(fc).Result; - for (i = 0; i < NCAMPS; i++) - { - if (!fields.Contains(camps[i])) - { - ErrStr = "No se encuentra el campo " + camps[i]; - break; - } - } - if (i < NCAMPS) - return false; - return true; - } + Serv = new LimpiezaServ(this); + } + } } diff --git a/OliviaAddInPro.csproj b/OliviaAddInPro.csproj index 92ade20..deea6a8 100644 --- a/OliviaAddInPro.csproj +++ b/OliviaAddInPro.csproj @@ -134,9 +134,11 @@ + + diff --git a/Services/LimpiezaServ.cs b/Services/LimpiezaServ.cs new file mode 100644 index 0000000..df753ac --- /dev/null +++ b/Services/LimpiezaServ.cs @@ -0,0 +1,88 @@ +using ArcGIS.Core.Data; +using ArcGIS.Core.Geometry; +using OliviaAddInPro.Helper; +using OliviaAddInPro.Model; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OliviaAddInPro.Services +{ + public class LimpiezaServ + { + private Limpieza limp; + public string ErrStr=""; + + public LimpiezaServ(Limpieza _limp) + { + limp = _limp; + } + + /** + * Prepara la geometría para exportar + */ + public Geometry GetGeomAmbitsExport() + { + Geometry geomAux = null; + FeatureClass fc = HelperGdb.GetFtClass(limp.CapaElems); + QueryFilter filtro = new QueryFilter { WhereClause = limp.ConsultaAmbs }; + if(fc==null) + { + ErrStr = "No se ha podido abrir la clase " + limp.CapaElems; + return null; + } + //comprueba que haya elementos que cumplen la consulta + int nElem = HelperGdb.GetNumElems(fc, limp.ConsultaAmbs).Result; + if(nElem<=0) + { + ErrStr = "No existen ámbitos que cumplan las condiciones dadas " + limp.ConsultaAmbs; + return null; + } + //Primero hace la geometría de los ámbitos que cumplen la consulta + geomAux = HelperGdb.GetGeomUnica(fc, filtro); + if(geomAux==null || geomAux.IsEmpty) + { + ErrStr = "No se ha podido generar geometría de los ámbitos" + limp.ConsultaAmbs; + return null; + } + //Hace la intersección de dicha geometría con las zonas + if (limp.GeomZon != null) + { + geomAux = HelperGdb.IntersectGeom(geomAux, limp.GeomZon); + if(geomAux==null) + { + ErrStr = "Error al intersecar con las zonas."; + return null; + } + } + + //Hace la intersección de la geometría con los niveles + if (limp.GeomNiv != null) + { + geomAux = HelperGdb.IntersectGeom(geomAux, limp.GeomNiv); + if (geomAux == null) + { + ErrStr = "Error al intersecar con los niveles."; + return null; + } + } + + //le quita las restricciones + if (limp.GeomRestr != null) + { + geomAux = HelperGdb.QuitaGeom(geomAux, limp.GeomRestr); + if (geomAux == null) + { + ErrStr = "Error al intersecar con las restricciones."; + return null; + } + } + + return geomAux; + } + + + } +} diff --git a/View/DockpaneLimpieza.xaml b/View/DockpaneLimpieza.xaml index 6a707c1..9f252e3 100644 --- a/View/DockpaneLimpieza.xaml +++ b/View/DockpaneLimpieza.xaml @@ -9,7 +9,7 @@ xmlns:viewModel="clr-namespace:OliviaAddInPro" xmlns:view="clr-namespace:OliviaAddInPro" mc:Ignorable="d" - d:DesignHeight="500" d:DesignWidth="300" + d:DesignHeight="390" d:DesignWidth="300" d:DataContext="{Binding Path=ui.DockpaneLimpiezaViewModel}"> @@ -22,7 +22,7 @@ - + diff --git a/View/PaneEjecutar.xaml b/View/PaneEjecutar.xaml index d50e971..3f5a48d 100644 --- a/View/PaneEjecutar.xaml +++ b/View/PaneEjecutar.xaml @@ -7,7 +7,7 @@ xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid" xmlns:ui="clr-namespace:OliviaAddInPro" mc:Ignorable="d" - d:DesignHeight="300" d:DesignWidth="300" + d:DesignHeight="40" d:DesignWidth="300" d:DataContext="{Binding Path=ui.PaneLimpiezaSub3ViewModel}"> @@ -19,12 +19,12 @@ - - - + + + -