Acceder a objetos del gráfico de Stateflow
Los objetos de la API de Stateflow® representan los objetos gráficos y no gráficos de un gráfico de Stateflow. Por ejemplo, los objetos de API Stateflow.State
y Stateflow.Transition
representan estados y transiciones en un gráfico de Stateflow. Para obtener más información, consulte Overview of the Stateflow API.
Buscar objetos en un gráfico
Con la función find
puede encontrar un objeto de API especificando criterios de búsqueda. Puede combinar criterios como:
El tipo de objeto
El nombre de una propiedad o función
El nombre y el valor de un propiedad
Por ejemplo, este comando busca el objeto Simulink.Root
y devuelve todos los objetos Stateflow.State
con el nombre On
:
onState = find(sfroot,"-isa","Stateflow.State",Name="On")
Si hay más de un objeto que cumple los criterios de búsqueda, find
devuelve un arreglo con dichos objetos. Por ejemplo, si hay más de un gráfico abierto, este comando devuelve un arreglo de objetos Stateflow.Chart
:
chartArray = find(sfroot,"-isa","Stateflow.Chart")
Buscar objetos en niveles de contención específicos
De forma predeterminada, la función find
busca objetos en todas las profundidades de contención dentro de un objecto. Por ejemplo, suponga que ch
es un objeto Stateflow.Chart
que corresponde a este gráfico. El gráfico contiene un estado principal A
con dos estados secundarios, A1
y A2
. Para obtener más información sobre este ejemplo, consulte Crear gráficos utilizando un script de MATLAB.
Una llamada a la función find
para buscar todos los estados de este gráfico devuelve un arreglo con tres objetos Stateflow.State
:
states = find(ch,"-isa","Stateflow.State"); get(states,"Name")
ans = 3×1 cell array {'A'} {'A1'} {'A2'}
Para limitar la profundidad de contención máxima de una búsqueda, utilice el argumento "-depth"
como parte de los criterios de búsqueda. Por ejemplo, para buscar el único objeto Stateflow.State
en el primer nivel de contención de ch
, introduzca:
sA = find(ch,"-isa","Stateflow.State","-depth",1); sA.Name
ans = 'A'
De forma similar, puede llamar a la función find
para que busque estados en el primer nivel de contención del objeto Stateflow.State
sA
. En este caso, la búsqueda incluye el nivel de contención cero, que es el propio objeto que se está buscando:
states = find(sA,"-isa","Stateflow.State","-depth",1); get(states,"Name")
ans = 3×1 cell array {'A'} {'A1'} {'A2'}
Para excluir el estado A
de los resultados de la búsqueda, llame a la función setdiff
de MATLAB®:
childStates = setdiff(states,sA);
get(childStates,"Name")
ans = 2×1 cell array {'A1'} {'A2'}
Navegar por la jerarquía de Stateflow
Después de acceder a un objeto de API, puede utilizar las funciones getChildren
y getParent
para atravesar la jerarquía de Stateflow e identificar los elementos secundarios que el objeto contiene o el elemento principal que contiene el objeto.
Buscar objetos secundarios
Para buscar los elementos secundarios de un objeto de API, llame a la función getChildren
. Por ejemplo, suponga que ch
es el objeto Stateflow.Chart
que corresponde al gráfico del ejemplo anterior. Una llamada a la función getChildren
en ch
devuelve un arreglo que contiene un objeto Stateflow.State
y un objeto Stateflow.Transition
.
children = getChildren(ch); arrayfun(@class,children,UniformOutput=false)
ans = 2×1 cell array {'Stateflow.State' } {'Stateflow.Transition'}
El primer elemento del arreglo es un objeto Stateflow.State
que corresponde al estado A
.
state = children(1); state.Name
ans = 'A'
El segundo elemento del arreglo es un objeto Stateflow.Transition
que corresponde a la transición predeterminada al estado A
.
children(2).Source
ans = []
children(2).Destination.Name
ans = 'A'
De forma similar, una llamada a la función getChildren
en el estado devuelve un arreglo que contiene dos objetos Stateflow.State
y dos objetos Stateflow.Transition
.
grandchildren = getChildren(state); arrayfun(@class,grandchildren,UniformOutput=false)
ans = 4×1 cell array {'Stateflow.State' } {'Stateflow.State' } {'Stateflow.Transition'} {'Stateflow.Transition'}
El primer y segundo elemento en este arreglo son objetos Stateflow.State
que corresponden a los estados A1
y A2
.
grandchildren(1).Name
ans = 'A1'
grandchildren(2).Name
ans = 'A2'
El tercer y el cuarto elemento de grandchildren
son objetos Stateflow.Transition
que corresponden a las transiciones a estados A1
y entre el estado A1
y el estado A2
, respectivamente.
grandchildren(3).Source
ans = []
grandchildren(3).Destination.Name
ans = 'A1'
grandchildren(4).Source.Name
ans = 'A1'
grandchildren(4).Destination.Name
ans = 'A2'
Buscar el objeto principal
Para buscar el elemento principal de un objeto de API, llame a la función getParent
. Por ejemplo, suponga que sA1
es el objeto Stateflow.State
que corresponde al estado A1
del ejemplo anterior. Una llamada a la función getParent
en sA1
devuelve el objeto Stateflow.State
, que corresponde al estado A
:
parent = getParent(sA1); parent.Name
ans = 'A'
De forma similar, una llamada a la función getParent
en parent
devuelve el objeto Stateflow.Chart
que corresponde al gráfico:
grandparent = getParent(parent); grandparent.Name
ans = 'Chart'
Recuperar objetos seleccionados recientemente
Puede recuperar los objetos seleccionados más recientemente en un gráfico llamando a la función sfgco
. Esta función devuelve un único objeto o un arreglo de objetos, dependiendo de la selección.
Por ejemplo, suponga que selecciona la transición del estado A1
al estado A2
del ejemplo anterior. Una llamada a sfgco
devuelve el objeto Stateflow.Transition
correspondiente:
tr = sfgco; str = str = "Transition from "+tr.Source.Name+" to "+tr.Destination.Name
str = "Transition from A1 to A2"
De forma similar, si selecciona simultáneamente los tres estados del gráfico, una llamada a sfgco
devuelve un arreglo de objetos Stateflow.State
.
states = sfgco;
get(states,"Name")
ans = 3×1 cell array {'A'} {'A1'} {'A2'}
Nota
Cuando utiliza sfgco
para acceder a múltiples objetos, el orden de los objetos del arreglo depende del orden en el que seleccione los objetos.