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也是扩展方法,自带的返回是一个Liststring 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.ExtensionsParameter 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.Extensionsheight.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已经提了好多次了,那么就下一篇写吧。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Vger对已经过身份验证的Jupyter实例进行安全检测

关于Vger Vger是一款功能强大的交互式命令行应用程序,广大研究人员可以利用Vger与已经过身验证的Jupyter实例进行交互,并对其执行人工智能或机器学习方面的安全检测操作。 使用场景 1、作为红队研究人员,当我们寻找到了Jupyter凭证之后&…

前端工程化(01):10款自动化构建工具初识。

前端工程化自动化构建工具是用于简化前端开发流程、提高开发效率和优化项目质量的工具。市面上的工具多种多样,贝格前端工场先介绍一下什么是前端工程化,为什么要前端工程化,以及常用工具,后面会对各种工具逐一介绍。 一、什么是…

五大实用内网穿透工具深度评测:畅通无阻,跨越网络屏障

在日益复杂多变的网络环境下,内网穿透技术成为了解决内外网络隔离问题的关键。无论是个人开发者测试环境的远程访问,还是企业内部服务的公网暴露,一款高效、安全的内网穿透工具显得尤为重要。本文精选了五款市场上广受好评的内网穿透解决方案…

《米小圈漫画历史》:历史启蒙,看漫画书就可以啦!

在当今信息爆炸的时代,如何让孩子在娱乐中学习,一直是许多家长关心的问题。《米小圈漫画历史》系列作为一部集合了趣味性和教育性的漫画书,以其独特的视角和精彩的故事情节,成为了许多家庭历史启蒙的首选。本文将通过探索漫画书的…

anaconda修改安装的默认环境

📚博客主页:knighthood2001 ✨公众号:认知up吧 (目前正在带领大家一起提升认知,感兴趣可以来围观一下) 🎃知识星球:【认知up吧|成长|副业】介绍 ❤️如遇文章付费,可先看…

从零开始学习嵌入式----Linux系统中shell脚本

目录 Shell脚本入门:玩转功能语句和数组,提升你的效率! 一、功能语句:让你的脚本更灵活 1. 条件语句:if、else、elif 2. 循环语句:for、while 二、数组:处理多项数据的好帮手 1. 声明数组…

Linux基础指令解析+项目部署环境

文章目录 前言基础指令部署项目环境总结 前言 Linux的魅力在于其强大的可定制性和灵活性,这使得它成为了众多开发者和运维人员的首选工具。然而,Linux的指令系统庞大而复杂,初学者往往容易迷失其中。因此,本文将带领大家走进Linu…

C++的介绍与认识

目录 前言 1.什么是C 2.C的发展历史 3.C参考文档 4.C重要性 4.1C特点 4.2编程语言排行榜 4.3 C的应用领域 5.C学习指南 1. 基础知识 2. 面向对象编程(OOP) 3. 泛型编程 4. 标准库(STL) 结束语 前言 学习了C语言的知识…

亚马逊云科技EC2简明教程

💡 完全适用于新手操作的Amazon EC2引导教程 简述 在亚马逊云科技中,存在多种计算服务,在此,我们将会着重讨论Amazon EC2(以下简称EC2),EC2作为亚马逊云科技的明星产品、核心产品,是大多数开发者和企业用…

高考后暑假新选择:从AI聊天机器人开发入门IT领域

你好,我是三桥君 七月来临,各省高考分数已揭榜完成。而高考的完结并不意味着学习的结束,而是新旅程的开始。对于有志于踏入IT领域的高考少年们,这个假期是开启探索IT世界的绝佳时机。 不知道这些有志于踏入IT领域的高考少年们&…

即时通讯平台项目测试(主页面)

http://8.130.98.211:8080/login.html项目访问地址:即时通讯平台http://8.130.98.211:8080/login.html 本篇文章进行项目主页面的测试。 在测试前需要先对待测内容进行分类,按照功能进行分类可以分为:个人信息设置、发送/接收消息、添加好友…

TypeScript的类型谓词与控制流分析

目录 ts封装类型判断的问题类型谓词TypeScript的“控制流分析” ts封装类型判断的问题 在union.d.ts 中 全局声明一个 DataType declare type DataType | "RegExp"| "Object"| "Array"| "Function"| "String"| "Bool…

Shell:一行命令如何实现采集某一进程一段时间内CPU使用率

首先,能想到使用top查看进程的CPU使用率,以java进程编号251346为例进行介绍 top -d 1 -p 251346 -d 表示每秒采集一次 CPU使用率是显示出来了,但这样只能在屏幕上原地刷新,我们希望能把数据每时每刻的数据都保存下来,…

vscode连接unbuntu失败,显示Downloading vs code server...

问题: vscode连接unbuntu失败,右下角显示:Downloading vs code server... 且当再次输入密码时,仍然出现:Downloading vs code server... 重复多次,无法解决。 解决办法: 这是因为服务器端的…

华为OD机试(C卷,200分)- 字符串拼接、田忌赛马

(C卷,200分)- 字符串拼接 题目描述 给定 M&#xff08;0 < M ≤ 30&#xff09;个字符&#xff08;a-z&#xff09;&#xff0c;从中取出任意字符&#xff08;每个字符只能用一次&#xff09;拼接成长度为 N&#xff08;0 < N ≤ 5&#xff09;的字符串&#xff0c; 要求…

凌风云 - 十大网盘资源搜索 Ver 6.0 版正式上线

《凌风云》作为网盘资源专业搜索领域的佼佼者&#xff0c;汇聚了国内十大网盘的丰富资源&#xff0c;凌风云搜索弥补其他搜索引擎可能无法搜索到相关资源的缺陷&#xff0c;作为专业的搜索引擎服务网络平台&#xff0c;您只需输入关键词&#xff0c;通过智能算法精准匹配&#…

C语言2D游戏

目录 开头程序程序的流程图这个游戏的效果结尾 开头 大家好&#xff0c;我叫这是我58。在今天&#xff0c;我用C语言编译出了我的第一个2D游戏。如果你想就看这个2D游戏或者与之相关的内容话&#xff0c;就看下下面的内容吧。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #defi…

第六次作业

一、视图作业 1、创建视图v_emp_dept_id_1&#xff0c;查询销售部门的员工姓名和家庭住址 2、创建视图v_emp_dept&#xff0c;查询销售部门员工姓名和家庭住址及部门名称。 3、创建视图v_dept_emp_count(dept_name,emp_count,avg_salay)&#xff0c;统计每个部门人数并计算平均…

Pandas基础03:数据排序与增删

上一节我们介绍了通过按行索引和按列索引找出相关数据的方法。本章节将进一步介绍如何筛选数据&#xff0c;并对数据进行排序、增删的方法。 示例表格和上一节相同。 1.数据筛选 Python中可以通过区域筛选&#xff0c;即获取某几行某几列的方法得到数据。例如&#xff0c;我要…

数据分表和分库原理

数据分表和分库是数据库设计中常见的扩展和优化手段&#xff0c;用于解决大数据量下的性能瓶颈问题。以下是数据分表和分库的原理&#xff1a; 一、数据分表&#xff08;Sharding&#xff09; 原理&#xff1a; 数据分表是将一个大的数据库表按照一定的规则拆分成多个较小的…