using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OliviaDef;

using ESRI.ArcGIS.Geometry;

namespace OliviaAddIn
{
    /**
    *	@file Limpieza.cs
    *	Clase de las variables asociadas a la limpieza viaria.
    *	Contiene definiciones, nombres de campos, y las opciones configuradas en la ventana.
    */

    //*************************************************************************************
    /**
    *	Clase de las variables asociadas a la limpieza viaria.
    *	Contiene definiciones, nombres de campos, y las opciones configuradas en la ventana.
    */
    public class Limpieza : Comun
    {        
        //*************************************************************************************
        //Variables        
        /**
         * Ámbitos de trabajo elegidos
         */
        public bool[] amb_tra_sel = new bool[(int)LimpiezaDef.AmbitsTra.AmbN];
        /**
         * Texto cuando no se ha seleccionado capa de niveles
         */
        public string text_selec_nive = "Capa de niveles";
        /**
        * Geometría que componen la selección de niveles, null si ninguno
        */
        public IGeometry geom_niveles = null;
        /**
         * String que almacena qué niveles se han seleccionado
         */
        public string text_niv = "";
        //*************************************************************************************      
        /**
         * Tipo de tratamiento elegidos
         */
        public int tipo_tto = -1;
        /**
        * Ancho de vía, en metros
        */
        public double ancho_via = LimpiezaDef.Parametros.ancho_via;
        /**
         * Tiempo de tratamiento, en minutos
         */
        public double t_tto = 5;
        /**
         * Tipo de unidades del tiempo de tto
         */
        public int uds_t_tto = (int)GeneralDef.OlvTiposTto.OlvTipTtoNoDef;
        /**
         * Velocidad de desplazamiento, en km/h. Si es 0, es determinada por la vía
         */
        public double v_despl = 0;
        /**
        * Umbral predeterminado para la recogida de basuras
        */
        public double umbral_basura = LimpiezaDef.Parametros.umbral_reco;
        /**
         * Matriz que da si los tratamientos tienen en cuenta las restricciones de circulación o no
         */
        public bool[] rest_circ;
        /**
         * Matriz que da si los tratamientos tienen en cuenta las restricciones de circulación o no
        */
        public bool[] t_carg_desc;
        /**
         * Indica si se ha marcado el checkbox para que se recojan únicamente aquellos contendores que superan un umbral de carga.
         */
        public bool umbral_reco_conten = false;        
        /**
         * Array que indica qué ámbitos tiene cada opción, mediante true en las posiciones de los ámbitos válidos
         */
        public struct AmbsValOps
        {
            public bool[] ambs; 
        };
        /**
         * Definición de tipo para la matriz que da los ámbitos
         * Donde hay n opciones y cada opción un array de booleanos que indican con true si esa opción tiene ese ámbito
         */
        public struct AmbsVal
        {
            public int          n_ops;
            public AmbsValOps[] ambs_ops;
        };
        /**
         * Matriz que da los ámbitos correspondientes a los tipos de tratamiento
         */
        public AmbsVal[] ambs_val;
        //*************************************************************************************
        //Métodos
        public Limpieza()
        {
            inicia_matr_amb();
            inicia_matr_restr();
            inicia_matr_carg_desc();
        }

        /**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[] dame_amb(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 < ambs_val[tto].n_ops && !sig; i++)
                {
                    if (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;
        }

        /**
         * Inicializa la matriz que da las restricciones de circulación de los tipos de tratamiento
         */
        private void inicia_matr_restr()
        {
            rest_circ = new bool[(int)LimpiezaDef.TiposTto.TtoN];//se inician a false
            rest_circ[(int)LimpiezaDef.TiposTto.TtoBarrMecCalz] = true;
            rest_circ[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz] = true;
            rest_circ[(int)LimpiezaDef.TiposTto.TtoBaldMecCalz] = true;
            rest_circ[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz] = true;
            rest_circ[(int)LimpiezaDef.TiposTto.TtoCaidaHoja] = true;
            rest_circ[(int)LimpiezaDef.TiposTto.TtoPapeVaci] = true;
            rest_circ[(int)LimpiezaDef.TiposTto.TtoPapeLimp] = true;
            rest_circ[(int)LimpiezaDef.TiposTto.TtoLimpCont] = true;
            rest_circ[(int)LimpiezaDef.TiposTto.TtoLimpZInf] = true;
            rest_circ[(int)LimpiezaDef.TiposTto.TtoLimpPipi] = true;
            rest_circ[(int)LimpiezaDef.TiposTto.TtoLimpSane] = true;
        }

        /**
         * Inicializa la matriz que da los ámbitos correspondientes a los tipos de tratamiento
         */
        private void inicia_matr_amb()
        {
            //crea la matriz
            ambs_val = new AmbsVal[(int)LimpiezaDef.TiposTto.TtoN];

            //va creando los arrays de cada elemento de la matriz correspondiente a un tipo de tratamiento
            
            //Barrido manual
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMan].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMan].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMan].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMan].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMan].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMan].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMan].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbCallePeatMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMan].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbCallePeatNoMec] = true;

            //Barrido manual de mantenimiento
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMant].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMant].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMant].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMant].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMant].ambs_ops[0].ambs = ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMan].ambs_ops[0].ambs;//igual que el manual
            //igual que el manual

            //Barrido manual motorizado
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMot].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMot].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMot].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMot].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMot].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMot].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMot].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMot].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbCallePeatMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMot].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbCallePeatNoMec] = true;

            //Barrido mecánico de calzadas
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMecCalz].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMecCalz].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMecCalz].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMecCalz].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMecCalz].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordLibreMec] = true;

            //Barrido mecánico de aceras y calzadas peatonales
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMecAcYCalzP].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMecAcYCalzP].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMecAcYCalzP].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMecAcYCalzP].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMecAcYCalzP].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMecAcYCalzP].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbCallePeatMec] = true;

            //Barrido mixto de aceras y calzadas
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].n_ops = 4;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;

            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[1].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;

            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[2].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[2].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[2].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordLibreMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[2].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;

            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[3].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[3].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[3].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordLibreMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[3].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz].ambs_ops[3].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;

            //Baldeo manual
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMan].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMan].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMan].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMan].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMan].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMan].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbCallePeatMec] = true;

            //Baldeo mecánico de calzadas
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecCalz].n_ops = 2;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecCalz].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecCalz].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecCalz].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecCalz].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecCalz].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordLibreMec] = true;

            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecCalz].ambs_ops[1].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecCalz].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbEjeCalle] = true;

            //Baldeo mecánico de aceras y calzadas peatonales
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecAcYCalzP].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecAcYCalzP].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecAcYCalzP].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecAcYCalzP].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecAcYCalzP].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMecAcYCalzP].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbCallePeatMec] = true;
                        
            //Baldeo mixto de aceras y calzadas
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].n_ops = 4;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;

            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[1].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;

            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[2].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[2].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[2].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordLibreMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[2].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;

            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[3].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[3].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[3].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordLibreMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[3].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz].ambs_ops[3].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;

            //Fregado mecánico de aceras y calzadas peatonales
            ambs_val[(int)LimpiezaDef.TiposTto.TtoFregMecAcYCalzP].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoFregMecAcYCalzP].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoFregMecAcYCalzP].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoFregMecAcYCalzP].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoFregMecAcYCalzP].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoFregMecAcYCalzP].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbCallePeatMec] = true;

            
            //Caída de la hoja
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].n_ops = 3;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            //No están especififacadas las características de la opción 1 ?
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbEjeCalle] = true;

            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops[1].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordLibreMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;

            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops[2].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops[2].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops[2].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordLibreMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops[2].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCaidaHoja].ambs_ops[2].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;

            //Vaciado de papeleras
            ambs_val[(int)LimpiezaDef.TiposTto.TtoPapeVaci].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoPapeVaci].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoPapeVaci].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoPapeVaci].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoPapeVaci].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbPape] = true;

            //Limpieza de papeleras
            ambs_val[(int)LimpiezaDef.TiposTto.TtoPapeLimp].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoPapeLimp].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoPapeLimp].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoPapeLimp].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoPapeLimp].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbPape] = true;

            //Limpieza de ubicación de contenedores
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpCont].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpCont].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpCont].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpCont].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpCont].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbConte] = true;

            //<Limpieza de zonas infantiles
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpZInf].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpZInf].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpZInf].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpZInf].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpZInf].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbZInf] = true;

            //<Limpieza de pipicanes
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpPipi].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpPipi].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpPipi].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpPipi].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpPipi].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbPipi] = true;

            //<Limpieza y reposición de sanecanes
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpSane].n_ops = 1;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpSane].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpSane].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpSane].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoLimpSane].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbSane] = true;

            //<Tratamiento personalizado
            //se pone 3 opciones para generar el array de booleanos para poder elegir ambitos lienales, puntutales o eje de calle.
            //realmente son opciones comunes a todos los tratamientos y no exclusivos de TtoCustom
            //se aprovecha que está creado el array de booleanos para rellenar las opciones golobales a todos los tratamientos
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].n_ops = 3;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops = new AmbsValOps[ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].n_ops];
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[0].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordLibreMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordLibreNoMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordAparc] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbAceNoMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbCallePeatMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbCallePeatNoMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordHojaMec] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[0].ambs[(int)LimpiezaDef.AmbitsTra.AmbBordHojaNoMec] = true;

            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[1].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbConte] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbPape] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbZInf] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbPipi] = true;
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[1].ambs[(int)LimpiezaDef.AmbitsTra.AmbSane] = true;

            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[2].ambs = new bool[(int)LimpiezaDef.AmbitsTra.AmbN]; //se inicializa todo a false
            ambs_val[(int)LimpiezaDef.TiposTto.TtoCustom].ambs_ops[2].ambs[(int)LimpiezaDef.AmbitsTra.AmbEjeCalle] = true;
        }

        /**
         * Inicializa la matriz booleana que habilita o deshabilita el timechecker del tiempo de carga y descarga, dependiendo del tipo de tratamiento
         */
        private void inicia_matr_carg_desc()
        {
            t_carg_desc = new bool[(int)LimpiezaDef.TiposTto.TtoN]; //se inician a false
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoBarrMan] = false;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoBarrMant] = false;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoBarrMot] = true;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoBarrMecCalz] = true;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoBarrMecAcYCalzP] = true;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoBarrMixAcYCalz] = true;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoBaldMan] = true;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoBaldMecCalz] = true;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoBaldMecAcYCalzP] = true;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoBaldMixAcYCalz] = true;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoFregMecAcYCalzP] = true;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoCaidaHoja] = true;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoPapeVaci] = false;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoPapeLimp] = false;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoLimpCont] = false;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoLimpZInf] = false;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoLimpPipi] = false;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoLimpSane] = false;
            t_carg_desc[(int)LimpiezaDef.TiposTto.TtoCustom] = true;
        }
        
    }
}
