MATLAB Answers

How to programmatically rename Stateflow states that are grouped?

7 ビュー (過去 30 日間)
Monika Jaskolka
Monika Jaskolka 2019 年 11 月 3 日
コメント済み: Monika Jaskolka 2019 年 11 月 5 日
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.
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.

  0 件のコメント



Fangjun Jiang
Fangjun Jiang 2019 年 11 月 4 日
編集済み: Fangjun Jiang 2019 年 11 月 4 日
To handle this,
Box=c.find('Name', 'Heater');
To handle it more generically (without nested boxes)
%% Make needed changes
% recover the original flags

  3 件のコメント

Monika Jaskolka
Monika Jaskolka 2019 年 11 月 4 日
Please read the entire question. This approach does not work for grouped states.
Again, please read the whole question. It does not seem possible to determine programmatically what the state is being grouped by, because there is no parameter that stores which box/state/etc. it is grouped in (see image below). The same is true in the other direction: boxes don't have a parameter that stores what elements it is grouping. This is problematic if there are multiple boxes in the chart (although the example only has one).
Screen Shot 2019-11-04 at 9.42.28 AM.png
Screen Shot 2019-11-04 at 9.47.04 AM.png
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...
% Turn back on
for n = 1:length(boxes)
boxes(n).IsGrouped = isgrouped(n);


その他の回答 (0 件)




Community Treasure Hunt

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

Start Hunting!

Translated by