spaderdabomb
spaderdabomb

Reputation: 952

MATLAB keeps updating the wrong plot

I'm really hoping this isn't some stupid little thing I'm missing, but I've been trying to figure this thing out for a couple hours now and haven't made any progress. Basically, I've created a figure with 3 subplots. For neatness, I made a function out of setting up the plots, then I made another function that constantly updates the plot with real time data.

The problem is, in the real time update function, the third subplot works perfectly fine, but now I want my second subplot to also real-time update, which I have not gotten done yet. For some reason, whenever I put in my code to access the 2nd plot, it keeps updating the 3rd plot and writing right over it! Meanwhile, the second plot stays in it's initial state...

Here is the code...I've looked over it a billion times so I'm at a loss at this point, I don't know what else to do....like I said really hoping it isn't something dumb lol...thanks a bunch =).

EDIT: The part that's going wrong starts where it says "%refresh plot

Real Time Plot Function

function [  ] = EndoSliceViewerJP( Naviparam,  DICOMparam)
%RGBparam should be included later - add +1 to nargin values 

%visualizes: 
%1st: RGB camera Live view 
%2nd: Orientation and Position of Navigation System
%3rd: DICOM Slice relative to navigated Endoscope in a and its orientation
%in a Slice perpendicular to the endoscope
%assumes Navigation system running with referenced tool (Naviparam.tool=4 or Naviparam.tool=5)

%currently this plots slices according to Endoscope position, could add
%vector in plot that shows orientation of the scope...
disp('Endo Slice Viewer');
disp('" ": exit on space key');
global kpressed;
kpressed = 0;

global Fig
Fig=EndoSliceViewer_createFigure(1);
set(Fig.fig,'KeyPressFcn','global kpressed; global Fig; kpressed = get(Fig.fig,''CurrentChar'');');

%create matrices and filter for smoothing of Endo Slice Data
xrel=-(ones(Fig.resolEndoSlice,1)*(1:Fig.resolEndoSlice)-Fig.resolEndoSlice/2);
yrel=-(ones(Fig.resolEndoSlice,1)*(1:Fig.resolEndoSlice)-Fig.resolEndoSlice/2);
SLimage=zeros(Fig.resolEndoSlice,Fig.resolEndoSlice);
PosVec=zeros(Fig.resolEndoSlice,Fig.resolEndoSlice,3);
gfilt = fspecial('gaussian',5,1.5);
depth = 50;


exitflag = 0;
while (exitflag == 0)
     %check on keyboard input
     if kpressed ~= 0
        switch kpressed
            case 'r'
                depth=depth+2
            case 'f'
                depth=depth-2
            case ' '
                exitflag = 1;
                disp('**** Exit Endo Slice Viewer ****')

        end
        kpressed = 0;
     end

if (nargin>=1) %Naviparam is passed - update Navigation View
     %capture new navigation data
     Naviparam=Navi_acquire(Naviparam);
     Naviparam=Navi_calc_data(Naviparam);

     %refreshN avigation View
     %NOT YET IMPLEMENTED: UPDATE NAVIGATION PLOT 

     if (nargin==2) %DICOMparam is also passed - update EndoSlice View
         EndoVecX=inv(DICOMparam.calib.navi2dicom(1:3,1:3))*inv(Naviparam.data.Endo_RefHomMat(1:3,1:3))*[1;0;0];
         EndoVecY=inv(DICOMparam.calib.navi2dicom(1:3,1:3))*inv(Naviparam.data.Endo_RefHomMat(1:3,1:3))*[0;1;0];
         EndoVecZ=inv(DICOMparam.calib.navi2dicom(1:3,1:3))*inv(Naviparam.data.Endo_RefHomMat(1:3,1:3))*[0;0;-1];
         EndoVecX=EndoVecX/norm(EndoVecX);
         EndoVecY=EndoVecY/norm(EndoVecY);
         EndoVecZ=EndoVecZ/norm(EndoVecZ);
         mask=ones(Fig.resolEndoSlice,Fig.resolEndoSlice);
         S=[DICOMparam.Sx; DICOMparam.Sy; DICOMparam.Sz];

         DICOMPos = DICOMparam.calib.navi2dicom*[Naviparam.data.Endo_RefOffsetPosVec;1];

         for i=1:3
             %Point on Plane defined by Endo Position plus distance*Viewing direction vector
             PosVec(:,:,i)=(DICOMPos(i)+depth*EndoVecZ(i))+xrel*EndoVecX(i)+yrel*EndoVecY(i);
             %limit positions to integer values inside DICOM data cube
             PosVec(:,:,i)=round(PosVec(:,:,i));
             PosVec(:,:,i)=min(max(PosVec(:,:,i),1),S(i));
             %create mask to set Points outside the data cube to 0
             mask=double(PosVec(:,:,i)>1).*double(PosVec(:,:,i)<S(i).*mask(:,:));
         end
         %access data cube via indexed labelling
         XposTemp=PosVec(:,:,1); YposTemp=PosVec(:,:,2); ZposTemp=PosVec(:,:,3);
         indexTemp=sub2ind(size(DICOMparam.Vd), XposTemp(:), YposTemp(:),ZposTemp(:));
         SLimage(:)=DICOMparam.Vd(indexTemp(:));

         SLimage=SLimage.*mask;
         SLimage=imfilter(SLimage,gfilt);

         %refresh plot
         set(Fig.sub3im, 'cdata', SLimage);
         hold on;
         Fig.sub2im=plot3(PosVec(1),PosVec(2),PosVec(3),'b*',PosVec(1)+depth*EndoVecZ(1),PosVec(2)-depth*EndoVecZ(2),PosVec(3)+depth*EndoVecZ(3),'r*');
         hold off;
     end
end

%RGBparam is always passed - update RGB camera View
%capture new RGB data
%handles.RGBparam=RGB_acquire(handles.RGBparam);
%refresh RGB camera View
%set(Fig.sub1im, 'CData', imresize(handles.RGBparam.image,[Fig.resolEndoRGB(1) Fig.resolEndoRGB(2)]));  


drawnow;
end

close(Fig.fig);
clear global;


end

And here is my function setting up the plot

function [Fig] = EndoSliceViewer_createFigure(Figindex)
%This function creates and returns a Figure object to visualizes DICOM data
%in the plane orthogonal to the endoscopic view, the RGB view of the camera
%and the orientation of the navigation

%set resolution for Endo Slice Plot
Fig.resolEndoSlice=300; 
Fig.resolEndoRGB=[720 1280]; 
Fig.resolEndoNavi=[500 500 500]; 

%init figure on screen
Fig.fig=figure(Figindex); gcf;
set(Fig.fig,'Position',[50 500 1500 500],'Name','Endo Slice Viewer');
%set(Fig.fig,'KeyPressFcn','global kpressed; global Fig; kpressed = get(Fig.fig,''CurrentChar'');');

Fig.sub1=subplot(1,3,1);
Fig.sub1im=image(uint8(zeros(Fig.resolEndoRGB(1), Fig.resolEndoRGB(2),3)));
title('Endo Camera View');
daspect([1 1 1]);

Fig.sub2=subplot(1,3,2);
Fig.BoxX=[0;1;1;0;0;0;1;1;0;0;1;1;1;1;1;0;0]*Fig.resolEndoNavi(1);
Fig.BoxY=[0;0;1;1;0;0;0;1;1;1;1;1;0;0;0;0;1]*Fig.resolEndoNavi(2);
Fig.BoxZ=[0;0;0;0;0;1;1;1;1;0;0;1;1;0;1;1;1]*Fig.resolEndoNavi(3);
Fig.sub2im=plot3(Fig.BoxX,Fig.BoxY,Fig.BoxZ);
title('Navigation View');
xlim([-0.2*Fig.resolEndoNavi(1),  1.2*Fig.resolEndoNavi(1)]);
ylim([-0.2*Fig.resolEndoNavi(2),  1.2*Fig.resolEndoNavi(2)]);
zlim([-0.2*Fig.resolEndoNavi(3),  1.2*Fig.resolEndoNavi(3)]);
xlabel('X [vox]');
ylabel('Y [vox]');
zlabel('Z [vox]');
daspect([1 1 1]);

Fig.sub3=subplot(1,3,3);
Fig.sub3im=imagesc(zeros(Fig.resolEndoSlice, Fig.resolEndoSlice));
title('Endo Slice View');
xlim([0 Fig.resolEndoSlice]);
ylim([0 Fig.resolEndoSlice]);
xlabel('Xendo [vox]');
ylabel('Yendo [vox]');
daspect([1 1 1]);
colormap bone
drawnow;

%potentially: add subplot for navigation position display later
end

Upvotes: 2

Views: 752

Answers (1)

Molly
Molly

Reputation: 13610

You need to set your second subplot as the current axes before plotting anything in it. You can use axes(Fig.sub2) before the plotting command.

Upvotes: 2

Related Questions