[MATLAB] Problema con errodlg y buttondownfcn

Iniciado por DarK_FirefoX, 3 Diciembre 2015, 20:10 PM

0 Miembros y 1 Visitante están viendo este tema.

DarK_FirefoX

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 msgbox (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:

Código (matlab) [Seleccionar]
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 queda 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 comenzó 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:

Código (matlab) [Seleccionar]
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


Salu2s