16. Revit API: Family、FamilySymbol、FamilyInstance

前言

前面写着一直絮絮叨叨,感觉不好。想找些表情包来,写得好玩点,但找不到合适的,或者说耗时费力又不满意,而自个儿又做不来表情包,就算了。

其次呢,之前会把部分类成员给抄表列出来,写全了又长又啰嗦,自己都不愿看,挑着写又可能会落下点有用的,所以就不列了。

那么,就闲话少说,直接讲。


一、这三个是什么

Family(族),直接派生自Element,在Revit中,绝大部分图元都是族。墙、梁、柱等模型是族,长度、角度、直径等图纸标注也是族。当然也有不是族的,比如DirectShape,就单纯的只是模型。
按照编辑形式,族可分为系统族、内建族、可载入族3种。由于我对内建组不够了解,就不展开了,可自行去查阅。

FamilySymbol(族类型),是族的一部分。比如一扇门,可以通过调整参数改变其宽、高、门把手的位置。但只有几种规格的门是实际用到的,这样就可以预设一些参数。这种预设好的,就是族类型。一个族可以有很多种类型。
在这里插入图片描述

FamilyInstance(族实例),简单理解,就是族的实例。
但是呢,族实例这个类,特指可载入族(用户自己创建的族,体现为.rfa格式的文件)的实例。系统族的实例,就是WallCloumn这类由Revit内部定义与实现好的族。


二、它们如何获取

泛指的族实例的获取,可按照之前讲过的《Filter(过滤器)》进行。

族名称的获取,可以参照另一篇Revit获取元素的族名,或者直接采用以下代码。

// 扩展方法
public static string GetFamilyName(this Element element)
{
    Parameter parameter = element.GetParameter(BuiltInParameter.ELEM_FAMILY_PARAM); // GetParameter也是扩展方法,自带的返回是一个List
    string familyName = parameter.AsValueString(); 
    return familyName;
}

族/族类型的获取,就要分情况了。族类型是绑定在族上的,所以获取到族,自然就可以拿到族类型了。

2.1. 可载入族-族与类型的获取

上面介绍到,FamilyInstance类特指可载入族的实例,同样的,Family类特指可载入族。FamilySymbol例外,系统组和可载入族都有。
因此,

第一种方式,便是直接使用类过滤器,过滤Family类
这种方式通常用于族的创建,比如我们要批量生成灯具,就可以通过这种方式检索到项目种已载入的灯族。

第二种方式,从FamilyInstance上拿到族。
族实例上,自然是包含了族信息的,这很合理,很自然就能想到。
但也有不自然的时候,等讲到Parameter的时候再细说。

从属性上获取

// ① 从属性种获取
var familySymbol = familyInstance.Symbol;
var family = familySymbol.Family;

需要注意的是,族实例上的名称,是类型名,而不是族名。这也是上面写获取元素族名方法的原因。

用方法获取。
这是通用的方法,无论是可载入族,或者是系统族,都可以使用,在下面 2.2 讲。

2.2. 系统族-族与类型的获取

我们注意到,Element上有俩方法:

  • GetTypeId():获取当前元素类型的ID,无类型则返回不可用ID。
  • GetValidTypes():获取当前元素的所有类型的ID,无则返回空集合。

看,在Element那篇,就没有讲这俩方法。

// ② 用方法获取
 var typeID = element.GetTypeId();
 var familySymbol = document.GetElement(typeID) as FamilySymbol;

至于系统族的获取,那就直接过滤呗。要墙就过滤Wall,要楼梯就过滤Stairs


三、作用、使用

从使用Revit的角度,族的作用就是让用户能够简单轻松的操作图元。而开发上呢,这几个类的作用就是让开发者能够对族、族实例进行调整,进行使用。

3.1. 族的载入与交互放置

使用交互的方式载入族,可以直接讲文件拖到Revit中。

而开发呢,则需要使用载入方法。

族的载入方法,在Document

// 载入族
bool loaded = document.LoadFamily(path);
// 其它重载
// public bool LoadFamily(string path,IFamilyLoadOptions familyLoadOptions,...);

这种直接载入的方式是不妥的,当项目中已经存在了同名族时,系统会进行提示。

Revit中,族不可同名。可载入族的名称,就是该族的文件名。

我们能不能默认对同名族进行替换呢?当然是可以的,这时需要实现IFamilyLoadOptions接口,并使用对应的LoadFamily方法。

// 加载行为
class FamilpathyLoadOptions_Overwrite : IFamilyLoadOptions
{
    bool IFamilyLoadOptions.OnFamilyFound(bool familyInUse, out bool overwriteParameterValues)
    {
        overwriteParameterValues = true;  // 覆盖
        return true;
    }
    bool IFamilyLoadOptions.OnSharedFamilyFound(Family sharedFamily, bool familyInUse, out FamilySource source, out bool overwriteParameterValues)
    {
        source = FamilySource.Project;
        overwriteParameterValues = true;
        return true;
    }
};

现在族已经载入了,那么放置呢?

UIDocument上,有以下方法,这样就可以交互式放置,点哪儿方哪儿。

uiDoc.PromptForFamilyInstancePlacement(familySymbol);

3.2. 族实例的创建

族的交互放置方式,一般是在开发族库类插件时用到。

而在要求批量生成的功能中,则需要使用代码来创建,也就是前面的随笔中多次提到的Creation

var creation = document.Create;  // 获取Creation实例
var instance = creation.NewFamilyInstance(setPoint, symbol, Autodesk.Revit.DB.Structure.StructuralType.NonStructural);

需要注意的是,族实例的创建方法,足足有12个重载。上面只是按照位置放置的方法,具体是需要自己去看看。

在这里插入图片描述

3.3. 族参数的设置

Revit族是可以由参数控制的,比如有一个门的族,可以通过设置其宽、高参数来改变规格。

流程:① 拿到族实例,② 拿到指定参数,③ 设置参数值。

这里涉及到Parameter了,简单讲一下使用。

[Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
internal class FamilyInstanceCommand : IExternalCommand
{
    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        UIDocument uiDoc = commandData.Application.ActiveUIDocument;
        Document document = uiDoc.Document;

        Reference reference = uiDoc.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element);
        Element element = document.GetElement(reference);

        //ElementId typeID = element.GetTypeId();
        //FamilySymbol familySymbol = document.GetElement(typeID) as FamilySymbol;
        //TaskDialog.Show("Family", $"Family: {familySymbol.Name}");

        // 获取指定参数
        Parameter width = element.FindParameter("宽度");  // Nice3Points.Revit.Extensions
        Parameter height = element.FindParameter("高度");

        if (width == null || height == null)
        {
            TaskDialog.Show("Family Instance", "No width or height parameter found.");
            return Result.Failed;
        }

        // 修改参数值
        using (Transaction transaction = new Transaction(document))
        {
            transaction.Start("Change Family Instance Parameters");

            width.Set(1500d.FromMillimeters());  // Nice3Points.Revit.Extensions
            height.Set(2100d.FromMillimeters());

            transaction.Commit();
        }

        return Result.Succeeded;
    }
}

代码中有两处Nice3Points.Revit.Extensions的注释,这是一个三方库,提供了一些扩展方法。

第一处是找到参数,Revit本身也有查找参数查找参数方法,但返回的是列表。

第二处是单位转换,讲毫米转为Revit内部单位(英尺)。Revit也有单位转换相关的工具类UnitUtils

提示,可以使用插件RevitLookUp,方便查看元素的参数。

在这里插入图片描述

四、一些可能用到的东西

Family、FamilySymbol上的大部分属性方法继承自Element,而FamilyInsyance上,就有比较多属于自己的东西了。

这里还是看一下类成员。

  1. 变换(Transform)相关

    带有翻转、镜像、等含义的。
    如属性上的 CanFlipFacing、FacingFlipped、FacingOrientation、Mirrored…
    方法上的 flipFacing、flipHand,继承来的GetTransform。
    对于上述类成员的作用,请查看Revit Transform和镜像(翻转)问题。

  2. 几何(Geometry)相关

    带有Geometry、Profile之类字样的,多少与图元的几何有关。
    几何方面的,放到后面讲。

  3. 剪切相关

    注意到有数个带有Coping资源的方法,但其含义我不够了解。
    至于剪切,也放到后面讲。

  4. 结构相关


总结

这篇,讲了的与族相关的3个类,讲了族的获取,载入,创建和参数修改。

又提到了一些没有展开的东西,有 CreationParameterUnitTransformGeoemtryCut等。

既然Creation已经提了好多次了,那么就下一篇写吧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/790455.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

昇思25天学习打卡营第15天|基于 MindSpore 实现 BERT 对话情绪识别

文章目录 昇思MindSpore应用实践1、基于 MindSpore 实现 BERT 对话情绪识别BERT 模型简介数据集数据加载和数据预处理 2、模型训练模型验证 3、模型推理 Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 1、基于 MindSpore 实现 BERT…

FOLANNIC FD31 UPS工作原理介绍

1.1简介 FOLANNIC FD31系列UPS系工业级电厂型不间断电源,是为重要负载提供不受电网干扰、稳压、稳频的电力供应的电源设备,在市电掉电后,UPS可给负载继续提供一段时间供电,此系列UPS采用带输出隔离变压器的高频双变换结…

回收站删除了是不是彻底删除了 回收站删除了怎么找回 回收站删除了还能找回来吗

电脑删除的数据文件一般不会直接被彻底删除掉,而是会暂存在回收站中,这样设计主要是为了防止误删除等操作,如果不小心删除了很重要的文件,只需要在回收站对文件进行还原即可。为了让大家更了解回收站,下面给大家详细讲…

JavaWeb-js(4)

js事件 在前端页面中,js程序大多数是由事件来驱动的,当触发某些事件的时候,可以使用js负责响应。 js事件由三部分组成: 事件源——》指的是被触发的对象; 事件类型——》如何触发的事件,如:鼠标单击、双击、键盘操作等;…

【题目/算法训练】:单调队列单调栈

🚀 前言: 【算法】单调队列&&单调栈 可以在看完这篇文章后,再来写下面的题目 一、绝对差不超过限制的最长连续子数组 思路: 1) 就相当于滑动窗口,维护滑动窗口内的两个值,一个是最大值…

CV05_深度学习模块之间的缝合教学(1)

1.1 在哪里缝 测试文件?() 训练文件?() 模型文件?(√) 1.2 骨干网络与模块缝合 以Vision Transformer为例,模型文件里有很多类,我们只在最后…

Flutter——最详细(Table)网格、表格组件使用教程

背景 用于展示表格组件,可指定线宽、列宽、文字方向等属性 属性作用columnWidths列的宽度defaultVerticalAlignment网格内部组件摆放方向border网格样式修改children表格里面的组件textDirection文本排序方向 import package:flutter/material.dart;class CustomTa…

Mac 上安转文字转 SQL 利器 WrenAI

WrenAI 是一个开源的 Text-SQL 的工具,通过导入数据库结构,通过提问的方式生成 SQL。本文将讲述如何在 MacOS 上安装 WrenAI。要运行WrenAI,首先需要安装 Docker 桌面版。 下载 WrenAI https://github.com/Canner/WrenAI/releases/tag/0.7.…

开源流程表单设计器都有哪些值得一提的优势?

如果需要提质、增效、降本,不妨来了解下低代码技术平台、开源流程表单设计器的功能和优势特点。想要实现流程化办公,低代码技术平台是助力增效的理想工具。功能灵活、操作方便、好维修、可视化操作等优势都是其深受行业喜爱的优势特点。通过本文&#xf…

DDL也会有undo吗?模拟Oracle中DML、DDL与undo的关系,10046跟踪DDL语句

已经有两个月没有更新博客了,主要实在忙毕设和毕业的一些事情!这两个月也是非常的精彩呀,充分体会到了职场的和校园的不同,作为一名刚毕业就满 1 年工作经验的牛马人,在两个月期间经历了两次调岗、两次降薪&#xff0c…

一句歌词描述夏天

夏天总是带着一种奇特的魔力,既能让人沉醉在阳光和海浪的浪漫中,也能在炎热与燥热中让人心生烦闷。特别是在夏日里情绪低落时,那些可以抚平心情的歌曲显得尤为珍贵。音乐,这个神奇的存在,总能在最需要的时候带来心灵的…

使用AutoGPT构建智能体:从LSTM到Prompt编写实战教程001

如果报错,这里会有一个环境变量的设置需要设置上. 然后这一节我们来自己制作一个智能体,来感受一下,实际上现在,大模型还是可以做很多功能的. 可以看到上面是智能体的架构,之前也说过了, 上面这几个功能,如果用我们人类去操作,还是需要花些时间的,如果用大模型就快很多了. 以…

利用Python的sympy包求解一元多次方程

一元1次方程 import sympy as sp # 导入sympy包 x sp.Symbol(x) # 定义符号变量 f 2*x -8 # 定义要求解的一元1次方程 x sp.solve(f) # 调用solve函数求解方程 x[4]一元2次方程 import sympy as sp # 导入sympy包 x sp.Symbol(x) # 定义符号变量 f …

Nature Protocols:整合多组学并进行因果推理的系统框架

转载自:MetaAI 在生物学研究中,随着实验和计算技术的进步,生物系统研究产生了大量高通量数据。技术努力主要集中在提高吞吐量、降低成本和提升实验与计算效率。因此,整合不同类型组学数据,并通过关联分析识别关键因素…

[机器学习]-人工智能对程序员的深远影响——案例分析

机器学习和人工智能对未来程序员的深远影响 目录 机器学习和人工智能对未来程序员的深远影响1. **自动化编码任务**1.1 代码生成1.2 自动调试1.3 测试自动化 2. **提升开发效率**2.1 智能建议2.2 项目管理 3. **改变编程范式**3.1 数据驱动开发 4. **职业发展的新机遇**4.1 AI工…

大数据开发者:如何快速熟悉新公司的技术环境

目录 1. 了解系统架构实践建议:示例对话: 2. 了解领域模型实践建议:示例: 3. 了解代码结构实践建议:示例: 结语 作为一名大数据开发者,加入新公司后快速熟悉技术环境是一项重要而又具有挑战性的…

bev 之 fastBEV

前面我们提到bev 之 LSS, 知道视觉的BEV方案的主要痛点在于: 1、depth 的预测 2、图像特征到BEV特征之间的视图变换消耗大量计算 LSS 为什么需要D维深度 占据大量消耗的原因是LSS 对每个图像特征点引入深度D,即假设每个像素上存在可能的D维深度。也就是假设不同像…

C++ 栈-队列-优先级队列

目录 1 栈 2 队列 3 deque 介绍 4 优先级队列 5 反向迭代器 栈也是我们在C语言就模拟实现过的一种数据结构,在C中,栈其实和我们前面模拟实现过的string、vector等容器有一点区别,站起是不是容器,而是一种容器适配器,我…

Floyd判圈算法——寻找重复数(C++)

287. 寻找重复数 - 力扣(LeetCode) 题目描述 给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,返…

python基础语法笔记(有C语言基础之后)

input()用于输入,其有返回值(即用户输入的值),默认返回字符串。括号里可放提示语句 一行代码若想分为多行来写,需要在每一行的末尾加上“\” 单个“/”表示数学中的除法,不会取整。“//”才会向下取整。 …