Скопируйте и вставьте объекты Stateflow

Clipboard объект является интерфейсом к буферу обмена, используемому для копирования и вставки объектов Stateflow®. В отличие от других объектов API Stateflow, существует только один Clipboard объект. Можно использовать Clipboard копируемый объект и вставка графические и неграфические объекты в рамках того же графика, между графиками в той же модели Simulink®, или между графиками в различных моделях Simulink.

Доступ к объекту буфера обмена

Создайте указатель на Clipboard объект путем вызова sfclipboard функция.

cb = sfclipboard;

Clipboard объект имеет два метода, используемые, чтобы скопировать и вставить объекты от одного местоположения до другого.

Копирование объектов к буферу обмена

copy метод копирует заданные объекты в Clipboard объект.

cb.copy(objects);

Вы не можете скопировать смесь графических и неграфических объектов к буферу обмена в той же операции. Вместо этого объекты, которые вы копируете, должны быть все графическими (состояния, поля, функции, переходы, соединения и аннотации) или все неграфические (данные, события и сообщения).

Графические объекты копирования также копируют данные, событие и объекты сообщения, которые содержат графические объекты.

Все графические объекты, скопированные в одной операции копии, должны отобразиться в том же подсредстве просмотра. Другими словами, чтобы скопировать графические объекты в одной операции, они должны находиться в том же графике или субдиаграмме.

Чтобы обеспечить связи перехода и отношения включения между скопированными объектами, вы должны:

  • Скопируйте сгруппированное состояние в буфер обмена. Путем копирования сгруппированного состояния вы копируете все объекты, содержавшиеся в состоянии, а также все отношения среди этих объектов при помощи одной операции.

  • Скопируйте массив связанных объектов. Например, чтобы скопировать два состояния, соединенные переходом к другому контейнеру, сначала создайте массив, который содержит и состояния и переход. Затем можно скопировать массив в буфер обмена.

Вставка объектов от буфера обмена

pasteTo метод вставляет содержимое буфера обмена к новому контейнеру.

cb.pasteTo(container)

Если буфер обмена содержит графические объекты (состояния, поля, функции, переходы, соединения и аннотации), контейнер должен быть графиком или субдиаграммой. Чтобы преобразовать состояние, поле или графическая функция к субдиаграмме, установило свой IsSubchart свойство к true. После вставки можно преобразовать контейнер назад путем установки его IsSubchart свойство к false.

Копия путем группировки

Когда вы копируете и вставляете сгруппированное состояние, вы копируете не только состояние, но и все его содержимое. Этот метод является самым простым способом скопировать объекты при помощи API Stateflow.

Для примера предположите тот ch указатель на этот график.

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

Можно сделать копию A состояния и его содержимое путем устанавливания значения свойства IsGrouped к true прежде, чем скопировать и вставить состояние.

  1. Найдите, что указатель утверждает A.

    sA = ch.find('-isa','Stateflow.State','Name','A');

  2. Сгруппируйте состояние и его содержимое путем установки IsGrouped свойство для состояния к true. Сохраните предыдущую настройку этого свойства, таким образом, можно вернуться к нему позже.

    prevGrouping = sA.IsGrouped;
    sA.IsGrouped = true;
  3. Поменяйте имя состояния к 'Copy_of_A'. Сохраните предыдущее имя, таким образом, можно вернуться к нему позже.

    prevName = sA.Name;
    newName = ['Copy_of_' prevName];
    sA.Name = newName;
  4. Создайте указатель на объект буфера обмена.

    cb = sfclipboard;
  5. Скопируйте сгруппированное состояние в буфер обмена.

    cb.copy(sA);
  6. Восстановите государственную собственность к их исходным настройкам.

    sA.IsGrouped = prevGrouping;
    sA.Name = prevName;
  7. Вставьте копию объектов от буфера обмена до графика.

    cb.pasteTo(ch);
  8. Настройте государственную собственность нового состояния.

    sNew = ch.find('-isa','Stateflow.State','Name',newName);
    sNew.Position = sA.Position + [400 0 0 0];
    sNew.IsGrouped = prevGrouping;

Chart showing result of pasting a copy of state A and its contents.

Скопируйте объекты индивидуально

Можно также скопировать отдельные объекты от одного местоположения до другого. Однако для того, чтобы сохранить связи перехода и отношения включения между объектами, необходимо скопировать все подключенные объекты целиком. Прежде, чем скопировать в буфер обмена, создайте массив объектов путем добавления результатов последовательных поисковых запросов.

Для примера предположите тот ch указатель на этот график.

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

Можно скопировать, утверждает A1 и A2, наряду с переходом между ними, к новому состоянию.

  1. Найдите, что указатель утверждает A.

    sA = ch.find('-isa','Stateflow.State','Name','A');

  2. Добавьте новое состояние под названием B. Позволять вставить другие объекты в B, преобразуйте новое состояние в субдиаграмму.

    sB = Stateflow.State(ch);
    sB.Name = 'B';
    sB.Position = sA.Position + [400 0 0 0];
    sB.IsSubchart = true;
  3. Создайте массив под названием sourceObjs это содержит указатели на состояния и переходы в A состояния. Используйте функцию setdiff удалить A состояния от массива копируемых объектов.

    objArrayS = sA.find('-isa','Stateflow.State');
    objArrayS = setdiff(objArrayS,sA);
    objArrayT = sA.find('-isa','Stateflow.Transition');
    sourceObjs = [objArrayS ; objArrayT];
  4. Создайте указатель на объект буфера обмена.

    cb = sfclipboard;
  5. Скопируйте объекты в sourceObjs и вставьте их в B.

    cb.copy(sourceObjs);
    cb.pasteTo(sB);
  6. Преобразуйте B назад к состоянию.

    sB.IsSubchart = false;
    sB.IsGrouped = false;
  7. Измените местоположение состояний и переходов в B.

    newStates = sB.find('-isa','Stateflow.State');
    newStates = setdiff(newStates,sB);
    newTransitions = sB.find('-isa','Stateflow.Transition');
    newOClocks = get(newTransitions,{'SourceOClock','DestinationOclock'});
    newPositions = get(newStates,'Position');
    for i = 1:numel(newPositions)
        set(newStates(i),'Position',newPositions{i} + [25 35 0 0]);
    end
    set(newTransitions,{'SourceOClock','DestinationOclock'},newOClocks);

Chart showing result of copying contents of state A and pasting them into state B.

Можно также скопировать неграфические данные, событие и объекты сообщения индивидуально. Однако с тех пор нет никакого пути к этим объектам найти их новые родительские элементы, необходимо гарантировать, что вы копируете каждый из этих объектов отдельно к его соответствующему родительскому объекту.

Смотрите также

| | | |

Похожие темы