Open ivanjimenez opened 1 year ago
En uno de los commits no funcionaba, en el ultimo commit esta arreglado
Si sigue sin funcionar hay que borrar las carpetas bin/ y obj/ y recrear la database: Para recrearla te la puedes volver a bajar o ejecutar esto desde cmdline en la carpeta insoles/ dotnet ef migrations add InitialCreate dotnet ef database update
Habra que instalar el dotnet ef supongo dotnet tool install --global dotnet-ef https://learn.microsoft.com/es-es/ef/core/cli/dotnet
Ok, genial, viene muy bien esa información, la puedes poner luego en el Readme.md (si no está creado lo creas) para acordarnos y la chequeo.
Por otro lado, comienza por la etapa de análisis, utiliza por ahora scottplot, pues ahora estoy probando syncfusion, otra librería de gráficos por si nos facilita el trabajo. Pero por ahora scottplot. Revisa el figma para recordar cómo está hecho. Nos vemos el lunes.
Buen fin de semana.
He subido un logo y hecho al final el Readme.md pero no me deja hacer push sobre tu rama. He subido los cambios a MVVM_ivan por si puedes luego merguearlos a la tuya de MVVM.
Esto para priorizar a partir del lunes 19. Ponerse como comentaba con la etapa de análisis del prototipo que se está haciendo:
Casos de uso para esta etapa:
Vale, entonces, Recordando el mockap de la ui de figma, he puesto unas anotaciones:
Vale, este es el punto que lleva más cosas y que tenemos que ver:
Bien, verás, para este punto me importa que se puedan establecer dos vertical lines y luego hacer la std deviation. Yo en el siguiente código calcula la STDDEV por otro método y luego aplico unos eventos para sacar la gráfica pero están incompletos.
double[] xs = DataGen.Consecutive(51);
double[] ys = DataGen.Sin(51);
List<double> ys_temp = new List<double>();
foreach (double y in ys)
{
ys_temp.Add(y);
}
double std_dev = ys_temp.PopulationStandardDeviation();
double[] std_array = DataGen.Consecutive(51);
for (int i = 0; i < ys.Length; i++)
{
std_array[i] = std_dev;
}
WpfPlot1.Plot.AddScatterLines(xs, ys, System.Drawing.Color.Red, 3);
WpfPlot1.Plot.AddFillError(xs, ys, std_array, System.Drawing.Color.FromArgb(50, System.Drawing.Color.Blue));
WpfPlot1.Render();
WpfPlot1.LeftClicked -= WpfPlot1.DefaultRightClickEvent;
WpfPlot1.LeftClicked += DeployCustomMenu;
this.DataContext = new ViewModel();
}
private void DeployCustomMenu(object sender, RoutedEventArgs e)
{
(x, y) = WpfPlot1.GetMouseCoordinates();
x0 = x;
y0 = y;
var vline = WpfPlot1.Plot.AddVerticalLine(x);
vline.LineWidth = 2;
vline.PositionLabel = true;
vline.PositionLabelBackground = vline.Color;
vline.DragEnabled = true;
count++;
WpfPlot1.Render();
if (count == 1 )
{
WpfPlot1.Plot.SetAxisLimitsX(xMin: x0, xMax: x + 1);
count = 0;
}
}
Si tienes tiempo, pruebas a sacar la STDDEV con el rango en el gráfico como ejemplo de selección:
También que se pueda volver a la situación inicial con todo el gráfico.
Me he agenciado una licencia para Syncfusion que lleva bastantes controles gráficos, pero la estoy probando yo para ver si nos funciona. Las que he probado LiveCharts y LiveCharts2 no me llegan a convencer.
Estoy probando varias opciones con Syncfusion que son bastante interesantes. Por ahora, no es totalmente elegible hasta que no vea cómo puedo hacer rangos con desvicación típica. De momento sigue con ScottPlot
Dejo el proyecto que está desorganizado y que podrías instalar con una versión de syncfusion. No obstante déjame esto a mí y sigue con Scottplot.
Vale, ya está en principio realizado con ScottPlot. Es más simple de lo que pareciera ser. Te adjunto el fichero zip con todo el proyecto actualizado, no lo he subido a un repo. Espero subirlo.
Lo mejor antes de explicar nada es que veas un gif de lo que se hace en el proyecto ejemplo:
Todo está para mirar en el MainWindow.xaml y Mainwindow.cs, los otros ficheros no son importantes para este ejemplo.
En primer lugar este gráfico calcula la desviación típica con otro método StdDevPointCalculation
, el cual es diferente a como lo has hecho con el otro e intuyo que es más correcto este método porque lo calculas por cada punto.
Hay un evento click que seleccionas un punto inicial y luego otro punto final, se añaden dos líneas verticales.
El botón STDDEV añade un nuevo gráfico que lo que hago es sacar de la lista de x el más próximo del punto inicial y y el más próximmo al punto final. Con eso lo que hago es sacar dos sublistas con el rango anterior, y ploteo sólo ese segmento del gráfico. Y luego le paso el rango de desviación típica volviéndolo a calcular a la sublista creada.
Debería haber un botón borrar gráfico, para eliminar las líneas verticales el subgráfico realizado. Falta por hacer, pero será sencillo y reinicializar los puntos guardados de las líneas verticales, pues lo añado a una lista pero hay que controlarla.
Con lo cual, a lo que estás realizando con la pestaña de Análisis, realiza lo siguiente con el gráfico de Fuerzas y fijándote en el código que he realizado.
Puedes comentarme los cambios realizados y cómo estaría la integración de lo de arriba. Veo la disposición actual de Análisis algo para que se integre bien todo. Por puntos:
1- En primer lugar no puedo ejecutar los ejemplos por un desborde de pila, ¿puede ser que la animación no esté realizada?
2- La disposición de ventanas no va a dejar hacer nada más. Pon tabs, como estaba antes. El video puede estar agrupado en tabs, y así dejas un video libre para poner el gráfico.
3- La línea de timeline es muy grande, a ver si puedes hacerla menos alta, pero que sea proporcional a como está. UPDATE ESTA TARDE 21 DE JUNIO Hay que cambiar más cosas:
No sé como está construida esta vista, pero el uso de frames no es conveniente porque la idea es dejar las referencias a ventanas con el "current". Si quieres usas un dock, o un grid.
4- El consumo de CPU es bastante, no sé si a ti te pasa. Esto ya has visto la solución.
5- Fase de Análisis. Además de poner el GRF como hemos comentado anteriormente, reajustar la UI
Apuntes de cambio en Registro y análisis
[x] El GRF se hace en la parte superior izquierda donde habrá más espacio
z
a
El GRF no me funciona bien. Me salen 2 lineas cada vez que clico y siempre coje el grafico entero. No se si me he equivocado en algo, esta el fichero en UserControls/GRF.xaml.cs
a
El problema es que al hacer click izquierdo se mueve el grafico por eso se dibujan 2 lineas.
Solucionado, he desactivado el comportamiento por defecto
En el calculo de la Std estas elevando al cuadrado:
double diferenciaCuadrada = Math.Pow(diferencia, 2);
Para numeros grandes esto se puede disparar bastante. He hecho la raiz cuadrada de esto y se ve bien
Algunas cosas, he subido algunos cambios de ui y otras issues:
* Fnominal = Peso / G, (siendo G = 9.80665).
* Este peso siempre será mayor debido a lo que calculamos.
* Luego del total que viene de las plantillas Fregistrada, hay que hacer un factor de corrección calculado como: Fc= Fnominal / Fregistrada >= 1.0 y que será siempre un valor superior o igual a 1.
* Si chequeamos esta casilla debe salir entonces Frectificada = Fnominal * FC
Sigue tardando una eternidad cargando el pressure map.
He precalculado las otras matrices.
Tambien he puesto un dropbox para seleccionar cuantos frames coger para el heatmap live, estaba antes a 1 / 10, lo he dejado a 1 / 50, si sigue yendo lento lo puedes bajar a 1/ 100 o 1 / 500
Modificaciones:
Lo de arriba está casi todo hecho y para que no se pierda he mudado dos cosas de arriba a la siguiente lista y que tiene actualizadas las cosas:
Sobre los sujetos:
Algunas cosas que he visto en las pruebas:
[x] En registro, el GRF al registrar, no se ve todo el gráfico hay que ajustarlo a como estaba antes en el proyecto antiguo, donde se veía todo el gráfico.
[ ] El pressure map al seleccionar min, avg, o max se vuelve a cambiar de tamaño. Tiene que ocupar siempre todo su marco con el mismo tamaño.
[x] La stddev del gráfico de rango se ha cambiado a la antigua fórmula para ver cómo funciona?
[ ] Mensaje posicionamiento sobre iconos --> para mí
[ ] Salvado de vistas al cambiar de opción -> esto lo estoy investigando yo. Por ahora lo anterior.
Informes El asunto informes lo tengo que debatir contigo, pues igual hacemos algo más simple.
El pressure map al seleccionar min, avg, o max se vuelve a cambiar de tamaño. Tiene que ocupar siempre todo su marco con el mismo tamaño.
A mi me va bien, no se ve igual que en este video?
https://github.com/IBCBio/insolesibc/assets/18369978/0cd47ef9-46ec-4524-8b23-70cec441dc92
He probado varias veces y parece que va bien. No obstante,
[x] Aumentar de tamaño para hacer la plantilla de igual tamaño que el butterfly
[x] Al importar el test, Frames taken está por defecto a 1/500 pero no se importa con 1/500, tal vez hay que render el gráfico, ¿puedes revisar si es ese el problema?
En cuanto al TreeView:
[x] El nivel pruebas no es necesario hay que eliminarlo
[x] Cambiar Sujetos a Pacientes
[x] Se pueden crear carpetas (contextual: Nueva carpeta) debajo de Tests, esto es con el objeto de luego importar ficheros txt y avi.
[x] Se pueden crear carpetas (contextural: Nueva carpeta) debajo de Informes. De momento guardaremos en las carpetas los informes.
[x] Importar tests. Sobre carpeta vacía de test creado (si hay ficheros no se puede importar), menú contextual: Importar test. Se seleccionan los ficheros txt y avi y se cargan en esa carpeta.
[x] Los nombres de los tests quedan muy largos junto con la fecha y no se ven. Puedes sustituir el nombre por un icono de file y video y que se vea junto con la fecha?
Pacientes (Cambiar Sujetos a Pacientes)
|
|--> Usuario1
|-->Tests (se pueden crear carpetas)
| |
| |-->marcha
| |-->estático
| |-->test_vacío (se puede importar ficheros txt y avis)
|
|-->Informes (se pueden crear carpetas)
Los informes he pensado que primero hay que guardar las imágenes de Hetmap: min, max, avg, butterfly y el segemento de gráfico con std dev. Después de eso hay que generar un word. Mañana lo podemos pensar un poco como acometerlo.
Aquí está el proyecto:
https://github.com/hightower70/WPFHeatMap
No obstante, después vemos cómo podemos acometer la matriz de 200K puntos con Scottplot antes y si no resulta pues deberemos ver otras opciones.
El que esta ahora es de 445 x 615 = 273.675 puntos
Al animar la plantilla del heatmap se vuelve pequeña
No se muy bien como hacer esto, estoy usando:
plot.Plot.SetInnerViewLimits(xMin, xMax, yMin, yMax);
plot.Plot.SetOuterViewLimits(yMin: 0);
plot.Plot.SetAxisLimits(xMin, xMax, yMin, yMax);
A mi me funciona bien pero parece que no va bien en todos los ordenadores
Paso a comentar por aquí tareas:
[x] Revisa lo de las tareas asíncronas en el Heatmap, si esto te va a llevar más tiempo continúa antes con lo siguiente, ya que es más prioritario.
[x] Lo primero ya está habilitado el proyecto para usar de forma completa Syncfusion y merged todo a MVVM. Para informes yo he usado el doc de syncfusion porque realmente el módulo interop de word de wpf c# lo veo más complicado en un principio porque tienes que tener una versión específica de MS Word instalada, de otra forma, no renderiza los docs. Y si no la quieres instalar la versión de Office tienes que adjuntar las dlls de MS word. Con syncfusion tira de primeras. Hay un botón que se llama informes en la etapa de análisis que sólo funciona cuando están los GRF y el de rangos creado. por ahora en Bin deja los png y el word. Estoy haciendo pruebas pero quería comentarte cómo integrarlo
[ ] Aquí es ver cómo está diseñado. ¿Puedo recuperar en GRF.xaml.cs la vista con los Heatmap y Butterfly para acceder a sus plots?
Butterfly -> UserControls/GrafoMariposa.xaml.cs variable plot Heatmap -> UserControls/Heatmap.xaml.cs variables plot
Vas a realizar lo siguiente para que quede más claro:
[x] Necesito que sobre la subcarpeta de informes que se cree, se seleccione un menú contextual que diga "Generar informe" y meter el dódigo de descarga de las imágenes del plot, más el de crear el word en la misma carpeta. Hay que meter las imágenes de butterfly y las de HeatMap Min, Max y Med, también.
[x] Luego, en la etapa de Reporting poner el TreeView de los usuarios. Hay lo que pienso hacer es un visor de word para que pueda editar y exportar a otros formatos.
[x] En la etapa de registro acortar los tabs de usuarios y dispositivos y aumentar verticalmente las cams hasta que lleguen abajo, tanto cam1 como cam2 deben tener el mismo height.
Tengo una reunión con Jose como a las 10, después de dicha reunión hablamos.
Aquí es ver cómo está diseñado. ¿Puedo recuperar en GRF.xaml.cs la vista con los Heatmap y Butterfly para acceder a sus plots?
Para esto habria que crear un Servicio y hacerlo todo desde alli mejor. Lo he creado en Services/InformesGeneratorService y he movido el codigo del GRF. El servicio tiene una referencia al Heatmap y mariposa tambien
Entonces aquí hay algo que debemos concretar. Todos los ficheros se graban en Documents, verdad? Y de ahí saca la bd. Porque siendo así tendremos que igualmente grabar ahí los informes. Los ficheros img se pueden grabar en alguna carpeta Temp que tengamos en la aplicación.
Bernat, prefiero que priorices lo de la calibración. Quiero probar ambos métodos, el de calibración y el otro de multiplicar por 2 el resultante de cada plantilla y he quedado con Claudia el jueves para hacer tests.
Yo veo los newtons en streaming que están más o menos bien.
Si que estaban intercanviados Total_left y total_right al escribir. Lo he cambiado
He hecho lo del FC lo he subido en mi rama quitando lo del * 2. En la rama principal solo he arreglado lo que estaban intercanbiados y lo he dejado como lo tenias.
Perfecto, gracias. Puedes hacerme una release de la de fc y otra de *2? La dejas en releases. Muchas gracias
Ayer hicimos algunos tests, sobretodo el 299:
Mañanta tengo otras pruebas programadas con Claudia como a las 12.
leftOnly.txt rightOnly.txt Diria que esta todo bien. He grabado un test solo con el pie izquierdo y otro solo con el derecho y salen bien.
El fichero csv resultante debería tener los datos con el FC calculado, si no, para el visual3d no sería válido. Creo que es mejor grabar a fuego el FC calculado en el csv y obviar el fC en la etapa de análisis. O eso o exportar con alguna opción un csv con el FC calculado. Y no sólo para el LTOTAL y RTOTAL si para todos los sensores, ya que los clientes usan el Visual3d para todos los sensores no los totales. Coméntame qué opción ves más simple. Gracias
Es mas facil poner una opcion para exportar con el fc calculado
He hecho la segunda opcion que es mas simple. He añadido un menu contextual "Exportar FC" genera un fichero en la misma carpeta con el nombre file.txt -> filefc.txt
leftOnly.txt rightOnly.txt Diria que esta todo bien. He grabado un test solo con el pie izquierdo y otro solo con el derecho y salen bien.
La cámara no está invertida? Puedes hacer un test con cámara y comprobarlo? Es raro pq tuve que cambiar el csv.
yo lo veo bien, te he pasado los ficheros por teams porque aqui no me deja subir el video
Bernat:
Dados los tests del viernes hay que ver algunas cosas y priorizarlas:
[x] Podrías hacer un test simple: pie izq segundos, pie derecho segundos, en estático y luego ponerte a caminar algunos pasos?
[x] El gráfico de butterfly no sé si le estabas poniendo animación, pero hay que chequear que cuando esté en estático no lo muestre, puede ser con N >= 20 como corte en cada pie.
[x] El gráfico de heatmap de momento no sé nada, pero veré si hay que modificar algo
[x] El treeview lo dejamos como última prioridad aparte del salvado de vistas.
Mañana hablamos.
Codigo de la grabación (no veo nada que este mal) (los fragmentos importantes son el primero y el ultimo)
private void ImageGrabbedCallback(object? sender, EventArgs eventArgs)
{
Mat frame = new Mat();
videoCapture.Retrieve(frame);
cameraService.InvokeFrameAvailable(index, frame);
}
public void InvokeFrameAvailable(int index, Mat frame)
{
try
{
FrameAvailable?.Invoke(indicesMap[index], frame);
}
catch(KeyNotFoundException)
{
Trace.WriteLine("InvokeFrameAvailable KeyNotFoundException");
}
}
cameraService.FrameAvailable += (int index, Mat frame) =>
{
if (index == 0)
{
Application.Current.Dispatcher.BeginInvoke(() =>
{
CurrentFrameTop = FormatConversions.ToBitmapSource(frame);
});
saveService.AppendVideo(frame, index);
}
else if(index == 1)
{
Application.Current.Dispatcher.BeginInvoke(() =>
{
CurrentFrameBottom = FormatConversions.ToBitmapSource(frame);
});
saveService.AppendVideo(frame, index);
}
};
public void AppendVideo(Mat frame, int index)
{
if (!state.paused)
{
if (videoWriters != null)
{
if (videoWriters[index] != null) // Race condition
{
lock (videoWriters[index])
{
if (videoWriters[index] != null)
videoWriters[index].Write(frame);
}
}
}
}
}
Has hecho algún cambio? Algún commit?
Estado actual release
Especificaciones fórmulas de IEE
Esto está sólo a modo de documentación:
Investigaciones sobre LiveCharts y Syncfusion
Probando una celda de 12 gráficos con fake data en tiempo real a 100hz no va nada mal.
Dejo el simple proyecto para tenerlo en cuenta.
Hay ciertas cosas que esta librería aún no me acaba de convencer eso sí. Creo que ScottPlot es mucho más completo en otras cosas.
liveplot.zip
El proyecto en zip
Entonces, la UI la mostramos:
VALUE_mbar es por sensor, con lo que tenemos que sumar todos los sensores.
N también es por sensor, así que lo mismo que lo anterior, sumar todos los sensores.
No es necesario calcular la media, utilizar sum únicamente tanto para streaming como offilne.
Cuando comience a registrar se puede calcular en tiempo real los mBar o los N según checkbox que indice (por defecto, los mBar).
Que en axis-Y de la gráfica ponga la leyenda dependiendo si es mBar o N.
Los gráficos tanto de Butterfly como Heatmap deben estar actualizados a la nueva forma de calcular valores de cada sensor.
Cuando se almacena en el csv se graba en cada sensor el mbar o el N, y en LTOTAL o RTOTAl los totales de cada unidad que seleccionemos.
Cuando importamos un fichero csv ya grabado no tendremos idea si son mBar o N, habría que tal vez hacer cambiar el nombre de la columna depdendiendo, pero esto sería un problema por el pipeline de otros programas que necesitan los nombre de las columnas. Por ahora, a efectos de pruebas, dejemos que el usuario controle si son mBar o N.
[x] - [x] Revisar la maquetación de la opción Análisis, aquí hay que pensar un poco cómo lo podemos hacer. Puedo dar algunas líneas con otras apps, pero más bien que se coloquen bien con espacio los elementos que hay: Pacientes, Dispositivos, Cámaras y Gráficos.
[x] La etapa de análisis, por ahora puede utilizar el gráfico de Scottplot Shadded error, el de la desviación típica. No me convencen del todo LivePlot, y estoy probando Plotly.NET