Stateflow チャート内のオブジェクトへのアクセス
Stateflow® API のオブジェクトは、Stateflow チャートのグラフィカル オブジェクトと非グラフィカル オブジェクトを表します。たとえば、API オブジェクト Stateflow.State および Stateflow.Transition は、Stateflow チャートのステートと遷移を表します。詳細については、Stateflow API の概要を参照してください。
チャート内のオブジェクトの検索
関数 find を使用すると、検索条件を指定して API オブジェクトを検索することができます。次のような条件を組み合わせることができます。
オブジェクトのタイプ
プロパティまたは関数の名前
プロパティの名前と値
たとえば、次のコマンドは Simulink.Root オブジェクトを検索し、名前が On であるすべての Stateflow.State オブジェクトを返します。
onState = find(sfroot,"-isa","Stateflow.State",Name="On")
検索条件に一致するオブジェクトが複数ある場合、find は該当するオブジェクトの配列を返します。たとえば、複数のチャートが開いている場合、次のコマンドは Stateflow.Chart オブジェクトの配列を返します。
chartArray = find(sfroot,"-isa","Stateflow.Chart")
包含の特定のレベルでオブジェクトを検索
既定では、関数 find はオブジェクト内のすべての包含深度でオブジェクトを検索します。たとえば、ch がこのチャートに対応する Stateflow.Chart オブジェクトであるとします。チャートには、親ステート A と、2 つの子ステート A1 および A2 が含まれています。この例の詳細については、MATLAB スクリプトを使用したチャートの作成を参照してください。

このチャートのすべてのステートを検索するために関数 find を呼び出すと、3 つの Stateflow.State オブジェクトをもつ配列が返されます。
states = find(ch,"-isa","Stateflow.State"); get(states,"Name")
ans =
3×1 cell array
{'A'}
{'A1'}
{'A2'}検索の最大包含深度を限定するには、検索条件の一部として "-depth" 引数を使用します。たとえば、ch の包含の第 1 レベルにある Stateflow.State オブジェクトのみを検索するには、以下のように入力します。
sA = find(ch,"-isa","Stateflow.State","-depth",1); sA.Name
ans =
'A'同様に、関数 find を呼び出して、Stateflow.State オブジェクト sA の包含の第 1 レベルにあるステートを検索することもできます。この場合、検索には包含の第 0 レベルも含まれます。これは検索対象のオブジェクト自体です。
states = find(sA,"-isa","Stateflow.State","-depth",1); get(states,"Name")
ans =
3×1 cell array
{'A'}
{'A1'}
{'A2'}ステート A を検索結果から除外するには、MATLAB® 関数 setdiff を呼び出します。
childStates = setdiff(states,sA);
get(childStates,"Name")ans =
2×1 cell array
{'A1'}
{'A2'}Stateflow 階層のナビゲート
API オブジェクトにアクセスした後、関数 getChildren および getParent を使用して、Stateflow 階層をナビゲートし、このオブジェクトに含まれる子、またはこのオブジェクトを含む親を特定できます。
子オブジェクトの検索
API オブジェクトの子を検索するには、関数 getChildren を呼び出します。たとえば、ch が前の例のチャートに対応している Stateflow.Chart オブジェクトであるとします。ch で関数 getChildren を呼び出すと、Stateflow.State オブジェクトと Stateflow.Transition オブジェクトが格納された配列が返されます。
children = getChildren(ch); arrayfun(@class,children,UniformOutput=false)
ans =
2×1 cell array
{'Stateflow.State' }
{'Stateflow.Transition'}この配列の 1 番目の要素は、ステート A に対応する Stateflow.State オブジェクトです。
state = children(1); state.Name
ans =
'A'この配列の 2 番目の要素は、ステート A へのデフォルト遷移に対応する Stateflow.Transition オブジェクトです。
children(2).Source
ans =
[]children(2).Destination.Name
ans =
'A'同様に、このステートで関数 getChildren を呼び出すと、2 つの Stateflow.State オブジェクトと 2 つの Stateflow.Transition オブジェクトが格納された配列が返されます。
grandchildren = getChildren(state); arrayfun(@class,grandchildren,UniformOutput=false)
ans =
4×1 cell array
{'Stateflow.State' }
{'Stateflow.State' }
{'Stateflow.Transition'}
{'Stateflow.Transition'}この配列の 1 番目と 2 番目の要素は、ステート A1 および A2 に対応する Stateflow.State オブジェクトです。
grandchildren(1).Name
ans =
'A1'grandchildren(2).Name
ans =
'A2'grandchildren の 3 番目と 4 番目の要素はそれぞれ、ステート A1 への遷移と、ステート A1 と A2 の間の遷移に対応する Stateflow.Transition オブジェクトです。
grandchildren(3).Source
ans =
[]grandchildren(3).Destination.Name
ans =
'A1'grandchildren(4).Source.Name
ans =
'A1'grandchildren(4).Destination.Name
ans =
'A2'親オブジェクトの検索
API オブジェクトの親を検索するには、関数 getParent を呼び出します。たとえば、sA1 が前の例のステート A1 に対応している Stateflow.State オブジェクトであるとします。sA1 で関数 getParent を呼び出すと、ステート A に対応する Stateflow.State オブジェクトが返されます。
parent = getParent(sA1); parent.Name
ans =
'A'同様に、parent で関数 getParent を呼び出すと、チャートに対応する Stateflow.Chart オブジェクトが返されます。
grandparent = getParent(parent); grandparent.Name
ans =
'Chart'
前回選択したオブジェクトの取得
関数 sfgco を呼び出すと、チャート内で前回選択したオブジェクトを取得できます。この関数は選択内容に応じて、単一のオブジェクト、またはオブジェクトの配列を返します。
たとえば、前の例でステート A1 からステート A2 への遷移を選択したとします。sfgco を呼び出すと、対応する Stateflow.Transition オブジェクトが返されます。
tr = sfgco; str = str = "Transition from "+tr.Source.Name+" to "+tr.Destination.Name
str =
"Transition from A1 to A2"同様に、チャートの 3 つのステートを同時に選択した場合、sfgco を呼び出すと Stateflow.State オブジェクトの配列が返されます。
states = sfgco;
get(states,"Name")ans =
3×1 cell array
{'A'}
{'A1'}
{'A2'}メモ
sfgco を使用して複数のオブジェクトにアクセスする場合、配列内のオブジェクトの順序は、オブジェクトを選択した順序によって決まります。