Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 在Simulink中以编辑字段作为枚举创建掩码_Matlab_Simulink_Mask_Enumeration - Fatal编程技术网

Matlab 在Simulink中以编辑字段作为枚举创建掩码

Matlab 在Simulink中以编辑字段作为枚举创建掩码,matlab,simulink,mask,enumeration,Matlab,Simulink,Mask,Enumeration,我想在子系统上创建一个掩码,比如枚举常量的掩码(如下所示)。如蓝色圆圈中所示,可以使用下拉列表编辑该值。枚举常数 如果创建遮罩,确实可以弹出窗口而不是编辑,但问题是可能的选择列表需要在遮罩内手动创建。我想要的是,这个编辑值只显示我只想指定的某个枚举的可能选择。枚举常量掩码使用编辑类型执行此操作,但即使这样,它也可以工作 当然,我试图从这个模块中进行逆向工程,但我找不到Matlab是如何做到这一点的。我不太清楚如何做到这一点,但希望这个答案能让您走上正确的轨道 在掩码上创建两个弹出窗口,例如“p

我想在子系统上创建一个掩码,比如枚举常量的掩码(如下所示)。如蓝色圆圈中所示,可以使用下拉列表编辑该值。枚举常数

如果创建遮罩,确实可以弹出窗口而不是编辑,但问题是可能的选择列表需要在遮罩内手动创建。我想要的是,这个编辑值只显示我只想指定的某个枚举的可能选择。枚举常量掩码使用编辑类型执行此操作,但即使这样,它也可以工作


当然,我试图从这个模块中进行逆向工程,但我找不到Matlab是如何做到这一点的。

我不太清楚如何做到这一点,但希望这个答案能让您走上正确的轨道

在掩码上创建两个弹出窗口,例如“popup1”和“popup2”。将您的类型选项硬编码为popup1,并将popup2留空并禁用(因为它取决于您使用popup1选择的内容)。然后,单击第一个popup1时,可以使用popup1上的回调来填充popup2。您的回调将如下所示:

% Grab the value selected from popup1
value = get_param(gcb, 'popup_1');

% Do some sort of check/switch statement to set your options
if value == 1 
    % Enable popup2
    set_param(gcb, 'MaskEnables', {'on', 'on'});
    % Set the type options for popup2
    set_param(gcb, 'MaskStyleString', 'popup(1|2|3|4|5),popup(my|new|options)');
end if

查看Matlab/Simulink文档中的和<如果代码>获取参数和
设置参数
有点不直观,则它们很有用。在Simulink的更高版本中,您可以使用
maskObj=Simulink.Mask.create(gcb)方法来做这类事情,这可能更容易。

正如巴克博士所建议的,你应该使用
maskObj=Simulink.Mask.create(gcb)
为当前选择的块(gcb)创建一个掩码,或者通过
maskObj=Simulink.Mask.get(gcb)
选择一个已经存在的掩码。然后,向其添加参数:

par_name   = 'foo'; % name
par_prompt = 'This is my enum constant'; %prompt
maskObj.addParameter('Prompt',par_prompt,'Name',par_name); % add parameter
您要查找的字段称为
TypeOptions
,但首先必须通过以下方式找到正确的参数编号:

par_idx  = find(strcmp({maskObj.Parameters.Name},par_name)); % index of parameter
将掩码参数设置为“popup”,并创建枚举值:

maskObj.Parameters(par_idx).Type = 'popup'; % type
maskObj.Parameters(par_idx).TypeOptions = {'Option1','Option2'}; % enum options
给你;)


朱利安,如果我现在读的话,我不确定我最初的问题是否很清楚。枚举应取自数据字典中的枚举类型。因此,根据朱利安和巴克博士的回答,我可以回答我自己的问题

我首先从数据字典中获取枚举类型

% set name of DD and type
DDName = 'types.sldd';
EventType = 'Dem_EventIdType';
% Get DD entry
myDictionaryObj = Simulink.data.dictionary.open(DDName);
dDataSectObj = getSection(myDictionaryObj,'Design Data');
entryObj = getEntry(dDataSectObj,EventType,'DataSource',DDName);
entryValue = getValue(entryObj);
maskObj= Simulink.Mask.get(gcb);
par_name = 'Value_eventID'; % name
par_idx  = find(strcmp({maskObj.Parameters.Name},par_name)); % index of parameter
maskObj.Parameters(par_idx).TypeOptions = EventIDs; % enum options
然后获取枚举并将事件类型添加到其中。这将用于填充弹出选项

% Get enumerals
NoOfEvents = length(entryValue.Enumerals);
for i = 1:NoOfEvents
    EventIDs{i,1} = [EventType '.' entryValue.Enumerals(i).Name];
end
在此之后,我使用上面建议的代码使用数据字典中的枚举操作创建的弹出菜单

% set name of DD and type
DDName = 'types.sldd';
EventType = 'Dem_EventIdType';
% Get DD entry
myDictionaryObj = Simulink.data.dictionary.open(DDName);
dDataSectObj = getSection(myDictionaryObj,'Design Data');
entryObj = getEntry(dDataSectObj,EventType,'DataSource',DDName);
entryValue = getValue(entryObj);
maskObj= Simulink.Mask.get(gcb);
par_name = 'Value_eventID'; % name
par_idx  = find(strcmp({maskObj.Parameters.Name},par_name)); % index of parameter
maskObj.Parameters(par_idx).TypeOptions = EventIDs; % enum options
我不是在“初始化命令”中执行此操作,而是在“刷新事件”按钮的回调函数中执行此操作。从库中添加块时,它只包含无效的_事件。刷新后,它会进行新的查找,并将当前枚举添加到列表中

我的最终结果是: