Se trata de generar una imagen, o cualquier otra representación, para un conjunto de paralelos datos. No se trata de dibujar o programar la GUI, sino calcular las posiciones. Primero explicaré un poco dónde estoy parado ahora y la segunda imagen y ejemplo muestra mi problema.Generación de una representación lineal, basada en la línea de tiempo, de elementos que consumen tiempo y elementos que no, pero aún necesitan espacio para dibujarse en
Estado actual
exampleOne-Easy http://www.wargsang.de/text3935.png
tengo objetos unidimensionales, sino que están alineados los coloca en paralelo "líneas". Llamemos a estos objetos unidimensionales "eventos" que tienen una "Duración" como una unidad de tiempo. Estos eventos tienen una variante donde no ocurre nada, objetos sin datos pero con una duración; Un objeto "gap".
Así que obtenemos un calendario con objetos simulativos que consisten en eventos y espacios, que es bastante fácil de manejar como tres listas de objetos. La visualización también es simple: Pasa el cursor por encima de las listas y dibuja cada objeto según su duración.
class Event():
def __init__(self, duration, displacement = 0): #displacement is explained in the second example and the core problem of this question
self.duration = duration
self.displacement = displacement
#additional data
def self.draw(self, start_coordinate):
"""draw duration * 10 pixels in black"""
#drawing code using start_coordinate to place the drawn object. see example graphic
return duration * 10
class Gap():
def __init__(self, duration, displacement = 0):
self.duration = duration
self.displacement = displacement
#no data
def self.draw(self, start_coordinate):
"""draw duration * 10 pixels in transparent"""
#drawing code using start_coordinate to place the drawn object. see example graphic
return duration * 10
row_one = [Event(1), Gap(1), Event(1), Gap(1), Event(1), Gap(1), Event(2)]
row_two = [Event(1), Gap(2), Event(1), Event(1), Gap(1), Event(1), Gap(1), ]
row_thr = [Gap(1), Event(1), Gap(1), Event(1), Gap(1), Event(3),]
timetable = [row_one, row_two, row_thr]
for row in timetable:
pixelcounter = 0 # the current position.
for item in row:
ret = item.draw(pixelcounter) #draw on the current position. Get how width the item was
pixelcounter += ret #save width for the next iteration
#instructions to move the "drawing cursor" down a few pixels so the next row does not overlap.
El problema
ahora al problema. Hay objetos que necesitan un espacio gráfico pero tienen una duración cero. Lo llamo "Desplazamiento".
exampleTwo-Problematic http://www.wargsang.de/text4120.png
o, necesitamos objetos que tienen una duración, pero también tienen el desplazamiento. Esto todavía no es un problema cuando solo tenemos una fila, pero la sincronización de las filas es más compleja y no tengo una solución para esto.
En la imagen de arriba, los bloques rojos tienen una duración igual a cero y están desplazados. Los bloques azules tienen duración y están desplazados, también.
Ejemplo: * Imagine un cronograma para una conferencia con diferentes ranuras de bocinas cada hora (nuestros tragamonedas de duración). Cada fila representa una sala de conferencias diferente.
Los bloques negros son discursos y tal vez tienen un breve tema escrito dentro de ellos (gráficamente).
Los bloques azules también son discursos, pero el tema era demasiado largo para escribir, por lo que necesitamos más espacio una vez.
Rojo son notas como un cambio de número de habitación. No se toman el tiempo de su propia sino que se refieren a todos los artículos que vienen después de ellos. *
La tarea es encontrar una manera de Calulate la pixelcounter de la función anterior para que sea correcta para cada fila solo, pero también ese desplazamiento en una fila afecta a todas las otras filas y crea espacio adicional allí. El objetivo es que las duraciones sean fijas y estén alineadas en cada fila. Cualquier evento o brecha que debería comenzar, por ejemplo, recuento de unidades 4, debe comenzar en la misma posición absoluta.
Esto significa que cualquier objeto de duración/desplazamiento cero comienza en un punto real de tiempo/duración pero no consume tiempo/duración, de modo que todos los elementos subsiguientes comienzan en la misma duración hasta que se produce el siguiente evento de duración real incluido. Desde otro punto de vista, eso también significa que los elementos de duración cero comienzan siempre antes que los eventos que tienen duración.
En la imagen podemos ver un caso bastante simple en la columna 2, lo que también significa que comienza la segunda ranura de duración. A pesar de que hay tres eventos reales en esa columna que se desplazan a la derecha porque un elemento de desplazamiento está allí. La columna 4 tiene un elemento de duración que también tiene desplazamiento. Una vez más, todos los artículos que comienzan en la ranura 5 se desplazan hacia la derecha. Colum 6 es el problema más interesante y mi verdadero problema, no puedo encontrar una solución aquí. Una vez más, todos los eventos reales en la columna 6 se desplazan hacia la derecha y aún comienzan al mismo tiempo. Pero aquí tenemos a) Desplazamiento: objetos en dos filas y dos b) dos objetos uno detrás del otro. Por lo tanto, es importante que los eventos reales conozcan el desplazamiento completo, pero también es importante para el segundo objeto en la tercera fila saber que hay un elemento de desplazamiento más antes.
Advertencia: La representación gráfica puede sugerir un enfoque basado en tablas donde cada columna tiene un ancho individual. Pero aquí es donde termina este ejemplo. La aplicación real se refiere a una duración común de 300-10,000 por evento, pero las duraciones de 1 son improbables pero técnicamente posibles. Entonces, la tabla tendría un ancho de columna de una duración. Teniendo en cuenta que entramos en los cientos de miles de duración completa (multiplicado por el número de filas), esto puede reducir el rendimiento.
Los datos de esta imagen se verían así. ¿Cómo puedo dibujar la segunda imagen con esta información? O lo que debe cambiarse, estoy abierto a todas las sugerencias.
Muchas gracias por su tiempo e interés. Si no conoce una solución, no dude en hacerme preguntas o mostrarme los defectos de mi concepto, eso me ayudará a pensar también.
row_one = [ Event(1), #1
Event(0,1), Event(1), #2
Gap(1), #3
Event(1), #4
Gap(1), #5
Event(0,1), Event(1), #6
Event(1), #7
]
row_two = [ Event(1), #1
Event(1), #2
Gap(1), #3
Event(1, 0.5), #4, 0,5 is not important. we can also simply to just ints. The important bit is that it has both values.
Event(1), #5
Event(1), #6
Event(1), #7
]
row_thr = [ Event(1), #1
Event(1), #2
Event(1), #3
Event(1), #4
Event(1), #5
Event(0,1), Event(0,1), Event(1), #6 #Please pay attention to this case.
Event(1), #7
]
Bueno, antes que nada, ¿estás seguro de que tienes que tener espacio para ellos? Puede dibujarlos de manera diferente, en lugar de barras de tiempo que tienen otras formas de mostrarlos. –
Tristemente, sí, los necesito a todos en una fila. – nilsge
Dado todos los objetos con un número de fila, un ancho gráfico y ancho de tiempo: necesitará encontrar las posiciones gráficas para cada objeto, de modo que todas las filas se ajusten gráficamente (sin superposiciones) y todos los mismos tiempos de inicio comiencen en el mismo gráfico posición. ¿Es eso correcto? – Ishtar