How to programmatically rename Stateflow states that are grouped?

2 次查看(过去 30 天)
From the command window I would like to rename all states that are in a Stateflow chart. I'll use the following built-in model as an example. In the chart there are two states, Off and On, that are grouped by the Heater box.
openExample('simulink_general/sldemo_boilerExample')
Screen Shot 2019-11-03 at 2.06.11 PM.png
I am receiving the error "Cannot change states inside a grouped state." when renaming the Off and On states because they are grouped by a box. If I simply double-click on the state name, I can easily rename via the usual Stateflow GUI, but I need to be able to do this in a script.
sys = 'sldemo_boiler';
rt = sfroot; % Get global Stateflow object
model = rt.find('-isa', 'Simulink.BlockDiagram', '-and', 'Name', sys); % Get the model
charts = model.find('-isa', 'Stateflow.Chart'); % Get the model's charts
c = charts(1); % The chart we are interested in
states = c.find('-isa', 'Stateflow.State'); % All states in the chart
state_off = states(1);
state_off.Name = 'NewName'; %% ERROR: Cannot change states inside a grouped state.
How can I rename these states? I considered just ungrouping the box by unsetting its IsGrouped parameter, but state objects don't have a parameter that tells me what object they are grouped by, so I can't trace up the hierarchy.

采纳的回答

Fangjun Jiang
Fangjun Jiang 2019-11-4
编辑:Fangjun Jiang 2019-11-4
To handle this,
Box=c.find('Name', 'Heater');
Box.IsGrouped=false;
states(1).Name='NewName';
To handle it more generically (without nested boxes)
Box=c.find('-isa','Stateflow.Box');
Index=cell2mat(get(Box,'IsGrouped'));
Box=Box(Index);
set(Box,'IsGrouped',false);
%% Make needed changes
% recover the original flags
set(Box,'IsGrouped',true);
  3 个评论
Fangjun Jiang
Fangjun Jiang 2019-11-4
You might have to blindly re-set all the boxes that are "IsGrouped" and later set it again. See updated answer.
This might not work if you have nested boxes, which I didn't try. But I've done similar programing on nested library links. If you do have nested boxes, then I would assume you would need to find all the boxes, save all the "IsGrouped" flags, re-set from root-level to deep-level, make you changes, then recover all the "IsGrouped" flags from deep-level to root-level.
Monika Jaskolka
Monika Jaskolka 2019-11-5
Thanks. My solution for now is:
% Save and turn off box grouping
boxes = c.find('-isa', 'Stateflow.Box');
isgrouped = cell2mat(get(boxes, 'IsGrouped'));
set(boxes, 'IsGrouped', 0);
states = c.find('-isa', 'Stateflow.State');
for m = 1:length(states)
% Make changes...
end
% Turn back on
for n = 1:length(boxes)
boxes(n).IsGrouped = isgrouped(n);
end

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Stateflow Programmatic Interface 的更多信息

产品


版本

R2019a

Community Treasure Hunt

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

Start Hunting!

Translated by