2016-08-04 2 views
0

MATLAB 버전 2015에서 MovStr 기능 업데이트에 대한 도움이 필요합니다. 전에 MATLAB Function 2013을 사용하고있었습니다. 아래에 주어진 기능이 나를 위해 작동하지 않습니다. 어떻게하면 효과가 있습니까? 감사합니다MovStr 기능 업데이트 (MATLAB 2015 버전)

function MoveStr(ws) 
% ws: with of a blank character 

p1 = get(gca,'CurrentPoint'); 
set(gcf,'Pointer','fleur') 
set(gcf,'WindowButtonUpFcn', sprintf('MoveStrUp(%1.20g,%1.8g,%1.8g,%1.8g)',gcbo,p1(1,1),p1(1,2),ws)) 
set(gcf,'WindowButtonMotionFcn',sprintf('MoveStrMo(%1.20g,%1.8g,%1.8g)',gcbo,p1(1,1),p1(1,2))) 

% alle Textobjekte mitbewegen 
ch = [gcbo get(gcbo,'UserData')]; 
for i = 1:length(ch) 
    if strcmpi(get(ch(i),'Type'),'text') 
     set(ch(i),'Selected','on') 
    end 
end 

function MoveStrMo(obj,x,y) 
%set(gcf,'WindowButtonMotionFcn','') 
d_pos = get(gca,'CurrentPoint'); 
set(gcf,'WindowButtonMotionFcn',sprintf('MoveStrMo(%20.15f,%f,%f)',obj,d_pos(1,1),d_pos(1,2))) 
%set(gcf, 'WindowButtonMotionFcn', @(s,e)MoveStrMo(obj,d_pos(1,1),d_pos(1,2))); 
d_pos = [d_pos(1,1)-x,d_pos(1,2)-y 0]; 
ch = [obj get(obj,'UserData')]; 
for i = 1:length(ch) 
    if isgraphics(ch(i),'text') 
     pos = get(ch(i),'Position'); 
     set(ch(i),'Position',[pos(1) pos(2) 2] + d_pos) 
    end 
end 

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% MATLAB의 이전 버전에서 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function MovePointer 
ans = get(gcbo,'UserData'); 
if strcmpi(get(ans(1),'Type'),'string') 
% if isgraphics (ans1(1), 'string') 
    ans = ans(2); 
end 
set(gcf,'Pointer','fleur') 
% set(gcf,'WindowButtonUpFcn',sprintf('MovePointerUp(%20.15f,%20.15f)',gcbo,ans(1))) 
% set(gcf,'WindowButtonMotionFcn',sprintf('MovePointerMo(%20.15f,%20.15f)',gcbo,ans(1))) 
set(gcf,'WindowButtonUpFcn',sprintf('MovePointerUp(%20.15f,%20.15f)',double(gcbo),ans(1))) 
set(gcf,'WindowButtonMotionFcn',sprintf('MovePointerMo(%20.15f,%20.15f)',double(gcbo),ans(1))) 
% set(gcf, 'WindowButtonUpFcn', @(s,e)MoveStrUp(gcbo, ans(1))); 
% set(gcf, 'WindowButtonMotionFcn', @(s,e)MoveStrMo(gcbo, ans(1))); 
set(gcbo,'Selected','on') 
+0

이 코드는 2013 버전에서 작동합니까? 여기서 "작동하지 않는"것은 무엇을 의미합니까? 오류가 있습니까? 기대하는 행동과 실제 행동을 기술하십시오. – YakovL

+1

안녕 Yakovl. Move Str 함수를 사용했고이 코드는 2013 버전에서 작동했습니다. 그러나 이제 MATLAB 버전 2015에서 일부 수정이 발생했으며 더 이상 "sprintf"를 사용할 수 없습니다. – KHAN6691

+1

MATLAB에서는 그래픽 개체 배열에 숫자 값을 추가 할 수 없습니다. MATLAB에서 숫자 값을 예상하는 함수에서 개체 핸들을 사용하려고해도 비슷한 문제가 발생합니다. 이것의 간단한 예제는 sprintf 함수에서 발생합니다. – KHAN6691

답변

1

, 그래픽 핸들은 단순히 그래픽 객체를 참조하는 데 사용할 수있는 부동 소수점 수 또는 정수였습니다. R2014b부터는 sprintf('%g')이 개체를 숫자 자체로 변환 할 수 없기 때문에 모든 그래픽 개체는 개체입니다. 코드가 손상됩니다.

당신은 은 여전히 ​​그래픽의 double 방법을 사용하여 그래픽 객체의 숫자 핸들을 가져올 오브젝트 수 :

set(gcf,'WindowButtonMotionFcn',sprintf('MoveStrMo(%1.20g,%1.8g,%1.8g)',double(gcbo),p1(1,1),p1(1,2))) 

하지만이을하시기 바랍니다. MATLAB에 의해 평가 될 정교한 문자열을 만드는 대신 함수 핸들을 사용하여 콜백을 작성해야합니다. 이 방법을 사용하면 그래픽 객체를 직접 전달할 수 있으므로 부동 소수점 숫자를 문자열로 변환 할 때 정밀도를 잃을 염려가 없습니다. 또한 나중에 코드를 읽으려는 사람은 누구나 많은 사람 클리너이므로 실제로 감사하게 될 것입니다.

set(gcf, 'WindowButtonUpFcn', @(s,e)moveStrUp(gcbo, p1(1,1), p1(1,2), ws)); 
set(gcf, 'WindowButtonMOtionFcn', @(s,e)MoveStrMo(gcbo, p1(1,1), p1(1,2))); 

업데이트

당신이 당신의 콜백 내에서 콜백을 할당하는 것이 나타납니다 때문에, 당신은 익명 함수 형식으로 사용할뿐만 아니라 이들을 수정해야합니다 :

function MoveStrMo(obj,x,y) 
    d_pos = get(gca,'CurrentPoint'); 
    set(gcf, 'WindowButtonMotionFcn', @(s,e)MoveStrMo(obj, d_pos(1,1), d_pos(1,2)); 
    d_pos = [d_pos(1,1)-x,d_pos(1,2)-y 0]; 
    ch = [obj get(obj,'UserData')]; 
    for i = 1:length(ch) 
     if isgraphics(ch(i),'text') 
      pos = get(ch(i),'Position'); 
      set(ch(i),'Position',[pos(1) pos(2) 2] + d_pos) 
     end 
    end 
end 

그리고 MovePointer

function MovePointer 
    ans = get(gcbo,'UserData'); 
    if strcmpi(get(ans(1),'Type'), 'text') 
     ans = ans(2); 
    end 

    set(gcf,'Pointer','fleur') 
    set(gcf, 'WindowButtonUpFcn', @(s,e)MoveStrUp(gcbo, ans(1))); 
    set(gcf, 'WindowButtonMotionFcn', @(s,e)MoveStrMo(gcbo, ans(1))); 
    set(gcbo,'Selected','on') 
end 
+0

set (gcf, 'WindowButtonUpFcn', @ (s, e) moveStrUp (gcbo, p1 (1,1), p1 (1,2), ws)); set (gcf, 'WindowButtonMOtionFcn', @ (s, e) MoveStrMo (gcbo, p1 (1,1), p1 (1,2))); 그래서 위 코드 코드 줄을 바꿔야합니까? – KHAN6691

+0

@WasimAkhtar 예, 그들이 무엇을하고 있는지 이해할 시간을 가지십시오. – Suever

+0

@WasimAkhtar이 기능이 도움이 되었습니까? – Suever