# 一个模型的仪表画面

> 定义在一个模型上的自由布局仪表画面、它们的绑定所带的单元占位符，以及每个单元怎么打开它自己那份解析出来的副本。

**一个模型的仪表画面**就是一张指名了它的模型的普通仪表画面：它由和 View 页面上每一张仪表画面相同的组件拼起来，也用同一个编辑器编辑（见[仪表画面编辑器](view-editor)），而让它成为某个模型的，是它住在哪里以及它的绑定指名什么。它列在 Process > 模型 > 某个模型 > 可视化 > **仪表画面**下面，它的地址字段提供这个模型的通道，而在本来该写出某一个单元的地方它写一个单元占位符。一份定义就够这个模型的每一个单元用。创建、删除和标记一张仪表画面需要**管理 Process** 权限；编辑上面有什么则需要仪表画面那一区的**编辑仪表画面**权限。

## 仪表画面文件夹 {#the-dashboards-folder}

选中**仪表画面**那一行会打开文件夹页面：标题栏（“定义在这个模型上的操作员仪表画面。一份定义服务于每一个单元：每个单元都有自己的一行，打开时套在这个单元绑定的通道上。”），以及一张仪表画面一张卡片，带着它的图标和名称。点一张卡片就打开那张仪表画面；卡片上那个叉则把它删掉。这个模型一张都没有时，页面写着“还没有仪表画面。先添加一张，再用仪表画面工具箱编辑它。”树把这些仪表画面按名称列在文件夹下面，文件夹那一行数出它们的数量。

| 命令 | 做什么 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
| --- | --- | --- | --- |
| **新建仪表画面**（选中文件夹时在详情栏上；右键**添加仪表画面**） | 创建一张空的仪表画面，名叫 `仪表画面 <n>`（这个模型还没有仪表画面用过的第一个号），保存它，并把它的卡片在这个页面上突出显示并滚动到可见处；这张仪表画面不会被打开，打开它的是它的卡片，或者树里它那一行。 | 任何一个单元上有运行，或者运行时已停止。 | 没有管理 Process 时。 |

一张新的仪表画面一开始上面什么都没有。它的名称、描述、图标，以及一张仪表画面所带的其他一切，都归编辑器改（见[仪表画面设置](view-settings)）；Process 页面上没有相应的字段。

## 仪表画面的页面 {#the-dashboards-page}

选中一张仪表画面，就在内容面板里满幅把它跑起来，前面什么都不挡：这就是那份定义本身，画在每一张仪表画面所画的同一块画布上。因为这里没有指名任何单元，绑定到这个模型某条通道的组件只画出它自己的布局，读不到任何值；对这样的绑定，编辑器的地址行写的是“这个模型的每个单元各一个点位”，而不是报告点位缺失。绑定到工作站点位（一个点位、一个变量）的组件照常读它。

一张空的仪表画面会自己说出来，而不是立在那里像一条空白条：“这张画面上还什么都没有。编辑它来放置组件：组件的地址字段会列出这个模型的通道，每个单元随后读自己的那一份。”

对选中的仪表画面，详情栏带着三样东西：**编辑仪表画面**、**在 View 上显示**开关，以及危险组里的**删除仪表画面**。

## 编辑仪表画面 {#edit-dashboard}

**编辑仪表画面**把 Process 页面的主体交给应用里那唯一一个仪表画面编辑器，挂在这份定义上：舞台、它的细线和任务栏取代了内容面板，而编辑器那一条上带着**结束编辑**（“结束编辑，回到查看这张仪表画面”），按它就把主体交还给内容面板，让它把仪表画面按现在的样子跑起来。出来的时候不提交什么：每一次编辑在做的时候就已经保存了。这张仪表画面自己的地址（`/d/<id>`）对拿着它到达的人来说仍然是通往编辑器的深层链接。

| 情形 | 你会看到什么 |
| --- | --- |
| 你的角色没有编辑仪表画面 | 这个动作根本不画出来：角色永远按不到的东西是留白，而不是变灰。 |
| 有单元上有运行 | 这个动作变灰，写着“有单元在运行时配置是锁住的。”锁在你编辑期间到来，会结束编辑模式；等工作站空下来再回来，那是你自己按的。 |
| 选择离开了这张仪表画面，或者角色失去了这一位 | 编辑模式同样地结束。 |

从编辑器里面删掉这张仪表画面，会关掉编辑器，并把选择落到这个模型的仪表画面文件夹上。

### 绑定里的单元占位符 {#the-unit-placeholder-in-bindings}

在一个模型的仪表画面上，编辑器的每一个地址字段开头都是这个模型的通道，一条通道一行，按模型的通道顺序排，每一行写成“这条通道，在打开这张画面的那个单元上”的地址：`Process.<Model>.{unit}.Channels.<Channel>`。选中一行就绑定了这条通道，把单元留到以后再回答。工作站自己的点位跟在那些行后面（一个模型的仪表画面完全可以正当地读一个环境点位或者一个共享变量），列表最多提示 50 条，字段本身仍然可以随手输入。会写入的字段（一个按钮、一个输入框）只列出角色可写的那些通道，因为一个单元可以通过哪些通道被写入，是通道的角色说了算。

那些行按字段所接受的值类别筛选，和工作站自己的点位完全一样，因此一条通道只有在没有东西装得下它时才会被藏起来。

一个单元打开这张仪表画面时，有三个记号会被回答：

| 记号 | 写在哪里 | 它变成什么 |
| --- | --- | --- |
| `{unit}` | 写在一个地址里面，或者作为某个绑定单元的组件属性的整个取值（例如备注时间线或事件条目列表的单元）。 | 在地址里变成那个单元的地址段；在绑定单元的属性里变成那个单元的标识。写在普通文字里（一个文本、一个标题）时，它原样留着。 |
| `{unit.name}` | 任何文字：仪表画面的名称和描述、一个组件的名称或标题、图表标题或系列标签、任何文字属性。 | 那个单元的显示名。 |
| `{channel.name:<segment>}` | 任何文字。那个段是这条通道规范化之后的地址段，和它旁边的地址所用的是同一个键。 | 这条通道在那个单元上所带的名称：模型允许而且那个单元设了的时候，是它按单元的别名；否则是通道自己的名称。指不到这个模型任何通道的段原样留着。 |

在模型上编辑这张仪表画面期间，地址里仍然带着 `{unit}` 的组件被当作没有绑定：它什么都不画、什么都不标，因为只有在解析出来的那份副本上，沉默才是真的。

## 每个单元怎么拿到它解析出来的仪表画面 {#how-each-unit-gets-its-resolved-dashboard}

在**操作**下面，这个模型的每一个单元，在它那些操作面板行之后，这个模型的每一张仪表画面各带一行。选中那一行，就把这份定义当作这个单元自己的跑起来：

- 这份定义被复制并重新赋予标识（仪表画面、它的组件和它的连线网络都拿到全新的标识），因此两个单元的副本绝不会共用一个组件标识。
- 每一个 `{unit}` 都变成这个单元，因此每一个地址都写成普通的 `Process.<Model>.<Unit>.Channels.<Channel>` 点位，每一个绑定单元的属性都持有这个单元。下游没有任何东西会知道这份定义原本是抽象的：那些组件读实时值，按钮和输入框写入，而一张系列读这个单元的折线图，会画出它上面正在进行的那次运行的判定范围带，和任何一张绑定到单元的仪表画面上完全一样。
- `{unit.name}` 和 `{channel.name:...}` 变成这个单元的名称，以及那些通道在它上面当时生效的名称。

这一行穿着 View 页面所用的那条舞台栏：条目名称 `模型 · 单元 · 仪表画面`、仪表画面的图标、**展开**（“占用整个窗口”）和**全屏**（“全屏（F11）”）。它上面没有复制、也没有编辑：一个单元的行只展示一张仪表画面，绝不编辑它。一张空的仪表画面在单元的行上这样说：“这张画面上还什么都没有。它是在模型‘可视化’下的‘仪表画面’一行里画的，放在那里的东西会出现在每个单元这里。”

在模型上保存的一次编辑会到达每一个单元的行：那一行持有的是模型的定义，只要来了一个新的实例，它就再解析一次。

## 在 View 上显示 {#show-on-view}

**在 View 上显示**是详情栏上的那个开关，紧挨着编辑仪表画面。它显示当前的状态，它的悬停提示说明那个状态起什么作用：

| 状态 | 悬停提示 |
| --- | --- |
| 开 | “这个模型的每个单元都在可视化栏里为这张仪表画面有一项。” |
| 关 | “这张仪表画面从单元的‘操作’里打开。View 页面上不放它的任何东西。” |

把它打开，就在 View 页面的可视化那一栏里，为这个模型的每一个单元放一个条目，名字写作 `模型 · 单元 · 仪表画面`，戴着这张仪表画面的图标；每一个条目都是那份定义为那个单元解析出来的样子，也就是那个单元在操作下面那一行所跑的同一张画面。这些条目是那个列表的行，不是工作站的仪表画面：它们在那里绝不会被重新排序、编辑或复制（复制会被拒绝），不过每个单元的条目可以各自归进 View 页面的文件夹。一个没有单元的模型，在 View 页面上什么也不放。一张仪表画面可以自己站在 View 页面上，同时又是一张站在那里的操作面板的一张卡片；两者同时成立是很平常的安排。那些条目长什么样，写在 [View 上的单元面板](view-unit-panels)里。

对没有管理 Process 的角色，这个开关不画出来。工程锁定和运行时停止之下它仍然画出来但变灰，并说明是两者中的哪一种。这个决定是随仪表画面本身一起保存的（和它的名称走同一次自动保存），因此被拒绝的写入会把开关放回去。

## 一张仪表画面作为一张操作面板的卡片 {#a-dashboard-as-a-card-of-a-panel}

这个模型的一张操作面板可以把这个模型的任何一张仪表画面画成它的一张卡片，高度在那张操作面板上选（120 到 1200 px，默认 320）。一张仪表画面只有在你在那里把它打开时才进入一张操作面板；它一开始是关的。见[操作面板](process-panels#the-card-catalogue)。

## 删除仪表画面 {#remove-dashboard}

**删除仪表画面**在选中这张仪表画面时立在详情栏的危险组里，也在树的右键菜单里，还是文件夹页面卡片上那个叉。它先问一次（“删除仪表画面”：那个名称，然后是“这会删除这张仪表画面和上面的一切。它们读取的地址仍留在 Logic 里。”）。删除之后，选择落到这个模型的仪表画面文件夹上，开着的、挂在那张仪表画面上的编辑器关掉，每一个画过它的操作面板行都把那张卡片丢掉，它在 View 页面上的那些条目也随之离开。它需要管理 Process，在工程锁定和运行时停止之下变灰。

## 这一页不做的事 {#what-this-page-does-not-do}

- 它不编辑仪表画面的内容、名称或设置：那些是编辑器的事，由编辑仪表画面打开。
- 它不做按单元的副本。一个单元显示什么，每一次都是从那唯一一份定义解析出来的；没有什么可以按单元编辑，而操作员想为某一台工位改动的仪表画面，就是这个模型的第二张仪表画面。
- 它不把仪表画面放进 View 页面自己的文件夹。一个模型的仪表画面永远不在工作站的仪表画面列表里；它只通过在 View 上显示到达 View 页面，每个单元一个条目。
- 它不启动也不驾驭任何运行。解析出来的仪表画面上一个绑定到命令点位的按钮才做这件事，在运行流程权限之下，和任何一张仪表画面上完全一样；见[运行记录与备注](process-runs)。
