2011-12-23 30 views
1

我有以下代碼,它是地球周圍衛星移動的圖形渲染。Matlab中的對象句柄錯誤無效

function ex 
global state; 
fh = figure('Menu','none','Toolbar','none','Units','characters'); 
hPanAni = uipanel('parent',fh,'Units','characters','Position',... 
    [22.6 10.4 53 23],'title','Controls','FontSize',11,... 
    'FontAngle','italic','FontWeight','bold'); 
hIniAni = uicontrol(hPanAni,'Style','pushbutton','Units','normalized',... 
    'Position',[0.14 0.75 0.5 0.12],'String','Spin',... 
    'FontSize',10,'Callback',@hIniAniCallback); 
hFinAni = uicontrol(hPanAni,'Style','pushbutton','Units','normalized',... 
    'Position',[0.14 0.5 0.5 0.12],'String','Stop',... 
    'FontSize',10,'Callback',@hFinAniCallback); 
hResetAni = uicontrol(hPanAni,'Style','pushbutton','Units','normalized',... 
    'Position',[0.14 0.25 0.5 0.12],'String','Reset',... 
    'FontSize',10,'Callback',@hResetAniCallback); 
hPantSim = uipanel('Parent',fh,'Units','characters',... 
    'Position',[107.87 8 157.447 42],'BorderType','none','title',... 
    'Screen','FontSize',11,'FontAngle','italic',... 
    'FontWeight','bold'); 
hPantSimInt = uipanel('Parent',hPantSim,'Units','normalized','Position',... 
    [0 0 1 1],'BorderType','line','BackgroundColor','black'); 
ah4 = axes('Parent',hPantSimInt,'Units','normalized','Position',... 
    [0 0 1 1],'Color','none','Visible','off','DataAspectRatio',... 
    [1 1 1],'NextPlot','add'); 
rotate3d(ah4); 
hgrot = hgtransform('Parent',ah4); 
T1 = 0:pi/100:2*pi; 
Y = zeros(numel(T1),3); 
Y(:,1) = 7000*cos(T1); 
Y(:,2) = 7000*sin(T1); 
xmin = min(Y(:,1)); 
ymin = min(Y(:,2)); 
zmin = min(Y(:,3)); 
xmax = max(Y(:,1)); 
ymax = max(Y(:,2)); 
zmax = max(Y(:,3)); 
Resf = 6378; 
xmin2 = min(xmin,-Resf); 
xmax2 = max(xmax,Resf); 
ymin2 = min(ymin,-Resf); 
ymax2 = max(ymax,Resf); 
zmin2 = min(zmin,-Resf); 
zmax2 = max(zmax,Resf); 
set(ah4,'XLim',[xmin2 xmax2],'YLim',[ymin2 ymax2],'ZLim',[zmin2 zmax2]); 
maptext = imread('tierra.jpg'); 
[X_im, map] = rgb2ind(maptext,128); 
[x_esf,y_esf,z_esf] = sphere(50); 
x_esf = Resf*x_esf; 
y_esf = Resf*y_esf; 
z_esf = Resf*z_esf; 
props.FaceColor= 'texture'; 
props.EdgeColor = 'none'; 
props.Parent = hgrot; 
props.Cdata = flipud(X_im); % it is necesary to do this for getting the 
% appropiate image on the sphere 
surface(x_esf,y_esf,z_esf,props); 
colormap(map); 
axis equal vis3d; 
view(3); 
az = 0; 
Fin = numel(T1); 
k = 2; 
ind_ini = 0; 
state = 0; 
handles.tray = zeros(1,Fin); 
handles.psat = line('parent',ah4,'XData',Y(1,1), 'YData',Y(1,2),... 
    'ZData',Y(1,3),'Marker','o', 'MarkerSize',10,'MarkerFaceColor','b'); 
     function hIniAniCallback(hObject,evt) 
      if (ind_ini == 1) 
       return; 
      end 
      ind_ini = 1; 
      state = 0; 
      while (k<Fin) 
      az = az + 0.01745329252; 
      set(hgrot,'Matrix',makehgtform('zrotate',az)); 
      handles.tray(k) = line([Y(k-1,1) Y(k,1)],[Y(k-1,2) Y(k,2)],... 
       [Y(k-1,3) Y(k,3)],... 
     'Color','red','LineWidth',3); 
      set(handles.psat,'XData',Y(k,1),'YData',Y(k,2),'ZData',Y(k,3)); 
      pause(0.02); 
      k = k + 1, 

      if (state == 1) 
       state = 0; 
       break; 
      end 
      end 
     end 

    function hFinAniCallback(hObject,evt) 
     ind_ini = 0; 
     state = 1; 
    end 
function hResetAniCallback(hObject,evt) 
    set([handles.tray,handles.psat],'Visible','off'); 
    k = 2; 
    ind_ini = 0; 
    state = 1; 
    az = 0; 
    set(hgrot,'Matrix',makehgtform('zrotate',az)); 
    handles.psat = line('parent',ah4,'XData',Y(1,1), 'YData',Y(1,2),... 
    'ZData',Y(1,3),'Marker','o', 'MarkerSize',10,'MarkerFaceColor','b'); 
end 

end 

然而,當我將它複製到我的主要程序中,我得到了以下錯誤消息:

??? Error using ==> surface 
Invalid object handle 

Error in ==> simorbiv8v3>hIniPropCallback at 1911 
surface(x_esf,y_esf,z_esf,props); 

??? Error while evaluating uicontrol Callback 

編輯:一些證據後,我檢查了ishandle(props.Parent)是假的。作爲props.Parent = hgrot,問題來源是這個hgtransform變量。它在主程序中被宣佈爲全球性的,所以應該沒有問題。我不明白hgrot有什麼問題。

+0

我懷疑有人會通讀所有的代碼。隔離導致錯誤的原因並刪除其他所有內容,然後人們可以幫助您。 – Phonon 2011-12-24 02:26:23

+0

第二聲子在這裏有很多額外的信息。 – 2011-12-24 02:31:27

+0

@Phonon:我認爲代碼是理解我的問題所必需的。我可能寫過,我在命令行'surface(x_esf,y_esf,z_esf,props);'然後編寫了一個消息錯誤,但這不會很有用。 – julian 2011-12-24 09:59:11

回答

1

我懷疑這是一個Matlab GUI?

如果是這樣,你需要的變量手柄傳遞給腳本,通常通過MATLAB和EVENTDATA作爲hObject以及標準程序的所有功能,回調等

function ex(hObject, eventdata, handles) 

而且不要忘了更新GUI數據以關閉該功能。

guidata(hObject,handles); 

我認爲所有使用句柄結構的嵌套函數都需要這個。

希望這會有所幫助。

+0

非常感謝您的回答。 – julian 2011-12-24 09:55:40

0

最後,我發現在主程序中有一個cla命令行,這是犯錯誤的。