识别CheckedNodes uitree的一部分

39视图(30天)
创建与多个treenodes树时,一个人怎么能识别特定的节点,一个检查项目从何而来?
鉴于matlab生成树的示例代码(见下文),我怎么能知道每个检查节点的父节点吗?具体来说,“训练”可以在车辆或行动的例子。tr.CHeckedNodes似乎没有显示父节点返回一个数组。
谢谢你的帮助。
无花果= uifigure;
gl = uigridlayout(无花果、[1 - 2]);
gl.ColumnWidth = {“2 x”,“1 x”};
车辆= [“训练”“训练”“飞机”“飞机”“平面”]“;
action = (“测试”“测试”“测试”“训练”“训练”]“;
T =表(车辆、行动);
台=场上(gl,“数据”T);
tr = uitree (gl,“复选框”);
var =字符串(T.Properties.VariableNames);
k1 = 1:长度(var)
var = vars {k1};
varnode = uitreenode (tr,“文本”var);
行= T {: var};
名称=类别(类别(行));
k2 = 1:长度(名称)
文本=姓名{k2};
uitreenode (varnode“文本”、文本);
结束
结束
%手动检查车辆。火车和行动。测试在树
> > tr.CheckedNodes
ans =
2×1 TreeNode数组:
TreeNode(火车)
TreeNode(测试)
5个评论
埃弗雷特韦伯
埃弗雷特韦伯 2023年1月24日
@Peter帕金斯 我发现代码源。如果你想改变Matlab文档,以更好地反映最优编码,那太好了。
看到“ 生成树节点基于表数据”
我更新代码,以反映一个更精致的拉数据的机制。我相信重要的是要注意,T{:,(“车”“行动”)}可以提取数据,点符号不能。
我也通过变量的名称而不是变量的数量,因为var_list不必要的有相同的数字或变量作为源表的顺序。因此,我需要传递变量的名字而不是数量。再一次谢谢你的警惕的眼睛。
正如你所看到的我用你的建议点符号和独特的行。
函数populate_tree (source_table var_list tree_obj)
%填充节点对象基于源表和树
%变量列表
%的输入
% source_table:将从数据来源选项
% var_list:变量列表用于填充树
% tree_obj:创建树的目标
%可以用var = gt变量名称字符串(source_table.Properties.VariableNames);
%注意:这将节点添加到现有的树。删除所有
%的节点。使用删除方法的孩子
%的树。
% tree_obj = app.myTree;%提到树,可以使用
%在函数调用。
% myTree.Children.delete;%删除树的孩子。
var_num = 1:长度(var_list)
var = var_list {var_num};
varnode = uitreenode (tree_obj,“文本”var);
名称=独特(source_table (var));
k2 = 1:长度(名称)
文本=名字(k2);
uitreenode (varnode“文本”、文本);
结束
结束
结束

登录置评。

接受的答案

埃弗雷特韦伯
埃弗雷特韦伯 2023年1月19日
编辑:埃弗雷特韦伯 2023年1月24日
谢谢你! @Rohan ,这是有用的信息,但由于实际返回的对象不是一个阶层式数组,一个人不能知道一片叶子是一个父母或孩子叶没有更多的处理。它也不是一个快速检查的位置检查选项。因此我创建下面的函数来处理treenode数据。
我的最终目标是使用信息从树上对象筛选表。我创建了2函数1)识别选项检查,忽视任何父节点检查(因为这意味着没有过滤字段)和2,创建一个逻辑数组来筛选源表。两个函数被设计用于在应用程序设计师,因此应用程序中的第一个变量函数。如果有人想适应他们更一般的意义上,他们可以从函数变量列表删除应用程序选项。功能使用树木假设2级等级秩序(即它将需要调整如果使用了3种或3种以上的水平)。
我也扔在2其他功能:populate_tree功能来简化创建节点和get_table_varinfo信息表的形式更容易使用(尤其是表中每个字段的变量类型)。我期望定期重新繁衍的树木,所以这是一个重要的功能。
我加入这个公司希望添加的信息他会帮助别人。
% 1月20日,2023年
% - - -更新get_checked_nodes返回空集,如果树对象
%的空
% - - -更新所有行如果get_filtered_rows返回真
% filter_criteria是空的
% 1月23日,2023年。更新get_filtered_rows
%——“任何”改为“所有”函数的最后一行
%(谢谢你抓住,圣彼得堡!)
%——也改变了num_vars =大小(filter_criteria, 1);
% num_vars =大小(filter_criteria 2);
% 1月24日,2023年。更新填充树更有效,没有功能
%的变化。
%调填充树
% app.data是导入excel电子表格
% app.selecteddocfield_EditField。值字段
%为文本分析选择,所以我不会
%想要将其添加到字段的列表
%过滤。
%得到源数据表和变量列表
source_table = app.data;
doc_field = app.selecteddocfield_EditField.Value;
var_info = get_table_varinfo(应用程序、source_table);
var_list = var_info.VarNames (var_info.VarType = =“字符串”);%只有字符串字段
var_list = var_list (var_list ~ = doc_field);
tree_obj = app.comp1_filter_Tree;
tree_obj.Children.delete;
populate_tree(应用,source_table var_list tree_obj);
%在回调将检查选项
% app.comp1_filter_Tree.CheckedNodes被选中的节点
% uitree的兴趣
% app.data是导入excel电子表格
%
checkedNodes = app.comp1_filter_Tree.CheckedNodes;
filter_criteria = get_checked_nodes(应用程序、checkedNodes);
unfiltered_data = app.data;
filtered_rows = get_filtered_rows (app, unfiltered_data filter_criteria);
%这是过滤数据,可以用于可视化
filtered_data = unfiltered_data (filtered_rows:);
%函数来创建和使用uitree节点数据
函数[filter_criteria, checked_nodes] = get_checked_nodes(应用程序,检查)
% =检查检查从树节点对象
%如果tr =树,= tr.CheckedNodes检查
% filter_criteria =结构变量和值对象,
%每个记录的名称作为一个变量的变量
%的字符串和一个字符串数组,这些项目的值
%的检查节点。
% checked_nodes =与所有检查表节点。表结构
%包括节点级别(只包括2级),父母
%(变量名),和叶(选中选项字符串
% treee)。
%注意:如果选中父节点,将不会的值
%返回,因为所有记录将被返回
% folter在没有标准。同时,CheckedNodes只
%返回检查节点,而不是无节制的节点。
%如果没有检查节点,输出都是空的
如果大小(检查,1)= = 0
filter_criteria = [];
checked_nodes = [];
返回
结束
node_num =大小(检查,1);
checked_nodes =表(大小= [node_num 3], VariableTypes = [“双重”“字符串”“字符串”],VariableNames = [“node_level”“parent_node”“叶”]);
node_id = 1: node_num
如果检查(node_id) .Parent.Type ~ =“uitreenode”%如果没有uitreenode父节点,然后顶层
checked_nodes.node_level (node_id) = 1;
检查checked_nodes.parent_node (node_id) = (node_id)。text;%注意父节点有自己父母
检查checked_nodes.leaf (node_id) = (node_id)。text;
其他的
checked_nodes.node_level (node_id) = 2;
检查checked_nodes.parent_node (node_id) = (node_id) .Parent.Text;
检查checked_nodes.leaf (node_id) = (node_id)。text;
结束
结束
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:);%将父母从checked_nodes移除
清晰的filter_criteria
varnames =独特(checked_nodes.parent_node);
varnum = 1:尺寸(varnames, 1)
filter_criteria (varnum) .variables = varnames (varnum);
filter_criteria (varnum) . values = checked_nodes.leaf (checked_nodes.parent_node = = varnames (varnum)) ';
结束
结束
函数[filtered_rows] = get_filtered_rows(应用程序、source_table filter_criteria)
%创建一个逻辑过滤数组行基于源
%表和筛选标准。数组可以被用来
%从一个表或数组选择特定的行。过滤器
%的标准和逻辑,逻辑或在一个变量
%之间。换句话说,它选择的字段
%值在一个字段中的任何选项,但如果多个
%字段使用,必须选择行
%变量中使用过滤器。
% (filter_criteria (1) .variables =“汽车”,
% filter_criteria (1)。值=["car" "train"],
% filter_criteria (2) .variables =“行动”,
% filter_criteria (2) . values =(“驾驭”)
%)结果仅在汽车和火车的行动是开车
%的输入
% source_table:数据来源。必须包含
%变量在filter_criteria和上市
%过滤列必须是字符串。
% filter_criteria:结构化数组中每一个记录
%变量。字段在结构化数组变量
%(变量)的名称和值(特定的值
%是包含在过滤行)。
%输出
% filtered_rows:逻辑数组的行
%。如果filter_criteriais empty, output is true
% source_table的每一行。
如果isempty (filter_criteria)
filtered_rows = true(大小(source_table, 1), 1);
返回;
结束
num_vars =大小(filter_criteria, 2);
filtered_matrix = [];
varnum = 1: num_vars
filtered_matrix (:, varnum) = ismember (source_table。(filter_criteria (varnum) .variables), filter_criteria (varnum) . values);
结束
filtered_rows = (filtered_matrix, 2);
结束
函数populate_tree(应用,source_table var_list tree_obj)
%填充节点对象基于源表和树
%变量列表
%的输入
% source_table:将从数据来源选项
% var_list:变量列表用于填充树
% tree_obj:创建树的目标
%可以用var = gt变量名称字符串(source_table.Properties.VariableNames);
%注意:这将节点添加到现有的树。删除所有
%的节点。使用删除方法的孩子
%的树。
% tree_obj = app.myTree;%提到树,可以使用
%在函数调用。
% myTree.Children.delete;%删除树的孩子。
var_num = 1:长度(var_list)
var = var_list {var_num};
varnode = uitreenode (tree_obj,“文本”var);
名称=独特(source_table (var));
k2 = 1:长度(名称)
文本=名字(k2);
uitreenode (varnode“文本”、文本);
结束
结束
结束
函数source_table var_info = get_table_varinfo(应用)
% source_table函数得到变量信息
%信息类似于拉当拉
%在数据库系统表。
var_info =表();
var_info.VarNames =字符串(source_table.Properties.VariableNames ');
var_info.VarPos =[1:尺寸(var_info, 1)] ';
%属性信息为空或空值设置为默认值
%取代如果不是失踪
var_info (:,“VarDesc”)= {”“};
var_info (:,“VarUnit”)= {”“};
如果大小(source_table.Properties.VariableUnits 2) > 0
var_info.VarUnit =字符串(source_table.Properties.VariableUnits ');
结束
如果大小(source_table.Properties.VariableDescriptions 2) > 0
var_info.VarDesc =字符串(source_table.Properties.VariableDescriptions ');
结束
var_types = [];
varnum = 1:尺寸(source_table, 2)
var_types = [var_types字符串(underlyingType (source_table (varnum))));
结束
var_info.VarType = var_types ';
结束
6个评论
埃弗雷特韦伯
埃弗雷特韦伯 2023年1月23日
谢谢,改变了代码并将今天晚些时候或者明天在一起简单的例子。

登录置评。

答案(1)

罗翰
罗翰 2023年1月19日
编辑:罗翰 2023年1月19日
父母本来就存在于每个检查节点的信息。自“tr.CheckedNodes”检查节点的返回一个数组,父母可以找到的信息访问每个节点的“父”属性在这个数组,如下所示:
> >父= tr.CheckedNodes .Parent (2)
父母=
TreeNode(行动)属性:
文本:“行动”
图标:
NodeData: []
显示所有属性
即使“训练”下检查“工具”和“行动”,父母的“训练”节点可以使用相同的语法:
> > tr.CheckedNodes
ans =
2×1 TreeNode数组:
TreeNode(火车)
TreeNode(火车)
> > tr.CheckedNodes (1) .Parent
ans =
TreeNode(车辆)属性:
文本:“汽车”
图标:
NodeData: []
显示所有属性
> > tr.CheckedNodes .Parent (2)
ans =
TreeNode(行动)属性:
文本:“行动”
图标:
NodeData: []
显示所有属性

s manbetx 845


释放

R2022b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!