0 背景
Rhino.Inside.Revit 1 已经上市,我们也准备了配套的使用手册,为了方便中文用户,我们会陆续将使用手册本地化,这是 Rhino.Inside®.Revit 手册中文版 的第一个部分 - 101必备内容,
请注意:
- 建议阅读本手册之前建议至这里了解 Rhino.Inside®.Revit入门指南
- 这是一套偏向教学本地化手册,既可以系统的学习 RIR也可以针性搜索查询某个功能;
- 如何利用 Rhino.Inside.Revit 建模?请浏览 Rhino.Inside®.Revit中文手册2 - 建模
- 关于 Revit的文档、容器与设置请浏览 Rhino.Inside®.Revit中文手册3 - 文档/容器/设置
- 关于 Revit 中的 Python 组件使用方法请浏览Rhino.Inside®.Revit中文手册4 - Python 脚本
- Rhino.Inside®.Revit 是一个继续开发中的项目,手册内容也会随着开发持续更新 ;
- Rhino.Inside®.Revit 手册英文版-请浏览这里,本地化中如果发现任何疑问、错误、遗漏,请直接回帖讨论,谢谢你的参与
1 概论
首先需要了解 Revit 如何创建与储存模型信息, 如果你准备利用 Revit 建立与管理数据这是非常关键的一步。在本教学中我们会详细讲解 Revit 数据模式,也会介绍如何利用 Grasshopper 中的专用 Revit 运算器组来处理数据模型。
1.1 Revit 图元(Element)DNA
下面这个图片显示了单一 ⬢ Revit 图元(Element) 的DNA,它就像一台小设备,输入数据、处理数据、建立几何物件与数据然后再输出它们。请注意,并不是所有的图元都包含几何信息,有一些图元仅仅只是记录信息。
- Category 类别 : 类别定义最顶层组织 ▬▬,其包含了了一个图元的输入与输出属性的模板,列别的列表内置于 Revit 且不能修改
- Family 族 :族定义第二层组织,族就像是一个函数,输入类型与实例的参数▬▬,生成元数据▬▬与几何 ⬢ 。族的逻辑作为系统内置于与 Revit 中称之为 系统族 ,例如楼板 、墙 与屋顶 ,也可以设置为自定义族 ,例如门 与窗 等。
- Type(族)类型 : 族类型定义第三层组织,族类型还携带类型的参数值,这些值会被馈送至族函数以生成图元、计算类型参数。
- Instance(族)实例 :携带图元放置至 2D 与 3D 空间的变换信息,同时也携带实例的参数值,这些值会被馈送至族函数以生成图元、计算实例相关参数。
因此,实际上我们是将类型与族实例信息输入至族函数中,用以生成图元元数据(包括计算属性)与几何体。请注意,我们在 Revit 族 定义中所提供的数据、族类型 、族实例 参数与系列逻辑一同用于生成 BIM 数据结构。
然后所有建立的图元都会存储在一个 Revit 文档中,它们也由一系列的容器(Container) 组成,每个容器都有各自的用途。
顺便介绍一下子类 (Subcategories ), 看名字好像是类 的下一级组织,实际上建议把它当作几何属性而不是组织层级。当一个族 函数生成几何时,它可以将它们分组为主要类别的子类别,这样就能更好的控制几何图形中的各部分图形。
1.2 Elements & Instances 图元与实例
常常有被问到,到底什么是图元 ?图元 是 Revit 数字模型中的基本构建图块,图元 被组织成类别 ,类别 列表内置在每个 Revit 版本内且不能修改。图元都 带有参数且会保持相关数据。图元 基于其所属类别 可以获得一系列内置参数,也能接受用户定义的自定义参数。有些图元 是几何物件,例如墙(3D)或细节组件(2D),也有一些图元不包含任何几何,例如项目信息(对,即使它也是 Revit 数据模型中的一个图元,但不可以被选择。介于 Revit 视图是围绕几何图元而设计,因此 Revit 提供了一个自定义窗口来编辑项目信息)。在 Revit 模型中图元都包含了很多定义图元行为方式的族类型。
API
Revit API 中图元 通常由 DB.Element 来表示,每个图元的参数由 DB.Parameter 来表示。DB.Element 提供多种方法以方便访问其属性集合。
每个图元都有一个整数值的 Id(DB.Element.Id),但图元并不是固定不变得,在更新与工作设置相关操作(例如居中保存)会发生改变。通常通过图元唯一的 Id(DB.Element.UniqueId)更安全,特别是你准备在 Revit 模型外部引用一个图元,例如外部数据库。请注意,DB.Element.UniqueId 并不是一个 UUID 编号,特别是你准备把这些信息发送给外部数据库时,要特别注意这个问题。
1.3 参数
图元 都包含参数,也会携带一些图元 (参数相关的数据),例如墙体图元 的高度参数,其值由高度参数 来加载。让我们来看下使用 Revit 图元时所遇到的各种参数类型。
1.3.1 内置参数
内置参数是基于不同类型的图元且内置于 Revit 内部最明显的参数集,例如一个墙体或是房间图元含有一个名为体积 的参数,这个参数不会影响 2D 填充图案图元当然也和其无任何关联。
提醒 :API ,Revit API 中所有的内置参数都由 DB.BuiltInParameter 枚举表示
1.3.2 项目参数 / 共享参数
Revit 允许用户创建一系列的自定义参数且将其全局应用于选顶类别,图元属性面板 还会显示附加的所选图元的项目参数
1.3.3 全局参数
全局参数是与类别无关的参数,可以将其用于许多不同 Revit 类别中的一系列实例或类型参数
1.3.4 类别、族与类型 (Categories, Families & Types)
现在我们知道 Revit 将建筑组件组织为类别 、族 与类型 ,下面将详细讨论一下它们
1.3.5 类别 (Categories )
类别 是最高级别的组织,这些类别都内置于 Revit 中,根据各自不同的功能松散的组织各自的组件。一个 Revit 模型中通常都会同事存在多组不同的类别:
- 模型类别,例如墙、门、楼板与屋顶等。
- 分析类别,例如表面分析与结构载荷等。
- 注解类别,例如标签、尺寸等。
其实每个类别中都存在多种不同的类别,有人认为类别其实比较高级别的组织,实际上遵循类、族与类型的组织系统能更好的理解和记住它们。
提醒 :API ,Revit API 中所有的内置类都由 DB.BuiltInCategory 枚举表示, 所有内置类别都有 DB.CategoryType 枚举表示。
1.3.6 类型 (Types)
在讨论族 之前需要先了解什么是 Revit 中的类型 ,正如前面提及到的每个 Revit 类别下面都会包含多种类型的图元,例如一个 3ft7ft 的单开门、是位于门类 下的一个类型, 一个 24 的木柱是结构柱类 别下的柱类型。
每个类型都有一系列的类型相关的参数,这些参数用来修改该特定类型的相关操作。在使用 Revit 时我们更加倾向定义或修改各种类型 且将这些类型的实例 放入模型中,例如我们可以定义一个 3ft*7ft 单页门的类型 ,然后再模型中的不同位置放置多个这样类型 的实例 ,所有的这些实例都会遵循其特定类型的指定逻辑,当然类型定义也允许修改某些实例参数 以调整指定实例的图形等。
1.3.7 族 (Families)
理解什么是类型 后我们开始讨论族 ,初次接触 Revit 的用户都很难理解什么是类别 与类型 ,Revit 模型中存在很多不同的类型 ,而且他们彼此之间差异很大。例如我们可以拥有数百种具有不同设计与尺寸的门,其中车库门与单页门完全不同,因此我们需要一个方法来组织这些类型至相关群组的方法:
- 系统族 都命名为群组 ,例如 风管系统 、基本墙体 等…
- 自定义族 (或可载入族)要更加复杂,可以使用多种自定义的方式来自行设计与创建。例如你可以创建一个看起来像太空飞船一样的新桌子族,可以将其悬空在地板上,然后根据场景设计需要摆放 6 到 12 张椅子。Revit 中的族编辑器 可以根据族模板文件 (.rfa) 来定义一个新的自定义族 ,自定义族 可以存储在外部文件(.rfa)中,而且可以与其他 Revit 用户共享. 内建族是自定义族的简化版,用于模型中使用一些受限的几何图形。
提醒 :系统族 这个名字容易让 Revit 用户混淆,请记住系统族 只是相关类型组 的一个名字,它们与自定义族完全不同且不能储存在外部文件中。通常 Revit 用户或是开发人员都不需要处理系统族 ,而且 Revit 的 API 至今也不支持创建或是修改任何的系统族 ,因此通常 Revit 用户讨论族 时都是指的自定义族 。
API ,在 Revit API 中,自定义族 由 DB.Famiy 来表示,它们衍生的各种类型由 DB.FamilySymbol 来表示,其每个实例都由 DB.FamilyInstance 来表示。
定义一个新的自定义族 并不是一件容易的事情,尤其当它需要智能、灵活的适应多种模型条件时,自定义族 无疑时 Revit 中最重要的自动化主题之一。很多公司都会为模型中经常使用的各种组件创建一套专有的自定义族,当然也有一些第三方的公司专门从事定制自定义族的业务。
Revit 为了方便用户入门,会在安装时会根据用户的系统配置建立一组默认的自定义族 ,例如公制与英制 ,还提供了很多模板以帮助用户一步步创建自己的自定义族 。
请浏览 Revit: 类型和族 章节了解如何使用 Revit 的类型以及在 Revit 中使用 Grasshopper的族 。
1.4 容器 Containers
Revit 容器 (例如工作集、设计选项等)是一种将一系列图元进行逻辑分组的机制,每个容器都有特定的用途,例如工作集允许导入部分的建筑物,因此协调与碰撞检车变得更加方便。加载指定的工作集时不会加载不属于该工作集的其他图元。
1.5 文档与链接
Revit 的文档 其实就是 Revit 图元 的合集,Revit 文档既可以是建筑模型(Revit 项目 )也可以表示为自定义族 (Revit 族 )
请浏览 Revit: 文档 章节了解如何使用 Revit 的文档以及在 Revit 中使用 Grasshopper的文档。
2 Grasshopper in Revit (GIR)
2.1 Revit-Aware 运算器
Revit-Aware 运算器图标能便于识别组件的功能,如下图所示, 基于颜色的不同而显示不同的操作类型(查询、分析、修改与创建)。也有一系列类似图标的徽章, 以显示组件所使用的数据类型、身份等:
例如用于 墙体 的参数、查询、分析与创建组件的显示如下:
2.1.1 传递运算器
有些场合下需要用到一类特别的传递运算器(Pass-throught)将分析、修改与创建等操作整合到一个运算器中,这样有助于减少运算器的使用数量且能避免界面混乱的问题, 这些运算器会在后台进行拆分, 例如 Flip Element 或 Material Identity :
下面以 Material Identity 为例, 这个运算左端有两组输入,第一个输入参数为 Revit 图元,在这个案例中用来处理材质 Material .接着下面的一些输入参数用来更改 Revit 图元:
运算器的右端是一些常用的输出参数,请注意 输入与输出参数并不是总是相同的,Revit 图元会根据需要创建一些不同的属性,通常会有一些不同的图元与不同属性设置的需求,且有一些输出属性是基于图元计算才能计算出输出参数(例如墙体不能把体积作为输入,但可以作为输出参数),另外不是所有的图元属性都可以通过 Revit API 进行调整:
传递运算器也可以自定义输出选项,可以用来处理 Revit 输出图元,例如这里填入 Material :
现在你应该能理解什么是传递运算器, 它们用来传递输入图元至输出图元以便于修改或分析这些图元,通常都是串联这些动作而不是并联,这样才能很好的保证操作顺序,因为这些目标图元都属于 Revit,Grasshopper 无法确定这些操作的全部含义;
2.1.2 事件运算器(Transactional Components)
文档要知道那些运算器每一次的 Grasshopper 脚本执行中被调整而导致文档修改, 就变得很重要的, 这样可以更好的理解和管理事件,也能更好的执行事件 ( 例如开发者可能会调整图形逻辑组合更多的事件用以提供性能)
当这些组件执行具体的事件时会显示深色背景:
提醒: 如果输入参数与目标图元没有任何的调整, 下一次执行 Grasshopper 脚本时组件不会有任何的变更, 且组件的背景色将会显示会默认的灰色;
2.2 几何预览
你既可以使用 Grasshopper 运算器上的预览开关来切换预览打开或关闭 Revit 的显示, 也可以从 Revit 的 Rhinoceros 选项卡全局切换预览:
2.3 暂停(停止)计算
你可以在 Revit 的 Rhinoceros 选项卡中暂停(停止) Grasshopper 脚本的执行, 这对于减少 Revit 大模型的等待事件非常有用:
2.4 图元追踪
Element Tracking 追踪功能可以让 Grasshopper 替换之前所创建的 Revit 图元, 及时是之前保存过的文件之间也可以替换. 每个运算器的输入都会记住它添加过那些Revit图元, 且能避免重复创建. 要注意,仅仅 Grasshopper 中 Add 运算器支持图元追踪功能. Grasshopper 文件关闭后再次打开会记住这些图元.
详情如下面的视频示范:
提示: 可以通过鼠标右键点击运算器来控制图元追踪模式,
我们提供三种不同的图元追踪模式:
- Disabled - 关闭追踪所有创建的 Revit 图元, 这样可能会造成 Revit 中出现重复创建的图元;
- Enabled: Replace - 每次运行 Grasshopper 都会在 Revit 中建立新的图元替代之前创建过的图元;
- Enabled: Update - 该选项为默认值, Grasshopper 会尽力修改当前 Revit 中的图元(如果 Revit API 允许修改类型), 否在,运算器将会和 Enabled: Replace 一样建立新的图元
每个运算器的输出端也可以额外增加控制来管理追踪:
- Highlight - 选择且会高亮由此输出端所建立的 Revit 图元
- Unpin - 移除任何经由此输出端创建且被 Pin 的 Revit 图元, 还有一个 Unpin 运算器也具有类似功能
- Delete - 删除任何由此输出端追踪的图元
- Release - 忘记所有的输出对象且不会最终这些输出对象,要注意的是如果再次运行 Grasshopper 脚本文件可能会重复建立对象
2.5 单位系统
在 Revit 界面数字发生改变时系统会提醒选择一个系统单位, Revit在后台都是以英尺为单位,如果Rhino和Revit 的单位不统一时, Rhino会提醒修改单位系统与Revit 的显示单位保持一致。
这时无任你选择哪个选项,几何图像都会转换为两种制式中正确的尺寸。
请注意,在Rhino中缩放模型会影响到公差(下面即将讨论),如果模型被放大,例如毫米改为米都会对公差产生不好的影响。
2.6 公差
Revit 可以处理经由 Rhino所创建的 BREP(NURBS)与网格几何对象,任何几何物件都有一个很重要的特性 - 几何公差,Revit 在进行几何转换时也会多方面的受到公差的影响, 请注意;
- 理论上 Rhino的Brep可以直接转换至 Revit, 但如果公差设置不正确会造成转换失败。
- 无法直接转换的几何物件会透过 SAT 格式来进行转换,但SAT的转换会很慢,通常需要用到SAT转换的运算器都会显示警告
- 如果无法使用常规或SAT方式转换的 DirectShape 图元可以使用带有密集黑色边缘的网格模型输入至 Revit
- 族类仅能接受 NURBS 几何物件,所以必须注意公差问题,如果某些几何物件无法转换为族类型会显示一个错误提醒
- 远离原点的物件可能无法保证一定的的公差精度,隐藏会造成输入Revit 失败
理论上一个Rhino模型和一个Revit模型都可以具有相同精度的公差。
请注意,所有线段长度小于1mm的曲线都无法被 Revit 接受,也包括修剪过的曲面边缘,长度包括;
- 1/256(0.0039)英尺
- 3/64(0.047)英寸
- 大概1毫米
所有 NURBS 的公差 Rhino都会与Revit 内置公差设置一致,可以通过下拉菜单 工具>选项>单位来进行设置, 以匹配 Revit 的单位类型与公差,
- 0.1 毫米
- 0.0001 米
- 0.006英寸
- 0.0005 英尺
很多时候无法保证 Rhino 模型公差总是与Revit 的一致, 例如模型经由其他软件创建而仅仅只是在 Rhino中被打开, 处理方法如下;
- 在 Rhino中执行 Selbadobject 以搜索这些坏的物件,然后修复或替换之。请点击这里了解如何修复与替换损坏的物件
- 参考前面的方法设置公差,物件的公差也会被重置
修复带有公差问题的模型过程有一些复杂, 为其重置正确公差的方法如下;
- 通过 Explode 指令将多重曲面炸开为多个曲面,
- 选择所有已经炸开的曲面,然后执行 RebuildEdge 指令,然后套用默认设置重建曲面边缘,
- 执行 Join 指令以组合所有被重建边缘的曲面,
- 运行 ShowEdge 指令, 检测所有外露边缘,所有超出公差的部分都会以外露边缘进行显示。
2.7 Grasshopper 性能问题
请注意以下的一些提醒会影响 Grasshopper 脚本的执行性能,
- Grasshopper 是以插件方式运行在 Revit 的内部, 因此当 Revit 运行比较慢时(例如打开大的模型、开启太多视图…) 会让 Grasshopper 无法获得更多的资源进行计算或预览显示
- Revit 中显示 Grasshopper 的内容都需要进行几何转换,预览数据过多时也会降低 Revit 的视图查看速度,你可以通过切换 Revit 的 Rhinoceros 栏内的全局预览开关,选择性的预览所需要显示的Grasshopper 内容
- 在单个图元上运行多个事件会比多个图元上执行单个事件要慢,因此在 Revit 中设计 Grasshopper 脚本时请尽力在执行单个事件时一次性对多个图元进行修改与调整
- 关闭 Grasshopper 脚本计算能减少大型 Revit 模型的等待时间,
- 低质量与超出公差范围的模型会增加转换时间,特别时公差超出的问题
3 Rhino in Revit (RIR)
3.1 Rhino on Side
在 Revit 中使用Rhino时,通常Rhino都会被放置在侧边用来查看与预览几何图像。大多数情况下你可能并不需要完整的 Rhino 界面,如果你仅需要预览模型, 你仅需要打开 Rhino视窗且将其放置才侧边即可,
4 Revit - 图元与实例
这里会介绍如何手动参照一个指定的图元且将其引入 Grasshopper 脚本文件,后面的部分会讨论如何收集各种不同类型的图元的方法。
4.1 参照图元
有很多方法选择各种类型的 Revit 图元,在本章我们将会讲解如何手动指定一个图元且将其参照至你的 Grasshopper 脚本文件中, 后面的章节详细的讲解更多的参照图元的方法。
4.2 以选择的方式
鼠标右击点击运算器 Graphical Element 参数,然后从 Revit 中选择你所需要的图元至 Grasshopper 脚本文件,
4.3 以图元ID号方式
从 Revit 中读取图元的ID号,然后鼠标邮件点击 Element 运算器,将读取到的ID号填入至 Manage Revit Element Collection 即可
4.4 实例
实例是放置在 Revit 中单个图像/几何图元,例如单个的墙或门,或其他类型的单一图元,作为 Revit 图元的子集, 实例会从其他的类别与类型继承一系列的参数,也可能包含仅限于当前实例特有的一些属性参数
4.5 查询筛选
Grasshopper 可以通过筛选运算器依据多种不同的属性选择特定的 Revit 图元,也可以组合多个不同的过滤器来进行一些复杂的挑选.
4.5.1 类别筛选
以选择类别的方式筛选所有的选择对象,
4.5.2 类型筛选
以选择类型的方式筛选所有的选择对象,将运算器 Built-In Categories 连接至 Element Type Picker , Type Filter , 与 Query Elements 来查询所有选择实例中的类型,下面示范如何从选择实例中筛选指定类型的窗户
4.5.3 参数值筛选
你可以使用 Parameter Filter 运算器与筛选规则 (例如 Greater Or Equal Rule 或 Equals Rule )结合使用,按照图元的参数值来筛选所需要图元,
运算器 Parameter Filter用来从所选图元中筛选指定的参数值,筛选规则是对指定参数执行类型的比较, 要注意, Revit 中的参数名与类型列表非常长。 Built-In Parameters是最好的参数筛选方式,它还会在选择器中列举出该参数的附加详细信息。
4.5.4 楼层筛选
可以使用 Level Filter 运算器以楼层的方式筛选项目图元
如果需要指定楼层来筛选图元,最好是使用 Levels Picker 运算器
4.5.5 API Class 筛选
还可以筛选 Revit API Class 名字的方式在项目中过滤图元, 这样既可以输入图元类别进行选择也可以类别字串符,
4.6 更多查询筛选工具
4.6.1 Filter Element
Filter Element 运算器会读取之前筛选的 Revit 图元,与筛选匹配图元进行对比然后返回一个是否匹配的 Ture/False 的列表。 例如一组在 Graphical Element 中预先筛选的图元,可以使用 Built-In Categories 输入至 Filter Element 中进行筛选, Filter Element 运算器将会返沪一个包含 True/False 的列表,这样可以使用 Cull Pattern 运算器对原始图元进行筛选,
4.6.2 Exclusion Filter
Exclusion Filter 运算器可以从查询结果中排除一组特定的图元,下面这个范例,示范如何从查询的所有墙体中剔除两个手动选择的墙,
4.6.3 Exclusion Type Filter
Exclude Types 运算器可以从一个列表中排除筛选某些类型,它是利用 Revit API WhereElementIsNotElementType 的方式来实现。
4.6.4 Bounding Box Filter
Bounding Box Filter 是使用几何边框匹配Revit图元的方式来进行筛选,初始的几何对象既可以来自 Rhino 也可以是 Revit, 输入参数包括:
- Bounding Box (Geometry) - 用于查询边框方块对齐世界坐标
- Union (Boolean) - 是否合并所有的目标边框方块
- Strict (Boolean) - 是否严格的包含图元,
- Tolerance (Number) - 查询容差范围
- Inverted (Boolean) - 是否需要反转查询结果
4.6.5 Intersects Brep Filter
Intersects Brep Filter 用于筛选与 NURBS Brep相交的图元
4.6.6 Intersects Element
Intersects Element Filter 用于筛选与其他图元相交的图元
4.6.7 Intersects Mesh Filter
Intersects Mesh Filter 用于筛选与Rhino网格对象相交的图元
4.6.8 Design Option Filter
Design Option Filter 用于匹配属于指定设计选项的 Revit 图元
4.6.9 Owner View Filter
Owner View Filter 用于筛选隶属于某一些指定视图的图元, 这个运算器通常与从模型返回视图选择器搭配使用,
4.6.10 Phase Status Filter
Phase Status Filter用于匹配给定阶段窗台关联的元素, 可以使用鼠标右键找到阶段与状态
4.7 组合查询筛选
4.7.1 Logical And Filter
可以使用 Logical And Filter 来合并所有的筛选工具,所有的图元都必须被筛选,
注意,可以使用放大的方式增加更多的筛选输入,
4.7.2 Logical Or Filter
使用Logical Or Filter群组多个筛选工具,图元可以从输入的任何一个筛选工具进行过滤
4.8 保存筛选或选择
4.8.1 Add Parameter Filter
Add Parameter Filter 可以Revit 模型中参建立基于 数的筛选工具,也可以当作 Grasshopper 中的参数过滤工具来使用
4.8.2 Add Selection Filter
Add Selection Filter 可以在Revit模型中创建一个选择过滤器,也可以同时在 Grasshopper 脚本文件中使用
4.9 提取实例几何
Element Geometry 可以提取实例中的几何,例如下图中示范如何将一个 Stacked Wall 实例中的几何体完全的提取, Detail Level 用来指定提取物件位于具体的楼层
4.9.1 Instance Base Curve
基于基准线(例如 Basic Walls) 创建的图元你可以使用 Element Curve 来获取或设置基准线;
4.9.2 Instance Bounding Box
通过 Grasshopper Box 运算器轻而易举的可以获取一个实例几何体的边框方块
4.9.3 Instance Bounding Geometry
当前 Bounding Geometry 运算器仅对墙体起作业,未来会扩展至更多的 Revit 类别。
很多时候回需要提取一个实例的边框几何(Bounding Geometry), 它会尽力包裹实例且会遵循实例的几何拓扑,你可以使用 Element Bounding Geometry 运算器来获取它,例如下面示范如何抽离一个 Stacked Wall 的边框几何, 请注意抽离出来的几何物件与 Stacked Wall 一样厚,
4.10 调整实例类型
使用 Element Type 运算器既可以查询一个实例的类型也可以将修改为其他类型,
4.11 放置实例类型
使用**Add Component (Location)**运算器可以将一个类型的实例放置至 Revit 模型空间,
对于需要指定依附主体(输入参数 Host)的类型,可以使用 **Add Component (Location)**运算器来实现
它会将给定的类型尽可能的靠近其依附主体,例如下图中绿色球体是给定窗户原来的实际位置,当指定墙体为窗户的依附主体时,它会将窗户放置在距离绿色球体最近的墙体上
5 Revit - 参数
在这一章我们将会讲解如何读取使用 Grasshopper 所建立的 Revit 图元的参数,
点击这里 下载本章所需 Grasshopper 脚本范例文件
5.1 检查参数
如果你需要检查某一个图元的属性,你可以使用 Inspect Element 来查看
现在请按装 Shift 键+鼠标双击 Inspect Element 运算器,这样你可以查看所有和该元素相关的参数列表,
你可以从输出端连接一些查看运算器来查看相关的属性信息, 例如Panel,然后你可以按住 Ctrl 键 +鼠标双击 Inspect Element 运算器来恢复默认显示大小,输出端有连接其他运算器的端口会被继续保留,
要检查现有参数的定义,请使用 Parameter Identity 运算器:
5.1.1 查找图元参数
要查找与一个图元相关的参数,请将图元与参数名称接入 Query Element Parameters 运算器来进行查询:
5.1.2 参数范围
参数可以被附加到图元类型或单个实例,将 Graphical Element 直接接入至 Inspect Element 运算器以检查两个实例参数,将 Element Type 运算器 链接至 Inspect Element 运算器以获取类型参数,你会发现可用参数的差异。
5.1.3 查找内置参数
可以使用 Built-In Parameters 运算器来检索 Revit 内建参数,双击标题可以搜索部分参数名称。
5.2 读取参数值
如果你需要查询特定的参数值,建议你使用 Revit Parameters 面板中的 Parameter 运算器,
继续鼠标右键点击这个运算器,然后选择你需要查询的一些参数项
运算器输出端连接 Element Parameter 来查询 这个值
也可以使用 Element Parameter 以指定参数名的方式来读取这个参数值
我们是以特定的语言来指定参数名称,因此如果利用不同语言版本的 Revit 打开这个 Grasshopper 脚本文件可能会出现中断错误
使用 Shared 参数时还可以用 UUID的作为查询输入值
5.3 设置参数值
可以使用 Element Parameter 运算器来设置一个 Revit 图元的参数值,要注意有些参数值为只读而不可以被覆盖
注意 Element Parameter 运算器仅以一个参照方式引入 Revit 图元,因此当基于这个运算器的参数值被更新时,它会把所有引入的图元运算器参数进行更新,这个操作可能不同于常规的 Grasshopper 运算器。
5.4 创建参数
创建参数的运算器位于 Grasshopper > Parameter 面板下,可以利用它再 Revit 中建立新的参数,通常流程如下:
- 首先必须定义一个参数,
- 然后增加这个参数至文档,
- 对于项目参数,需要设置附加类别和组(可选),
- 然后进行图元、类型或是全局参数设置。
参数定义可以使用 Define Parameter 运算器来创建或是直接从一个共享参数文件中读取。
一旦建立定义,可使用 Add Parameter 运算器将参数增加至项目,如果是参数范围是针对全局的,则使用 Global Parameter 运算器进行设置参数值, 请在使用前设置项目参数的额外属性。
5.4.1 新增项目参数
相对一个基础参数而言项目参数会有很多额外的属性,项目参数属于某些类别,且起参数值也因图元不同而有所不同。
通过连接参数名至 Define Parameter 运算器就可以来创建一个新的参数,然后使用 Built-In Parameter Types 与 Built-In Parameter Groups 来设置参数类型与输入群组, Define Parameter 运算器将会建立一个新的参数定义,这个定义可以连接至 Add Parameter 运算器在 Revit 中创建参数,你也可以使用 Parameter Identity 来检查你所创的得参数。
提醒:当前 Revit API 并不支持直接创建项目参数,因此需要利用 Grasshopper 的共享项目参数来创建项目参数
下面是共享参数中的参数配置:
可以后续将其参数名连接至 Element Parameter 运算器来读取或设置其参数值,也可以使用 Inspect Element 运算器与 Parameter Identity 运算器来检查参数值:
5.5 共享参数文件
使用 Shared Parameters 运算器来读取共享参数文件,将会返回当前文件的路径、群组与参数定义等。这个文件仅仅包含定义内容,所以必须将参数添加至当前项目中才能后续设置参数值,使用 Add Parameter 来添加参数且使用 Element Parameter 来设置图元的参数值。
5.6 全局参数
如果要查询当前项目的全局参数必须使用 Query Parameters 运算器, Global Parameter 运算器可以帮助获取全局参数值:
可以使用通用的 创建参数 来为一个项目建立全局参数。
5.7 参数公式
使用尺寸与参数中的公式来驱动与控制模型中的参数内容, Parameter Formula 运算器可以使用 Valid Formula Syntax and Abbreviations 中涵盖的语法来创建参数公式。
6 Revit - 类型&族
在与 Revit 或 Revit API 打交道时我们时常需要处理 Revit 的类型 与自定义族 , 在这个章节将向你展示如何通过不同的 Grasshopper 运算器来查询与创建不同的类型 与族 ,
注意:建模过程中要更多的关注被建模的数据而不是几何
6.1 查询类型
如果你想统计一个 Revit 族中类型的情况,可以组合一组类别拾取运算器,例如 Built-In Categories + Category Filter component, + Query Type 等运算器:
还可以给 Query Types 运算器增加更多筛选条件:
6.1.1 查询类型信息
使用 Type Identity 运算器来查询 Revit 类型信息,但要注意族名称 参数,对于系统类型 与自定义族 名称下的自定义类型查询会返回 系统族名称 ,
6.2 访问一个类型的族
当查询 一个 Revit 模型中的自定义类型时,我们可以找到包含每种类型逻辑的自定义族定义,使用 Family Types 运算器来获取该组件中的每种类型的系列,
注意 ,如果被查询的族类型没有关联自定义族定义, Family Types 运算器会返回一个 Null 值得, 例如以 Duct Systems 为例, 它是一个系统类型且没有关联自定义族定义,所以得到一个 Null 的查询值。
6.3 选择特定类型
Built-In Categories 可以选择一个特定的模型类别,例如 墙(Walls),
将其连接至 Element Type Picker 运算器,然后从族中选择一个指定的类型,
6.4 确定特定类型
当启动构建工具 (例如放置一扇门),Revit 会自动选择上一次使用的指定类别(例如使用放置门工具所选择的门),称之为该类别的默认类型 ,这对于使用 API 来创建图元很有帮助, 使用 Default Type 运算器来查看选定类别的默认类型,
这个运算器在当前这个例子中会返回默认的 DB.FamilySymbol
6.4 修改类型
一旦你筛选到需要的类型,你就可以查询其相关参数且可以修改参数(我们会再后续的章节详细介绍如何编辑一个图元的参数),例如使用 ParameterSet 运算器来修改图元类型,
6.5 提取类别几何
一旦你筛选到需要的类型,你就可以使用 Element Geometry 来提取图元的几何图形,运算器 Detail Level 很容易为参数输入正确的 LOD值
Element Geometry Element Geometry 运算器也会自动的在 Rhino 视窗中预览几何图形
6.5 按照类别提取几何图形
从族实例内按照类别来提取几何图形是个比较常见的操作,这里分享一个专用的工具 Element Geometry By SubCategory 运算器, 还可以利用它抓取到族内子类别的定义信息,范例如下图所示,
这里下载 Element Geometry By SubCategory 运算器 ,下载后请放置于 Grasshopper 的 User Objects 文件夹下 ( 可以通过 Revit > Custom Panel 找到)
6.6 创建新的类型
你也可以基于现有的类型来建立新的类型,例如利用 Duplicate Type 运算器复制一个现有的类型,然后赋予新的名字,调整相关属性值,
提醒: Revit 项目浏览器会在族下面显示新的类型
6.7 移除类型
如果需要移除类型请使用 Delete Element 运算器, 请注意被删除的类型也会连同其相关实例一起被删除,如果你不希望实例也被删除,请在删除之前找到这些实例,然后修改为其他类型,
6.8 导入族
你可以使用 Load Component Family 运算器导入一个新的族文件至模型
提醒:Revit 浏览器现在会在族下面列出新的族
6.9 保存族
使用 Save Component Family 运算器将一个族保存至外部文件
6.10 新建族
在当前的 Rhino.Inside.Revit 中,可以使用 New Component Family 运算器建立新的 Revit 族或是将新的几何物件加入至某个选定的族中,请注意,运算器需要赋予正确的模板文件,
提醒:Revit 浏览器现在会在族下面列出新的族
你也可以继续给 New Component Family 运算器接入 Generic Model 模板,且使用 Built-In Categories 运算器手动设置类别,
提醒:可以利用位于 Revit > Family 面板下的一些运算器来帮助我们建立用于Revit 族的几何
- Component Family Void
- Component Family Curve
- Component Family Opening
- Component Family Void
上面这些运算器可以设置构成新的族的图元的可见性、子类别与材质,
如上面的范例,你可以使用 Construct Visibility 运算器来控制待创建几何的可见性,这个运算器提供了所有原生控制Revit族几何物件可见性/图形编辑的选项
6.11 编辑族
你也可以使用 New Component Family 运算器类编辑当前的族,只需要接入合适的模板与族名称、新的几何,而且 New Component Family 运算器会自动找到当前的族,然后代替相关内容且重新导入族只 Revit 模型中,请注意,OverrideFamily 需要设置为 True , OverrideParameters 设置为根据需要覆盖族参数
6.12 建立新的族模板
Revit 附带一系列 Revit 族模板 (.RFT) 文件。这些包含为特定类别创建可载入族所需的基本默认参数。有趣的是,许多最受欢迎的类别都没有为它们构建的模板。这些类别的示例包括墙壁、屋顶、地板、窗户、HardScape 等。按照以下步骤,可以在这些常用的类别中创建族模板并创建可载入族。此电子表格中列出了支持客户 RFT 文件的默认模板和类别列表。
离线视频下载 链接: 百度网盘 请输入提取码
综上所述,创建一个新的族模板步骤如下:
- 利用所需的类别创建一个就地运算器,例如楼梯,
- 绘制一个对象,
- 群组这些对象,
- 右键点击 Group 且 Save Group,
- 保存文件为 RFA,
- 开启 FRA 文件且删除里面的所有物件,
- 保存文件,
- 在文件浏览器中重新命名这个 RFA 文件为 RFT 文件,
- 在新的运算器族中使用这个 RFT 文件来建立一个新的族。
7 Revit - 类别
类别 是最高级别的组织,这些类别都内置于 Revit 中,根据各自不同的功能松散的组织各自的组件。
一个 Revit 模型中通常都会存在多组不同的类别:
- 模型类别,例如墙、门、楼板与屋顶等。
- 分析类别,例如表面分析与结构载荷等。
- 注解类别,例如标签、尺寸等。
- 内部类比,例如各种标签。
模型类别可以包含的图元各不相同, 开发和了解常用类别的使用方式对于使用 Revit 很重要,类别可能包含也可能不包含:
- Directshapes
- 可载入族, 例如家具、通用模型与场地等,
- 系统族/类型,例如墙体、门、楼板与屋顶等,
详情请浏览 RhinoToRevit 章节来了解如何利用 Rhino 与 Grasshopper 来添加图元。
7.1 查询类别
有两个主要的方法来查询一个文档中的类别
使用 Query Categories 运算器来查询一个当前项目文档中的主要类别与子类别,还可以利用 Category Types 运算器来进一步的过滤与筛选某些特定的类型或使用一个布尔开关来选择主要的类别或子类别,
第二个方法是使用 Built-In Categories 运算器,这个选取器会列出每个 Revit 文档中所有的主要类别与子类别,可以先选择一个所需要的类别然后通过 Category Identity 运算器来输出类别标识的部分,
提醒: 类别选择器支持搜索,双击运算器标题然后在框内输入准备查询类别的名称,如果名称有效则会列出所有与之匹配的类别。支持多模式进行查询,甚至是表达式。
7.2 访问类别
Category Identity 运算器可以用来建立各种参数类型(模型、注解与分析)名称,包括主类别于子类别。
可以创建属于某个类别的参数列表,以帮助建立用于创建计划或将其设置于某个适当的列表中。例如下面使用 Built-In Categories 来选择一个门的类别,然后利用 Category Parameters 来查找合格项目中所有门的附加参数,
通过 Category Style 运算器来获取与设置一个类别的图形类型。
7.3 扩展类别
主要类别都是被内置且无法被修改,尽管可以在大多数类别中添加子类别以进一步组织和重构控制图元。
7.4 子类别
利用 Add SubCategory 可以增加一个子类别,如果子类别已经存在这个运算器会间的返回当前已经存在的子类别
使用 Category SubCategories 运算器来创建一组指定类别的子类别,
使用 Element Subcategory + v1.8 运算器来获取-设置图元子类别
8 Revit - 文档与连接
这一章我们将会介绍如何利用 Revit 中的 Grasshopper 来与 Revit 文档与链接配合作业
8.1 查询打开的文档
利用 Open Documents 运算器来查看已经在 Revit 中打开的文档
Active Document 运算器总会参照当前工作文档内容,这样你切换不同的 Revit 文档时它也会及时的更新,
提醒:文档运算器底部标签会显示目标文档名称
使用 Document Identity 可以从当前执行文档中获取身份信息
8.2 Document-Aware 运算器
Document-Aware 运算器可以工作与当前文档与指定文档,它还有隐藏的输入选项 Document
可以放到运算器后增加参数
一旦增加好参数,就可以将任何的 Revit 文档作为其输入选项
也可以配合其他的运算器查询多个文档,例如这里查询多个墙体
8.3 文档属性
使用 Document File 运算器 来查看给定文档的属性:
使用 Document Worksharing 运算器来查看给定文档的工作共享属性:
使用 Query Warnings + v1.10 来获取文档中累积的持续(可审查)警告生成的失败消息列表
使用 Document Tolerances + v1.9 运算器来读取 Revit 文档公差.
使用 Revit Version + v1.9 来获取 Revit 版本号
使用 Revit User + v1.9 来获取 Revit 用户属性
使用 **来获取默认文件路径
8.4 保存文档
使用 Save Document 运算器将给定的文档另存为一个输出文档,输出文档可以给定一个路径字符,请注意给定路径中要包含正确的文件扩展名:
8.5 查询链接的文档
API
当Revit导入一个模型的同时也会导入所有的链接模型至内存,每一个Revit模型都经由一个DB.Document实例来表达, 因为DB.Document.IsLinked
将会显示是否导入其他的链接文档, Revit不能在同一个场景同时开启两个相同的实例, 这是不导入主模型的情况下是无法编辑链接模型的主要原因.
视频下载链接: 百度网盘 请输入提取码
可以使用 Query Revit Links 运算器来查询当前文档(或给定文档)的所有链接文档信息,
8.6 查询链接的图元
使用 Query Elements 运算器可以直接查询给定文档的图元信息, 也可以输入一个连接文档,
当使用 Query Elements 在链接模型中的图元时,将会以它们在链接模型中的基本方向导入,且连接图元必须定位至主体项目中链接实例的位置。
8.7 链接几何方向
导入文件的图形图元的位置和其在原项目中的位置相同,有必要将这些几何定位至链接实例中,例如使用 Orient 运算器进行定位
9 Revit - BIM360 Cloud
Rhino 与 Grasshopper 文件都可以整合至 Autodesk BIM360® 中,作为项目的一部分,所有团队成员都可以使用最新的文件,所有文件都支持 Autodesk BIM360® 所提供的备份、版本控制与文件锁定功能。
使用 BIM360 File Locker可以:
- 如果当前文件被打开或被其他人标记为锁定,这个文件会被锁定;
- 会显示锁定状态警报;
- 保存文件后会与 Autodesk BIM360® 同步;
- 同时支持 Rhino 与 Grasshopper 文件;
- 插件既可以既可以在 Rhino.Inside.Revit®内运行,也可以在 Rhino 内运行;
9.1 安装 BIM360Locker 插件
- 开启 Rhino7 ,然后再指令行内敲入 PackageManager 指令回车;
- 弹出搜索 BIM360 ;
- 点击 安装 按钮,然后按照提示重启 Rhino7
更多关于该插件的安装、设置与调试请查看下面的视频
下载:百度网盘 请输入提取码 BIM3
BIM360 File Locker是由 Rhino开发工程师 Ehsan Iran-Nejad 开发一个开源项目
10 Revit To Rhino
这里将讨论如何把 Rhino 数据无损导入Revit 中。
如何借助 Rhino.Inside.Revit 将 Revit 的图元无损导入至 Rhino ? 通常需要下面三个步骤
- 选择准备输出的 Revit 图元;
- 提取每个Revit 图元的几何、类别名称或其他需要的信息;
- 烘焙几何与信息至Rhino,这里提供一个简单的 Python 烘焙工具 (点击下载👈 )来将烘焙物件放置至 Rhino的图层,Revit 种的每个类别都会放置在同一个Rhino图层,
Element Geometry 运算器 有一个隐藏的输出选项 Category 非常有用,放大运算器且点击 Geometry 输出项下面的 + 号,就可以调出 Category 输出项。
有很多第三方的插件也可以将物件信息烘焙至 Rhino,包括图层、物件名称、颜色、材质或是用户数据(关键值/数值)信息,常用的有 Human, LunchBox 与 Elefront 等。
10.1 选择需要输出的图元
Grasshopper 提供多种方法从 Revit 中选择物件,主要包括下面三个方法;
- 使用视图过滤工具引入可见内容,这可能是最简单的方法。
- 大多数情况下可以利用类别过滤工具,虽然使用稍稍有一点复杂,因为类别比较广泛。
- 直接在 Revit 中选择图元也是一个很简单直接的方法。
提醒 关于上面截图的注意事项
- 视图名称 To Rhino 是已经在当前项目中保存过的3D视图。
- Query Views**返回视图中的图元,作为 Selectable In View Filter 运算器的输入。
- 使用 QuareyElements 来过滤,L(Limite) 输入端通过放到运算器然后点击 - 号隐藏了这个输入项。
- 选择图元后,其他的一些运算器设置请参考前面的截图。
10.2 过滤筛选
推荐使用 Category Filter 来进行筛选,这样可以快速的获取需要的内容,但要注意 Revit 的类别非常多,所以通常使用 Category Filter都会搭配一些其他的过滤器来选择具体的图元,例如 Query Design Options 或 Phase Status Filter用来限制选择范围。
另外在尝试获取一些不同类别时,所需要的类别列表就会更丰富,也会造成列表非常庞大…
10.3 选择图元
获取 Revit 图元最简单的方法时使用 Graphical Element + Element Geometry ,这样将仅出输出所选择的图元
提醒 , 类似 房间、面积等 Revit 空间图元也可以在导出且烘焙至 Rhino, 会在后续的 Revit空间图元 章节详细介绍。 Revit 中很多图元会建立分析图元,也可以导出至 Rhino ,在后续的分析模型 章节会详细介绍。
11 Rhino to Revit
如何在 Rhino 与 Revit 之间交互数据?这应该是很多建筑师与结构工程师的痛点,现在利用 Rhino.Inside.Revit 可以轻松数据无缝对接,这一篇将介绍如何把 Rhino 的数据无缝导入 Revit.
11.1 常用途径
Rhino.Inside.Revit 可以把 Rhino的造型与表单编码为 Revit 图元且进行分类,请注意仅将几何物件简单、快速的转入至Revit可能不是最好的方法,要确定 Revit 中形体的最终目标,可以提高最终Revit 数据结构的质量与项目效率。
Revit 数据模型是基于(族)分类系统,侦测最佳的分类与子分类图元将会被正确的绘制且赋予正确属性, 请注意我们这里每一种模式并不都适合所有的 Revit 类别。
这里将介绍三种主要的方式来分类与转移Rhino的几何图形移至 Revit, 越靠后的方式越会增加 BIM 模型的集成度,但也同时需要更多的提前规划,这三种模式分别为:
- DirectShapes , 这是最快转换模型的方法且不需要过多的组织,比较适合于竞赛或是方案设计阶段的演示,但不推荐用于设计方案深化与后期阶段
- 可载入族 , 适合于模型中的独立图元或是由独立制造商订购与加工的图元,作为一个族的部分,这些对象既可以是一个大型项目图形的一部分,也可以额外拥有自己的图形
- 系统族 ,这是建立最终 Revit 图元的最好办法,Revit原生图元能最好的匹配 Revit 的工作环境,这些原生图元可以脱离 Rhino.Inside.Revit 进行编辑。这个模式也会存在一些限制,不是所有几何物件都可以建立为 Revit 原生图元
下图是Rhino模型使用 DirectShapes 模式快速在 Revit 中构建图形的一个竞赛模型,
通过一个简单的 Grasshopper 脚本,既可以按照高度对物件进行归类
使用类别控制的方式来控制的平面图
11.2 DirectShapes
DirectShapes 是将Rhino模型最直接、最简单导入至Revit的方法,它也是建立通用的 Revit 图元,可以置于Revit模型中进行分类的非参数化图元,请注意它们都是非参数化的图元,Revit 并不知道它是如何建立,因此它也无法与其他原生图元进行交互。例如 Revit 原生的墙体无法延伸至 DirectShapes转换的图元。
DirectShapes 适用于下面的这些场合:
- 用于比赛或早期方案设计阶段的快速模型;
- 设计阶段还在调整、待确定的占位建筑构件,例如虽然地板已经完成,但Grasshopper中的外墙部分还在继续调整,这样使用 DirectShape 作为里面与其他设计阶段的图纸的占位建筑构件会更好;
- 一个无法使用 Revit 原生族进行建模且完全定制零件或部件。
视频下载链接: 百度网盘 请输入提取码 提取码: x4ne
DirectShapes 可以放置在任何级别的类别,可以通过对象样式来控制图形与材料:
为了在同一个类别的图元之间进行额外的图形控制,可以基于规则的视图筛选来自定义参数值,DirectShapes 不能直接放于子类别,但可以输入的方式将源几何导入族内且可以进一步进行子类别归纳(后面的章节会详细介绍):
除了可以使用 DirectShapes将Rhino物件导入Reivt之外,还可以创建可重复多次插入的 DirectShapes类型:
提醒 :由 Rhino 中顺滑NURBS曲面所创建DirectShapes 可以以顺滑的实体导入或由 Revit 转换为一个网格,如果NURBS被转换为网格,则说明 Revit 无法接受NURBS,由很多原因造成NURBS被 Revit 拒绝,但通常这些问题都可以在 Rhino 中修复。
11.3 包含子类别的可载入族
Rhino 对象以表单的形式插入Revit的一个族,且允许作为一个对象插入多个实例也可以指派子类别,你可以使用子类别的方式来控制其顶级类别中某个族部分的可见性和图形。
将 Rhino 几何包裹至可载入族有如下的几个优点:
- 可以多次插入重复的对象,这样可以正确的统筹与统计表单;
- 可载入族内的表单可以按需被 Revit 编辑;
- 放置在 族/类型中的表单可以放置再子类别中,便于进一步的图形控制与调度。
例如这里有一个范例,在Rhino中完成的一个走廊天蓬,这个结构件将由专业的建造商来承建。小的地基会在现场浇灌,其他的人行道将在上面组装。因此地基是族的一部分,而结构的其他部分是另外一个族的部分。
可以自动转换的方式将 Rhino的图层映射为 Revit 中的子类别, 在Revit 中可以以子类别与视图的方式来控制图层与材料:
关于如何创建子类别,请参考下面的视频教学
离线视频链接: 百度网盘 请输入提取码 提取码: 46xw
把对象送至 Family Creator 运算器之前请使用 Subcategory 运算器为其分配一个子类别:
如果指定的子类别并不存在,Subcategory 运算器会建立一个的子类别,子类别的属性可以在物件样式对话框中编辑:
子类别也可以与基于规则的图形挑选工具一起使用以实现额外的图形控制
11.4 使用 Revit 内建系统族
使用内置的 Revit 系统族(例如墙、地板、天花板和屋顶)可能需要更费精力,但它能提供很多额外的帮助,原生图元的优点有很多,包括:
- 能更好的集成项目的BIM模式,包括最大程度的图形控制、动态内建参数值,能像原生图元一样访问所有常见项目的标准BIM参数;
- 图元可以脱离 Rhino.Inside.Revit 进行编辑,也可以对其附加其他的尺寸,这些图元也可以托管其他的图元;
- 便于与其他非 Rhino.Inside.Revit 用户交流,他们并不会意识到这些图元是基于 Rhino.Inside.Revit 所建立。
这里提供一个视频教学,讲解如何利用 Rhino.Inside.Revit 来建立原生的楼层、地面、立柱与幕墙面板
链接: 百度网盘 请输入提取码 提取码: k362
后面的章节将会详细的讲解如何使用 Revit 图元的每个类别