# View 与仪表画面

> View 页面：列出文件夹、画面和单元面板的可视化栏，打开画面上方带展开和全屏的那条命令栏，画面所依托的网格，以及谁可以在上面按什么。

**View** 是导航栏上紧跟在[欢迎](welcome)之后的一项，也是欢迎不在导航栏上时工作站打开时停在的那一页。它列出这台工作站所显示的每一幅画面，并运行你挑中的那一幅：既包括你在网格上、在实时 [Logic](logic) 地址空间之上搭出来的仪表画面，也包括 Process 各单元放到这里的操作面板。每一个角色都到得了这一页，因为“查看仪表画面”是每个角色都持有的那一项权限（见[权限](users-permissions)）；一个角色随后在这一页上能做什么，是一条动词一条动词地从它别的权限读出来的。

这一页回答四个路由。`/view` 是规范地址，`/` 打开同一页；`/home` 保留着，让一个旧的快捷方式仍然落在这里。`/d/{id}` 直接打开某一幅画面，平板上的书签或者别的页面来的链接就是这么到达它的；这条连接的角色不该看到的 id，或者一个已经不存在的 id，会不声不响地退回到这一页本来就会打开的那幅画面。`/d/{id}?edit=true` 直接在[编辑器](view-editor)里打开这幅画面，复制之后或者从[验证](validation)点了修复链接之后，落地的就是它；画面不能编辑时它被忽略。

## 可视化栏 {#the-visualization-column}

左边那一栏的标题是**可视化**，工作站能显示的每一样东西在这里各占一行：

- **文件夹**，最多两层深，每个带一个把这一组折起来的箭头，还有一个在舞台上打开文件夹本身的名称。文件夹那一行的末尾写着它装了多少幅画面，包括子文件夹里的。
- **画面**，也就是你自己的仪表画面，可以归进文件夹，也可以站在顶层，每一幅带着在它的[设置](view-settings)里挑的图标，它的说明则是这一行的提示。
- **单元操作面板**，Process 各模型放到这里的那些条目，每个单元一项，命名为 `模型 · 单元 · 界面`。没有人归档过的那些，聚在树后面一个**单元操作面板**抬头底下；归了档的那一项，就和你的画面一起待在它的文件夹里。

一幅画面里只要有一个组件的点位此刻读不到，它的名称后面就带上一个安静的注意圆点，它上面的每一层文件夹也一样，于是即使各组都折起来了，故障也找得到。这个圆点不说别的：没有计数，也不动。

栏的底部带着**新建…**（只给可以编辑仪表画面的角色画出来，它打开一个菜单，里面是**新建仪表画面**和**新建文件夹**，两者都在顶层），接着，在编辑器打开期间，是针对打开画面的**上移仪表画面**和**下移仪表画面**，末尾那个角上则是对文件夹的**全部展开**和**全部收起**。在一幅画面的行上右击，打开的菜单先是它命令栏上的命令（**复制**、**编辑**或**结束编辑**，在单元的条目上是**在 Process 里编辑**），然后是**移动到**；在文件夹的行上右击，打开的是新建、重命名和移除的那个菜单；那些全都写在[画面与文件夹](view-screens)。

这一栏可以用它标题上的那个箭头收成一条窄条。按一下那条窄条，列表就作为一层浮层盖在舞台上打开，好让画布留住它刚赢来的每一个像素；选中一行它又关上，图钉则把固定的那一栏放回来。这一栏和舞台之间的分隔条可以在 260 到 600 px 之间拖动。你展开了哪些文件夹、栏有多宽、有没有收起，都只属于你这一次会话：它们按连接分别保存，所以浏览器里折起一组，绝不会把工作站自己窗口上的那一组也折起来，而且这些都不会被保存下来。

## 打开画面上方的那条命令栏 {#the-open-screens-bar}

舞台上方那条命令栏写出打开的是什么，带着画面的图标和名称，也带着针对它的那些动词。编辑器打开期间，名称上戴着一个**编辑中**的徽标。

| 命令 | 作用 | 什么时候变灰（情形） | 什么时候不画出来（角色） |
|---|---|---|---|
| 复制 | 在打开的画面旁边、同一个文件夹里，做一个可编辑的副本，按原来的名字加上“(2)”“(3)”这样一直排到有一个名字空着为止，副本不会被打开：舞台显示那个文件夹的卡片墙（顶层的画面则是**顶层**卡片墙），副本的卡片突出显示并滚动到可见处。 | 什么也没打开（“请先打开一个画面再复制。”）、工程已锁定、运行时已停止。 | 角色不可以编辑仪表画面，或者打开的这一项是一块单元面板或者一幅单元画面（没有东西可复制：它是在它的模型上排布的）。 |
| 编辑 / 结束编辑 | 对打开的画面进入[编辑器](view-editor)，或者离开编辑器回到查看。离开从不被拒绝。 | 什么也没打开（“请先打开一个画面再编辑。”）、工程已锁定（“有单元在运行时配置是锁住的。”）、运行时已停止（“运行时已停止”）。 | 角色不可以编辑仪表画面，或者打开的这一项是一块单元面板或者一幅单元画面。 |
| 在 Process 里编辑 | 在 Process 工作区里打开这一项自己的定义：它那个模型的面板行或者画面行。 | 从不变灰；只有它跑得起来的时候才画出来。 | 打开的这一项是你自己的画面，或者角色不可以管理模型。 |
| 展开 | 把导航栏、标题栏和这条命令栏本身都藏起来，把整个窗口交给这幅画面；窗口本身保持原样。 | 什么也没打开。 | 从不隐藏，但编辑期间不提供。 |
| 全屏 | 来真的：工作站的窗口盖住整个显示器，浏览器则进入文档全屏。F11 做的是同一件事。 | 什么也没打开。 | 从不隐藏，但编辑期间不提供。 |

展开和全屏是为了操作一幅做好的画面，所以编辑器打开期间这条命令栏把两者都收起来，那时按 F11 也什么都不做。这两种模式、那个浮出菜单和状态栏的全部内容，写在[全屏操作模式](view-fullscreen)。

打开的是一个文件夹而不是一幅画面时，这条命令栏换了主语：它写出这个文件夹的名字，并带上**重命名文件夹**（在文件夹自己那一行上打开名称字段），以及右边用危险色写的**删除文件夹**（和行菜单里那一条同样的确认）。两者都只给可以编辑仪表画面的角色画出来，工程锁定期间变灰。

## 舞台 {#the-stage}

舞台画什么，跟着你挑的那一行走：

- 一幅**画面**在画布上运行：它的网格放大到铺满舞台，不出现滚动条，它的各个组件按这一页自己的节奏读取地址空间（工作站的窗口上每 150 ms 一次，远程浏览器上每 400 ms 一次）。
- 一个**文件夹**作为一份概览打开：一行说明这里归了什么，每个子文件夹一行并写着它的数量，每幅画面一张卡片，带着图标、名称和说明。按下一张卡片就打开那幅画面。
- 一块**单元面板**不是一份布局，而是一摞卡片，所以舞台变成它们竖着排的一根滚动列：见 [View 上的单元面板](view-unit-panels)。一幅**单元画面**（在 View 上显示的某个模型的画面）像任何画面一样在画布上运行，并且已经为它那个单元解析好了。

没有东西可显示时舞台会说出来：一台没有任何仪表画面的工作站写着“还没有仪表画面。创建一个，为你的试验台组合实时读数、图表和控件，然后全屏打开来操作。”，并给可以编辑的角色配一个**新建仪表画面**按钮；一个所有仪表画面都对它隐藏的角色读到“没有仪表画面对你的角色可见。”；而一份有文件夹却没有画面的列表，或者一个打开着却没挑中画面的文件夹，会说明是这两种当中的哪一种。

## 网格 {#the-grid}

每一幅仪表画面都有自己的**列 × 行**网格（在你改动之前是 24 × 12，每个数在 1 到 96 之间），它铺满舞台并随窗口缩放。一个组件占据一块矩形的单元格（它的 X、Y、宽和高）；组件之间可以随意重叠，每个还带着一个**图层**编号（Z）：图层高的画在上面，也接住点击。[边框](component-frame)就是这样变成一个真正的背景的：把它移到最后，再把那一组画在它上面。摆放、定大小和图层次序属于[编辑器](view-editor)；网格自身的大小则是一项[仪表画面设置](view-settings)。

## 命令、权限和锁标记 {#commands-permissions-and-the-lock-mark}

每一种命令类组件都经由工作站唯一的 Logic 写入出口写入并记入日志，也都服从同一套权限模型。这既包括画面上任何按得下去的控件，也包括一块单元面板所带的那些流程类卡片，还包括在[报警提示条](component-alarm-banner)上做的确认：

- 在你自己的仪表画面上按一个控件，需要角色的**操作仪表画面**权限，它在[用户](users)页面上按角色授予。
- 目标是一次 Process 改动的按下（一条单元运行命令、一个预选字段、一条运行备注），另外还需要**运行流程**。一次按下需要什么，是从它解析出来的目标读出来的，绝不是从组件的种类读出来的：一个写入一个值或者打开另一幅仪表画面的按钮，仍然停在仪表画面那项权限上。
- 在一块单元面板或者一幅单元画面上，只由 Process 那项权限管着：**运行流程**，和仪表画面无关。
- 运行时停止期间，不管什么角色，每一条命令都以“运行时已停止”被拒绝。

登录的角色不可以按的命令仍然留在屏幕上，戴着那个安静的**锁标记**：组件角上一个小挂锁，完整的理由（“需要‘操作仪表画面’权限。”或者“需要‘运行流程’权限。”）写在组件的提示里。它是有意做得安静的，因为一个只能查看的角色会一下子在每个控件上都看到它，而一个运行正常的现场不该读起来像一幅满是警告的画面。授权在每一次按下的那一刻重新核对，所以画面开着的时候退出登录或者换了角色，都不会派发出一次过期的点击。

每一个命令类组件都在控件下面自己那条**答复行**上作答（“已写入”“成功 · 12 ms”，或者那句拒绝），它五秒之后过期。全屏的画面把状态栏藏起来之后，那一行是仅剩的那块地方，所以命令在那里作答，而不是在状态栏的操作记录条里。格子太矮、放不下组件的角上标题、控件和这一行三者时，答复在显示期间占用角上标题的位置，答复过期后标题回来。带角上标题的命令只有一行高时，编辑器会在控件的**字体**分区里说明这一点，因为这个大小很少能同时放下三者。格子矮到连角上标题和控件都放不下时，标题把自己那一行让给控件，所以输入框或按键绝不会被截断地画出来。答复没有自己的那一行、控件上面也没有角上标题（没有写标题，或者标题让出了自己那一行）时，按钮、开关、输入框、设定值滑块、选择器和步进按键在答复显示期间把它画在自己文字的位置上：按钮上的文字、开关的标签、输入框和滑块用来发送的那个按键、选择器或步进按键上被按下的那个按键，以及以下拉列表显示选项的选择器收起时列表里显示的那个选项。答复用答复行的颜色（在按钮上，是按钮自身文字颜色调淡后的色调）叠在这些文字上，拒绝用错误的颜色；文字的位置比答复窄时以省略号截断，完整的答复在提示里。什么都不会移动：文字保住自己的位置和名字，答复过期后就回来。其他命令把答复留在自己那一行上，把格子加高就能让那一行回来。

## 各种锁 {#locks}

一个单元运行期间，这一页显示**工程已锁定**提示条：“有一项单元操作正在进行。在每个单元结束之前，配置保持只读；运行控制和其他操作员动作仍然可用。”新建、复制、编辑、归档、重命名和重排都以这个理由变灰，打开着的编辑器会关掉，而各幅画面照常运行、照常接受允许的命令。运行时停止会把同样这些动词关掉，连命令一起；外壳自己那条暂停通知会说明在哪里重新启动。

## 这一页不做什么 {#what-the-page-does-not-do}

它从不编辑一块单元面板或者一幅单元画面（在 Process 里编辑会把你带到它们排布的地方），从不给它们重排顺序，也绝不让一个角色看到一幅对它隐藏的仪表画面，无论通过列表还是通过地址。它不为你保留任何超出这次会话的布局状态：折起来的文件夹、栏宽、图钉和选中的画面，都随着连接一起重置。删除一幅画面是在编辑器的[仪表画面设置](view-settings)里做的，不是从这一栏做的。

## 本区域内 {#in-this-area}

| 页面 | 涵盖 |
|---|---|
| [画面与文件夹](view-screens) | 新建、复制、归档、重命名、重排和移除这一栏所列的东西，启动画面，以及谁看得到哪一幅画面。 |
| [仪表画面编辑器](view-editor) | 那张工作台：面板、画布、选择、每个组件共有的属性分区，以及在图元连接点之间画出来的连线。 |
| [仪表画面设置](view-settings) | 一幅画面对自己声明的东西：名称、说明、图标、网格、启动、全屏时的状态栏、可见的角色、删除。 |
| [全屏操作模式](view-fullscreen) | 展开和全屏、F11 和 Esc、浮出菜单以及状态栏偏好。 |
| [View 上的单元面板](view-unit-panels) | 操作一个 Process 单元所用的那一摞卡片，在这里的样子。 |
| [图表](view-charts) | 每张图表都带的那条工具栏，它的刻度、统计和参考面板，以及分离出去的图表窗口。 |
| [仪表画面组件](components) | 组件类型的目录、它们绑定的地址、读数如何绘制，以及每一种类型一页的参考。 |
