Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: DarK_FirefoX en 3 Diciembre 2015, 20:10 pm



Título: [MATLAB] Problema con errodlg y buttondownfcn
Publicado por: DarK_FirefoX en 3 Diciembre 2015, 20:10 pm
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
  1. function mousedraw(handles)
  2.  
  3. A=handles.axesToDrawOn; % axesToDrawOn es el handle al axes
  4.  
  5.  
  6.  
  7. set(A,'buttondownfcn',{@start_pencil, handles})
  8.  
  9.  
  10.  
  11. function start_pencil(src,eventdata, handles)
  12.  
  13. cla(handles.axesToDrawOn);
  14.  
  15. coords=get(src,'currentpoint'); %scomo este es el callback del axes, src=gca
  16.  
  17. x=coords(1,1,1);
  18.  
  19. y=coords(1,2,1);
  20.  
  21.  
  22.  
  23. global lineCoords;
  24.  
  25. newPoint = [coords(1,1,1) coords(1,2,1)];
  26.  
  27. lineCoords = newPoint;
  28.  
  29.  
  30.  
  31. 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
  32.  
  33.  
  34.  
  35. set(gcf,'windowbuttonmotionfcn',{@continue_pencil,r})
  36.  
  37. set(gcf,'windowbuttonupfcn',@done_pencil)
  38.  
  39.  
  40.  
  41. function continue_pencil(src,eventdata,r)
  42.  
  43. %src es ahora el handle del figure, y no del axes, por lo tanto necesitamos usar gca.
  44.  
  45. coords=get(gca,'currentpoint'); %esto actualiza cada vez que mueva el mouse
  46.  
  47. x=coords(1,1,1);
  48.  
  49. y=coords(1,2,1);
  50.  
  51.  
  52.  
  53. global lineCoords;
  54.  
  55.  
  56.  
  57. newPoint = [coords(1,1,1) coords(1,2,1)];
  58.  
  59. D = [lineCoords; newPoint];
  60.  
  61. lineCoords = D;
  62.  
  63.  
  64.  
  65. %obtener las coordenadas de la linea existente y agregarle las nuevas
  66.  
  67. lastx=get(r,'xdata');
  68.  
  69. lasty=get(r,'ydata');
  70.  
  71. newx=[lastx x];
  72.  
  73. newy=[lasty y];
  74.  
  75. set(r,'xdata',newx,'ydata',newy);
  76.  
  77.  
  78.  
  79. function done_pencil(src,evendata)
  80.  
  81.  
  82.  
  83. %Desactiva la función e movimiento
  84.  
  85. global lineCoords
  86.  
  87. set(gcf,'windowbuttonmotionfcn','')
  88.  
  89. 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
  1. function xMinEdit_Callback(hObject, eventdata, handles)
  2.  
  3. Val=get(hObject,'String');
  4.  
  5.  
  6.  
  7. if(isnan(IsNumber(Val)))
  8.  
  9.    set(hObject, 'String', handles.xMin);
  10.  
  11. else
  12.  
  13.    NewVal=str2num(Val);
  14.  
  15.    handles.xMin=NewVal;
  16.  
  17.  
  18.  
  19.    axis([handles.xMin,handles.xMax,handles.yMin,handles.yMax]);
  20.  
  21. end
  22.  
  23. guidata(hObject, handles);
  24.  
  25.  
  26.  
  27. function [varargout] = IsNumber( x )
  28.  
  29. num=str2num(x);
  30.  
  31.  
  32.  
  33. if (isempty(num)==0)
  34.  
  35.    varargout{1}=num;
  36.  
  37. else
  38.  
  39.    varargout{1} = NaN;
  40.  
  41.    errordlg('Debes insertar un numero', 'Error de entrada', 'modal');
  42.  
  43. end
  44. end

Salu2s