How to programmatically rename Stateflow states that are grouped?
6 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Monika Jaskolka
am 3 Nov. 2019
Kommentiert: Monika Jaskolka
am 5 Nov. 2019
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')
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 Kommentare
Akzeptierte Antwort
Fangjun Jiang
am 4 Nov. 2019
Bearbeitet: Fangjun Jiang
am 4 Nov. 2019
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 Kommentare
Fangjun Jiang
am 4 Nov. 2019
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.
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Stateflow Programmatic Interface finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!