Main Content

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 Stateflow.State y Stateflow.Transition de la API 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 primario A con dos estados secundarios, A1 y A2. Para obtener más información sobre este ejemplo, consulte Create Charts by Using a MATLAB Script.

Stateflow chart with a hierarchy of states. The outer state is called A. It contains two inner states called A1 and A2.

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 navegar por la jerarquía de Stateflow e identificar los elementos secundarios que el objeto contiene o el elemento primario 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 primario

Para buscar el elemento primario 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.

Consulte también

Funciones

Objetos

Temas relacionados