# 选择

### 选择 Revit 图元

Revit 是一个数据丰富的环境。这为我们提供了一系列选择功能，使其远超“点击”范围。我们可以查询 Revit 数据库，以及在执行参数化操作的同时将 Revit 图元动态链接到 Dynamo 几何图形。

UI 中的 Revit 库提供了“选择”类别，该类别允许通过多种方式选择几何图形。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-908c5187f9538a8ca308639aad8f0be4e22a5325%2Fselect_revit_elements_01.jpg?alt=media)

### Revit 层次结构

要正确选择 Revit 图元，请务必全面了解 Revit 图元层次结构。要选择项目中的所有墙？选择“按类别”。要选择您中世纪风格大厅中的每把埃姆斯椅？选择“按族”。

我们快速回顾一下 Revit 层次结构。

还记得生物学的分类法吗？界、门类、类别、等级、族、属、种？Revit 图元以类似方式分类。在基本级别上，Revit 层次结构可以分解为“类别”、“族”、“类型\*”和“实例”。实例是一个模型图元（具有唯一 ID），而类别则定义常规组（如“墙”或“楼板”）。通过这种方式组织 Revit 数据库，我们可以选择一个图元，并根据层次结构中的指定级别选择所有相似图元。

{% hint style="warning" %}
\*Revit 中的类型定义与编程中的类型不同。在 Revit 中，类型是指层次结构的分支，而不是“数据类型”。
{% endhint %}

### 使用 Dynamo 节点进行数据库导航

下面的三幅图像对 Dynamo 中 Revit 图元选择的主要类别进行了细分。这些是可结合使用的优秀工具，我们将在以下练习中介绍其中一些工具。

*“点击”* 是直接选择 Revit 图元的最简单方法。可以选择完整的模型图元或其一部分拓扑（如面或边）。这会保持与该 Revit 对象的动态链接，因此，当 Revit 文件更新其位置或参数时，参照的 Dynamo 图元将在图形中更新。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-2765fbc05d156965026262d20d51e7dbf19ce843%2Fselecting_database_navigation_with_dynamo_nodes_01.jpg?alt=media)

*“下拉”菜单* 在 Revit 项目中创建所有可访问图元的列表。可以使用此选项来参照在视图中不一定可见的 Revit 图元。这是一款优秀的工具，可用于查询现有图元或者在 Revit 项目或族编辑器中创建新图元。

!\[]\(../.gitbook/assets/selecting \_database\_navigation\_with\_dynamo\_nodes\_02.png)

还可以在 *Revit 层次结构* 中按特定层级选择 Revit 图元。这是一个功能强大的选项，可用于自定义大型数据阵列，以准备文档或衍生式实例化和自定义。

\![UI](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-chs/.gitbook/assets/allelements%20\(1\).jpg)

在上述三幅图中，我们将深入探讨一个练习，该练习从基本 Revit 项目中选择图元，为我们将在本章的其余部分创建的参数化应用程序做好准备。

## 练习

> 单击下面的链接下载示例文件。
>
> 可以在附录中找到示例文件的完整列表。

在此 Revit 文件示例中，我们有三种图元类型的简单建筑。我们将以此为例，在 Revit 层次结构的上下文中选择 Revit 图元。

!

> 1. 建筑体量
> 2. 梁（结构框架）
> 3. 桁架（自适应构件）

基于 Revit 项目视图中当前的图元，我们可以得出哪些结论？我们需要在层次结构中向下行进多远来选择相应图元？当然，在处理大型项目时，这将成为一项更为复杂的任务。有许多可用选项：我们可以按“类别”、“标高”、“族”、“实例”等选择图元。

### 选择体量和曲面

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-6ede986a3eec1e06ae23773dbfb56e8e025db738%2Fselecting_exercise_02.jpg?alt=media)

> 1. 由于我们使用的是基本设置，因此我们选择“Categories”下拉节点中的 *“Mass”* 来选择建筑体量。这可在“Revit”>“选择”选项卡中找到。
> 2. “Mass”类别的输出只是类别本身。我们需要选择相应图元。为此，我们使用 *“All Elements of Category”* 节点。

请注意，此时我们在 Dynamo 中看不到任何几何图形。我们已选择 Revit 图元，但尚未将该图元转换为 Dynamo 几何图形。这是非常重要的差异。如果要选择大量图元，您不会希望在 Dynamo 中预览所有这些图元，因为这会降低所有操作的速度。Dynamo 是一款用于管理 Revit 项目的工具（无需执行几何图形操作），我们将在本章的下一部分中进行介绍。

在本例中，我们使用的是简单几何图形，因此我们希望将几何图形输入 Dynamo 预览。上述“Watch”节点中的“BldgMass”旁边有一个绿色数字。这表示该图元的 ID，指示处理的是 Revit 图元，而不是 Dynamo 几何图形。下一步是在 Dynamo 中将此 Revit 图元转换为几何图形。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-58dcd14a6b744643e9587c4c558efb36689152b4%2Fselecting_exercise_03.jpg?alt=media)

> 1. 使用 *“Element.Faces”* 节点，我们会得到一个包含曲面的列表，表示 Revit 体量的每个面。现在，我们可以在 Dynamo 视口中看到几何图形，然后开始参照相应面进行参数化操作。

以下是另一种方法。在这种情况下，我们将不会通过 Revit 层次结构 \_（“All Elements of Category”）\_进行选择，而是改为在 Revit 中明确选择几何图形。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-37c62b8a757eb68f08ac539d9e8d7b75cb8fedfa%2Fselecting_exercise_04.jpg?alt=media)

> 1. 使用 *“Select Model Element”* 节点，单击\*“select”\*（或 *“change”* ）按钮。在 Revit 视口中，选择所需的图元。在本例中，我们选择的是建筑体量。
> 2. 我们可以使用 *“Element.Geometry”* 将完整体量作为一个实体几何图形进行选择，而不是使用 *“Element.Faces”*。这将选择该体量中包含的所有几何图形。
> 3. 使用 *“Geometry.Explode”* ，我们可以再次获得包含曲面的列表。这两个节点的工作方式与 *“Element.Faces”* 相同，但提供了用于深入到 Revit 图元的几何图形的替代选项。

使用一些基本列表操作，我们可以查询关注的面。

!\[]\(images/2/selecting - exercise 05.jpg)

> 1. 首先，将之前选定的图元输出到“Element.Faces”节点。
> 2. 接着，*“List.Count”* 节点会显示我们正在处理体量中的 23 个曲面。
> 3. 参照此数字，我们将*整数滑块*的最大值更改为 *“22”*。
> 4. 使用 *“List.GetItemAtIndex”*，我们为 *“index”* 输入列表和*整数滑块*。在选定内容之间滑动，当到达 *“索引 9”* 并隔离将桁架用作主要外立面时，便会停止。

上一步有点麻烦。我们可以使用 *“Select Face”* 节点更快地完成此操作。这样，我们便可以隔离 Revit 项目中本身不是图元的面。除了我们选择曲面而非完整图元之外，与 *“Select Model Element”* 相同的交互也适用。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-15ae31a864394a15f659ea870135782471cd5fd4%2Fselecting_exercise_06.jpg?alt=media)

假定我们要隔离建筑的主要外立面墙。我们可以使用 *“Select Faces”* 节点来执行此操作。单击“Select”按钮，然后在 Revit 中选择四个主要外立面。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-6e07c0165012b53189838647456923615f055fea%2Fselecting_exercise_07.jpg?alt=media)

选择四面墙后，确保在 Revit 中单击“完成”按钮。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-ccae5a6c05e80a44da24afd149c57158f2f4c8ad%2Fselecting%20-%20exercise%2008.jpg?alt=media)

现在，面作为曲面输入到 Dynamo 中。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-b76b4b3a3a0b8f6d162d254f6dd853960ea4b5ec%2Fselecting_exercise_09.jpg?alt=media)

### 选择梁

现在，我们看一下横跨中庭的梁。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-75d071a2aefcb5307f140d0d445f54b39ce40a17%2Fselecting_exercise_10.jpg?alt=media)

> 1. 使用 *“Select Model Element”* 节点，选择其中一个梁。
> 2. 将梁图元连接到 *“Element.Geometry”* 节点，现在在 Dynamo 视口中便有了梁。
> 3. 我们可以使用 *“Watch3D”* 节点放大几何图形（如果在“Watch 3D”中看不到梁，请单击鼠标右键，然后点击“zoom to fit”）。

Revit/Dynamo 工作流中可能经常遇到的问题：如何选择一个图元并获取所有相似图元？由于选定的 Revit 图元中包含其所有层次结构信息，因此我们可以查询其族类型并选择该类型的所有图元。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-35d458c08dada703eb506588590c31ec6856cd8f%2Fselecting_exercise_11.jpg?alt=media)

> 1. 将梁图元连接到 *“Element.ElementType”* 节点。
> 2. *“Watch”* 节点显示，输出现在是族符号，而不是 Revit 图元。
> 3. *“Element.ElementType”* 是一个简单查询，因此我们可以在代码块中执行此操作（就像使用 `x.ElementType;` 一样简单）并获得相同的结果。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-a3a686c1005c138f790e27bd794cdbac97c447b8%2Fselecting_exercise_12.jpg?alt=media)

> 1. 要选择其余梁，我们使用 *“All Elements of Family Type”* （所有族类型的图元）节点。
> 2. “Watch”节点显示我们已选择了五个 Revit 图元。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-e1c20521840f62fa843bbc44871091482897d73f%2Fselecting_exercise_13.jpg?alt=media)

> 1. 我们也可以将所有这五个图元都转换为 Dynamo 几何图形。

如果我们有 500 个梁，该怎样办？将所有这些图元都转换为 Dynamo 几何图形会非常慢。如果 Dynamo 计算节点需要较长时间，可能需要使用“冻结”节点功能，以便在开发图形时暂停执行 Revit 操作。有关冻结节点的详细信息，请查看“实体”章节中的“[冻结](https://github.com/DynamoDS/DynamoPrimerNew/blob/master-chs/essential-nodes-and-concepts/5_geometry-for-computational-design/5-6_solids.md#freezing)”部分。

在任何情况下，如果要输入 500 个梁，我们是否需要将所有曲面都用来执行所需的参数化操作？或者，我们是否可以从梁中提取基本信息，并使用基本几何图元执行衍生式任务？在学习本章时，我们要牢记这个问题。例如，接下来让我们看一下桁架系统。

### 选择桁架

使用相同的节点图，选择桁架图元而不是梁图元。在执行此操作之前，请在上一步中删除“Element.Geometry”。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-ee2fa45ac91be989c14aa894cd5bc823c74e3111%2Fselecting_exercise_14.jpg?alt=media)

接下来，我们准备从桁架族类型中提取一些基本信息。

![](https://338946474-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FZkPl5tDHbu5X9VJTozDs%2Fuploads%2Fgit-blob-92b69505366d784b2e922b6c4d412503dfe40731%2Fselecting_exercise_15.jpg?alt=media)

> 1. 在 *“Watch”* 节点中，我们可以看到从 Revit 中选择的自适应构件列表。我们要提取基本信息，因此我们从自适应点开始操作。
> 2. 将 *“All Elements of Family Type”* （所有族类型的图元）节点连接到 *“AdaptiveComponent.Location”* 节点。这样，我们就得到了一个包含列表的列表，每个列表都有三个点，这三个点代表自适应点的位置。
> 3. 连接 *“Polygon.ByPoints”* 节点会返回一条复合线。我们可以在 Dynamo 视口中看到这一结果。通过此方法，我们已可视化了一个图元的几何图形，并对其余图元阵列的几何图形进行了抽象处理（其数量可能大于本示例）。

{% hint style="info" %}
提示：如果在 Dynamo 中单击 Revit 图元的绿色数字，则 Revit 视口将缩放到该图元。
{% endhint %}
