Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F121888857
spm_mesh_render.m
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Mon, Jul 14, 15:43
Size
26 KB
Mime Type
text/x-Algol68
Expires
Wed, Jul 16, 15:43 (1 d, 23 h)
Engine
blob
Format
Raw Data
Handle
27405275
Attached To
R5163 Slepians
spm_mesh_render.m
View Options
function
varargout
=
spm_mesh_render
(
action
,
varargin
)
%
Display
a
surface
mesh
&
various
utilities
%
FORMAT
H
=
spm_mesh_render
(
'
Disp
'
,
M
,
'
PropertyName
'
,
propertyvalue
)
%
M
-
a
GIfTI
filename
/
object
or
patch
structure
%
H
-
structure
containing
handles
of
various
objects
%
Opens
a
new
figure
unless
a
'
parent
'
Property
is
provided
with
an
axis
%
handle
.
%
%
FORMAT
H
=
spm_mesh_render
(
M
)
%
Shortcut
to
previous
call
format
.
%
%
FORMAT
H
=
spm_mesh_render
(
'
ContextMenu
'
,
AX
)
%
AX
-
axis
handle
or
structure
returned
by
spm_mesh_render
(
'
Disp
'
,...)
%
%
FORMAT
H
=
spm_mesh_render
(
'
Overlay
'
,
AX
,
P
)
%
AX
-
axis
handle
or
structure
given
by
spm_mesh_render
(
'
Disp
'
,...)
%
P
-
data
to
be
overlayed
on
mesh
(
see
spm_mesh_project
)
%
%
FORMAT
H
=
spm_mesh_render
(
'
ColourBar
'
,
AX
,
MODE
)
%
AX
-
axis
handle
or
structure
returned
by
spm_mesh_render
(
'
Disp
'
,...)
%
MODE
-
{[
'
on
'
],
'
off
'
}
%
%
FORMAT
H
=
spm_mesh_render
(
'
ColourMap
'
,
AX
,
MAP
)
%
AX
-
axis
handle
or
structure
returned
by
spm_mesh_render
(
'
Disp
'
,...)
%
MAP
-
a
colour
map
matrix
%
%
FORMAT
MAP
=
spm_mesh_render
(
'
ColourMap
'
,
AX
)
%
Retrieves
the
current
colourmap
.
%
%
FORMAT
spm_mesh_render
(
'
Register
'
,
AX
,
hReg
)
%
AX
-
axis
handle
or
structure
returned
by
spm_mesh_render
(
'
Disp
'
,...)
%
hReg
-
Handle
of
HandleGraphics
object
to
build
registry
in
.
%
See
spm_XYZreg
for
more
information
.
%
__________________________________________________________________________
%
Copyright
(
C
)
2010
-
2011
Wellcome
Trust
Centre
for
Neuroimaging
%
Guillaume
Flandin
%
$Id:
spm_mesh_render
.
m
5411
2013
-
04
-
15
11
:
45
:
08
Z
guillaume
$
%-
Input
parameters
%--------------------------------------------------------------------------
if
~
nargin
,
action
=
'
Disp
'
;
end
if
~
ischar
(
action
)
varargin
=
{
action
varargin
{
:
}};
action
=
'
Disp
'
;
end
varargout
=
{[]};
%-
Action
%--------------------------------------------------------------------------
switch
lower
(
action
)
%-
Display
%======================================================================
case
'
disp
'
if
isempty
(
varargin
)
[
M
,
sts
]
=
spm_select
(
1
,
'
mesh
','
Select
surface
mesh
file
'
);
if
~
sts
,
return
;
end
else
M
=
varargin
{
1
};
end
if
ischar
(
M
)
||
isstruct
(
M
),
M
=
gifti
(
M
);
end
if
~
isfield
(
M
,
'
vertices
'
)
try
MM
=
M
;
M
=
gifti
(
MM
.
private
.
metadata
(
1
).
value
);
try
,
M
.
cdata
=
MM
.
cdata
();
end
catch
error
(
'
Cannot
find
a
surface
mesh
to
be
displayed
.
'
);
end
end
M
=
export
(
M
,
'
patch
'
);
O
=
getOptions
(
varargin
{
2
:
end
});
%-
Figure
&
Axis
%------------------------------------------------------------------
if
isfield
(
O
,
'
parent
'
)
H
.
axis
=
O
.
parent
;
H
.
figure
=
ancestor
(
H
.
axis
,
'
figure
'
);
figure
(
H
.
figure
);
axes
(
H
.
axis
);
else
H
.
figure
=
figure
(
'
Color
'
,[
1
1
1
]);
H
.
axis
=
axes
(
'
Parent
'
,
H
.
figure
);
set
(
H
.
axis
,
'
Visible
','
off
'
);
end
renderer
=
get
(
H
.
figure
,
'
Renderer
'
);
set
(
H
.
figure
,
'
Renderer
','
OpenGL
'
);
%-
Patch
%------------------------------------------------------------------
P
=
struct
(
'
vertices
'
,
M
.
vertices
,
'
faces
'
,
M
.
faces
);
H
.
patch
=
patch
(
P
,...
'
FaceColor
'
,
[
0.6
0.6
0.6
],...
'
EdgeColor
'
,
'
none
'
,...
'
FaceLighting
'
,
'
phong
'
,...
'
SpecularStrength
'
,
0.7
,...
'
AmbientStrength
'
,
0.1
,...
'
DiffuseStrength
'
,
0.7
,...
'
SpecularExponent
'
,
10
,...
'
Clipping
'
,
'
off
'
,...
'
DeleteFcn
'
,
{
@
myDeleteFcn
,
renderer
},...
'
Visible
'
,
'
off
'
,...
'
Tag
'
,
'
SPMMeshRender
'
,...
'
Parent
'
,
H
.
axis
);
setappdata
(
H
.
patch
,
'
patch
'
,
P
);
%-
Label
connected
components
of
the
mesh
%------------------------------------------------------------------
C
=
spm_mesh_label
(
P
);
setappdata
(
H
.
patch
,
'
cclabel
'
,
C
);
%-
Compute
mesh
curvature
%------------------------------------------------------------------
curv
=
spm_mesh_curvature
(
P
)
>
0
;
setappdata
(
H
.
patch
,
'
curvature
'
,
curv
);
%-
Apply
texture
to
mesh
%------------------------------------------------------------------
if
isfield
(
M
,
'
facevertexcdata
'
)
T
=
M
.
facevertexcdata
;
else
T
=
[];
end
updateTexture
(
H
,
T
);
%-
Set
viewpoint
,
light
and
manipulation
options
%------------------------------------------------------------------
axis
(
H
.
axis
,
'
image
'
);
axis
(
H
.
axis
,
'
off
'
);
view
(
H
.
axis
,[
-
90
0
]);
material
(
H
.
figure
,
'
dull
'
);
H
.
light
=
camlight
;
set
(
H
.
light
,
'
Parent
'
,
H
.
axis
);
H
.
rotate3d
=
rotate3d
(
H
.
axis
);
set
(
H
.
rotate3d
,
'
Enable
','
on
'
);
set
(
H
.
rotate3d
,
'
ActionPostCallback
'
,{
@
myPostCallback
,
H
});
%
try
%
setAllowAxesRotate
(
H
.
rotate3d
,
...
%
setxor
(
findobj
(
H
.
figure
,
'
Type
','
axes
'
),
H
.
axis
),
false
);
%
end
%-
Store
handles
%------------------------------------------------------------------
setappdata
(
H
.
axis
,
'
handles
'
,
H
);
set
(
H
.
patch
,
'
Visible
','
on
'
);
%-
Add
context
menu
%------------------------------------------------------------------
spm_mesh_render
(
'
ContextMenu
'
,
H
);
%-
Context
Menu
%======================================================================
case
'
contextmenu
'
if
isempty
(
varargin
),
varargin
{
1
}
=
gca
;
end
H
=
getHandles
(
varargin
{
1
});
if
~
isempty
(
get
(
H
.
patch
,
'
UIContextMenu
'
)),
return
;
end
cmenu
=
uicontextmenu
(
'
Callback
'
,{
@
myMenuCallback
,
H
});
uimenu
(
cmenu
,
'
Label
','
Inflate
'
,
'
Interruptible
','
off
'
,
...
'
Callback
'
,{
@
myInflate
,
H
});
uimenu
(
cmenu
,
'
Label
','
Overlay
...
'
,
'
Interruptible
','
off
'
,
...
'
Callback
'
,{
@
myOverlay
,
H
});
uimenu
(
cmenu
,
'
Label
','
Image
Sections
...
'
,
'
Interruptible
','
off
'
,
...
'
Callback
'
,{
@
myImageSections
,
H
});
c
=
uimenu
(
cmenu
,
'
Label
'
,
'
Connected
Components
'
,
'
Interruptible
','
off
'
);
C
=
getappdata
(
H
.
patch
,
'
cclabel
'
);
for
i
=
1
:
length
(
unique
(
C
))
uimenu
(
c
,
'
Label
'
,
sprintf
(
'
Component
%
d
'
,
i
),
'
Checked
','
on
'
,
...
'
Callback
'
,{
@
myCCLabel
,
H
});
end
uimenu
(
cmenu
,
'
Label
','
Rotate
'
,
'
Checked
','
on
'
,
'
Separator
','
on
'
,
...
'
Callback
'
,{
@
mySwitchRotate
,
H
});
uimenu
(
cmenu
,
'
Label
','
Synchronise
Views
'
,
'
Visible
','
off
'
,
...
'
Checked
','
off
'
,
'
Tag
','
SynchroMenu
'
,
'
Callback
'
,{
@
mySynchroniseViews
,
H
});
c
=
uimenu
(
cmenu
,
'
Label
','
View
'
);
uimenu
(
c
,
'
Label
','
Go
to
Y
-
Z
view
(
right
)
'
,
'
Callback
'
,
{
@
myView
,
H
,
[
90
0
]});
uimenu
(
c
,
'
Label
','
Go
to
Y
-
Z
view
(
left
)
'
,
'
Callback
'
,
{
@
myView
,
H
,
[
-
90
0
]});
uimenu
(
c
,
'
Label
','
Go
to
X
-
Y
view
(
top
)
'
,
'
Callback
'
,
{
@
myView
,
H
,
[
0
90
]});
uimenu
(
c
,
'
Label
','
Go
to
X
-
Y
view
(
bottom
)
'
,
'
Callback
'
,
{
@
myView
,
H
,
[
-
180
-
90
]});
uimenu
(
c
,
'
Label
','
Go
to
X
-
Z
view
(
front
)
'
,
'
Callback
'
,
{
@
myView
,
H
,
[
-
180
0
]});
uimenu
(
c
,
'
Label
','
Go
to
X
-
Z
view
(
back
)
'
,
'
Callback
'
,
{
@
myView
,
H
,
[
0
0
]});
uimenu
(
cmenu
,
'
Label
','
Colorbar
'
,
'
Callback
'
,
{
@
myColourbar
,
H
});
c
=
uimenu
(
cmenu
,
'
Label
','
Colormap
'
);
clrmp
=
{
'
hot
' '
jet
' '
gray
' '
hsv
' '
bone
' '
copper
' '
pink
' '
white
'
...
'
flag
' '
lines
' '
colorcube
' '
prism
' '
cool
' '
autumn
'
...
'
spring
' '
winter
' '
summer
'
};
for
i
=
1
:
numel
(
clrmp
)
uimenu
(
c
,
'
Label
'
,
clrmp
{
i
},
'
Callback
'
,
{
@
myColourmap
,
H
});
end
c
=
uimenu
(
cmenu
,
'
Label
','
Transparency
'
);
uimenu
(
c
,
'
Label
','
0
%
'
,
'
Checked
','
on
'
,
'
Callback
'
,
{
@
myTransparency
,
H
});
uimenu
(
c
,
'
Label
','
20
%
'
,
'
Checked
','
off
'
,
'
Callback
'
,
{
@
myTransparency
,
H
});
uimenu
(
c
,
'
Label
','
40
%
'
,
'
Checked
','
off
'
,
'
Callback
'
,
{
@
myTransparency
,
H
});
uimenu
(
c
,
'
Label
','
60
%
'
,
'
Checked
','
off
'
,
'
Callback
'
,
{
@
myTransparency
,
H
});
uimenu
(
c
,
'
Label
','
80
%
'
,
'
Checked
','
off
'
,
'
Callback
'
,
{
@
myTransparency
,
H
});
uimenu
(
cmenu
,
'
Label
','
Data
Cursor
'
,
'
Callback
'
,
{
@
myDataCursor
,
H
});
c
=
uimenu
(
cmenu
,
'
Label
','
Background
Color
'
);
uimenu
(
c
,
'
Label
','
White
'
,
'
Callback
'
,
{
@
myBackgroundColor
,
H
,
[
1
1
1
]});
uimenu
(
c
,
'
Label
','
Black
'
,
'
Callback
'
,
{
@
myBackgroundColor
,
H
,
[
0
0
0
]});
uimenu
(
c
,
'
Label
','
Custom
...
'
,
'
Callback
'
,
{
@
myBackgroundColor
,
H
,
[]});
uimenu
(
cmenu
,
'
Label
','
Save
As
...
'
,
'
Separator
'
,
'
on
'
,
...
'
Callback
'
,
{
@
mySave
,
H
});
set
(
H
.
rotate3d
,
'
enable
','
off
'
);
try
,
set
(
H
.
rotate3d
,
'
uicontextmenu
'
,
cmenu
);
end
try
,
set
(
H
.
patch
,
'
uicontextmenu
'
,
cmenu
);
end
set
(
H
.
rotate3d
,
'
enable
','
on
'
);
dcm_obj
=
datacursormode
(
H
.
figure
);
set
(
dcm_obj
,
'
Enable
','
off
'
,
'
SnapToDataVertex
','
on
'
,
...
'
DisplayStyle
','
Window
'
,
'
Updatefcn
'
,{
@
myDataCursorUpdate
,
H
});
%-
Overlay
%======================================================================
case
'
overlay
'
if
isempty
(
varargin
),
varargin
{
1
}
=
gca
;
end
H
=
getHandles
(
varargin
{
1
});
if
nargin
<
3
,
varargin
{
2
}
=
[];
end
updateTexture
(
H
,
varargin
{
2
:
end
});
%-
Slices
%======================================================================
case
'
slices
'
if
isempty
(
varargin
),
varargin
{
1
}
=
gca
;
end
H
=
getHandles
(
varargin
{
1
});
if
nargin
<
3
,
varargin
{
2
}
=
[];
end
renderSlices
(
H
,
varargin
{
2
:
end
});
%-
ColourBar
%======================================================================
case
{
'
colourbar
'
,
'
colorbar
'
}
if
isempty
(
varargin
),
varargin
{
1
}
=
gca
;
end
if
length
(
varargin
)
==
1
,
varargin
{
2
}
=
'
on
'
;
end
H
=
getHandles
(
varargin
{
1
});
d
=
getappdata
(
H
.
patch
,
'
data
'
);
col
=
getappdata
(
H
.
patch
,
'
colourmap
'
);
if
strcmpi
(
varargin
{
2
},
'
off
'
)
if
isfield
(
H
,
'
colourbar
'
)
&&
ishandle
(
H
.
colourbar
)
delete
(
H
.
colourbar
);
H
=
rmfield
(
H
,
'
colourbar
'
);
setappdata
(
H
.
axis
,
'
handles
'
,
H
);
end
return
;
end
if
isempty
(
d
)
||
~
any
(
d
(
:
)),
varargout
=
{
H
};
return
;
end
if
isempty
(
col
),
col
=
hot
(
256
);
end
if
~
isfield
(
H
,
'
colourbar
'
)
||
~
ishandle
(
H
.
colourbar
)
H
.
colourbar
=
colorbar
(
'
peer
'
,
H
.
axis
);
set
(
H
.
colourbar
,
'
Tag
','
'
);
set
(
get
(
H
.
colourbar
,
'
Children
'
),
'
Tag
','
'
);
end
c
(
1
:
size
(
col
,
1
),
1
,
1
:
size
(
col
,
2
))
=
col
;
ic
=
findobj
(
H
.
colourbar
,
'
Type
','
image
'
);
if
size
(
d
,
1
)
>
1
set
(
ic
,
'
CData
'
,
c
(
1
:
size
(
d
,
1
),
:
,
:
));
set
(
ic
,
'
YData
'
,[
1
size
(
d
,
1
)]);
set
(
H
.
colourbar
,
'
YLim
'
,[
1
size
(
d
,
1
)]);
set
(
H
.
colourbar
,
'
YTickLabel
'
,[]);
else
set
(
ic
,
'
CData
'
,
c
);
clim
=
getappdata
(
H
.
patch
,
'
clim
'
);
if
isempty
(
clim
),
clim
=
[
false
min
(
d
)
max
(
d
)];
end
set
(
ic
,
'
YData
'
,
clim
(
2
:
3
));
set
(
H
.
colourbar
,
'
YLim
'
,
clim
(
2
:
3
));
end
setappdata
(
H
.
axis
,
'
handles
'
,
H
);
%-
ColourMap
%======================================================================
case
{
'
colourmap
'
,
'
colormap
'
}
if
isempty
(
varargin
),
varargin
{
1
}
=
gca
;
end
H
=
getHandles
(
varargin
{
1
});
if
length
(
varargin
)
==
1
varargout
=
{
getappdata
(
H
.
patch
,
'
colourmap
'
)
};
return
;
else
setappdata
(
H
.
patch
,
'
colourmap
'
,
varargin
{
2
});
d
=
getappdata
(
H
.
patch
,
'
data
'
);
updateTexture
(
H
,
d
);
end
%-
CLim
%======================================================================
case
'
clim
'
if
isempty
(
varargin
),
varargin
{
1
}
=
gca
;
end
H
=
getHandles
(
varargin
{
1
});
if
length
(
varargin
)
==
1
c
=
getappdata
(
H
.
patch
,
'
clim
'
);
if
~
isempty
(
c
),
c
=
c
(
2
:
3
);
end
varargout
=
{
c
};
return
;
else
if
isempty
(
varargin
{
2
})
||
any
(
~
isfinite
(
varargin
{
2
}))
setappdata
(
H
.
patch
,
'
clim
'
,[
false
NaN
NaN
]);
else
setappdata
(
H
.
patch
,
'
clim
'
,[
true
varargin
{
2
}]);
end
d
=
getappdata
(
H
.
patch
,
'
data
'
);
updateTexture
(
H
,
d
);
end
%-
Register
%======================================================================
case
'
register
'
if
isempty
(
varargin
),
varargin
{
1
}
=
gca
;
end
H
=
getHandles
(
varargin
{
1
});
hReg
=
varargin
{
2
};
xyz
=
spm_XYZreg
(
'
GetCoords
'
,
hReg
);
hs
=
myCrossBar
(
'
Create
'
,
H
,
xyz
);
set
(
hs
,
'
UserData
'
,
hReg
);
spm_XYZreg
(
'
Add2Reg
'
,
hReg
,
hs
,
@
myCrossBar
);
%-
Otherwise
...
%======================================================================
otherwise
try
H
=
spm_mesh_render
(
'
Disp
'
,
action
,
varargin
{
:
});
catch
error
(
'
Unknown
action
.
'
);
end
end
varargout
=
{
H
};
%==========================================================================
function
O
=
getOptions
(
varargin
)
O
=
[];
if
~
nargin
return
;
elseif
nargin
==
1
&&
isstruct
(
varargin
{
1
})
for
i
=
fieldnames
(
varargin
{
1
})
O
.(
lower
(
i
{
1
}))
=
varargin
{
1
}.(
i
{
1
});
end
elseif
mod
(
nargin
,
2
)
==
0
for
i
=
1
:
2
:
numel
(
varargin
)
O
.(
lower
(
varargin
{
i
}))
=
varargin
{
i
+
1
};
end
else
error
(
'
Invalid
list
of
property
/
value
pairs
.
'
);
end
%==========================================================================
function
H
=
getHandles
(
H
)
if
~
nargin
||
isempty
(
H
),
H
=
gca
;
end
if
ishandle
(
H
)
&&
~
isappdata
(
H
,
'
handles
'
)
a
=
H
;
clear
H
;
H
.
axis
=
a
;
H
.
figure
=
ancestor
(
H
.
axis
,
'
figure
'
);
H
.
patch
=
findobj
(
H
.
axis
,
'
type
','
patch
'
);
H
.
light
=
findobj
(
H
.
axis
,
'
type
','
light
'
);
H
.
rotate3d
=
rotate3d
(
H
.
figure
);
setappdata
(
H
.
axis
,
'
handles
'
,
H
);
elseif
ishandle
(
H
)
H
=
getappdata
(
H
,
'
handles
'
);
else
H
=
getappdata
(
H
.
axis
,
'
handles
'
);
end
%==========================================================================
function
myMenuCallback
(
obj
,
evt
,
H
)
H
=
getHandles
(
H
);
h
=
findobj
(
obj
,
'
Label
','
Rotate
'
);
if
strcmpi
(
get
(
H
.
rotate3d
,
'
Enable
'
),
'
on
'
)
set
(
h
,
'
Checked
','
on
'
);
else
set
(
h
,
'
Checked
','
off
'
);
end
if
numel
(
findobj
(
'
Tag
','
SPMMeshRender
','
Type
','
Patch
'
))
>
1
h
=
findobj
(
obj
,
'
Tag
','
SynchroMenu
'
);
set
(
h
,
'
Visible
','
on
'
);
end
h
=
findobj
(
obj
,
'
Label
','
Colorbar
'
);
d
=
getappdata
(
H
.
patch
,
'
data
'
);
if
isempty
(
d
)
||
~
any
(
d
(
:
)),
set
(
h
,
'
Enable
','
off
'
);
else
set
(
h
,
'
Enable
','
on
'
);
end
if
isfield
(
H
,
'
colourbar
'
)
if
ishandle
(
H
.
colourbar
)
set
(
h
,
'
Checked
','
on
'
);
else
H
=
rmfield
(
H
,
'
colourbar
'
);
set
(
h
,
'
Checked
','
off
'
);
end
else
set
(
h
,
'
Checked
','
off
'
);
end
setappdata
(
H
.
axis
,
'
handles
'
,
H
);
%==========================================================================
function
myPostCallback
(
obj
,
evt
,
H
)
P
=
findobj
(
'
Tag
','
SPMMeshRender
','
Type
','
Patch
'
);
if
numel
(
P
)
==
1
camlight
(
H
.
light
);
else
for
i
=
1
:
numel
(
P
)
H
=
getappdata
(
ancestor
(
P
(
i
),
'
axes
'
),
'
handles
'
);
camlight
(
H
.
light
);
end
end
%==========================================================================
function
varargout
=
myCrossBar
(
varargin
)
switch
lower
(
varargin
{
1
})
case
'
create
'
%----------------------------------------------------------------------
%
hMe
=
myCrossBar
(
'
Create
'
,
H
,
xyz
)
H
=
varargin
{
2
};
xyz
=
varargin
{
3
};
hold
(
H
.
axis
,
'
on
'
);
hs
=
plot3
(
xyz
(
1
),
xyz
(
2
),
xyz
(
3
),
'
Marker
','
+
','
MarkerSize
'
,
60
,...
'
parent
'
,
H
.
axis
,
'
Color
'
,[
1
1
1
],
'
Tag
','
CrossBar
','
ButtonDownFcn
'
,{});
varargout
=
{
hs
};
case
'
setcoords
'
%----------------------------------------------------------------------
%
[
xyz
,
d
]
=
myCrossBar
(
'
SetCoords
'
,
xyz
,
hMe
)
hMe
=
varargin
{
3
};
xyz
=
varargin
{
2
};
set
(
hMe
,
'
XData
'
,
xyz
(
1
));
set
(
hMe
,
'
YData
'
,
xyz
(
2
));
set
(
hMe
,
'
ZData
'
,
xyz
(
3
));
varargout
=
{
xyz
,[]};
otherwise
%----------------------------------------------------------------------
error
(
'
Unknown
action
string
'
)
end
%==========================================================================
function
myInflate
(
obj
,
evt
,
H
)
spm_mesh_inflate
(
H
.
patch
,
Inf
,
1
);
axis
(
H
.
axis
,
'
image
'
);
%==========================================================================
function
myCCLabel
(
obj
,
evt
,
H
)
C
=
getappdata
(
H
.
patch
,
'
cclabel
'
);
F
=
get
(
H
.
patch
,
'
Faces
'
);
ind
=
sscanf
(
get
(
obj
,
'
Label
'
),
'
Component
%
d
'
);
V
=
get
(
H
.
patch
,
'
FaceVertexAlphaData
'
);
Fa
=
get
(
H
.
patch
,
'
FaceAlpha
'
);
if
~
isnumeric
(
Fa
)
if
~
isempty
(
V
),
Fa
=
max
(
V
);
else
Fa
=
1
;
end
if
Fa
==
0
,
Fa
=
1
;
end
end
if
isempty
(
V
)
||
numel
(
V
)
==
1
Ve
=
get
(
H
.
patch
,
'
Vertices
'
);
if
isempty
(
V
)
||
V
==
1
V
=
Fa
*
ones
(
size
(
Ve
,
1
),
1
);
else
V
=
zeros
(
size
(
Ve
,
1
),
1
);
end
end
if
strcmpi
(
get
(
obj
,
'
Checked
'
),
'
on
'
)
V
(
reshape
(
F
(
C
==
ind
,
:
),[],
1
))
=
0
;
set
(
obj
,
'
Checked
','
off
'
);
else
V
(
reshape
(
F
(
C
==
ind
,
:
),[],
1
))
=
Fa
;
set
(
obj
,
'
Checked
','
on
'
);
end
set
(
H
.
patch
,
'
FaceVertexAlphaData
'
,
V
);
if
all
(
V
)
set
(
H
.
patch
,
'
FaceAlpha
'
,
Fa
);
else
set
(
H
.
patch
,
'
FaceAlpha
'
,
'
interp
'
);
end
%==========================================================================
function
myTransparency
(
obj
,
evt
,
H
)
t
=
1
-
sscanf
(
get
(
obj
,
'
Label
'
),
'
%
d
%%
'
)
/
100
;
set
(
H
.
patch
,
'
FaceAlpha
'
,
t
);
set
(
get
(
get
(
obj
,
'
parent
'
),
'
children
'
),
'
Checked
','
off
'
);
set
(
obj
,
'
Checked
','
on
'
);
%==========================================================================
function
mySwitchRotate
(
obj
,
evt
,
H
)
if
strcmpi
(
get
(
H
.
rotate3d
,
'
enable
'
),
'
on
'
)
set
(
H
.
rotate3d
,
'
enable
','
off
'
);
set
(
obj
,
'
Checked
','
off
'
);
else
set
(
H
.
rotate3d
,
'
enable
','
on
'
);
set
(
obj
,
'
Checked
','
on
'
);
end
%==========================================================================
function
myView
(
obj
,
evt
,
H
,
varargin
)
view
(
H
.
axis
,
varargin
{
1
});
axis
(
H
.
axis
,
'
image
'
);
camlight
(
H
.
light
);
%==========================================================================
function
myColourbar
(
obj
,
evt
,
H
)
y
=
{
'
on
','
off
'
};
toggle
=
@
(
x
)
y
{
1
+
strcmpi
(
x
,
'
on
'
)};
spm_mesh_render
(
'
Colourbar
'
,
H
,
toggle
(
get
(
obj
,
'
Checked
'
)));
%==========================================================================
function
myColourmap
(
obj
,
evt
,
H
)
spm_mesh_render
(
'
Colourmap
'
,
H
,
feval
(
get
(
obj
,
'
Label
'
),
256
));
%==========================================================================
function
mySynchroniseViews
(
obj
,
evt
,
H
)
P
=
findobj
(
'
Tag
','
SPMMeshRender
','
Type
','
Patch
'
);
v
=
get
(
H
.
axis
,
'
cameraposition
'
);
for
i
=
1
:
numel
(
P
)
H
=
getappdata
(
ancestor
(
P
(
i
),
'
axes
'
),
'
handles
'
);
set
(
H
.
axis
,
'
cameraposition
'
,
v
);
axis
(
H
.
axis
,
'
image
'
);
camlight
(
H
.
light
);
end
%==========================================================================
function
myDataCursor
(
obj
,
evt
,
H
)
dcm_obj
=
datacursormode
(
H
.
figure
);
set
(
dcm_obj
,
'
Enable
','
on
'
,
'
SnapToDataVertex
','
on
'
,
...
'
DisplayStyle
','
Window
'
,
'
Updatefcn
'
,{
@
myDataCursorUpdate
,
H
});
%==========================================================================
function
txt
=
myDataCursorUpdate
(
obj
,
evt
,
H
)
pos
=
get
(
evt
,
'
Position
'
);
txt
=
{[
'
X:
'
,
num2str
(
pos
(
1
))],...
[
'
Y:
'
,
num2str
(
pos
(
2
))],...
[
'
Z:
'
,
num2str
(
pos
(
3
))]};
i
=
ismember
(
get
(
H
.
patch
,
'
vertices
'
),
pos
,
'
rows
'
);
txt
=
{[
'
Node:
'
num2str
(
find
(
i
))]
txt
{
:
}};
d
=
getappdata
(
H
.
patch
,
'
data
'
);
if
~
isempty
(
d
)
&&
any
(
d
(
:
))
if
any
(
i
),
txt
=
{
txt
{
:
}
[
'
T:
'
,
num2str
(
d
(
i
))]};
end
end
hMe
=
findobj
(
H
.
axis
,
'
Tag
','
CrossBar
'
);
if
~
isempty
(
hMe
)
ws
=
warning
(
'
off
'
);
spm_XYZreg
(
'
SetCoords
'
,
pos
,
get
(
hMe
,
'
UserData
'
));
warning
(
ws
);
end
%==========================================================================
function
myBackgroundColor
(
obj
,
evt
,
H
,
varargin
)
if
isempty
(
varargin
{
1
})
c
=
uisetcolor
(
H
.
figure
,
...
'
Pick
a
background
color
...
'
);
if
numel
(
c
)
==
1
,
return
;
end
else
c
=
varargin
{
1
};
end
h
=
findobj
(
H
.
figure
,
'
Tag
','
SPMMeshRenderBackground
'
);
if
isempty
(
h
)
set
(
H
.
figure
,
'
Color
'
,
c
);
else
set
(
h
,
'
Color
'
,
c
);
end
%==========================================================================
function
mySave
(
obj
,
evt
,
H
)
[
filename
,
pathname
,
filterindex
]
=
uiputfile
({...
'
*
.
gii
' '
GIfTI
files
(
*
.
gii
)
'
;
...
'
*
.
png
' '
PNG
files
(
*
.
png
)
'
;...
'
*
.
dae
' '
Collada
files
(
*
.
dae
)
'
;...
'
*
.
idtf
' '
IDTF
files
(
*
.
idtf
)
'
},
'
Save
as
'
);
if
~
isequal
(
filename
,
0
)
&&
~
isequal
(
pathname
,
0
)
[
pth
,
nam
,
ext
]
=
fileparts
(
filename
);
switch
ext
case
'
.
gii
'
filterindex
=
1
;
case
'
.
png
'
filterindex
=
2
;
case
'
.
dae
'
filterindex
=
3
;
case
'
.
idtf
'
filterindex
=
4
;
otherwise
switch
filterindex
case
1
filename
=
[
filename
'
.
gii
'
];
case
2
filename
=
[
filename
'
.
png
'
];
case
3
filename
=
[
filename
'
.
dae
'
];
end
end
switch
filterindex
case
1
G
=
gifti
(
H
.
patch
);
[
p
,
n
,
e
]
=
fileparts
(
filename
);
[
p
,
n
,
e
]
=
fileparts
(
n
);
switch
lower
(
e
)
case
'
.
func
'
save
(
gifti
(
getappdata
(
H
.
patch
,
'
data
'
)),...
fullfile
(
pathname
,
filename
));
case
'
.
surf
'
save
(
gifti
(
struct
(
'
vertices
'
,
G
.
vertices
,
'
faces
'
,
G
.
faces
)),...
fullfile
(
pathname
,
filename
));
case
'
.
rgba
'
save
(
gifti
(
G
.
cdata
),
fullfile
(
pathname
,
filename
));
otherwise
save
(
G
,
fullfile
(
pathname
,
filename
));
end
case
2
u
=
get
(
H
.
axis
,
'
units
'
);
set
(
H
.
axis
,
'
units
','
pixels
'
);
p
=
get
(
H
.
axis
,
'
Position
'
);
r
=
get
(
H
.
figure
,
'
Renderer
'
);
hc
=
findobj
(
H
.
figure
,
'
Tag
','
SPMMeshRenderBackground
'
);
if
isempty
(
hc
)
c
=
get
(
H
.
figure
,
'
Color
'
);
else
c
=
get
(
hc
,
'
Color
'
);
end
h
=
figure
(
'
Position
'
,
p
+
[
0
0
10
10
],
...
'
InvertHardcopy
','
off
'
,
...
'
Color
'
,
c
,
...
'
Renderer
'
,
r
);
copyobj
(
H
.
axis
,
h
);
set
(
H
.
axis
,
'
units
'
,
u
);
set
(
get
(
h
,
'
children
'
),
'
visible
','
off
'
);
%
a
=
get
(
h
,
'
children
'
);
%
set
(
a
,
'
Position
'
,
get
(
a
,
'
Position
'
).
*
[
0
0
1
1
]
+
[
10
10
0
0
]);
if
isdeployed
deployprint
(
h
,
'
-
dpng
'
,
'
-
opengl
'
,
fullfile
(
pathname
,
filename
));
else
print
(
h
,
'
-
dpng
'
,
'
-
opengl
'
,
fullfile
(
pathname
,
filename
));
end
close
(
h
);
set
(
getappdata
(
obj
,
'
fig
'
),
'
renderer
'
,
r
);
case
3
save
(
gifti
(
H
.
patch
),
fullfile
(
pathname
,
filename
),
'
collada
'
);
case
4
save
(
gifti
(
H
.
patch
),
fullfile
(
pathname
,
filename
),
'
idtf
'
);
end
end
%==========================================================================
function
myDeleteFcn
(
obj
,
evt
,
renderer
)
try
,
rotate3d
(
get
(
obj
,
'
parent
'
),
'
off
'
);
end
set
(
ancestor
(
obj
,
'
figure
'
),
'
Renderer
'
,
renderer
);
%==========================================================================
function
myOverlay
(
obj
,
evt
,
H
)
[
P
,
sts
]
=
spm_select
(
1
,
'\
.
img
|
\
.
nii
|
\
.
gii
|
\
.
mat
','
Select
file
to
overlay
'
);
if
~
sts
,
return
;
end
spm_mesh_render
(
'
Overlay
'
,
H
,
P
);
%==========================================================================
function
myImageSections
(
obj
,
evt
,
H
)
[
P
,
sts
]
=
spm_select
(
1
,
'
image
','
Select
image
to
render
'
);
if
~
sts
,
return
;
end
renderSlices
(
H
,
P
);
%==========================================================================
function
renderSlices
(
H
,
P
,
pls
)
if
nargin
<
3
pls
=
0.05
:
0.2
:
0.9
;
end
N
=
nifti
(
P
);
d
=
size
(
N
.
dat
);
pls
=
round
(
pls
.
*
d
(
3
));
hold
(
H
.
axis
,
'
on
'
);
for
i
=
1
:
numel
(
pls
)
[
x
,
y
,
z
]
=
ndgrid
(
1
:
d
(
1
),
1
:
d
(
2
),
pls
(
i
));
f
=
N
.
dat
(
:
,
:
,
pls
(
i
));
x1
=
N
.
mat
(
1
,
1
)
*
x
+
N
.
mat
(
1
,
2
)
*
y
+
N
.
mat
(
1
,
3
)
*
z
+
N
.
mat
(
1
,
4
);
y1
=
N
.
mat
(
2
,
1
)
*
x
+
N
.
mat
(
2
,
2
)
*
y
+
N
.
mat
(
2
,
3
)
*
z
+
N
.
mat
(
2
,
4
);
z1
=
N
.
mat
(
3
,
1
)
*
x
+
N
.
mat
(
3
,
2
)
*
y
+
N
.
mat
(
3
,
3
)
*
z
+
N
.
mat
(
3
,
4
);
surf
(
x1
,
y1
,
z1
,
repmat
(
f
,[
1
1
3
]),
'
EdgeColor
','
none
'
,
...
'
Clipping
','
off
'
,
'
Parent
'
,
H
.
axis
);
end
hold
(
H
.
axis
,
'
off
'
);
axis
(
H
.
axis
,
'
image
'
);
%==========================================================================
function
C
=
updateTexture
(
H
,
v
,
col
)
%-
Get
colourmap
%--------------------------------------------------------------------------
if
nargin
<
3
,
col
=
getappdata
(
H
.
patch
,
'
colourmap
'
);
end
if
isempty
(
col
),
col
=
hot
(
256
);
end
setappdata
(
H
.
patch
,
'
colourmap
'
,
col
);
%-
Get
curvature
%--------------------------------------------------------------------------
curv
=
getappdata
(
H
.
patch
,
'
curvature
'
);
if
size
(
curv
,
2
)
==
1
curv
=
0.5
*
repmat
(
curv
,
1
,
3
)
+
0.3
*
repmat
(
~
curv
,
1
,
3
);
end
%-
Project
data
onto
surface
mesh
%--------------------------------------------------------------------------
if
nargin
<
2
,
v
=
[];
end
if
ischar
(
v
)
[
p
,
n
,
e
]
=
fileparts
(
v
);
if
strcmp
([
n
e
],
'
SPM
.
mat
'
)
swd
=
pwd
;
spm_figure
(
'
GetWin
','
Interactive
'
);
[
SPM
,
v
]
=
spm_getSPM
(
struct
(
'
swd
'
,
p
));
cd
(
swd
);
else
try
,
spm_vol
(
v
);
catch
,
v
=
gifti
(
v
);
end
;
end
end
if
isa
(
v
,
'
gifti
'
),
v
=
v
.
cdata
;
end
if
isa
(
v
,
'
file_array
'
),
v
=
v
();
end
if
isempty
(
v
)
v
=
zeros
(
size
(
curv
))
'
;
elseif
ischar
(
v
)
||
iscellstr
(
v
)
||
isstruct
(
v
)
v
=
spm_mesh_project
(
H
.
patch
,
v
);
elseif
isnumeric
(
v
)
||
islogical
(
v
)
if
size
(
v
,
2
)
==
1
v
=
v
'
;
end
else
error
(
'
Unknown
data
type
.
'
);
end
v
(
isinf
(
v
))
=
NaN
;
setappdata
(
H
.
patch
,
'
data
'
,
v
);
%-
Create
RGB
representation
of
data
according
to
colourmap
%--------------------------------------------------------------------------
C
=
zeros
(
size
(
v
,
2
),
3
);
clim
=
getappdata
(
H
.
patch
,
'
clim
'
);
if
isempty
(
clim
),
clim
=
[
false
NaN
NaN
];
end
mi
=
clim
(
2
);
ma
=
clim
(
3
);
if
any
(
v
(
:
))
if
size
(
col
,
1
)
>
3
&&
size
(
col
,
1
)
~=
size
(
v
,
1
)
if
size
(
v
,
1
)
==
1
if
~
clim
(
1
),
mi
=
min
(
v
(
:
));
ma
=
max
(
v
(
:
));
end
C
=
squeeze
(
ind2rgb
(
floor
(((
v
(
:
)
-
mi
)
/
(
ma
-
mi
))
*
size
(
col
,
1
)),
col
));
elseif
isequal
(
size
(
v
),[
size
(
curv
,
1
)
3
])
C
=
v
;
v
=
v
'
;
else
if
~
clim
(
1
),
mi
=
min
(
v
(
:
));
ma
=
max
(
v
(
:
));
end
for
i
=
1
:
size
(
v
,
1
)
C
=
C
+
squeeze
(
ind2rgb
(
floor
(((
v
(
i
,
:
)
-
mi
)
/
(
ma
-
mi
))
*
size
(
col
,
1
)),
col
));
end
end
else
if
~
clim
(
1
),
ma
=
max
(
v
(
:
));
end
for
i
=
1
:
size
(
v
,
1
)
C
=
C
+
v
(
i
,
:
)
'
/
ma
*
col
(
i
,
:
);
end
end
end
setappdata
(
H
.
patch
,
'
clim
'
,
[
false
mi
ma
]);
%-
Build
texture
by
merging
curvature
and
data
%--------------------------------------------------------------------------
C
=
repmat
(
~
any
(
v
,
1
),
3
,
1
)
'
.
*
curv
+
repmat
(
any
(
v
,
1
),
3
,
1
)
'
.
*
C
;
set
(
H
.
patch
,
'
FaceVertexCData
'
,
C
,
'
FaceColor
','
interp
'
);
%-
Update
the
colourbar
%--------------------------------------------------------------------------
if
isfield
(
H
,
'
colourbar
'
)
spm_mesh_render
(
'
Colourbar
'
,
H
);
end
Event Timeline
Log In to Comment