-
Notifications
You must be signed in to change notification settings - Fork 1
/
xtgetsporfaces.m
127 lines (106 loc) · 5.34 KB
/
xtgetsporfaces.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
function xSurpassObjects = xtgetsporfaces(xImarisApp, varargin)
% XTGETSPORFACES Get the Spots and Surfaces objects from Imaris
% XTGETSPORFACES returns a struct containing the Spots and/or
% Surfaces child objects from the Surpass scene of the input Imaris XT
% application.
%
% Syntax
% ------
% xObjects = xtgetsporfaces(xImarisApp);
% xObjects = xtgetsporfaces(xImarisApp, 'Spots');
%
% Description
% -----------
% xObjects = xtgetsporfaces(xImarisApp) returns the Spots and
% Surfaces object in the Imaris application instance represented by
% xImarisApp.
%
% xSurfaces = xtgetsporfaces(xImarisApp, 'Surfaces') returns only the
% Surfaces objects from the Imaris appplication. Spots can also be
% returned independently.
%
% Input Arguments
% ---------------
% xImarisApp An <Imaris.IApplicationPrxHelper> object.
% statTypes A case-insensitive string from the list:
% 'Both' (Default)
% 'Spots' (Returns Spots and Surfaces)
% 'Surfaces'
%
% The output is a struct with the fields 'ImarisObject', 'Name' and
% 'Type'. The ImarisObject field is an <Imaris.IDataItemPrxHelper>
% object that can be used to access the Spot/Surface object. The Name
% field is the char string displayed by the Imaris Surpass scene. The
% Type field is a string matching either 'Spots' or 'Surfaces'.
%
%% Parse the inputs.
xtgetsporfacesParser = inputParser;
addRequired(xtgetsporfacesParser, 'xImarisApp', ...
@(arg)isa(arg, 'Imaris.IApplicationPrxHelper'))
validationFcn = @(arg)any(strcmpi(arg, {'Spots', 'Surfaces', 'Both'}));
addOptional(xtgetsporfacesParser, 'SurfaceType', 'Both', validationFcn);
parse(xtgetsporfacesParser, xImarisApp, varargin{:})
%% Allocate the output struct.
xSurpassObjects = struct('Name', {}, 'ImarisObject', [], 'Type', {});
% If there is no scene, return an empty array.
xScene = xImarisApp.GetSurpassScene;
if isempty(xScene)
xSurpassObjects = [];
return
end % if
%% Get the Surpass objects.
% Create a factory handle.
xFactory = xImarisApp.GetFactory;
% Use a switch case to return either the Spots, Surfaces or both.
switch lower(xtgetsporfacesParser.Results.SurfaceType)
case 'both'
for c = 1:xScene.GetNumberOfChildren
% Get the next child of the Surpass container.
cChild = xScene.GetChild(c - 1);
% If the child is a Surfaces or Spots object, add it to the list.
if xFactory.IsSpots(cChild)
% Cast to Spots.
cChild = xFactory.ToSpots(cChild);
% Add to the struct.
xSurpassObjects(length(xSurpassObjects) + 1).ImarisObject = cChild;
xSurpassObjects(length(xSurpassObjects)).Name = char(cChild.GetName);
xSurpassObjects(length(xSurpassObjects)).Type = 'Spots';
elseif xFactory.IsSurfaces(cChild)
% Cast to Surfaces.
cChild = xFactory.ToSurfaces(cChild);
% Add to the struct.
xSurpassObjects(length(xSurpassObjects) + 1).ImarisObject = cChild;
xSurpassObjects(length(xSurpassObjects)).Name = char(cChild.GetName);
xSurpassObjects(length(xSurpassObjects)).Type = 'Surfaces';
end % if
end % for m
case 'spots'
for c = 1:xScene.GetNumberOfChildren
% Get the next child of the Surpass container.
cChild = xScene.GetChild(c - 1);
% If the child is a Spots object, add it to the list.
if xFactory.IsSpots(cChild)
% Cast to Spots.
cChild = xFactory.ToSpots(cChild);
% Add to the struct.
xSurpassObjects(length(xSurpassObjects) + 1).ImarisObject = cChild;
xSurpassObjects(length(xSurpassObjects)).Name = char(cChild.GetName);
xSurpassObjects(length(xSurpassObjects)).Type = 'Spots';
end % if
end % for m
case 'surfaces'
for c = 1:xScene.GetNumberOfChildren
% Get the next child of the Surpass container.
cChild = xScene.GetChild(c - 1);
% If the child is a Surfaces object, add it to the list.
if xFactory.IsSurfaces(cChild)
% Cast to Surfaces.
cChild = xFactory.ToSurfaces(cChild);
% Add to the struct.
xSurpassObjects(length(xSurpassObjects) + 1).ImarisObject = cChild;
xSurpassObjects(length(xSurpassObjects)).Name = char(cChild.GetName);
xSurpassObjects(length(xSurpassObjects)).Type = 'Surfaces';
end % if
end % for m
end % switch
end % xtgetsporfaces