Matlab - Problema con errordlg y buttondownfcn

   
Vista:

Problema con errordlg y buttondownfcn

Publicado por Armando (2 intervenciones) el 03/12/2015 19:56:39
Trabajando en Matlab R2010a.

Tengo el siguiente problema. Tengo una interfaz gráfica con varios componentes. Entre ellos tengo un edit y un axes.

Lo que estoy tratando de hacer es controlar que lo único que se escriba en el edit sean números. Lo hago con una función y funciona bien. Una vez que el edit pierde el foco o se presiona ENTER si el dato entrado es un numero se realiza una función y sino se muestra un errordlg (modal).

Ahora, quiero aclarar que tengo una función llamada mousedraw, que se encarga de permitir al usuario dibujar con el mouse en el axes. Utilizando los eventos: buttondownfcn, windowbuttonmotionfcn y windowbuttonupfcn.

Aquí el código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function mousedraw(handles)
A=handles.axesToDrawOn; % axesToDrawOn es el handle al axes
 
set(A,'buttondownfcn',{@start_pencil, handles})
 
function start_pencil(src,eventdata, handles)
cla(handles.axesToDrawOn);
coords=get(src,'currentpoint'); %scomo este es el callback del axes, src=gca
x=coords(1,1,1);
y=coords(1,2,1);
 
global lineCoords;
newPoint = [coords(1,1,1) coords(1,2,1)];
lineCoords = newPoint;
 
r=line(x, y, 'color', [0 .5 1], 'LineWidth', 2, 'hittest', 'off'); %Poniendo hittset off nos permite dibujar una linea que comience encima de una linea que ya este dibujada
 
set(gcf,'windowbuttonmotionfcn',{@continue_pencil,r})
set(gcf,'windowbuttonupfcn',@done_pencil)
 
function continue_pencil(src,eventdata,r)
%src es ahora el handle del figure, y no del axes, por lo tanto necesitamos usar gca.
coords=get(gca,'currentpoint'); %esto actualiza cada vez que mueva el mouse
x=coords(1,1,1);
y=coords(1,2,1);
 
global lineCoords;
 
newPoint = [coords(1,1,1) coords(1,2,1)];
D = [lineCoords; newPoint];
lineCoords = D;
 
%obtener las coordenadas de la linea existente y agregarle las nuevas
lastx=get(r,'xdata');
lasty=get(r,'ydata');
newx=[lastx x];
newy=[lasty y];
set(r,'xdata',newx,'ydata',newy);
 
function done_pencil(src,evendata)
 
%Desactiva la función e movimiento
global lineCoords
set(gcf,'windowbuttonmotionfcn','')
set(gcf,'windowbuttonupfcn','')


Mi problema es que si la manera en que el edit perdió el foco es haciendo un click sobre el axes, como que se quedo colgado el evento buttondownfcn, pues se reconoce que lo entrado no es válido (osea, no es un número), se muestra el errordlg, pero al hacer click en aceptar, pues como que se ejecuto el evento y se comenzo a dibujar desde que se hizo click en el axes para hacer al edit perder el foco, y entonces esta dibujando con el mouse levantado, sin hacer click.

Espero que me haya explicado bien, sino que alguien me diga y explico mejor.

Gracias de antemano.

PD: El callback del edit es el siguiente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function xMinEdit_Callback(hObject, eventdata, handles)
Val=get(hObject,'String');
 
if(isnan(IsNumber(Val)))
    set(hObject, 'String', handles.xMin);
else
    NewVal=str2num(Val);
    handles.xMin=NewVal;
 
    axis([handles.xMin,handles.xMax,handles.yMin,handles.yMax]);
end
guidata(hObject, handles);
 
function [varargout] = IsNumber( x )
num=str2num(x);
 
if (isempty(num)==0)
    varargout{1}=num;
else
    varargout{1} = NaN;
    errordlg('Debes insertar un numero', 'Error de entrada', 'modal');
end
 
end
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 JOSE JEREMIAS CABALLERO

Problema con errordlg y buttondownfcn

Publicado por JOSE JEREMIAS CABALLERO (3433 intervenciones) el 04/12/2015 14:47:13
En esta parte:
1
axis([handles.xMin,handles.xMax,handles.yMin,handles.yMax]);

De donde importas el valor de handles.yMax. , handles.xMax Estoy tratando de reproducir el guide que tienes.


Saludos .
JOSE JEREMÍAS CABALLERO
Asesoría online en Matlab
jjcc94@hotmail.com
Estimado Usuario, el correo es para servicios de cursos, asesoría y programación en Matlab.
Toda ayuda gratuita es vía foro.


http://matlabcaballero.blogspot.com
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

Problema con errordlg y buttondownfcn

Publicado por Armando (2 intervenciones) el 04/12/2015 16:10:54
Muchas gracias por responder. Perdón por no aclarar esa parte!

Yo tengo en mi figure no solo 1 edit, sino 4 (xMinEdit, xMaxEdit, yMinEdit, yMaxEdit), que los utilizo para definir los límites del axes. Entonces esos valores van a ir actualizando las variables:

1
2
3
4
handles.xMin
handles.xMax
handles.yMin
handles.yMax

Claro, en caso de que se le haga una modificación a los edits correcta.

Ahora, esas variables las inicializo en:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function TPProyecto4_OpeningFcn(hObject, eventdata, handles, varargin)
% Choose default command line output for TPProyecto4
handles.output = hObject;
 
%--- AQUÍ INICIALIZO LAS VARIABLES EN CUESTIÓN
handles.xMin = -10;
handles.xMax = 10;
handles.yMin = -10;
handles.yMax = 10;
 
%--- ACTUALIZO LOS LÍMITES DEL AXES
axis([handles.xMin,handles.xMax,handles.yMin,handles.yMax]);
 
% Update handles structure
guidata(hObject, handles);
 
global lineCoords;
 
mousedraw(handles); %Aquí llamo al evento que espera el dibujo del mouse en el axes

Nota: En el post anterior hice referencia a xMinEdit_Callback, la lógica se repite para los 4 edits

Espero hayas entendido mi problema y que puedan (Ud. o alguien más) ayudarme.

Espero su pronta respuesta.
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