删除simulink模型中除指定块之外的所有块
Delete all blocks except specified ones in simulink model
是否有与 clearvars -except keepVariables 等效的命令可用于在 simulink 模型中删除所有模块、端口和线路,指定的除外?
这是一个的通用方法,使用内置示例进行了解释vdp
:
simulink;
name = 'vdp';
%// open system, pause just for displaying purposes
open_system(name);
% pause(3)
%// find system, specify blocks to keep
allblocks = find_system(name);
ToKeep = {'Out1';'Out2'};
%// add systemname to strings
ToKeep = strcat(repmat({[name '/']},numel(ToKeep),1), ToKeep);
%// Alternative, directly, so save one line:
ToKeep = {'vdp/Out1';'vdp/Out2'};
%// create mask
ToDelete = setdiff(allblocks,ToKeep);
%// filter out main system
ToDelete = setxor(ToDelete,name);
%// try-catch inside loop as in this example not everything is deletable
for ii = 1:numel(ToDelete)
try
delete_block(ToDelete{ii})
catch
disp('Some objects couldn''t be deleted')
end
end
如果所有对象都是可删除的,您可以使用
cellfun(@(x) delete_block(x),ToDelete)
而不是循环。
关于您的评论:
假设您只想保留所有 Scope
和 Out
块。您还需要通过 find_system
找到名称并将它们收集到列表中:
%// what to keep
scopes = find_system(name,'BlockType','Scope')
outs = find_system(name,'BlockType','Outport')
%// gather blocks to keep
ToKeep = [scopes; outs];
%// create mask
ToDelete = setdiff(allblocks,ToKeep);
%// filter out main system
ToDelete = setxor(ToDelete,name);
是否有与 clearvars -except keepVariables 等效的命令可用于在 simulink 模型中删除所有模块、端口和线路,指定的除外?
这是一个的通用方法,使用内置示例进行了解释vdp
:
simulink;
name = 'vdp';
%// open system, pause just for displaying purposes
open_system(name);
% pause(3)
%// find system, specify blocks to keep
allblocks = find_system(name);
ToKeep = {'Out1';'Out2'};
%// add systemname to strings
ToKeep = strcat(repmat({[name '/']},numel(ToKeep),1), ToKeep);
%// Alternative, directly, so save one line:
ToKeep = {'vdp/Out1';'vdp/Out2'};
%// create mask
ToDelete = setdiff(allblocks,ToKeep);
%// filter out main system
ToDelete = setxor(ToDelete,name);
%// try-catch inside loop as in this example not everything is deletable
for ii = 1:numel(ToDelete)
try
delete_block(ToDelete{ii})
catch
disp('Some objects couldn''t be deleted')
end
end
如果所有对象都是可删除的,您可以使用
cellfun(@(x) delete_block(x),ToDelete)
而不是循环。
关于您的评论:
假设您只想保留所有 Scope
和 Out
块。您还需要通过 find_system
找到名称并将它们收集到列表中:
%// what to keep
scopes = find_system(name,'BlockType','Scope')
outs = find_system(name,'BlockType','Outport')
%// gather blocks to keep
ToKeep = [scopes; outs];
%// create mask
ToDelete = setdiff(allblocks,ToKeep);
%// filter out main system
ToDelete = setxor(ToDelete,name);