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
указатель на этот график.
Можно сделать копию A
состояния и его содержимое путем устанавливания значения свойства
IsGrouped
к true
прежде, чем скопировать и вставить состояние.
Найдите, что указатель утверждает A
.
sA = ch.find('-isa','Stateflow.State','Name','A');
Сгруппируйте состояние и его содержимое путем установки IsGrouped
свойство для состояния к true
. Сохраните предыдущую настройку этого свойства, таким образом, можно вернуться к нему позже.
prevGrouping = sA.IsGrouped; sA.IsGrouped = true;
Поменяйте имя состояния к 'Copy_of_A'
. Сохраните предыдущее имя, таким образом, можно вернуться к нему позже.
prevName = sA.Name;
newName = ['Copy_of_' prevName];
sA.Name = newName;
Создайте указатель на объект буфера обмена.
cb = sfclipboard;
Скопируйте сгруппированное состояние в буфер обмена.
cb.copy(sA);
Восстановите государственную собственность к их исходным настройкам.
sA.IsGrouped = prevGrouping; sA.Name = prevName;
Вставьте копию объектов от буфера обмена до графика.
cb.pasteTo(ch);
Настройте государственную собственность нового состояния.
sNew = ch.find('-isa','Stateflow.State','Name',newName); sNew.Position = sA.Position + [400 0 0 0]; sNew.IsGrouped = prevGrouping;
Можно также скопировать отдельные объекты от одного местоположения до другого. Однако для того, чтобы сохранить связи перехода и отношения включения между объектами, необходимо скопировать все подключенные объекты целиком. Прежде, чем скопировать в буфер обмена, создайте массив объектов путем добавления результатов последовательных поисковых запросов.
Для примера предположите тот ch
указатель на этот график.
Можно скопировать, утверждает A1
и A2
, наряду с переходом между ними, к новому состоянию.
Найдите, что указатель утверждает A
.
sA = ch.find('-isa','Stateflow.State','Name','A');
Добавьте новое состояние под названием B
. Позволять вставить другие объекты в B
, преобразуйте новое состояние в субдиаграмму.
sB = Stateflow.State(ch);
sB.Name = 'B';
sB.Position = sA.Position + [400 0 0 0];
sB.IsSubchart = true;
Создайте массив под названием sourceObjs
это содержит указатели на состояния и переходы в A
состояния. Используйте функцию
setdiff
удалить A
состояния от массива копируемых объектов.
objArrayS = sA.find('-isa','Stateflow.State'); objArrayS = setdiff(objArrayS,sA); objArrayT = sA.find('-isa','Stateflow.Transition'); sourceObjs = [objArrayS ; objArrayT];
Создайте указатель на объект буфера обмена.
cb = sfclipboard;
Скопируйте объекты в sourceObjs
и вставьте их в B
.
cb.copy(sourceObjs); cb.pasteTo(sB);
Преобразуйте B
назад к состоянию.
sB.IsSubchart = false; sB.IsGrouped = false;
Измените местоположение состояний и переходов в 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);
Можно также скопировать неграфические данные, событие и объекты сообщения индивидуально. Однако с тех пор нет никакого пути к этим объектам найти их новые родительские элементы, необходимо гарантировать, что вы копируете каждый из этих объектов отдельно к его соответствующему родительскому объекту.
find
| pasteTo
| setdiff
| sfclipboard
| Stateflow.State