-
空间
几何空间对象,在revit中用GeometryObject(几何对象)来表示。这是一套完整的几何库。点、线、面、体的基类都是GeometryObject
对应的点、线、面、体:
点: Point
线: Curve、 Edge、PolyLine、Profile
面: Face、Mesh
体: Solid
GeometryElement 和 GeometryInstance 是GeometryObject的集合。
GeometryObject也是这些类的基类。 -
GeometryElement(几何元素)
此类包含从元素的参数化描述生成的几何图元。 可以使用 IEnumerable 的功能直接从此对象中获取成员几何图元。(实际上几何元素不仅包括几何实例还包括其他东西,比如有的还包括Solid实体)
- GeometryInstance(几何实例)
GeometryInstance 表示 Revit 存储在默认配置中的一组几何图形,然后根据元素的属性转换到正确的位置。(是否可以这样理解,几何实例就是族模型中的几何图形,它是个局部坐标系,我们画实体的时候,就是通过这个几何图形在三维空间中,选取世界坐标系的基点(这里要有一个坐标系的转换),生成的(族实例里面包含很多信息,几何信息,材质信息等等))
几何实例(GeometryInstance)也提供了一个Transform属性,表示了从类型的局部坐标系到实例的世界坐标系的坐标变换。用户有时候需要使用Transform属性对取到的几何数据进行坐标变换。
遇到 GeometryInstances 的最常见情况是在 Family 实例中。 Revit 使用 GeometryInstances 允许它为给定族存储几何图形的单个副本,并在多个实例中重复使用它。
请注意,并非所有 Family 实例都将包含 GeometryInstances。当 Revit 需要为给定实例制作族几何图形的唯一副本时(由于局部连接、相交和与实例放置相关的其他因素的影响),不会遇到 GeometryInstance;相反,将在层次结构的顶层(点、线、面、体)找到实体几何体。(这句话的意思就是,不是所有的族实例都有几何实例,几何实例的本质就是便于复用,如果族实例是一个复杂构件,那么它直接就是一个实体)
几何实例(GeometryInstance)也提供了 GetInstanceGeometry()和GetSymbolGeometry()方法来分别获取其族实例的几何元素和族模型的几何元素。 这些方法返回另一个 Autodesk.Revit.DB.GeometryElement,可以像第一级返回一样对其进行解析。(族模型的几何元素与族实例的几何元素有啥子区别??)
-
revit中族的分类
Revit将族分为系统族、内建族、标准构件族。
- 系统族:系统族是在 Autodesk Revit 中预定义的族,包含基本建筑构件,例如墙、窗和门。例如:基本墙系统族包含定义内墙、外墙、基础墙、常规墙和隔断墙样式的墙类型;可以复制和修改现有系统族,但不能创建新系统族;可以通过指定新参数定义新的族类型。(注意带有基本两个字)
- **标准构件族:**在默认情况下,在项目样板中载入标准构件族,但更多标准构件族存储在构件库中。使用族编辑器创建和修改构件。可以复制和修改现有构件族, 也可以根据各种族样板创建新的构件族。族样板可以是基于主体的样板, 也可以是独立的样板。基于主体的族包括需要主体的构件。例如:以墙族为主体的门族,独立族包括柱、树和家具;族样板有助于创建和操作构件族。标准构件族可以位于项目环境外,且具有 .rfa 扩展名,可以将它们载入项目,从一个项目传递到另一个项目,而且如果需要还可以从项目文件保存到您的库中。
- **内建族:**内建族可以是特定项目中的模型构件,也可以是注释构件。只能在当前项目中创建内建族,因此它们仅可用于该项目特定的对象,例如:自定义墙的处理。创建内建族时,可以选择类别,且您使用的类别将决定构件在项目中的外观和显示控制。
-
C#扩展方法和递归函数
扩展方法这个类必须是静态的。函数本身也必须是静态的。而且这个函数的第一个参数必须是要扩展的这个类,并且用this修饰。
Options:可选择参数(用来定义分析几何生成模型的用户参数选项,比如是否计算几何引用、模型的详细程度(粗略、中等、精细)等等)
using Autodesk.Revit.DB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloRevit
{
public static class GeometryObjectLearn
{
//给Element这个类添加一个GetGeometryObjects扩展方法
public static List<GeometryObject> GetGeometryObjects(this Element element, Options options = default(Options))
{
//用一个变量results来接收获取到的GeometryObject(几何对象)
var results = new List<GeometryObject>();
//检查options是否为空值,??表示如果前面的为空,则让其等于后面的,如果不为空,则将其赋值给后面的
options = options ?? new Options();
//获取几何元素GeometryElement
var geometry = element.get_Geometry(options);
RecourseObject(geometry,ref results);
return results;
}
//递归函数
private static void RecourseObject(this GeometryElement geometryElement,ref List<GeometryObject> geometryObjects)
{
if (geometryElement == null) return;
//GeometryElement实现的是IEnumerable接口,写一个枚举器
var enumerator = geometryElement.GetEnumerator();
while (enumerator.MoveNext()) //将枚举数推进到集合里下一个元素,放在while里面就表示,循环能否继续
{
//获取集合中位于枚举数当前位置的元素
var current = enumerator.Current;
//对当前元素进行条件判断
switch (current)
{
case GeometryInstance instance: //判断,如果它是一个几何实例
instance.SymbolGeometry.RecourseObject(ref geometryObjects); //那么,将几何实例对应的族模型中的几何元素进行枚举迭代
break;
case GeometryElement geometryElement1: //判断,如果它是一个几何元素
geometryElement1.RecourseObject(ref geometryObjects); //那么,将在它自身包含的几何元素里面枚举迭代寻找
break;
case Solid solid: //判断,如果它是一个实体
if (solid.Faces.Size == 0 || solid.Edges.Size == 0) //排除实体中面和边都为0的情况
continue;
geometryObjects.Add(solid);
break;
default: //默认的其他情况
geometryObjects.Add(current);
break;
}
}
}
}
}