Clear Filters
Clear Filters

App designer - problem implementing filter based on tree nodes

9 views (last 30 days)
Hi folks,
i have a tree that looks something like this:
I am trying to createn a filter based on "cause" whereby you can see things on a table to the left based on one or more of the selected criteria (such as fire, or fire + attack).
So I've used the following code from another thread (below). However, I am getting the error "Unrecognized method, property, or field 'Cause' for class 'matlab.ui.control.Table'. Is there a way around this please?
function [filter_criteria, checked_nodes] = get_checked_nodes(~, checked)
% checked = checked nodes object from tree
% if tr = tree, checked=tr.CheckedNodes
% filter_criteria = structure with variables and values objects,
% each record has the name of the variable in variables as a string and a string array of the values for those items checked in the nodes.
% checked_nodes = table with all checked nodes. Table Structure includes node level (only level 2 is included),
% Parent (variable name), and leaf (selected string option in tree).
% If the parent node is checked, the values will not be returned, because all records would be returned and there are no criteria to filter on.
if size(checked,1)==0
filter_criteria=[];
checked_nodes=[];
return
end
node_num=size(checked,1);
checked_nodes=table(Size=[ node_num 3],VariableTypes=["double" "string" "string"],VariableNames=["node_level" "parent_node" "leaf"]);
for node_id=1:node_num
if checked(node_id).Parent.Type~="uitreenode" % if parent node is not uitreenode, then top level
checked_nodes.node_level(node_id)=1;
checked_nodes.parent_node(node_id)=checked(node_id).Text; % parent nodes have themselves as parent here
checked_nodes.leaf(node_id)=checked(node_id).Text;
else
checked_nodes.node_level(node_id)=2;
checked_nodes.parent_node(node_id)=checked(node_id).Parent.Text;
checked_nodes.leaf(node_id)=checked(node_id).Text;
end
end
check_parents=checked_nodes.leaf(checked_nodes.node_level==1);
node_rows=~ismember(checked_nodes.parent_node,check_parents);
checked_nodes=checked_nodes(node_rows,:); % removes parents from checked_nodes
clear filter_criteria
varnames=unique(checked_nodes.parent_node);
for varnum=1:size(varnames,1)
filter_criteria(varnum).variables=varnames(varnum);
filter_criteria(varnum).values=checked_nodes.leaf(checked_nodes.parent_node==varnames(varnum))';
end
end
function [filtered_rows] = get_filtered_rows(~,source_table, filter_criteria)
% create a logical array of filtered rows based upon a source table and filter criteria.
% The array can then be used to select specific rows from a table or array.
% The filter criteria selects fields that have any option in the values within a field,
% but if multiple fields are used, the row must be selected for each variable used in the filter.
if isempty(filter_criteria)
filtered_rows=true(size(source_table,1),1);
return;
end
num_vars=size(filter_criteria,2);
filtered_matrix=[];
for varnum=1:num_vars
filtered_matrix(:,varnum)=ismember(source_table.(filter_criteria(varnum).variables),filter_criteria(varnum).values);
end
filtered_rows=all(filtered_matrix,2);
end

Accepted Answer

Kevin Holly
Kevin Holly on 27 Jun 2023
Teshan,
I created an app based on the scripts provided (see attached). Please let me know if this answers your question. I believe you were inputing the incorrect variable as the source_table into the get_filtered_rows function.
  3 Comments

Sign in to comment.

More Answers (0)

Categories

Find more on Develop Apps Using App Designer in Help Center and File Exchange

Products


Release

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!