<commit_before># CTC
Simulador de un Control de Tráfico Centralizado

Esta aplicación simula el tablero mímico de una central de Control de Tráfico Centralizado (CTC).

El menú se abre del icono de las tres barras en el extremo izquierdo. Los sectores disponibles se muestran bajo el encabezado "Recientes" pues en su momento ese item habrá de mostrar los que el usuario ha usado más recientemente, mientras que los sectores se desplegarán de otra lista más larga.  Como sólo hay dos, entonces, no valía la pena agregar compllicaciones.

El globito de dialogo a la derecha mostrará el teletipo.  Por ahora solo lo muestra, pero no hay nada que envíe mensajes al mismo, por lo que siempre está en blanco.

Una de las opciones del menu es Login. Por el momento el único efecto es mostrar el nombre de usuario y, si la tiene, su foto, en lugar del monigote anónimo y el alias `guest` a la derecha.

Si se selecciona un sector (sugiero Constitución) mostrará el nombre en la barra azul y el mímico en el panel central.

Algunas de las celdas están activa, los cambios y también las señales.  Al hacer click en cualquiera de ellas se abre un panel a la derecha mostrando las opciones.

Si se pulsa cualquiera de los botones para cambiar la posición del cambio, se mostrará el efecto de inmediato y tras una ligera demora se propagarán los enclavamientos que tenga configurado, cambiarán las luces de los semaforos y otros cambios vinculados.

Tanto celdas como las senales dentro de las celdas se pueden poner en manual.  En ese caso, se pueden mover a mano, pero no responden al enclavamiento propagado desde otras celdas. La celda o senal tendrán un halo en rosa para indicar el estado manual.  Al salir de manual, se deberían propagar los enclavamientos pendientes.

Para volver al mímico, basta hacer click en cualquier lugar del tablero.

La opción Admin Sectores permite agregar, actualizar o borrar nuevos sectores.  Si se agrega un sector con un identificador ya existente, actualizará ese sector. Se recomienda llamar al archivo por el mismo identificador del sector.

----

La configuración de los diversos sectores está dada por archivos en formato [JSON](http://www.json.org/).

* [Descripción de un sector](#descripci%C3%B3n-de-un-sector)
	* [Celdas](#celdas)
		* [Línea](#linea)
		* [Cambio](#cambio)
		* [Paragolpe](#paragolpe)
		* [Cruce](#cruce)
		* [Triple](#triple)
	* [Señales](#se%C3%B1ales)
	* [Enclavamientos](#enclavamientos)
		* [Apareados](#apareados)
		* [Cambio a señal](#cambio-a-se%C3%B1al)


Acorde al estándar del formato JSON, todos los nombres de propiedades han de estar entrecomillados.

Los valores de las claves de este diccionario se corresponden a los nombres de archivo a los cuales ha de agregársele la extensión `.json`.  Así pues, la entrada `"constitucion"` corresponde al archivo `data/constitucion.json`. Las claves del diccionario así como los nombres de los archivos deben ser únicos dentro de la aplicación.  Ninguno de ellos se muestra al usuario y no se recomienda el uso de caracteres que pudieran causar problemas de portabilidad entre sistemas operativos, tales como vocales acentuadas o incluso espacios en blanco.

## Descripción de un sector

Cada sector está descrito en un archivo en formato JSON.

El encabezado contiene información global sobre el sector, en particular:

* `idSector`: El identificador único del sector. Este se usará internamente, el usuario no debería verlo nunca. Basta que sea único.  Usualmente es el mismo que el nombre del archivo en que está contenido, por ello, conviene que tenga caracteres válidos como nombre de archivo.
* `descrCorta`: Un texto breve que describa el sector. Se usará, por ejemplo, en el menú.
* `descr`: El nombre completo del sector.
* `alto`: El número de celdas que ocupa este sector en altura.
* `ancho`: El número de celdas que ocupa este sector a lo ancho.
* `celdas`: Un objeto que describe cada una de las celdas.

El valor de `descr` se mostrará en la solapa.  A diferencia del nombre de archivo, que el usuario no verá, este se mostrará en la solapa y debe ser legible.  Por ello, el archivo `constitucion.json` tiene como descripción en su encabezado: `"descr": "Constitución"`, con mayúscula y acento.

La imagen que representa el sector se ajustará para ocupar el máximo espacio posible dentro de la pantalla basándose en el `alto` y `ancho` declarados en el encabezado.

Por ejemplo, el archivo `constitucion.json` contendrá la siguiente descripción:

	{
	  "idSector": "constitucion",
	  "descrCorta": "Constitución",
	  "descr": "Estación Constitución, Ciudad de Buenos Aires, Argentina",
	  "ancho": 16,
	  "alto": 7,
		"celdas": [{
		...
		}]
	}

El orden de las propiedades es indistinto, pueden darse en cualquier orden. Eso se aplica a todo el archivo.

### Celdas

Cada sector esta compuesto de varias celdas.  No es necesario declarar las celdas vacías, así pues el número de celdas en esta sección es habitualmente menor que el producto de `alto` * `ancho` del encabezado pues las celdas vacías no necesitan declararse.

La configuración de las celdas está formada por la propiedad `celdas` que apunta a un *arreglo* (array) de propiedades de cada celda.  Toda celda debe tener al menos las siguiente propiedades:

* `coords`: un par de números separados por coma indicando las coordenadas `X` e `Y` de la celda, contando desde cero con la celda `"0,0"` ubicada arriba a la izquierda.
* `tipo`: indica el tipo de celda.  El resto de las propiedades de la celda depende del tipo, según se verá a continuación.

La mayoría de las celdas pueden tener otras propiedades opcionales independientemente de su tipo, a saber [senales](#senales) o [enclavamientos](#enclavamientos).

Por ejemplo, el tipo más simple de celda es el que contiene una simple línea:

	"celdas": [
		...,
		{
			"coords": "5,0"
			"tipo": "linea",
			"descr": "XVI-b",
			"desde": {
				"dir":"N",
			},
			"hacia": {
				"dir":"S"
			}
		},
		...

Dentro de la lista de `celdas` la que se encuentra en la coordenada `5,0`  contiene un tramo de vía simple que va de norte `N` a sur `S`.  La leyenda `XVI-b` se mostrará en una esquina de la celda, si no se proveyera, simplemente se mostrará la coordenada.  Cada tramo de vía se define con al menos la propiedad `dir` (direción) que señala a alguno de los puntos cardinales.  

Todas las celdas son más o menos cuadradas.  Todos los segmentos de vías que contienen irradian del centro de ese cuadrado hacia una de 8 posibles direcciones, las cuatro esquinas y los puntos intermedios de los lados.  Estos extremos se los llama por su coordenada geográfica.   Aún así, todas las líneas pasan por el centro del cuadrado.  Es obvio que una línea de norte a sur como la del ejemplo cruzará por el centro del cuadrado, pero también lo hará una que vaya de norte a este.  En lugar de hacer un simple trazo en diagonal uniendo estos lados, la celda se graficará con dos segmentos, uno desde el arriba (*norte*) hasta el centro y otro del centro a la derecha (*este*).

	NW  N  NE
	  \ | /
	W - . - E
	  / | \
	SW  S  SE

Los tipos de celdas son:

#### linea

Contiene una vía con una única entrada y una única salida, sin cambios o desvíos. Requiere las propiedades `desde` y `hacia` que contendrán la propiedad `dir` indicando los puntos geográficos que une.  Los nombres `desde` y `hacia` son arbitrarios y no señalan el sentido del tráfico en la línea.

Ej.:

	{
		"coords": "5,0"
		"tipo": "linea",
		"descr": "XVI-b",
		"desde": {
			"dir":"N",
		},
		"hacia": {
			"dir":"S"
		}
	}

#### Cambio

Contiene una vía con una entrada, la `punta` y dos `ramas`, una `normal` y otra `desviado`.  Si bien la salida `normal` suele ser la opuesta a la `punta` esto no es obligatorio.

La propiedad opcional `posicion` indica la posición del cambio y su valor debe corresponder a alguna de las ramas.  Por defecto, es `normal`.

La propiedad opcional `manual` excluye al cambio de cualquier automatismo (ver [Enclavamientos](#Enclavamientos) más adelante) y sólo responderá a comandos manuales.  Habitualmente, este valor es establecido dinámicamente desde el tablero mímico. Por defecto es `false`.  Si se indica, el valor `true` of `false` no debe ir entrecomillado, dado que es un booleano, no una cadena de caracteres (o sea: `"manual": true,`)

Ej:

	{
		"coords": "8,3",
		"tipo": "cambio",
		"posicion": "normal",
		"punta": {
			"dir": "SE"
		},
		"ramas": {
			"normal": {
				"dir": "NW"
			},<commit_msg>fixed broken internal links<commit_after># CTC
Simulador de un Control de Tráfico Centralizado

Esta aplicación simula el tablero mímico de una central de Control de Tráfico Centralizado (CTC).

El menú se abre del icono de las tres barras en el extremo izquierdo. Los sectores disponibles se muestran bajo el encabezado "Recientes" pues en su momento ese item habrá de mostrar los que el usuario ha usado más recientemente, mientras que los sectores se desplegarán de otra lista más larga.  Como sólo hay dos, entonces, no valía la pena agregar compllicaciones.

El globito de dialogo a la derecha mostrará el teletipo.  Por ahora solo lo muestra, pero no hay nada que envíe mensajes al mismo, por lo que siempre está en blanco.

Una de las opciones del menu es Login. Por el momento el único efecto es mostrar el nombre de usuario y, si la tiene, su foto, en lugar del monigote anónimo y el alias `guest` a la derecha.

Si se selecciona un sector (sugiero Constitución) mostrará el nombre en la barra azul y el mímico en el panel central.

Algunas de las celdas están activa, los cambios y también las señales.  Al hacer click en cualquiera de ellas se abre un panel a la derecha mostrando las opciones.

Si se pulsa cualquiera de los botones para cambiar la posición del cambio, se mostrará el efecto de inmediato y tras una ligera demora se propagarán los enclavamientos que tenga configurado, cambiarán las luces de los semaforos y otros cambios vinculados.

Tanto celdas como las senales dentro de las celdas se pueden poner en manual.  En ese caso, se pueden mover a mano, pero no responden al enclavamiento propagado desde otras celdas. La celda o senal tendrán un halo en rosa para indicar el estado manual.  Al salir de manual, se deberían propagar los enclavamientos pendientes.

Para volver al mímico, basta hacer click en cualquier lugar del tablero.

La opción Admin Sectores permite agregar, actualizar o borrar nuevos sectores.  Si se agrega un sector con un identificador ya existente, actualizará ese sector. Se recomienda llamar al archivo por el mismo identificador del sector.

----

La configuración de los diversos sectores está dada por archivos en formato [JSON](http://www.json.org/).

* [Descripción de un sector](#descripci%C3%B3n-de-un-sector)
	* [Celdas](#celdas)
		* [Línea](#linea)
		* [Cambio](#cambio)
		* [Paragolpe](#paragolpe)
		* [Cruce](#cruce)
		* [Triple](#triple)
	* [Señales](#se%C3%B1ales)
	* [Enclavamientos](#enclavamientos)
		* [Apareados](#apareados)
		* [Cambio a señal](#cambio-a-se%C3%B1al)


Acorde al estándar del formato JSON, todos los nombres de propiedades han de estar entrecomillados.

Los valores de las claves de este diccionario se corresponden a los nombres de archivo a los cuales ha de agregársele la extensión `.json`.  Así pues, la entrada `"constitucion"` corresponde al archivo `data/constitucion.json`. Las claves del diccionario así como los nombres de los archivos deben ser únicos dentro de la aplicación.  Ninguno de ellos se muestra al usuario y no se recomienda el uso de caracteres que pudieran causar problemas de portabilidad entre sistemas operativos, tales como vocales acentuadas o incluso espacios en blanco.

## Descripción de un sector

Cada sector está descrito en un archivo en formato JSON.

El encabezado contiene información global sobre el sector, en particular:

* `idSector`: El identificador único del sector. Este se usará internamente, el usuario no debería verlo nunca. Basta que sea único.  Usualmente es el mismo que el nombre del archivo en que está contenido, por ello, conviene que tenga caracteres válidos como nombre de archivo.
* `descrCorta`: Un texto breve que describa el sector. Se usará, por ejemplo, en el menú.
* `descr`: El nombre completo del sector.
* `alto`: El número de celdas que ocupa este sector en altura.
* `ancho`: El número de celdas que ocupa este sector a lo ancho.
* `celdas`: Un objeto que describe cada una de las celdas.

El valor de `descr` se mostrará en la solapa.  A diferencia del nombre de archivo, que el usuario no verá, este se mostrará en la solapa y debe ser legible.  Por ello, el archivo `constitucion.json` tiene como descripción en su encabezado: `"descr": "Constitución"`, con mayúscula y acento.

La imagen que representa el sector se ajustará para ocupar el máximo espacio posible dentro de la pantalla basándose en el `alto` y `ancho` declarados en el encabezado.

Por ejemplo, el archivo `constitucion.json` contendrá la siguiente descripción:

	{
	  "idSector": "constitucion",
	  "descrCorta": "Constitución",
	  "descr": "Estación Constitución, Ciudad de Buenos Aires, Argentina",
	  "ancho": 16,
	  "alto": 7,
		"celdas": [{
		...
		}]
	}

El orden de las propiedades es indistinto, pueden darse en cualquier orden. Eso se aplica a todo el archivo.

### Celdas

Cada sector esta compuesto de varias celdas.  No es necesario declarar las celdas vacías, así pues el número de celdas en esta sección es habitualmente menor que el producto de `alto` * `ancho` del encabezado pues las celdas vacías no necesitan declararse.

La configuración de las celdas está formada por la propiedad `celdas` que apunta a un *arreglo* (array) de propiedades de cada celda.  Toda celda debe tener al menos las siguiente propiedades:

* `coords`: un par de números separados por coma indicando las coordenadas `X` e `Y` de la celda, contando desde cero con la celda `"0,0"` ubicada arriba a la izquierda.
* `tipo`: indica el tipo de celda.  El resto de las propiedades de la celda depende del tipo, según se verá a continuación.

La mayoría de las celdas pueden tener otras propiedades opcionales independientemente de su tipo, a saber [senales](#se%C3%B1ales) o [enclavamientos](#enclavamientos).

Por ejemplo, el tipo más simple de celda es el que contiene una simple línea:

	"celdas": [
		...,
		{
			"coords": "5,0"
			"tipo": "linea",
			"descr": "XVI-b",
			"desde": {
				"dir":"N",
			},
			"hacia": {
				"dir":"S"
			}
		},
		...

Dentro de la lista de `celdas` la que se encuentra en la coordenada `5,0`  contiene un tramo de vía simple que va de norte `N` a sur `S`.  La leyenda `XVI-b` se mostrará en una esquina de la celda, si no se proveyera, simplemente se mostrará la coordenada.  Cada tramo de vía se define con al menos la propiedad `dir` (direción) que señala a alguno de los puntos cardinales.  

Todas las celdas son más o menos cuadradas.  Todos los segmentos de vías que contienen irradian del centro de ese cuadrado hacia una de 8 posibles direcciones, las cuatro esquinas y los puntos intermedios de los lados.  Estos extremos se los llama por su coordenada geográfica.   Aún así, todas las líneas pasan por el centro del cuadrado.  Es obvio que una línea de norte a sur como la del ejemplo cruzará por el centro del cuadrado, pero también lo hará una que vaya de norte a este.  En lugar de hacer un simple trazo en diagonal uniendo estos lados, la celda se graficará con dos segmentos, uno desde el arriba (*norte*) hasta el centro y otro del centro a la derecha (*este*).

	NW  N  NE
	  \ | /
	W - . - E
	  / | \
	SW  S  SE

Los tipos de celdas son:

#### linea

Contiene una vía con una única entrada y una única salida, sin cambios o desvíos. Requiere las propiedades `desde` y `hacia` que contendrán la propiedad `dir` indicando los puntos geográficos que une.  Los nombres `desde` y `hacia` son arbitrarios y no señalan el sentido del tráfico en la línea.

Ej.:

	{
		"coords": "5,0"
		"tipo": "linea",
		"descr": "XVI-b",
		"desde": {
			"dir":"N",
		},
		"hacia": {
			"dir":"S"
		}
	}

#### Cambio

Contiene una vía con una entrada, la `punta` y dos `ramas`, una `normal` y otra `desviado`.  Si bien la salida `normal` suele ser la opuesta a la `punta` esto no es obligatorio.

La propiedad opcional `posicion` indica la posición del cambio y su valor debe corresponder a alguna de las ramas.  Por defecto, es `normal`.

La propiedad opcional `manual` excluye al cambio de cualquier automatismo (ver [Enclavamientos](#enclavamientos) más adelante) y sólo responderá a comandos manuales.  Habitualmente, este valor es establecido dinámicamente desde el tablero mímico. Por defecto es `false`.  Si se indica, el valor `true` of `false` no debe ir entrecomillado, dado que es un booleano, no una cadena de caracteres (o sea: `"manual": true,`)

Ej:

	{
		"coords": "8,3",
		"tipo": "cambio",
		"posicion": "normal",
		"punta": {
			"dir": "SE"
		},
		"ramas": {
			"normal": {
				"dir": "NW"
			},
{'fraction_non_alphanumeric': 0.0716608525985928, 'fraction_numerical': 0.0024832968722284634, 'mean_word_length': 4.076230492196879, 'pattern_counts': {'":': 62, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6355950', 'n_tokens_mistral': 5998, 'n_tokens_neox': 5829, 'n_words': 2567}