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
を使用して複数のオブジェクトにアクセスする場合、配列内のオブジェクトの順序は、オブジェクトを選択した順序によって決まります。