OliviaAddIn/OliviaAddIn/Comun.cs

268 lines
9.8 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.DataSourcesGDB;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Catalog;
namespace OliviaAddIn
{
/**
* Elementos comunes a Limpieza y Recogida
*/
public class Comun
{
//*************************************************************************************
//Variables
/**
* Texto cuando no se ha seleccionado instalación
*/
public string text_selec_instal = "Instalación de salida/llegada";
/**
* Coordenadas de la instalación de partida, si las huibiera, 0 si no
*/
public double[] coords_instala = new double[2];
/**
* Texto cuando no se ha seleccionado capa de restricciones
*/
public string text_selec_rest = "Capa de restric. circ.";
/**
* Geometría que componen las restricciones de acceso, null si nunguna
*/
public IGeometry geom_rest_acces = null;
/**
* Texto cuando no se ha seleccionado capa de zonas
*/
public string text_selec_zonas = "Capa de zonas";
/**
* Geometría que componen las zonas seleccionadas, null si nunguna
*/
public IGeometry geom_zonas = null;
/**
* Texto cuando no se ha seleccionado capa de limpieza otra
*/
public string text_capa_limp = "Cambiar capa de limpieza...";
/**
* String de errores de ejecución
*/
public string err_st = null;
/**
* Tiempo de trabajo al día por convenio, en minutos
*/
public double t_conv = LimpiezaDef.Parametros.t_conv;
/**
* Tiempo de descanso del personal, en minutos
*/
public double t_descan = LimpiezaDef.Parametros.t_descanso;
/**
* Tiempo de carga y descarga, en minutos
*/
public double t_descarg = LimpiezaDef.Parametros.t_cardesc;
/**
* Tiempo de desplazamiento inicio/fin a las instalaciones, en minutos
*/
public double t_despl_insta = LimpiezaDef.Parametros.t_desp;
/**
* hora de inicio de la jornada de trabajo, en minutos
*/
public double h_ini = 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
*/
public double trafico = 80;
/**
* Número de puntos de control
*/
public int n_ptsctrl = 3;
/**
* Número de sectores por defecto
*/
public int n_secdef = 3;
/**
* Parámentro que indica si se tendrán en cuenta en el estudio los elementos aislados. Si 1 se descartan aislados. Si 0 se tienen en cuenta en el cálculo.
*/
public int aislados = -1;
/**
* String que almacena qué zonas se han seleccionado
*/
public string text_zon = "";
/**
* String que almacena qué restricciones se han seleccionado
*/
public string text_restr = "";
/**
* Path de la clase de los ámbitos
*/
//*************************************************************************************
//Funciones
/**
* Para la selección de puntos de instalación
* Abre el dialogo de selección de capa y el form para seleccionar campo a leer y valor del campo
*/
public bool selec_instal(string title, int wnd_handle, out string text_sal, out double x, out double y)
{
ListCamposVal list;
IFeature f = null;
IFeatureClass fc = null;
IGeometry geom = null;
list = new ListCamposVal(title, wnd_handle, esriGeometryType.esriGeometryPoint);
text_sal = "";
x = y = 0;
try
{
IPoint instalacion;
string campo, clase_path, st;
int elem;
int[] ids;
clase_path = null;
campo = st="";
ids = null;
elem = -1;
clase_path = list.selec_capa();
if (clase_path != null)
{
elem = list.selec_campo(out campo);
if (elem > -1 && campo != null)
{
elem = list.selec_valor_campo(campo, out st);
if (elem > -1)
{
ids = FunGDB.dame_ids_consulta(clase_path, ""); //consulta todos
if (ids != null)
{
fc=FunGDB.abre_ftclass(clase_path);
if (fc != null)
{
f = fc.GetFeature(ids[elem]);
geom = f.Shape;
geom = FunGDB.reproyecta(geom, OliviaGlob.coorsys);//reproyecta por si hace falta
instalacion = (IPoint)geom;
x = instalacion.X;
y = instalacion.Y;
text_sal = st;
}
}
}
}
}
}
catch (Exception)
{
x = 0;
}
FunGDB.libera(fc);
FunGDB.libera(geom);
FunGDB.libera(f);
if (x==0) //algo ha ido mal
{
MessageBox.Show("Error al seleccionar capa de instalaciones. " + list.err_st, "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
return true;
}
/**
* Para la selección de capas de polígonos
* Abre el dialogo de selección de capa y el form para seleccionar campo a leer y valor del campo
* Permite multiselección
* Tiene que mostrar valores únicos, no repetidos
* Devuelve la geom resultante
* En text_sal van concatenados los valores que se han seleccionado unidos por '_'
*/
public bool selec_polig(string title, int wnd_handle, out string text_sal, out IGeometry geom_sal)
{
ListCamposVal list;
IFeature f = null;
IFeatureClass fc = null;
IGeometry geom = null;
list = new ListCamposVal(title, wnd_handle, esriGeometryType.esriGeometryPolygon);
text_sal = "";
geom_sal = null;
try
{
string campo, clase_path, consulta;
string[] val_st;
int nval;
int[] ids, val_ids;
int i,j;
bool is_str = true;
clase_path=null;
campo=consulta="";
val_st=null;
val_ids=ids=null;
nval=-1;
clase_path = list.selec_capa();
if (clase_path != null)
{
nval = list.selec_campo(out campo);
if (nval > -1 && campo != null)
{
//mira a ver si el campo es str
is_str = FunGDB.is_str_field(clase_path,campo);
nval = list.selec_valores_campo(campo,out val_ids, out val_st);//valores únicos
if (nval > 0)
{
//se embucla para unir las geoms
for (i = 0; i < nval; i++)
{
if(is_str)
consulta = campo + " = '" + val_st[i] + "'";
else
consulta = campo + " = " + val_st[i];
ids = FunGDB.dame_ids_consulta(clase_path, consulta);
fc = FunGDB.abre_ftclass(clase_path);
if ((ids != null) && (fc != null))
{
for(j=0;j<ids.Length;j++)
{
f = fc.GetFeature(ids[j]);
geom = f.Shape;
geom_sal = FunGDB.une_geoms(geom_sal, geom);
FunGDB.libera(f);
}
geom_sal = FunGDB.reproyecta(geom_sal, OliviaGlob.coorsys);//reproyecta por si hace falta
}
FunGDB.libera(fc);
//Actualiza el texto de salida
text_sal = text_sal + val_st[i].Replace(" ", string.Empty);
/*if(i<(nval-1))//si es el último no le pone '_'
text_sal = text_sal + "_";*/
}
}
}
}
}
catch (Exception)
{
geom_sal = null;
}
FunGDB.libera(fc);
FunGDB.libera(f);
if (geom_sal==null)
{
MessageBox.Show("Error al seleccionar capa de polígonos. " + list.err_st, "Olivia", MessageBoxButtons.OK, MessageBoxIcon.Error);
return false;
}
return true;
}
}
}