Matlab - Como poner por defecto pop up menus en una columna de una uitable matlab

 
Vista:
sin imagen de perfil
Val: 33
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como poner por defecto pop up menus en una columna de una uitable matlab

Publicado por David (32 intervenciones) el 25/08/2017 01:18:44
Hola,

Tengo una duda, estoy realizando un programa con interfaz grafica en la que el usuario ingresa una determinada cantidad de "materiales", que estan asociados a la generación de filas en una tabla, lo cual ya hize en el callback del boton Ingresar datos (TAG"botonDatosGenerales").

En dicha tabla hay 8 columnas, una se llama elemento, otra area, y las 6 restantes son para coeficientes varios, como se puede observar aqui:

tabla

Tambien hay un pop up menu el cual tiene una lista de materiales, la idea es que cuando se seleccione un material, se carguen en una fila los coeficientes varios de la columna 3 a la 6 por medio de un vector ya asignado.

La idea es que dicho pop up menu este en la columna 1 de elemento, de forma determinada, es decir si el usuario ingresa 8 materiales al darle click al boton se deberan crear 8 filas cada una con su pop up menu de seleccion de materiales que, en la que al seleccionar alguna opcion cargaran los datos en esa fila que seran operados con la columna 2 de area la cual es una columna editable.

Como se podria entonces incluir los pop up 's en dicha columna???

O si no que forma habria de usar un solo pop up para ir cargando material por material en cada fila
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Lindsey
Val: 419
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Como poner por defecto pop up menus en una columna de una uitable matlab

Publicado por Lindsey (119 intervenciones) el 25/08/2017 18:52:17
Hola, te dejaré el archivo adjunto con los cambios que hice para ajustarse a la descripción que deseas.

- Inicialmente en la función function proyectoArqui_OpeningFcn(hObject, eventdata, handles, varargin) de la línea 48, que dice que se ejecuta justamente antes de que la interfaz se haga visible se agregó la siguiente línea para evitar que el usuario pueda modificar la tabla antes de haber ingresado la cantidad de materiales:
1
set(handles.tablaDatos,'ColumnEditable',logical([0 0 0 0 0 0 0 0]))

- En la función callback de botonDatosGenerales se agregó una variable llamada elementos que es un arreglo de celdas que contiene la información de los elementos que quieres agregar a la tabla, y sus coeficientes. Además se agregó la condición para que la primera y la segunda columna de la tabla vuelvan a ser editables.
1
2
3
4
5
6
7
8
9
10
11
12
% --- Executes on button press in botonDatosGenerales.
function botonDatosGenerales_Callback(hObject, eventdata, handles)
 filas = str2double(get(handles.edit_CanMateriales,'String'));
 % Cell array de elementos y sus 6 coeficientes, debe ser igual al que esté en el celleditcallback de tabla datos
 elementos={'Elemento 1' 1 2 3 4 5 6
            'Elemento 2' 7 8 9 10 11 12
            'Elemento 3' 13 14 15 16 17 18};
 num_elem = cell(filas,8);
 num_elem(:,:)={''};
 set(handles.tablaDatos,'Data',num_elem)
 set(handles.tablaDatos,'ColumnEditable',logical([1 1 0 0 0 0 0 0]))
 set(handles.tablaDatos,'ColumnFormat',{elementos(:,1)' 'numeric' 'numeric' 'numeric' 'numeric' 'numeric' 'numeric' 'numeric'})
Como detalle, en la última línea del código que te muestro acá, está la clave para hacer que las celdas de la primera columna de la tabla sean "pop-up menus". Es cuestión de poner en su formato de columna la lista de palabras que quieras que salgan en dicho popup menu. Como ves, la lista corresponde a la primera columna de la variable elementos.

- En el celleditcallback de tablaDatos primeramente se obtiene la posición de la celda editada, y si esta celda corresponde a alguna de la primera columna entonces es que se van a agregar los coeficientes del elemento seleccionado (por eso el if).
Si queires saber cómo funciona el eventdata lee los comentarios que aparecen justo debajo de esta función en el archivo .m.
Observa que en esta función también se encuentra la variable elementos, que tiene que ser justamente igual a la variable elementos agregada en el callback del botón de datos generales, así que cuando hagas algún cambio en la información dentro de esta variable asegúrate de hacerlo en ambas funciones (también está como recordatorio en los comentarios del código).
1
2
3
4
5
6
7
8
9
10
11
12
13
function tablaDatos_CellEditCallback(hObject, eventdata, handles)
% Cell array de elementos y sus 6 coeficientes, debe ser igual al que esté en el callback de botondatosgenerales
elementos={'Elemento 1' 1 2 3 4 5 6
           'Elemento 2' 7 8 9 10 11 12
           'Elemento 3' 13 14 15 16 17 18};
posicion=eventdata.Indices;
if posicion(2)==1 % Se asegura que el cambio sea en la primera columna, ya que un cambio en la segunda no afecta los coeficientes
    elemento=eventdata.EditData;
    fila=find(strcmp(elemento,elementos(:,1)));
    tabla=get(hObject,'Data');
    tabla(posicion(1),3:8)=elementos(fila,2:7);
    set(hObject,'Data',tabla)
end

Espero que te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 33
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como poner por defecto pop up menus en una columna de una uitable matlab

Publicado por David (32 intervenciones) el 26/08/2017 01:50:51
Muchas gracias, funciono a la perfección, ahora estoy tratando de operar las columnas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 33
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como poner por defecto pop up menus en una columna de una uitable matlab

Publicado por David (32 intervenciones) el 26/08/2017 19:34:51
Hola, oye tengo un problema al operar entre columnas de la tabla, me esta generando datos re locos, que no son, por ejemplo, para la sumatoria de la columna 2, osea la de area use:

1
2
3
A = get(handles.tablaDatos,'Data')
 
b = set(handles.a2,'String',sum(cell2mat(A(:,2))))

y el resultado no tiene ningun sentido, no se si es que se esta sumando todo en la tabla

o para multiplicar como te decia antes columna 2 de area por cualquiera de la 3 a la 8 que son los coeficientes, y de paso hacer la sumatoria de esas multiplicaciones use:

1
a = set(handles.a1,'String',sum((cell2mat(A(:,2))).*cell2mat((A(:,3)))))

y tambien me da un valor super raro:

y luego trato de multiplicar por ejemplo el valor de una sumatoria por otra y tampoco me funciona, lo puse como:

t = a*b

o

t = a.*b

y me sale este error

1
2
Error using  *
Inner matrix dimensions must agree.

Te mande el programa al tu correo, no me deja subirlo aqui
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 33
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como poner por defecto pop up menus en una columna de una uitable matlab

Publicado por David (32 intervenciones) el 27/08/2017 01:02:54
Me di cuenta que las sumatorias de las columnas de los coeficientes (de la 3 a 8) dan correctas.

El problema es en la columna de casillas editable del area (columna 2).

Hice algunas pruebas, poniendo solo una fila y dandole el valor de 1 a la casilla de area y su sumatoria da 49, si se pone 2 la sumatoria da 50, hasta que en cierto punto si se le pone 10 la sumatoria da 97, es como que si yo ingreso un numero ya tenga asignado por defecto otro numero totalmente diferente y esos numeros son los que toma para hacer la sumatoria.

No se si sera por el if o porque motivo pasa esto, ya que intente en una tabla normal y en cualquier columna (con filas editables), si sirve la sumatoria una vez se rellenan las casillas usando:

1
2
A = get(handles.tablaDatos,'Data')
set(handles.a2,'String',sum(cell2mat(A(:,2))))

Es muy extraño, y por este motivo cuando hago la sumatoria de la multiplicación de dos columnas tambien dan datos erroneos, causantes a los datos que se cargan en la columna dos, ya que tambien hize pruebas de multiplicar entre las columnas de coeficientes y sacarle la sumatoria a eso y si tambien dan correctas, por lo que el error si debe de ser en la columna dos.

Que puede causar este error???
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Lindsey
Val: 419
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Como poner por defecto pop up menus en una columna de una uitable matlab

Publicado por Lindsey (119 intervenciones) el 27/08/2017 01:49:58
El error estaba en que la segunda columna la estaba leyendo como texto y no como números.

Ya puse en el celleditcallback otro if para convertir los datos de texto a número y los cálculos no te den problema. Otra cosa que vi que hiciste. Estabas obteniendo "números" directamente de las cajas de texto a1 y a2, por eso el absProm125 que es la multiplicación de esos dos valores daba raro, la cuestión es que cuando obtienes el string de una caja de texto, te lo lee todo como texto y lo tienes que convertir a número. Para que lo tengas en cuenta en futuras operaciones. Eso, o las variables St y abstt125 las calculas directamente desde los datos de la tabla, que fue como quedó escrito en el código que te adjunto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 33
Ha aumentado su posición en 3 puestos en Matlab (en relación al último mes)
Gráfica de Matlab

Como poner por defecto pop up menus en una columna de una uitable matlab

Publicado por David (32 intervenciones) el 27/08/2017 02:07:11
Ufffff muchas gracias, eres lo mejor, me haz salvado, ya me funciona todo bien, Graciassss :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar