八、元素几何信息的获取(2)

  • 空间

    几何空间对象,在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将族分为系统族、内建族、标准构件族。

    1. 系统族:系统族是在 Autodesk Revit 中预定义的族,包含基本建筑构件,例如墙、窗和门。例如:基本墙系统族包含定义内墙、外墙、基础墙、常规墙和隔断墙样式的墙类型;可以复制和修改现有系统族,但不能创建新系统族;可以通过指定新参数定义新的族类型。(注意带有基本两个字)
    2. **标准构件族:**在默认情况下,在项目样板中载入标准构件族,但更多标准构件族存储在构件库中。使用族编辑器创建和修改构件。可以复制和修改现有构件族, 也可以根据各种族样板创建新的构件族。族样板可以是基于主体的样板, 也可以是独立的样板。基于主体的族包括需要主体的构件。例如:以墙族为主体的门族,独立族包括柱、树和家具;族样板有助于创建和操作构件族。标准构件族可以位于项目环境外,且具有 .rfa 扩展名,可以将它们载入项目,从一个项目传递到另一个项目,而且如果需要还可以从项目文件保存到您的库中。
    3. **内建族:**内建族可以是特定项目中的模型构件,也可以是注释构件。只能在当前项目中创建内建族,因此它们仅可用于该项目特定的对象,例如:自定义墙的处理。创建内建族时,可以选择类别,且您使用的类别将决定构件在项目中的外观和显示控制。
  • 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;
                        
                }


            }
        }
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值