在上一篇文章中我们讲解了在PREEvision的Metric中静态变量不释放和修改构件属性默认值不生效的两个问题。本次我们来分享另外两个问题,分别是Report多级标题格式不统一和通过Metric不能直接设置特定构件属性值问题。
Report多级标题格式不统一
Report是一种用于生成详细文档和报告、展示模型中各种信息的强大工具。用户可以通过Report创建定制化的文档,包括项目结构、构件属性、连接信息等内容。报告可以导出为多种格式,如PDF、ODT等,便于与团队成员或其他利益相关方共享项目信息。为了生成清晰、全面的文档,多采用创建多级模块(Report Module)的方式进行开发,这么做可以简化项目维护、提高可读性。当模型信息较多时,Report Module的嵌套逻辑较复杂,在进行开发时,如果对相关内容了解不深,则可能产生一些问题,例如Report多级标题格式不统一的问题,本次将为大家讲解此类问题的解决方法。
Report常见的结构如图所示,它由一个主模块(Report)和多个子模块(Report Module)组成,本例中共设置一个主模块和三个层级的子模块,主模块负责调用子模块,然后子模块调用下一级子模块,层层调用,最终输出成一个pdf或odt文件。
在开发Report的过程中需要设置不同层级的子标题(和Word文档子标题类似),不同层级的标题可以在不同的模块中定义,并且每个模块中都提供了设置标题格式的功能。在开发复杂的Report时,我们一般把一级标题放在主模块(Report)中,二级标题放在一级子模块(Report Module)中,其他子级标题的定义以此类推。
在下面的示例中,我们定义了一级标题以及对一级子模块的引用。可以看到,在主模块(Report)中,定义了一级标题,随后一行中是对一级子模块的引用。
下面是被主模块引用的一级子模块,主要定义了三部分内容:
1. 第一行首先定义了一级子模块的文档内容;
2. 第二行定义二级子标题;
3. 第三行定义了引用二级子模块的占位符。
二级子模块与三级子模块的定义与此类似,不再赘述。
接下来我们在各个模块内设置各级标题的格式,包括Font、Style、Size等属性。每个模块中标题属性都可以在当前模块中配置,具体配置方法会在后面讲述。下面先看导出文档示例,实际配置中,所有标题按照统一格式来设置,但下图中标题格式并不符合要求。
在经过反复测试后发现,所有模块中标题的格式要通过主模块统一进行设置,在子模块中设置的标题格式并不会生效。
在本例中,我们共定义了三个层级的标题,它们的格式都要在Report类型的主模块中设置。接下来,我们设置一级标题的格式。如下图所示,在Report类型的主模块中,第一步我们点击红框中的下拉列表,第二步选中“Heading 1”右边的下拉箭头,第三步点击名为“Edit Style”的子菜单。
标题格式的设置界面如下图所示,在Font选项卡中可以设置标题的Font、Style、Size等属性。
最后是设置标题的数字前缀,也是在Report类型的主模块中。第一步选中红框中的下拉列表,第二步点击“More Numbering…”。
在弹出的窗口中点击Position选项卡,我们可以在此设置标题的数字前缀,其中Level列表中的数字代表层级,一级标题对应数字1。当前设置的为一级标题,故只需选1即可。在本例中共设置三个层级的标题,其他层级的标题则选择与之相对应的数字即可。
设置完毕后,我们再重新导出报告,如下图所示。
通过Metric不能直接设置特定构件属性值
在实际项目中,当我们使用Port Communication Requirement构件(在Port或Signal构件下)时,可以通过执行Metric来创建这个构件。但是当使用Metric为Port Communication Requirement构件设置Send Mode属性值时,会发现,无法在Generic Editor窗口(当我们想通过Metric给构件设置一些属性时,一般在这里去寻找)中找到这个属性,无法为此属性赋值。这时就需要根据图形化操作来反推此属性是如何设置的。
如下图所示,通过手动创建Port Communication Requirement构件,在它的Property View窗口中的Timing界面中可以看到Send Mode属性。
在Send Mode属性右侧的下拉框中选择一个值,我们以Spontaneous值为例。
如下图所示,在我们将Send Mode属性的值设置成Spontaneous后,Port Communication Requirement构件下会自动创建一个名为EventControlledTiming346的新构件,并且此构件的父层级还有一个虚拟层级Timing Mode on TRUE。据此可知,如果想要在Metric中将Send Mode属性设置为Spontaneous,需要先在Port Communication Requirement构件下创建一个Event Controlled Timing类型的构件。
在下面的代码中我们创建了Port Communication Requirement构件和它的子构件Event Controlled Timing。
但执行Metric后,发现Send Mode属性并未设置成功。再回看Port Communication Requirement构件的Send Mode属性,在其右侧有提示蓝标“i”,我们点击这个蓝标“i”,发现这个属性的设置需要一些前置条件。
根据提示可知,要给Send Mode属性设置值,我们需要设置Event Controlled Timing构件的NumberOfRepetitions属性,并据此推测,在上图中指向EventControlledTiming箭头上的TRUE应该代表此构件的某属性值,经测试为Active By TRUE属性,代表前面所述的虚拟层级Timing Mode on TRUE。同理,图中Timed Artifact表示Port Communication Requirement构件,需要设置其TransferProperty和DataFilterType属性。下面是我们修改后的Metric代码:
再次执行这个Metric,Send Mode属性值已被设置为Spontaneous。Send Mode属性可以设置多种值,其它属性都可以此方式设置。
以上就是“关于PREEvision二次开发常见的问题及解析(下)”中两个常见问题及解决方法,大家在开发中遇到的其他问题也可以联系我们一起进行讨论,可以后台留言或发送至邮箱market@dotrustech.com。