Avances en ventana de Limpieza, preparar para exportación, etc

ConfiguracionSimplificada
Elena 2021-09-25 21:50:41 +02:00
parent 55d87b0edf
commit 5e766d9fab
32 changed files with 5875 additions and 388 deletions

View File

@ -27,7 +27,8 @@ namespace OliviaAddInPro
{ {
if (OliviaGlob.TipoEjec == TiposEjecucion.Ninguno) if (OliviaGlob.TipoEjec == TiposEjecucion.Ninguno)
{ {
OliviaGlob.TipoEjec = TiposEjecucion.LimpiezaConfig; OliviaGlob.TipoEjec = TiposEjecucion.Limp;
OliviaGlob.Limp = new Limpieza();
DockpaneLimpiezaViewModel.Show(); DockpaneLimpiezaViewModel.Show();
} }
else else

View File

@ -27,7 +27,8 @@ namespace OliviaAddInPro
{ {
if(OliviaGlob.TipoEjec==TiposEjecucion.Ninguno) if(OliviaGlob.TipoEjec==TiposEjecucion.Ninguno)
{ {
OliviaGlob.TipoEjec = TiposEjecucion.RecoConfig; OliviaGlob.TipoEjec = TiposEjecucion.Reco;
//OliviaGlob.Reco=new
DockpaneRecogidaViewModel.Show(); DockpaneRecogidaViewModel.Show();
} }
else else

View File

@ -20,7 +20,6 @@
</tabs> </tabs>
<groups> <groups>
<group id="OliviaAddInPro_Group1" caption="Olivia" appearsOnAddInTab="false"> <group id="OliviaAddInPro_Group1" caption="Olivia" appearsOnAddInTab="false">
<button refID="OliviaAddInPro_Button1" size="large" />
<button refID="OliviaAddInPro_ButtonLimp" size="large" /> <button refID="OliviaAddInPro_ButtonLimp" size="large" />
<button refID="OliviaAddInPro_ButtonRec" size="large" /> <button refID="OliviaAddInPro_ButtonRec" size="large" />
<button refID="OliviaAddInPro_ButtonMaq" size="large" /> <button refID="OliviaAddInPro_ButtonMaq" size="large" />
@ -45,9 +44,6 @@
<tooltip heading="OLIVIA - Configuración"> <tooltip heading="OLIVIA - Configuración">
Add-In de ArcGIS Pro para la herramienta de optimización de la limpieza viaria, OLIVIA<disabledText /></tooltip> Add-In de ArcGIS Pro para la herramienta de optimización de la limpieza viaria, OLIVIA<disabledText /></tooltip>
</button> </button>
<button id="OliviaAddInPro_ButtonArcGisPro" caption="ButtonArcGisPro" className="ButtonArcGisPro" loadOnClick="true" smallImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericButtonBlue16.png" largeImage="pack://application:,,,/ArcGIS.Desktop.Resources;component/Images/GenericButtonBlue32.png">
<tooltip heading="Tooltip Heading">Tooltip text<disabledText /></tooltip>
</button>
</controls> </controls>
<dockPanes> <dockPanes>
<dockPane id="OliviaAddInPro_DockpaneLimpieza" caption="OLIVIA | Limpieza" className="DockpaneLimpiezaViewModel" dock="group" dockWith="esri_core_contentsDockPane"> <dockPane id="OliviaAddInPro_DockpaneLimpieza" caption="OLIVIA | Limpieza" className="DockpaneLimpiezaViewModel" dock="group" dockWith="esri_core_contentsDockPane">

View File

@ -163,7 +163,7 @@ namespace OliviaAddInPro.Helper
} }
catch (Exception ex) catch (Exception ex)
{ {
HelperGdb.out_str = "Error al abrir Geodatabase " + path + ": " + ex.Message; HelperGdb.OutStr = "Error al abrir Geodatabase " + path + ": " + ex.Message;
return null; return null;
} }
} }
@ -205,7 +205,7 @@ namespace OliviaAddInPro.Helper
} }
catch (Exception ex) catch (Exception ex)
{ {
HelperGdb.out_str = "Error al abrir Feature Class " + nameFtclss + ": " + ex.Message; HelperGdb.OutStr = "Error al abrir Feature Class " + nameFtclss + ": " + ex.Message;
return null; return null;
} }
return ftclss; return ftclss;
@ -230,7 +230,7 @@ namespace OliviaAddInPro.Helper
} }
catch (Exception ex) catch (Exception ex)
{ {
HelperGdb.out_str = "Error al abrir Shapefile " + pathShp + ": " + ex.Message; HelperGdb.OutStr = "Error al abrir Shapefile " + pathShp + ": " + ex.Message;
return null; return null;
} }
} }
@ -252,7 +252,7 @@ namespace OliviaAddInPro.Helper
} }
catch (Exception ex) catch (Exception ex)
{ {
HelperGdb.out_str = "No se encuentra el campo " + fieldName + ": " + ex.Message; HelperGdb.OutStr = "No se encuentra el campo " + fieldName + ": " + ex.Message;
return null; return null;
} }
return field; return field;
@ -282,13 +282,35 @@ namespace OliviaAddInPro.Helper
} }
catch (Exception ex) catch (Exception ex)
{ {
HelperGdb.out_str = "Error al leer los campos " + fc.GetName() + ": " + ex.Message; HelperGdb.OutStr = "Error al leer los campos " + fc.GetName() + ": " + ex.Message;
return fields_st; return fields_st;
} }
return fields_st; return fields_st;
})); }));
} }
/*
* Comprueba que en la capa dada exista un campo con nombre 'field'
*/
public static bool CheckField(string pathCapa, string field)
{
FeatureClass fc = GetFtClass(pathCapa);
if (fc == null)
{
HelperGdb.OutStr = "No se puede abrir la capa";
return false;
}
ObservableCollection<string> fields = GetFields(fc).Result;
if (!fields.Contains(field))
{
HelperGdb.OutStr = "No se encuentra el campo " + field;
return false;
}
return true;
}
//Devuelve comilla simple si el campo es de texto, o nada si es númerico //Devuelve comilla simple si el campo es de texto, o nada si es númerico
//var whereClause = $"{SelectedField} = {Quote(f)}{FieldValue}{Quote(f)}"; //var whereClause = $"{SelectedField} = {Quote(f)}{FieldValue}{Quote(f)}";
public static string Quote(ArcGIS.Core.Data.Field f) public static string Quote(ArcGIS.Core.Data.Field f)
@ -329,7 +351,7 @@ namespace OliviaAddInPro.Helper
} }
catch (Exception ex) catch (Exception ex)
{ {
HelperGdb.out_str = "Error al leer los campos " + fc.GetName() + ": " + ex.Message; HelperGdb.OutStr = "Error al leer los campos " + fc.GetName() + ": " + ex.Message;
return attribs_st; return attribs_st;
} }
@ -448,7 +470,7 @@ namespace OliviaAddInPro.Helper
} }
catch (Exception ex) catch (Exception ex)
{ {
out_str = "Error al leer generar geometría única " + out_str + ex.Message; OutStr = "Error al leer generar geometría única " + OutStr + ex.Message;
return geomsal; return geomsal;
} }
@ -467,7 +489,7 @@ namespace OliviaAddInPro.Helper
ArcGIS.Core.Data.QueryFilter filtro; ArcGIS.Core.Data.QueryFilter filtro;
bool ok = true; bool ok = true;
ReiniciaOutStr(); ReiniciaOutStr();
TextoSal = string.Empty; string txtsal = string.Empty;
return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func<ArcGIS.Core.Geometry.Geometry>)(() => return ArcGIS.Desktop.Framework.Threading.Tasks.QueuedTask.Run((Func<ArcGIS.Core.Geometry.Geometry>)(() =>
{ {
@ -488,18 +510,19 @@ namespace OliviaAddInPro.Helper
continue; continue;
} }
geomsal = UneGeom(geomsal, geomAux); geomsal = UneGeom(geomsal, geomAux);
TextoSal = TextoSal + HelperGlobal.RevisaText(selFieldVals[i]); txtsal = txtsal + HelperGlobal.RevisaText(selFieldVals[i]);
} }
TextoSal = txtsal;
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
HelperGdb.out_str = "Error al generar geometría en " + fclss.GetName() + " Con filtro " + where +": " + ex.Message; HelperGdb.OutStr = "Error al generar geometría en " + fclss.GetName() + " Con filtro " + where +": " + ex.Message;
return geomsal; return geomsal;
} }
if (!ok) if (!ok)
HelperGdb.out_str = "Error al generar geometría en " + fclss.GetName() + " Con filtro " + where + HelperGdb.out_str; HelperGdb.OutStr = "Error al generar geometría en " + fclss.GetName() + " Con filtro " + where + HelperGdb.OutStr;
return geomsal; return geomsal;
})); }));
} }
@ -548,7 +571,7 @@ namespace OliviaAddInPro.Helper
} }
catch (Exception ex) catch (Exception ex)
{ {
HelperGdb.out_str = "Error al contar filas en " + fc.GetName() + ": " + ex.Message; HelperGdb.OutStr = "Error al contar filas en " + fc.GetName() + ": " + ex.Message;
return n; return n;
} }

View File

@ -13,13 +13,18 @@ namespace OliviaAddInPro.Helper
public static class HelperGlobal public static class HelperGlobal
{ {
public static void ponMsg(String mensaje, System.Windows.MessageBoxImage icon = MessageBoxImage.Information, public static bool ponMsg(String mensaje, System.Windows.MessageBoxImage icon = MessageBoxImage.Information,
String titulo = "OLIVIA", String titulo = "OLIVIA",
MessageBoxButton button= MessageBoxButton.OK) MessageBoxButton button= MessageBoxButton.OK)
{ {
//MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon); //MessageBoxResult Show(string messageText, string caption, MessageBoxButton button, MessageBoxImage icon);
ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show(mensaje, titulo, button, icon); MessageBoxResult res = ArcGIS.Desktop.Framework.Dialogs.MessageBox.Show(mensaje, titulo, button, icon);
if (res == MessageBoxResult.Yes || res == MessageBoxResult.OK)
return true;
else
return false;
} }
public static string RevisaText(string text) public static string RevisaText(string text)
{ {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
@ -32,5 +37,18 @@ namespace OliviaAddInPro.Helper
} }
return sb.ToString(); return sb.ToString();
} }
public static bool Str2Int(string entr, out int sal)
{
sal = 0;
try
{
sal=int.Parse(entr);
return true;
}
catch(Exception)
{
return false;
}
}
} }
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,31 +0,0 @@
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; }
}
}

View File

@ -12,38 +12,54 @@ using OliviaAddInPro.Services;
namespace OliviaAddInPro.Model namespace OliviaAddInPro.Model
{ {
public class Limpieza : Comun public class Limpieza : TratamientoComun
{ {
//********************************************** //**********************************************
//Se recogen en PaneLimpiezaSub1 //Se recogen en PaneLimpiezaSub1
/** /**
* Tipo de tratamiento elegidos * Tipo de tratamiento elegidos
*/ */
public int TipoTto = -1; public int TipoTto { get; set; } = -1;
/** /**
* Ámbitos de trabajo elegidos * Ámbitos de trabajo elegidos
*/ */
public bool[] AmbitosSel = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; public bool[] AmbitosSel { get; set; } = new bool[(int)LimpiezaDef.AmbitsTra.AmbN];
/** /**
* Indica si respeta el sentido de circulación o no * Indica si respeta el sentido de circulación o no
*/ */
public bool RespCirc = false; public bool RespCirc { get; set; } = false;
/** /**
* Tipo de unidades del tiempo de tto * Tipo de unidades del tiempo de tto
*/ */
public int UdsTTto = (int)GeneralDef.OlvTiposTto.OlvTipTtoNoDef; public int UdsTTto { get; set; } = (int)GeneralDef.OlvTiposTto.OlvTipTtoNoDef;
/**
* Path a una capa auxiliar que almacena las columnas de sectorización y planif
*/
public string CapaAuxPlanif = string.Empty;
/** /**
* Instancia para las funciones de exportación y demás * Instancia para las funciones de exportación y demás
*/ */
public LimpiezaServ Serv = null; public LimpiezaServ Serv { get; set; } = null;
/**
* Almacena la consulta para exportar los ámbitos
*/
public string ConsultaAmbs = "";
public Limpieza() public Limpieza()
{ {
Serv = new LimpiezaServ(this); Serv = new LimpiezaServ(this);
} }
public void Ejecuta(ModosEjec modo)
{
bool bien = true;
if (modo == ModosEjec.Sectoriza)
bien = Serv.Sectoriza();
else if (modo == ModosEjec.Planifica)
bien=Serv.Planifica();
if(!bien)
{
string msg;
if (Serv.ErrStr.Length > 0)
msg = Serv.ErrStr;
else
msg="Han ocurrido errores al comenzar la ejeción."
HelperGlobal.ponMsg(msg);
}
}
} }
} }

View File

@ -37,6 +37,8 @@ namespace OliviaAddInPro.Model
public static string consulta_observ; //<Campo a consultar de la capa de limpieza, observaciones public static string consulta_observ; //<Campo a consultar de la capa de limpieza, observaciones
public static string consulta_anch_tip; //<Campo a consultar de la capa de limpieza, ancho tipo public static string consulta_anch_tip; //<Campo a consultar de la capa de limpieza, ancho tipo
public static string consulta_tipolo; //<Campo a consultar de la capa de limpieza, tipología public static string consulta_tipolo; //<Campo a consultar de la capa de limpieza, tipología
public static string consulta_sector; //<Campo a consultar de la capa planificada, sector
public static string consulta_secuen; //<Campo a consultar de la capa planificada, planificacion
}; };
/** /**
* Nombre de los atributos (de las capas) sobre los que se realizarán consultas para la limpieza * Nombre de los atributos (de las capas) sobre los que se realizarán consultas para la limpieza

View File

@ -1,8 +1,10 @@
/** 
using ArcGIS.Core.Geometry;
/**
* @file GeneralDef.cs * @file GeneralDef.cs
* Clase con definiciones globales comunes al proyecto Olivia y a OliviaTasks. * Clase con definiciones globales comunes al proyecto Olivia y a OliviaTasks.
*/ *//**
/**
* Clase con definiciones globales comunes al proyecto Olivia y a OliviaTasks. * Clase con definiciones globales comunes al proyecto Olivia y a OliviaTasks.
*/ */
namespace OliviaAddInPro.Model namespace OliviaAddInPro.Model
@ -36,6 +38,7 @@ namespace OliviaAddInPro.Model
OlvTipTtoM2h_eje, OlvTipTtoM2h_eje,
}; };
public static string[] UdsTto = new string[] {"min","m/h","m/h","m2/h","m2/h"}; public static string[] UdsTto = new string[] {"min","m/h","m/h","m2/h","m2/h"};
public static int SpatRefDef { get; set; } = (int)esriSRProjCS4Type.esriSRProjCS_ETRS1989_UTM_Zone_30N;
//************************************************************************************* //*************************************************************************************
//Variables generales //Variables generales
/* /*

View File

@ -1,20 +1,31 @@
using System; using ArcGIS.Desktop.Internal.Core;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using OliviaAddInPro.Services;
using ArcGIS.Core.Geometry;
namespace OliviaAddInPro.Model namespace OliviaAddInPro.Model
{ {
enum TiposEjecucion [Flags]
/**
* 2 primeros bit indican si es nada (0), limp (1), reco(2), u otros (3)
* 3er bit indica si es config
* 4º bit indica ejec
*/
public enum TiposEjecucion
{ {
Ninguno, Ninguno = 0,
LimpiezaConfig, Limp=1,
LimpiezaEjec, Reco=2,
RecoConfig, Config = 4, //está configurando por primera vez
RecoEjec, Ejec=8,//está ejecutando por primera vez
Maqueta, Config2=16,//está configurando después de haber planificado ya al menos una primera vez
Config Ejec2=32,//está ejecutando después de haber planificado ya al menos una primera vez
Maqueta =64,
Conifg=128,
} }
static class OliviaGlob static class OliviaGlob
{ {
@ -50,8 +61,11 @@ namespace OliviaAddInPro.Model
public static Limpieza Limp public static Limpieza Limp
{ {
get { return limp; } get { return limp; }
//set { limp = value; } set { limp = value; }
} }
public static EjecServ Serv { get; } = new EjecServ();
public static SpatialReference SpatRef { get; set; } = null;
#endregion Properties #endregion Properties
public static void Inicia() public static void Inicia()
@ -59,6 +73,50 @@ namespace OliviaAddInPro.Model
IniDefault(); IniDefault();
LimpiezaDef.iniciaLimpDef(); LimpiezaDef.iniciaLimpDef();
limp = new Limpieza(); limp = new Limpieza();
SpatRef = ArcGIS.Core.Geometry.SpatialReferenceBuilder.CreateSpatialReference(GeneralDef.SpatRefDef);
}
public static bool IsLimp()
{
return (OliviaGlob.TipoEjec & TiposEjecucion.Limp) == TiposEjecucion.Limp;
}
public static bool IsReco()
{
return (OliviaGlob.TipoEjec & TiposEjecucion.Reco) == TiposEjecucion.Reco;
}
public static bool IsConfig2()
{
return (OliviaGlob.TipoEjec & TiposEjecucion.Config2) == TiposEjecucion.Config2;
}
/**
* Habilita Sh=true
* o Deshabilita sh=false
* el pane correspondiente
*/
public static void ShowHidePane(bool sh)
{
if (OliviaGlob.IsLimp())
{
if (sh)
{
DockpaneLimpiezaViewModel.Show();
}
else
{
DockpaneLimpiezaViewModel.Hide_();
}
}
else if (OliviaGlob.IsReco())
{
if (sh)
{
DockpaneRecogidaViewModel.Show();
}
else
{
DockpaneRecogidaViewModel.Hide_();
}
}
} }
/** /**
@ -99,6 +157,8 @@ namespace OliviaAddInPro.Model
LimpiezaDef.Campos.consulta_observ = "OBSERVACIONES"; LimpiezaDef.Campos.consulta_observ = "OBSERVACIONES";
LimpiezaDef.Campos.consulta_anch_tip = "ANCHO_TIPO"; LimpiezaDef.Campos.consulta_anch_tip = "ANCHO_TIPO";
LimpiezaDef.Campos.consulta_tipolo = "TIPOLOGIA"; LimpiezaDef.Campos.consulta_tipolo = "TIPOLOGIA";
LimpiezaDef.Campos.consulta_sector = "SECTOR";
LimpiezaDef.Campos.consulta_secuen = "SECUENCIA";
LimpiezaDef.Atributos.atr_esca = "Escaleras"; LimpiezaDef.Atributos.atr_esca = "Escaleras";
LimpiezaDef.Atributos.atr_fuent = "Fuentes"; LimpiezaDef.Atributos.atr_fuent = "Fuentes";

View File

@ -8,72 +8,83 @@ using ArcGIS.Desktop.Internal.Layouts.Utilities;
namespace OliviaAddInPro.Model namespace OliviaAddInPro.Model
{ {
public abstract class Comun public class TratamientoComun
{ {
/** /**
* Capa de ámbitos * Capa de ámbitos
*/ */
public string CapaElems = string.Empty; public string CapaElems { get; set; } = string.Empty;
/** /**
* Velocidad de desplazamiento, en km/h. Si es 0, es determinada por la vía * Velocidad de desplazamiento, en km/h. Si es 0, es determinada por la vía
*/ */
public double VDespl = 0; public int VDespl { get; set; } = 0;
/** /**
* Tiempo de tratamiento, en minutos * Tiempo de tratamiento, en minutos
*/ */
public double Ttto = 5; public int Ttto { get; set; } = 5;
/** /**
* Geometría para el filtro de ámbitos, incluye zonas, se añaden los ámbitos que pertenecen a esa geom * Geometría para el filtro de ámbitos, incluye zonas, se añaden los ámbitos que pertenecen a esa geom
*/ */
public Geometry GeomZon = null; public Geometry GeomZon { get; set; } = null;
public string TextGeomZon { get; set; } = string.Empty;
/** /**
* Geometría para el filtro de ámbitos, incluye zonas, se añaden los ámbitos que pertenecen a esa geom * Geometría para el filtro de ámbitos, incluye zonas, se añaden los ámbitos que pertenecen a esa geom
*/ */
public Geometry GeomNiv = null; public Geometry GeomNiv { get; set; } = null;
public string TextGeomNiv { get; set; } = string.Empty;
/** /**
* Geometría para el filtro de ámbitos, incluye restricciones, se quitan los ámbitos que pertenecen a esa geom * Geometría para el filtro de ámbitos, incluye restricciones, se quitan los ámbitos que pertenecen a esa geom
*/ */
public Geometry GeomRestr = null; public Geometry GeomRestr { get; set; } = null;
public string TextGeomRestr { get; set; } = string.Empty;
/** /**
* Coordenadas de la instalación * Coordenadas de la instalación
*/ */
public Coordinate2D CoordsInstal = new Coordinate2D(0, 0); public Coordinate2D CoordsInstal { get; set; } = new Coordinate2D(0, 0);
/** /**
* Buffer para la exportación, en metros * Buffer para la exportación, en metros
*/ */
public int BuffExport = 1000; public int BuffExport { get; set; } = 1000;
/** /**
* Tiempo de trabajo al día por convenio, en minutos * Tiempo de trabajo al día por convenio, en minutos
*/ */
public double TConv = LimpiezaDef.Parametros.t_conv; public double TConv { get; set; } = LimpiezaDef.Parametros.t_conv;
/** /**
* Tiempo de descanso del personal, en minutos * Tiempo de descanso del personal, en minutos
*/ */
public double TDescan = LimpiezaDef.Parametros.t_descanso; public double TDescan { get; set; } = LimpiezaDef.Parametros.t_descanso;
/** /**
* Tiempo de carga y descarga, en minutos * Tiempo de carga y descarga, en minutos
*/ */
public double TDescarg = LimpiezaDef.Parametros.t_cardesc; public double TDescarg { get; set; } = LimpiezaDef.Parametros.t_cardesc;
/** /**
* Tiempo de desplazamiento inicio/fin a las instalaciones, en minutos * Tiempo de desplazamiento inicio/fin a las instalaciones, en minutos
*/ */
public double TDesplIniFin = LimpiezaDef.Parametros.t_desp; public double TDesplIniFin { get; set; } = LimpiezaDef.Parametros.t_desp;
/** /**
* hora de inicio de la jornada de trabajo, en minutos * hora de inicio de la jornada de trabajo, en minutos
*/ */
public double HIni = LimpiezaDef.Parametros.h_inicio; public double HIni { get; set; } = LimpiezaDef.Parametros.h_inicio;
/** /**
* Porcentaje de tráfico que se estima, ya que si no los vehículos irían siempre a la velocida máxima permitida por la vía * Porcentaje de tráfico que se estima, ya que si no los vehículos irían siempre a la velocida máxima permitida por la vía
*/ */
public int Trafico = 80; public int Trafico { get; set; } = 80;
/** /**
* Número de puntos de control * Número de puntos de control
*/ */
public int NPtosCtrl = 3; public int NPtosCtrl { get; set; } = 3;
/** /**
* Número de sectores, si es 0, se calcula automáticamente, si es negativo, se ajusta a jornada * Número de sectores, si es 0, se calcula automáticamente, si es negativo, se ajusta a jornada
*/ */
public int NSect = 3; public int NSect { get; set; } = 3;
/**
* Ignorar o noelementos aislados
*/
public bool IgnoAis { get; set; } = true;
/**
* Almacena la consulta para exportar los ámbitos
*/
public string ConsultaAmbs { get; set; } = "";
/** /**
* String para errores o mensajes * String para errores o mensajes
*/ */

View File

@ -133,11 +133,12 @@
<Compile Include="Helper\CheckedListItem.cs" /> <Compile Include="Helper\CheckedListItem.cs" />
<Compile Include="Helper\HelperGdb.cs" /> <Compile Include="Helper\HelperGdb.cs" />
<Compile Include="Helper\HelperGlobal.cs" /> <Compile Include="Helper\HelperGlobal.cs" />
<Compile Include="Model\Comun.cs" /> <Compile Include="Model\ESRI.ArcGIS.Geometry.esriSRProjCS4Type.cs" />
<Compile Include="Model\ILimpieza.cs" /> <Compile Include="Model\TratamientoComun.cs" />
<Compile Include="Model\Limpieza.cs" /> <Compile Include="Model\Limpieza.cs" />
<Compile Include="Model\LimpiezaDef.cs" /> <Compile Include="Model\LimpiezaDef.cs" />
<Compile Include="Model\OliviaDef.cs" /> <Compile Include="Model\OliviaDef.cs" />
<Compile Include="Services\EjecServ.cs" />
<Compile Include="Services\LimpiezaServ.cs" /> <Compile Include="Services\LimpiezaServ.cs" />
<Compile Include="ViewModel\OptionsMenuItem.cs" /> <Compile Include="ViewModel\OptionsMenuItem.cs" />
<Compile Include="ViewModel\PaneEjecutarViewModel.cs" /> <Compile Include="ViewModel\PaneEjecutarViewModel.cs" />

213
Services/EjecServ.cs Normal file
View File

@ -0,0 +1,213 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OliviaAddInPro.Model;
using ArcGIS.Core.Data;
using ArcGIS.Core.Geometry;
using OliviaAddInPro.Helper;
using ArcGIS.Core.Internal.Data;
namespace OliviaAddInPro.Services
{
public enum ModosEjec
{
Sectoriza,
Planifica
}
//Clase que realiza las funciones de la ejecución
public class EjecServ
{
//Cadenas de nombres internos para la exportación/importación de los archivos
public string prefNameExport = "data_";
public string extShp = ".shp";
public string name_export_nw = "nw_";
public string ErrStr = "";
public TratamientoComun com;
/**
* Acciones para comenzar ejecución
* Modo 0, sectorizar
* Modo 1, planificar
*/
public bool ComienzaEjec(ModosEjec modo)
{
bool fue_mal = false;
//esconde el pane
OliviaGlob.ShowHidePane(false);
//Cuenta las filas que cumplen la consulta
int nelems = HelperGdb.GetNumElems(com.CapaElems, com.ConsultaAmbs);
if(nelems<=0)
{
ErrStr = "No existen ámbitos que cumplan las condiciones introducidas para la exportación " + com.ConsultaAmbs;
fue_mal = true;
}
//Obtiene la geometría que envuelve a los ámbitos
Geometry geom_export = null;
if (!fue_mal)
{
geom_export = GetGeomAmbitsExport();
if (geom_export == null || geom_export.IsEmpty)
{
fue_mal = true;
}
}
//mira spatialreference de los datos de entrada
GetSpatialRef(geom_export);
//crea el filtro de exportación
SpatialQueryFilter filtroEspacial = null;
if (!fue_mal)
{
filtroEspacial = CreaFiltro(com.ConsultaAmbs, geom_export);
if (filtroEspacial == null)
{
fue_mal = true;
}
}
if (!fue_mal)
{
Ejecuta(modo);
return true;
}
//fue mal
//muestra pane
OliviaGlob.ShowHidePane(true);
return false;
}
/**
* Prepara la geometría para exportar los ámbitos
*/
public Geometry GetGeomAmbitsExport()
{
Geometry geomAux = null;
FeatureClass fc = HelperGdb.GetFtClass(com.CapaElems);
QueryFilter filtro = new QueryFilter { WhereClause = com.ConsultaAmbs };
if (fc == null)
{
ErrStr = "No se ha podido abrir la clase " + com.CapaElems;
return null;
}
//comprueba que haya elementos que cumplen la consulta
int nElem = HelperGdb.GetNumElems(fc, com.ConsultaAmbs).Result;
if (nElem <= 0)
{
ErrStr = "No existen ámbitos que cumplan las condiciones dadas " + com.ConsultaAmbs;
return null;
}
//Primero hace la geometría de los ámbitos que cumplen la consulta
geomAux = HelperGdb.GetGeomConvexHull(fc, filtro);
if (geomAux == null || geomAux.IsEmpty)
{
ErrStr = "No se ha podido generar geometría de los ámbitos" + com.ConsultaAmbs;
return null;
}
//Hace la intersección de dicha geometría con las zonas
if (com.GeomZon != null)
{
geomAux = HelperGdb.IntersectGeom(geomAux, com.GeomZon);
if (geomAux == null)
{
ErrStr = "Error al intersecar con las zonas.";
return null;
}
if(geomAux.IsEmpty)
{
ErrStr = "No existen ámbitos en la intersección con las zonas.";
return null;
}
}
//Hace la intersección de la geometría con los niveles
if (com.GeomNiv != null)
{
geomAux = HelperGdb.IntersectGeom(geomAux, com.GeomNiv);
if (geomAux == null)
{
ErrStr = "Error al intersecar con los niveles.";
return null;
}
if (geomAux.IsEmpty)
{
ErrStr = "No existen ámbitos en la intersección con los niveles.";
return null;
}
}
//le quita las restricciones
if (com.GeomRestr != null)
{
geomAux = HelperGdb.QuitaGeom(geomAux, com.GeomRestr);
if (geomAux == null)
{
ErrStr = "Error al intersecar con las restricciones.";
return null;
}
}
return geomAux;
}
public SpatialQueryFilter CreaFiltro(string consulta, Geometry geom)
{
SpatialQueryFilter filtSpac = new SpatialQueryFilter
{
WhereClause = consulta,
FilterGeometry = geom,
SpatialRelationship = SpatialRelationship.Contains,
};
return filtSpac;
}
/**
* Devuelve el string a concatenar en el nombre del path dependiendo de los polígonos seleccionados (zonas, turnos... etc)
*/
public string DameStrPoligs()
{
string str = "";
if (com.TextGeomNiv != "" && com.GeomNiv != null)
str += "_N" + com.TextGeomNiv;
if (com.TextGeomZon != "" && com.GeomZon != null)
str += "_Z" + com.TextGeomZon;
if (com.TextGeomRestr != "" && com.GeomRestr != null)
str += "_R" + com.TextGeomRestr;
return str;
}
/**
* Coge spatial reference de los datos a exportar
*/
public void GetSpatialRef(Geometry geom)
{
OliviaGlob.SpatRef = geom.SpatialReference;
}
/**
* Exporta y lanza proceso y ventana de proceso
*/
public void Ejecuta(ModosEjec modo)
{
}
/**
* Exporta los datos de entrada y el nw
*/
public void Exporta(ModosEjec modo)
{
}
}
}

View File

@ -1,5 +1,6 @@
using ArcGIS.Core.Data; using ArcGIS.Core.Data;
using ArcGIS.Core.Geometry; using ArcGIS.Core.Geometry;
using ArcGIS.Core.Internal.CIM;
using OliviaAddInPro.Helper; using OliviaAddInPro.Helper;
using OliviaAddInPro.Model; using OliviaAddInPro.Model;
using System; using System;
@ -7,82 +8,249 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows;
namespace OliviaAddInPro.Services namespace OliviaAddInPro.Services
{ {
public class LimpiezaServ public class LimpiezaServ : EjecServ
{ {
private Limpieza limp; private Limpieza limp;
public string ErrStr="";
public LimpiezaServ(Limpieza _limp) public LimpiezaServ(Limpieza _limp)
{ {
limp = _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;
}
/** /**
* Prepara la geometría para exportar * Comprueba lo necesario para ver si hay campos para la planificación
*/ */
public Geometry GetGeomAmbitsExport() public bool CompruebaPlanif()
{ {
Geometry geomAux = null; string path = null;
FeatureClass fc = HelperGdb.GetFtClass(limp.CapaElems);
QueryFilter filtro = new QueryFilter { WhereClause = limp.ConsultaAmbs }; //si ha importado no hace falta que compruebe, seguro que las tiene
if(fc==null) 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))
{ {
ErrStr = "No se ha podido abrir la clase " + limp.CapaElems; return false;
return null;
} }
//comprueba que haya elementos que cumplen la consulta
int nElem = HelperGdb.GetNumElems(fc, limp.ConsultaAmbs).Result; //comprueba que en la nueva capa haya columnas de planif
if(nElem<=0) if (!ComprCamposPlanif(path))
{ {
ErrStr = "No existen ámbitos que cumplan las condiciones dadas " + limp.ConsultaAmbs; return false;
return null;
} }
//Primero hace la geometría de los ámbitos que cumplen la consulta
geomAux = HelperGdb.GetGeomUnica(fc, filtro); //almacena la info de secto auxiliar
if(geomAux==null || geomAux.IsEmpty) limp.CapaAuxPlanif = path;
{ return true;
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 public bool ComprCamposPlanif(string pathCapa)
if (limp.GeomZon != null)
{ {
geomAux = HelperGdb.IntersectGeom(geomAux, limp.GeomZon); int NCAMPS = 2;
if(geomAux==null) 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++)
{ {
ErrStr = "Error al intersecar con las zonas."; if (!HelperGdb.CheckField(pathCapa, camps[i]))
return null; {
break;
} }
} }
//Hace la intersección de la geometría con los niveles if (i < NCAMPS)
if (limp.GeomNiv != null) 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)
{ {
geomAux = HelperGdb.IntersectGeom(geomAux, limp.GeomNiv); int NCAMPS = 5;
if (geomAux == null) 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++)
{ {
ErrStr = "Error al intersecar con los niveles."; if (!HelperGdb.CheckField(pathCapa, camps[i]))
return null; {
break;
} }
} }
//le quita las restricciones if (i < NCAMPS)
if (limp.GeomRestr != null) 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)
{ {
geomAux = HelperGdb.QuitaGeom(geomAux, limp.GeomRestr); string consulta;
if (geomAux == null) 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)
{ {
ErrStr = "Error al intersecar con las restricciones."; amb_gdb[(int)LimpiezaDef.AmbitsTra.AmbEjeCalle] = true;
return null; }
//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 geomAux; 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;
}
} }
} }

View File

@ -8,7 +8,7 @@
xmlns:ui="clr-namespace:OliviaAddInPro" xmlns:ui="clr-namespace:OliviaAddInPro"
mc:Ignorable="d" mc:Ignorable="d"
d:DesignHeight="40" d:DesignWidth="300" d:DesignHeight="40" d:DesignWidth="300"
d:DataContext="{Binding Path=ui.PaneLimpiezaSub3ViewModel}"> d:DataContext="{Binding Path=ui.PaneEjecutarViewModel}">
<UserControl.Resources> <UserControl.Resources>
<ResourceDictionary> <ResourceDictionary>
<ResourceDictionary.MergedDictionaries> <ResourceDictionary.MergedDictionaries>
@ -23,8 +23,8 @@
<ColumnDefinition Width="100"/> <ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/> <ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Button x:Name="button_secto" Grid.Column="1" Style="{DynamicResource Esri_Button}" Content="Sectorizar" Margin="10,0,10,0"/> <Button x:Name="button_secto" Grid.Column="1" Style="{DynamicResource Esri_Button}" Content="Sectorizar" Margin="10,0,10,0" Click="button_secto_Click"/>
<Button x:Name="button_planif" Grid.Column="2" Style="{DynamicResource Esri_Button}" Content="Planificar" Margin="10,0,10,0"/> <Button x:Name="button_planif" Grid.Column="2" Style="{DynamicResource Esri_Button}" Content="Planificar" Margin="10,0,10,0" Click="button_planif_Click"/>
</Grid> </Grid>
</StackPanel> </StackPanel>

View File

@ -26,5 +26,14 @@ namespace OliviaAddInPro
InitializeComponent(); InitializeComponent();
} }
private void button_secto_Click(object sender, RoutedEventArgs e)
{
}
private void button_planif_Click(object sender, RoutedEventArgs e)
{
}
} }
} }

View File

@ -45,7 +45,7 @@
</ResourceDictionary> </ResourceDictionary>
</UserControl.Resources> </UserControl.Resources>
<Grid MinHeight="200" MinWidth="300"> <Grid MinHeight="200" MinWidth="300" x:Name="GridLimp">
<!--TextBlock Text="Add your custom content here" VerticalAlignment="Center" HorizontalAlignment="Center"></--> <!--TextBlock Text="Add your custom content here" VerticalAlignment="Center" HorizontalAlignment="Center"></-->
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
@ -65,7 +65,21 @@
<ContentPresenter Content="{Binding CurrentSubPanelPage}"/> <ContentPresenter Content="{Binding CurrentSubPanelPage}"/>
</StackPanel> </StackPanel>
<StackPanel Grid.Row="2" Margin="0,20,0,0"> <StackPanel Grid.Row="2" Margin="0,20,0,0">
<ContentPresenter Content="{Binding SubPanelEjec}"/> <ContentPresenter Name="PaneEjecutar">
<ContentPresenter.Content>
<StackPanel Orientation="Vertical">
<Grid Margin="0,10,0,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="100"/>
</Grid.ColumnDefinitions>
<Button x:Name="button_secto" Grid.Column="1" Style="{DynamicResource Esri_Button}" Content="Sectorizar" Margin="10,0,10,0" Click="button_secto_Click"/>
<Button x:Name="button_planif" Grid.Column="2" Style="{DynamicResource Esri_Button}" Content="Planificar" Margin="10,0,10,0" Click="button_planif_Click"/>
</Grid>
</StackPanel>
</ContentPresenter.Content>
</ContentPresenter>
</StackPanel> </StackPanel>
</Grid> </Grid>
</UserControl> </UserControl>

View File

@ -25,5 +25,22 @@ namespace OliviaAddInPro
{ {
InitializeComponent(); InitializeComponent();
} }
private void button_secto_Click(object sender, RoutedEventArgs e)
{
if (DataContext is PaneLimpiezaViewModel mod)
{
mod.Ejecuta(OliviaAddInPro.Services.ModosEjec.Sectoriza);
}
}
private void button_planif_Click(object sender, RoutedEventArgs e)
{
if (DataContext is PaneLimpiezaViewModel mod)
{
mod.Ejecuta(OliviaAddInPro.Services.ModosEjec.Planifica);
}
}
} }
} }

View File

@ -57,7 +57,7 @@ namespace OliviaAddInPro
{ {
label_capalimp.Content = Resource1.String_selec_capa; label_capalimp.Content = Resource1.String_selec_capa;
if (DataContext is PaneLimpiezaSub1ViewModel mod) if (DataContext is PaneLimpiezaSub1ViewModel mod)
mod.CapaAbierta = false; mod.AbiertaCapa(null);
} }
} }

View File

@ -38,7 +38,10 @@ namespace OliviaAddInPro
e.Handled = !PanelGlobal.IsValid(((TextBox)sender).Text + e.Text,0,9999); e.Handled = !PanelGlobal.IsValid(((TextBox)sender).Text + e.Text,0,9999);
} }
private ArcGIS.Core.Geometry.Geometry selecGeom(FeatureClass fc, out string _texto, bool multisel) /*
* Saca ventana para seleccionar el campo del que leer para elegir la geometría
*/
private ArcGIS.Core.Geometry.Geometry SelecLeeGeom(FeatureClass fc, out string _texto, bool multisel)
{ {
ArcGIS.Core.Geometry.Geometry geomsal = null; ArcGIS.Core.Geometry.Geometry geomsal = null;
string texto = ""; string texto = "";
@ -53,63 +56,75 @@ namespace OliviaAddInPro
texto = HelperGdb.TextoSal; texto = HelperGdb.TextoSal;
} }
} }
if (geomsal==null)
{
texto = Resource1.String_selec_capa;
if (HelperGdb.OutStr.Length > 0)
HelperGlobal.ponMsg(HelperGdb.OutStr, System.Windows.MessageBoxImage.Error);
}
_texto = texto; _texto = texto;
return geomsal; return geomsal;
} }
private ArcGIS.Core.Geometry.Geometry AbreGeom(out string texto)
{
//inicialmente
ArcGIS.Core.Geometry.Geometry geom = null;
texto = Resource1.String_selec_capa;
//abre
FeatureClass fc = HelperGdb.OpenFtClassDialog(HelperGdb.TiposOpenFileDlg.OpenFtrClassPolygon);
if (fc != null)
{
//hace geom
geom = SelecLeeGeom(fc, out texto, true);
if (geom == null && (HelperGdb.OutStr.Length > 0))
HelperGlobal.ponMsg(HelperGdb.OutStr, System.Windows.MessageBoxImage.Error);
HelperGdb.Free(fc);
}
return geom;
}
private void button_caparestr_Click(object sender, RoutedEventArgs e) private void button_caparestr_Click(object sender, RoutedEventArgs e)
{ {
FeatureClass fc = HelperGdb.OpenFtClassDialog(HelperGdb.TiposOpenFileDlg.OpenFtrClassPolygon); string texto = "";
string texto=""; ArcGIS.Core.Geometry.Geometry geom = AbreGeom(out texto);
if (DataContext is PaneLimpiezaSub2ViewModel mod)
OliviaGlob.Limp.GeomRestr = selecGeom(fc, out texto, true); {
mod.GeomRestr = geom;
}
label_caparestr.Content = texto; label_caparestr.Content = texto;
HelperGdb.Free(fc);
} }
private void button_capaniv_Click(object sender, RoutedEventArgs e) private void button_capaniv_Click(object sender, RoutedEventArgs e)
{ {
FeatureClass fc = HelperGdb.OpenFtClassDialog(HelperGdb.TiposOpenFileDlg.OpenFtrClassPolygon);
string texto = ""; string texto = "";
ArcGIS.Core.Geometry.Geometry geom = AbreGeom(out texto);
OliviaGlob.Limp.GeomNiv = selecGeom(fc, out texto, true); if (DataContext is PaneLimpiezaSub2ViewModel mod)
{
mod.GeomNiv = geom;
}
label_capaniv.Content = texto; label_capaniv.Content = texto;
HelperGdb.Free(fc);
} }
private void button_capazon_Click(object sender, RoutedEventArgs e) private void button_capazon_Click(object sender, RoutedEventArgs e)
{ {
FeatureClass fc = HelperGdb.OpenFtClassDialog(HelperGdb.TiposOpenFileDlg.OpenFtrClassPolygon);
string texto = ""; string texto = "";
ArcGIS.Core.Geometry.Geometry geom = AbreGeom(out texto);
OliviaGlob.Limp.GeomZon = selecGeom(fc, out texto, true); if (DataContext is PaneLimpiezaSub2ViewModel mod)
{
mod.GeomZon = geom;
}
label_capazon.Content = texto; label_capazon.Content = texto;
HelperGdb.Free(fc);
} }
private void button_capainst_Click(object sender, RoutedEventArgs e) private void button_capainst_Click(object sender, RoutedEventArgs e)
{ {
FeatureClass fc = HelperGdb.OpenFtClassDialog(HelperGdb.TiposOpenFileDlg.OpenFtrClassPoint);
string texto = ""; string texto = "";
ArcGIS.Core.Geometry.Geometry geomsal = selecGeom(fc, out texto, false);
if (geomsal != null && geomsal is MapPoint mp) ArcGIS.Core.Geometry.Geometry geomsal = AbreGeom(out texto);
if ((DataContext is PaneLimpiezaSub2ViewModel mod) && geomsal != null && geomsal is MapPoint mp)
{ {
OliviaGlob.Limp.CoordsInstal = mp.Coordinate2D; mod.CoordsInstal = mp.Coordinate2D;
} }
label_capainst.Content = texto; label_capainst.Content = texto;
HelperGdb.Free(fc);
} }
} }
} }

View File

@ -35,8 +35,8 @@
<ColumnDefinition Width="Auto" MinWidth="100"/> <ColumnDefinition Width="Auto" MinWidth="100"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Label Content="Nº de sectores" HorizontalAlignment="Left" Margin="15,0,0,0" VerticalAlignment="Top" Width="90" Height="30"/> <Label Content="Nº de sectores" HorizontalAlignment="Left" Margin="15,0,0,0" VerticalAlignment="Top" Width="90" Height="30"/>
<xctk:IntegerUpDown x:Name="spinner_nsect" Value="{Binding Path=NumSect, Mode = TwoWay}" Grid.Column="1" Height="20" Width="70" FormatString="N0" Increment="1" Maximum="20" Minimum="1" Margin="17,4,2,6" AllowTextInput ="False"/> <xctk:IntegerUpDown x:Name="spinner_nsect" Value="{Binding Path=NumSect, Mode = TwoWay}" Grid.Column="1" Height="20" Width="70" FormatString="N0" Increment="1" Maximum="30" Minimum="1" Margin="17,4,2,6" AllowTextInput ="False" IsEnabled="{Binding Path=EnableNSect, Mode = TwoWay}"/>
<CheckBox x:Name="checkBox_sectauto" Grid.Column="2" Margin="9,6,9,-1" Content="Automático" IsChecked="{Binding Path=CheckSectAuto, Mode = TwoWay}" Checked="checkBox_sectauto_Checked"/> <CheckBox x:Name="checkBox_sectauto" Grid.Column="2" Margin="9,6,9,-1" Content="Automático" IsChecked="{Binding Path=CheckSectAuto, Mode = TwoWay}"/>
</Grid> </Grid>
<CheckBox x:Name="checkBox_ajustsect" Margin="18,10,0,0" Content="Ajustar sectores a jornada" IsChecked="{Binding Path=CheckAjustSect, Mode = TwoWay}"/> <CheckBox x:Name="checkBox_ajustsect" Margin="18,10,0,0" Content="Ajustar sectores a jornada" IsChecked="{Binding Path=CheckAjustSect, Mode = TwoWay}"/>
<CheckBox x:Name="checkBox_ignorais" Margin="18,10,0,0" Content="Ignorar elementos aislados" IsChecked="{Binding Path=CheckIgnoAis, Mode = TwoWay}"/> <CheckBox x:Name="checkBox_ignorais" Margin="18,10,0,0" Content="Ignorar elementos aislados" IsChecked="{Binding Path=CheckIgnoAis, Mode = TwoWay}"/>

View File

@ -28,14 +28,14 @@ namespace OliviaAddInPro
private void checkBox_sectauto_Checked(object sender, RoutedEventArgs e) private void checkBox_sectauto_Checked(object sender, RoutedEventArgs e)
{ {
if(checkBox_sectauto.IsChecked ?? true) /*if(checkBox_sectauto.IsChecked ?? true)
{ {
spinner_nsect.IsEnabled = false; spinner_nsect.IsEnabled = false;
} }
else else
{ {
spinner_nsect.IsEnabled = true; spinner_nsect.IsEnabled = true;
} }*/
} }
} }
} }

View File

@ -44,6 +44,15 @@ namespace OliviaAddInPro
pane.Activate(); pane.Activate();
} }
internal static void Hide_()
{
DockPane pane = FrameworkApplication.DockPaneManager.Find(_dockPaneID);
if (pane == null)
return;
pane.Hide();
}
//The parameter passed to this method will be true if the Dockpane is being opened and it is false when you close the dockpane //The parameter passed to this method will be true if the Dockpane is being opened and it is false when you close the dockpane
protected override void OnShow(bool isVisible) protected override void OnShow(bool isVisible)
{ {

View File

@ -39,6 +39,15 @@ namespace OliviaAddInPro
pane.Activate(); pane.Activate();
} }
internal static void Hide_()
{
DockPane pane = FrameworkApplication.DockPaneManager.Find(_dockPaneID);
if (pane == null)
return;
pane.Hide();
}
//The parameter passed to this method will be true if the Dockpane is being opened and it is false when you close the dockpane //The parameter passed to this method will be true if the Dockpane is being opened and it is false when you close the dockpane
//also false the first time //also false the first time
protected override void OnShow(bool isVisible) protected override void OnShow(bool isVisible)

View File

@ -17,7 +17,7 @@ using ArcGIS.Desktop.Mapping;
namespace OliviaAddInPro namespace OliviaAddInPro
{ {
internal class PaneEjecutarViewModel : PanelViewModelBase public class PaneEjecutarViewModel : PanelViewModelBase
{ {
public PaneEjecutarViewModel() public PaneEjecutarViewModel()
{ {
@ -32,13 +32,6 @@ namespace OliviaAddInPro
get { return "Ejecutar"; } get { return "Ejecutar"; }
} }
private int numPtosCtrl;
public int NumPtosCtrl
{
get { return numPtosCtrl; }
set { base.SetProperty(ref numPtosCtrl, value, () => NumPtosCtrl); }
}
#endregion Properties #endregion Properties
} }
} }

View File

@ -19,10 +19,11 @@ using System.Collections.ObjectModel;
using OliviaAddInPro.Model; using OliviaAddInPro.Model;
using OliviaAddInPro.Helper; using OliviaAddInPro.Helper;
using ArcGIS.Desktop.Internal.Layouts.Utilities; using ArcGIS.Desktop.Internal.Layouts.Utilities;
using OliviaAddInPro.Services;
namespace OliviaAddInPro namespace OliviaAddInPro
{ {
internal class PaneLimpiezaSub1ViewModel : PanelViewModelBase, ILimpieza internal class PaneLimpiezaSub1ViewModel : PanelViewModelBase
{ {
private ObservableCollection<string> tiposTto = new ObservableCollection<string>(LimpiezaDef.tipos_tto_str); private ObservableCollection<string> tiposTto = new ObservableCollection<string>(LimpiezaDef.tipos_tto_str);
@ -51,6 +52,7 @@ namespace OliviaAddInPro
* Matriz que da true aquellos ámbitos de trabajo que están contemplados en .gdb una vez leida * Matriz que da true aquellos ámbitos de trabajo que están contemplados en .gdb una vez leida
*/ */
bool[] amb_tra_gdb = null; bool[] amb_tra_gdb = null;
private LimpiezaServ limpServ;
//implementan la interfaz Limpieza //implementan la interfaz Limpieza
private int selTto = -1; private int selTto = -1;
@ -196,6 +198,7 @@ namespace OliviaAddInPro
textVeloDespl = "10"; textVeloDespl = "10";
lblUdsTimeTto = "min"; lblUdsTimeTto = "min";
lblUdsVeloDespl = "km/h"; lblUdsVeloDespl = "km/h";
limpServ = new LimpiezaServ(null); //no hace falta instancia limp
} }
/** /**
@ -203,17 +206,21 @@ namespace OliviaAddInPro
*/ */
public void AbiertaCapa(string capa) public void AbiertaCapa(string capa)
{ {
capaElems = capa;
CapaAbierta = false; CapaAbierta = false;
CapaElems = string.Empty;
OpsAmbs.Clear();
Ambitos.Clear();
OliviaGlob.TipoEjec = OliviaGlob.TipoEjec | TiposEjecucion.Config; //lo reinicia, por si estaba después de planificar
if (string.IsNullOrEmpty(capa))
return;
//comprueba los campos de limpieza //comprueba los campos de limpieza
string ss = ""; if (!limpServ.CompruebaCamposLimp(capa))
if (!CompruebaCamposLimp(capa, out ss))
{ {
HelperGlobal.ponMsg(ss, System.Windows.MessageBoxImage.Warning); HelperGlobal.ponMsg(HelperGdb.OutStr, System.Windows.MessageBoxImage.Warning);
return; return;
} }
amb_tra_gdb = BuscAmbGdb(capa); amb_tra_gdb = limpServ.BuscAmbGdb(capa);
bool hay_alguno = false; bool hay_alguno = false;
foreach (bool b in amb_tra_gdb) foreach (bool b in amb_tra_gdb)
{ {
@ -230,10 +237,8 @@ namespace OliviaAddInPro
return; return;
} }
//hay elementos en la gdb //hay elementos en la gdb
OpsAmbs.Clear(); CapaElems = capa;
Ambitos.Clear();
CapaAbierta = true; CapaAbierta = true;
} }
/** /**
* Realiza los cambios en los ámbitos cuando se ha seleccionado un tratamiento * Realiza los cambios en los ámbitos cuando se ha seleccionado un tratamiento
@ -253,10 +258,14 @@ namespace OliviaAddInPro
RespCirc = LimpiezaDef.rest_circ[TipoTto]; RespCirc = LimpiezaDef.rest_circ[TipoTto];
if (LimpiezaDef.v_desplazamiento[TipoTto] > 0) if (LimpiezaDef.v_desplazamiento[TipoTto] > 0)
{
TextVeloDespl = Convert.ToString(LimpiezaDef.v_desplazamiento[TipoTto]); TextVeloDespl = Convert.ToString(LimpiezaDef.v_desplazamiento[TipoTto]);
}
else else
{
TextVeloDespl = Resource1.String_velo_nodef; TextVeloDespl = Resource1.String_velo_nodef;
} }
}
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
//rellena el combo de opciones de los ambitos //rellena el combo de opciones de los ambitos
@ -374,6 +383,7 @@ namespace OliviaAddInPro
&& amb_tra_gdb[(int)((AmbitsList)lista[i]).amb_i]; && amb_tra_gdb[(int)((AmbitsList)lista[i]).amb_i];
} }
Ambitos.ElementAt(i).IsChecked = check; Ambitos.ElementAt(i).IsChecked = check;
Ambitos.ElementAt(i).IsEnabled = amb_tra_gdb[(int)((AmbitsList)lista[i]).amb_i];
} }
} }
/** /**
@ -389,7 +399,7 @@ namespace OliviaAddInPro
if (TipoTto < (int)LimpiezaDef.TiposTto.TtoCustom) if (TipoTto < (int)LimpiezaDef.TiposTto.TtoCustom)
{ {
//pide un array de booleanos donde es true en las posiciones de los ámbitos comunes //pide un array de booleanos donde es true en las posiciones de los ámbitos comunes
amb_val = DameAmbTto(selTto); amb_val = limpServ.DameAmbTto(selTto);
//crea un array con el número de elementos del array anterior que sean true //crea un array con el número de elementos del array anterior que sean true
ambs_list = new ObservableCollection<AmbitsList>();//cuenta los trues ambs_list = new ObservableCollection<AmbitsList>();//cuenta los trues
//rellena el array apuntando los índices y los textos correspondientes a los trues //rellena el array apuntando los índices y los textos correspondientes a los trues
@ -477,7 +487,6 @@ namespace OliviaAddInPro
} }
catch (Exception) catch (Exception)
{ {
//MessageBox.Show("Error al poner los ámbitos", "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
return null; return null;
} }
@ -536,123 +545,6 @@ namespace OliviaAddInPro
} }
return true; 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, out string err_str)
{
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(pathCapa);
err_str = "";
if (fc == null)
{
err_str = "No se puede abrir la capa";
return false;
}
ObservableCollection<string> fields = HelperGdb.GetFields(fc).Result;
for (i = 0; i < NCAMPS; i++)
{
if (!fields.Contains(camps[i]))
{
err_str = "No se encuentra el campo " + 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;
}
/**
* Devuelve qué consulta hay que hacer, el filtro de los ámbitos y el nombre de la clase donde están
*/
public string dame_consul_amb_clas(out string ambitos, out string nom_class)
{
string consulta, orstr;
consulta = null;
ambitos = "";
orstr = null;
nom_class = null;
for (int i = 0; i < AmbitosSel.Length; i++)
{
if (AmbitosSel[i])
{
if (nom_class == null)
nom_class = LimpiezaDef.ftclass[i];
consulta = consulta + orstr + "(" + LimpiezaDef.filtro_str[i] + ")";
ambitos = ambitos + i.ToString("00");
if (orstr == null)
orstr = " OR ";
}
}
ambitos = "_A" + ambitos;
if (consulta == "()")
consulta = "";
return consulta;
}
} }

View File

@ -17,7 +17,7 @@ using ArcGIS.Desktop.Mapping;
namespace OliviaAddInPro namespace OliviaAddInPro
{ {
internal class PaneLimpiezaSub2ViewModel : PanelViewModelBase public class PaneLimpiezaSub2ViewModel : PanelViewModelBase
{ {
public PaneLimpiezaSub2ViewModel() public PaneLimpiezaSub2ViewModel()
{ {
@ -63,6 +63,22 @@ namespace OliviaAddInPro
get { return txtBuffExport; } get { return txtBuffExport; }
set { base.SetProperty(ref txtBuffExport, value, () => TxtBuffExport); } set { base.SetProperty(ref txtBuffExport, value, () => TxtBuffExport); }
} }
/**
* Geometría para el filtro de ámbitos, incluye zonas, se añaden los ámbitos que pertenecen a esa geom
*/
public Geometry GeomZon { get; set; } = null;
/**
* Geometría para el filtro de ámbitos, incluye zonas, se añaden los ámbitos que pertenecen a esa geom
*/
public Geometry GeomNiv { get; set; } = null;
/**
* Geometría para el filtro de ámbitos, incluye restricciones, se quitan los ámbitos que pertenecen a esa geom
*/
public Geometry GeomRestr { get; set; } = null;
/**
* Coordenadas de la instalación
*/
public Coordinate2D CoordsInstal { get; set; } = new Coordinate2D(0, 0);
#endregion Properties #endregion Properties
} }
} }

View File

@ -17,12 +17,14 @@ using ArcGIS.Desktop.Mapping;
namespace OliviaAddInPro namespace OliviaAddInPro
{ {
internal class PaneLimpiezaSub3ViewModel : PanelViewModelBase public class PaneLimpiezaSub3ViewModel : PanelViewModelBase
{ {
public PaneLimpiezaSub3ViewModel() public PaneLimpiezaSub3ViewModel()
{ {
numPtosCtrl = numSect = 3; numPtosCtrl = numSect = 3;
checkAjustSect = checkSectAuto = false; checkAjustSect = checkSectAuto = false;
checkIgnoAis = true;
enableNSect = true;
} }
@ -51,7 +53,18 @@ namespace OliviaAddInPro
public bool CheckSectAuto public bool CheckSectAuto
{ {
get { return checkSectAuto; } get { return checkSectAuto; }
set { base.SetProperty(ref checkSectAuto, value, () => CheckSectAuto); } set {
if (checkSectAuto)
EnableNSect = false;
else
EnableNSect = true;
base.SetProperty(ref checkSectAuto, value, () => CheckSectAuto); }
}
private bool enableNSect;
public bool EnableNSect
{
get { return enableNSect; }
set { base.SetProperty(ref enableNSect, value, () => EnableNSect); }
} }
private bool checkAjustSect; private bool checkAjustSect;

View File

@ -17,7 +17,7 @@ using ArcGIS.Desktop.Mapping;
namespace OliviaAddInPro namespace OliviaAddInPro
{ {
internal class PaneLimpiezaSub4ViewModel : PanelViewModelBase public class PaneLimpiezaSub4ViewModel : PanelViewModelBase
{ {
public PaneLimpiezaSub4ViewModel() public PaneLimpiezaSub4ViewModel()
{ {

View File

@ -6,27 +6,21 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using OliviaAddInPro.Helper;
namespace OliviaAddInPro namespace OliviaAddInPro
{ {
class PaneLimpiezaViewModel : PanelViewModelBase class PaneLimpiezaViewModel : PanelViewModelBase
{ {
private PaneLimpiezaSub1ViewModel _subPanel1ViewModel; private PaneLimpiezaSub1ViewModel _subPanel1ViewModel;
private PaneLimpiezaSub2ViewModel _subPanel2ViewModel;
private PaneLimpiezaSub3ViewModel _subPanel3ViewModel;
private PaneLimpiezaSub4ViewModel _subPanel4ViewModel;
private PaneEjecutarViewModel _subPanelEjec;
private PanelViewModelBase _subPanelEjecBase;
Limpieza limp; Limpieza limp;
public PaneLimpiezaViewModel() public PaneLimpiezaViewModel()
{ {
limp = OliviaGlob.Limp;
_subPanel1ViewModel = new PaneLimpiezaSub1ViewModel(); _subPanel1ViewModel = new PaneLimpiezaSub1ViewModel();
_subPanel2ViewModel = new PaneLimpiezaSub2ViewModel(); _subPanel2ViewModel = new PaneLimpiezaSub2ViewModel();
_subPanel3ViewModel = new PaneLimpiezaSub3ViewModel(); _subPanel3ViewModel = new PaneLimpiezaSub3ViewModel();
_subPanel4ViewModel = new PaneLimpiezaSub4ViewModel(); _subPanel4ViewModel = new PaneLimpiezaSub4ViewModel();
_subPanelEjec = new PaneEjecutarViewModel();
OptionsMenu = new ObservableCollection<OptionsMenuItem> OptionsMenu = new ObservableCollection<OptionsMenuItem>
{ {
@ -36,7 +30,7 @@ namespace OliviaAddInPro
new OptionsMenuItem(new BitmapImage(new Uri("pack://application:,,,/OliviaAddInPro;component/Resources/Panda32.png")), Resource1.String_tiempos, _subPanel4ViewModel) new OptionsMenuItem(new BitmapImage(new Uri("pack://application:,,,/OliviaAddInPro;component/Resources/Panda32.png")), Resource1.String_tiempos, _subPanel4ViewModel)
}; };
SelectedOption = OptionsMenu[0]; SelectedOption = OptionsMenu[0];
SubPanelEjec = _subPanelEjecBase=_subPanelEjec; limp = OliviaGlob.Limp;
} }
public override string DisplayName public override string DisplayName
{ {
@ -56,12 +50,6 @@ namespace OliviaAddInPro
set { SetProperty(ref _currentSubPanelPage, value, () => CurrentSubPanelPage); } set { SetProperty(ref _currentSubPanelPage, value, () => CurrentSubPanelPage); }
} }
public PanelViewModelBase SubPanelEjec
{
get { return _subPanelEjecBase; }
set { SetProperty(ref _subPanelEjecBase, value, () => SubPanelEjec); }
}
private OptionsMenuItem _selectionOption; private OptionsMenuItem _selectionOption;
public OptionsMenuItem SelectedOption public OptionsMenuItem SelectedOption
{ {
@ -77,22 +65,72 @@ namespace OliviaAddInPro
err_str = ""; err_str = "";
try try
{ {
///Lee el primer panel ////////////////////////////////////////////////////////////
/*limp.CapaElems = _subPanel1ViewModel.CapaElems; ///Lee el panel 1
limp.Ttto = _subPanel1ViewModel.SelTto; if(!_subPanel1ViewModel.CapaAbierta || string.IsNullOrEmpty(_subPanel1ViewModel.CapaElems))
if (limp.Ttto == (int)LimpiezaDef.TiposTto.TtoNoDef) {
err_str = "No se ha seleccionado ninguna Capa de Limpieza";
return false;
}
limp.CapaElems = _subPanel1ViewModel.CapaElems;
//lee el tipo tto
if (_subPanel1ViewModel.TipoTto == (int)LimpiezaDef.TiposTto.TtoNoDef)
{ {
err_str = "No se ha seleccionado ningún Tipo de Tratamiento"; err_str = "No se ha seleccionado ningún Tipo de Tratamiento";
return false; return false;
} }
//lee el ámbito seleccionado limp.TipoTto = _subPanel1ViewModel.TipoTto;
//lee el/los ámbito seleccionado
if (!_subPanel1ViewModel.lee_ambitos()) if (!_subPanel1ViewModel.lee_ambitos())
{ {
err_str = "No se ha seleccionado ningún Ámbito de trabajo"; err_str = "No se ha seleccionado ningún Ámbito de trabajo";
return false; return false;
} }
limp.AmbitosSel = _subPanel1ViewModel.AmbitosSel; limp.AmbitosSel = _subPanel1ViewModel.AmbitosSel;
*/ int i = 0;
for (i = 0; i < limp.AmbitosSel.Length; i++)
if (limp.AmbitosSel[i])
break;
if(i>= limp.AmbitosSel.Length)
{
err_str = "No se ha seleccionado ningún Ámbito de trabajo";
return false;
}
//lee si respeta circulacion
limp.RespCirc = _subPanel1ViewModel.RespCirc;
//lee velo de desplazamiento
int vv = -1;
if((!HelperGlobal.Str2Int(_subPanel1ViewModel.TextVeloDespl, out vv)) && (_subPanel1ViewModel.TextVeloDespl!=Resource1.String_velo_nodef))
{
err_str = "Error al leer la velocidad de desplazamiento";
return false;
}
if ((vv == 0) || (vv > LimpiezaDef.Parametros.v_despM) || (vv < LimpiezaDef.Parametros.v_despm))
{
err_str = "La velocidad de desplazamiento no está dentro de los límites configurados";
return false;
}
limp.VDespl = vv;
//lee tiempo de tto
if ((_subPanel1ViewModel.TimeTto == 0) ||
(_subPanel1ViewModel.TimeTto > LimpiezaDef.Parametros.t_ttoM) || (_subPanel1ViewModel.TimeTto < LimpiezaDef.Parametros.t_ttom))
{
err_str = "El tiempo de tratamiento no está dentro de los límites configurados";
return false;
}
limp.Ttto = _subPanel1ViewModel.TimeTto;
limp.UdsTTto = _subPanel1ViewModel.UdsTTto;
//lee las propiedades comunes a recogida
if (!LeeComun(limp,out err_str))
{
return false;
}
return true; return true;
} }
catch catch
@ -100,5 +138,21 @@ namespace OliviaAddInPro
return false; return false;
} }
} }
/**
* Acciones para comenzar ejecución
*/
public void Ejecuta(OliviaAddInPro.Services.ModosEjec modo)
{
string err = "";
if(!Lee(out err))
{
HelperGlobal.ponMsg(err);
return;
}
OliviaGlob.Limp.Ejecuta(modo);
}
} }
} }

View File

@ -5,6 +5,8 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Runtime.InteropServices.WindowsRuntime;
using OliviaAddInPro.Model;
namespace OliviaAddInPro namespace OliviaAddInPro
{ {
@ -14,9 +16,87 @@ namespace OliviaAddInPro
#region Properties #region Properties
public abstract string DisplayName { get; } public abstract string DisplayName { get; }
public PaneLimpiezaSub2ViewModel _subPanel2ViewModel;
public PaneLimpiezaSub3ViewModel _subPanel3ViewModel;
public PaneLimpiezaSub4ViewModel _subPanel4ViewModel;
#endregion Properties #endregion Properties
public bool LeeComun(TratamientoComun com, out string err_str)
{
err_str = string.Empty;
////////////////////////////////////////////////////////////
///Lee el panel 2
///Lee las capas
com.GeomRestr = _subPanel2ViewModel.GeomRestr;
if (com.GeomRestr!=null)
com.TextGeomRestr = _subPanel2ViewModel.LblCapaRestr;
com.GeomNiv = _subPanel2ViewModel.GeomNiv;
if (com.GeomNiv != null)
com.TextGeomNiv = _subPanel2ViewModel.LblCapaNiv;
com.GeomZon = _subPanel2ViewModel.GeomZon;
if (com.GeomZon != null)
com.TextGeomZon = _subPanel2ViewModel.LblCapaZon;
com.CoordsInstal = _subPanel2ViewModel.CoordsInstal;
//lee el buffer de export
if ((_subPanel2ViewModel.TxtBuffExport <= 0) || (_subPanel2ViewModel.TxtBuffExport > 100000))
{
err_str = "El buffer de exportación no está dentro de los límites configurados";
return false;
}
com.BuffExport = _subPanel2ViewModel.TxtBuffExport;
////////////////////////////////////////////////////////////
///Lee el panel 3
if (_subPanel3ViewModel.CheckSectAuto)
com.NSect = 0; //envía 0 si es sector automat
else
{
com.NSect = _subPanel3ViewModel.NumSect; //limitado entre 1 y 30 por código del spinner
if (_subPanel3ViewModel.CheckAjustSect)
com.NSect = com.NSect * (-1);//lo envía negativo si es ajustar a sectores
}
com.NPtosCtrl = _subPanel3ViewModel.NumPtosCtrl; //limitado entre 3 y 10 por código del spinner
com.IgnoAis = _subPanel3ViewModel.CheckIgnoAis;
////////////////////////////////////////////////////////////
///Lee el panel 4
//lee los tiempos
com.TDescarg = PanelGlobal.Hm_DateTime2int(_subPanel4ViewModel.TimeCargDesc);
if ((com.TDescarg == 0) || (com.TDescarg > LimpiezaDef.Parametros.t_cardescM) || (com.TDescarg < LimpiezaDef.Parametros.t_cardescm))
{
err_str = "El valor introducido para el tiempo de carga y descarga no es válido.";
return false;
}
com.TDesplIniFin = PanelGlobal.Hm_DateTime2int(_subPanel4ViewModel.TimeDespIniFin);
if ((com.TDesplIniFin == 0) || (com.TDesplIniFin > LimpiezaDef.Parametros.t_despM) || (com.TDesplIniFin < LimpiezaDef.Parametros.t_despm))
{
err_str = "El valor introducido para el tiempo de desplazamiento no es válido.";
return false;
}
com.TDescan = PanelGlobal.Hm_DateTime2int(_subPanel4ViewModel.TimeDescPers);
if ((com.TDescan == 0) || (com.TDescan > LimpiezaDef.Parametros.t_descansoM) || (com.TDescan < LimpiezaDef.Parametros.t_descansom))
{
err_str = "El valor introducido para el tiempo de descanso no es válido.";
return false;
}
com.TConv = PanelGlobal.Hm_DateTime2int(_subPanel4ViewModel.TimeJornadaConv);
if ((com.TConv == 0) || (com.TConv > LimpiezaDef.Parametros.t_convM) || (com.TConv < LimpiezaDef.Parametros.t_convm))
{
err_str = "El valor introducido para el tiempo de trabajo por convenio no es válido.";
return false;
}
com.HIni = PanelGlobal.Hm_DateTime2int(_subPanel4ViewModel.TimeIniJornada);
//porcent reducc traf
com.Trafico = _subPanel4ViewModel.TextPercentTrafico;
if ((com.Trafico <= 0) || (com.Trafico > 100))
{
err_str = "El porcentaje de tráfico en las vías no está dentro de los límites configurados";
return false;
}
return true;
}
} }
//****************************************************** //******************************************************
@ -31,31 +111,7 @@ namespace OliviaAddInPro
/** /**
* Dado un tiempo en minutos devuelve las horas modulo 60 y los minutos restantes * Dado un tiempo en minutos devuelve las horas modulo 60 y los minutos restantes
*/ */
/*public static string Hm_int2str(double t)
{
int[] hm = { 0, 0 };
hm[0] = (int)(t / 60);
hm[1] = (int)(t - hm[0] * 60);
return String.Format("%dd h %dd m", hm[0], hm[1]);
}
public static int Hm_str2int(string hm)
{
int h = 0;
int m = 0;
int t = 0;
Match match = Regex.Match(hm, "^([0-9]+).([0-9]+).([0-9]+) ([0-9]+):([0-9]+):([0-9]+)");
if (match.Success)
{
h = int.Parse(match.Groups[4].Value);
m = int.Parse(match.Groups[5].Value);
t = h * 60 + m;
}
return t;
}*/
public static DateTime Hm_int2DateTime(double t) public static DateTime Hm_int2DateTime(double t)
{ {
int[] hm = { 0, 0 }; int[] hm = { 0, 0 };
@ -76,6 +132,7 @@ namespace OliviaAddInPro
t = h * 60 + m; t = h * 60 + m;
return t; return t;
} }
} }
} }