16. Revit API: Family、FamilySymbol、FamilyInstance

news2024/9/23 3:28:52

前言

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

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

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


一、这三个是什么

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已经提了好多次了,那么就下一篇写吧。

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

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

相关文章

电脑缺少dll文件是怎么回事?教你5种有效的解决方法

当您的计算机显示DLL文件已经遗失时,您应如何应对呢?实际上,针对此类DLL文件的处置过程相对来说较为简易。今日,我们在此为大家详细介绍此领域的相关知识,让大家轻松解决电脑中因丢失DLL文件而产生的问题。 一、关于DL…

关于消息队列MQ的举例 | 同步调用与异步调用的区别

为什么要有一个消息代理? 举例: 消息发送者和消息接收者直接连接,就好像外卖员直接把外卖送到顾客的手上。 但如果顾客此刻正在处理自己的事情,不方便拿外卖。 那么外卖员就需要把外卖放在外卖柜上,顾客方便的时候直接…

【前端】面试八股文——meta标签

【前端】面试八股文——meta标签 在HTML文档中&#xff0c;meta标签是一个关键但常被忽视的元素。它位于文档的<head>部分&#xff0c;用于提供关于HTML文档的元数据&#xff08;metadata&#xff09;。这些元数据不会直接显示在页面上&#xff0c;但对搜索引擎优化&…

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

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

Python编程:如何有效等待套接字的读取与关闭

背景介绍 网络编程是现代应用程序开发的重要组成部分&#xff0c;尤其是在大数据和实时通信的背景下。套接字&#xff08;Socket&#xff09;作为网络通信的核心技术&#xff0c;是开发网络应用程序的基础。在Python编程中&#xff0c;如何有效地等待套接字的读取与关闭事件是…

无人机之穿越机注意事项篇

一、检查设备 每次飞行前都要仔细检查穿越机的每个部件&#xff0c;确保所有功能正常&#xff0c;特别是电池和电机。 二、遵守法律 了解并遵循你所在地区关于无人机的飞行规定&#xff0c;避免非法飞行。 三、评估环境 在飞行前检查周围环境&#xff0c;确保没有障碍物和…

补码一位乘法原理(布斯编码详讲)

最近在看补码乘法的时候&#xff0c;感觉到很奇怪的一点&#xff0c;那就是补码的一位乘法&#xff0c;就是上网查了大量的资料都没有理解到它真正的原理&#xff0c;总感觉还是不会。那么&#xff0c;补码乘法的原理到底是什么呢&#xff1f;而让我们一直困惑的点是哪里呢&…

Linux运维:MySQL中间件代理服务器,mycat读写分离应用实验

Mycat适用的场景很丰富&#xff0c;以下是几个典型的应用场景&#xff1a; 1.单纯的读写分离&#xff0c;此时配置最为简单&#xff0c;支持读写分离&#xff0c;主从切换 2.分表分库&#xff0c;对于超过1000万的表进行分片&#xff0c;最大支持1000亿的单表分片 3.多租户应…

【多线程】生产者消费者模型(代码实现)

文章目录 生产者消费者模型介绍生产者消费者模型的特点基于BlockingQueue的生产者消费者模型 生产者消费者模型介绍 生产者消费模型是一种常见的多线程编程模式&#xff0c;广泛应用于解决并发编程中的数据共享和任务调度问题。在该模型中&#xff0c;我们将生产数据并放入缓冲…

“都市绿洲,健康生活新纪元“ —全方位打造高科技多功能智慧健康园

咸宁&#xff0c;这座被誉为"桂花之乡"和"华中康养区"的城市&#xff0c;如同一朵绽放在湖北东南的璀璨明珠。这里桂花飘香&#xff0c;温泉涌动&#xff0c;将自然的馈赠与人文的智慧完美融合。漫步在咸宁&#xff0c;你会被满城金黄的桂花树所吸引&#…

SCSA第四天

ASPF FTP --- 文件传输协议 Tftp --- 简单文件传输协议 FTP协议相较于Tftp协议 ---- 1&#xff0c;需要进行认证 2&#xff0c;拥有一套完整的命令集 用户认证 防火墙管理员认证 ---- 校验登录者身份合法性 用户认证 --- 上网行为管理中的一环 上网用户认证 --- 三层认证…

QImage显示图片像素

在Qt中&#xff0c;QImage 类是用来表示和处理图像的。如果你想查看或显示一个图片的像素数据&#xff0c;你可以使用 QImage 提供的方法来访问这些数据。以下是一些基本的方法来获取和显示图片的像素信息&#xff1a; 获取图像的像素格式&#xff1a; 使用 QImage::format() …

redis相关知识记录

redis基本数据类型 Redis⽀持五种主要数据结构&#xff1a;字符串&#xff08;Strings&#xff09;、列表&#xff08;Lists&#xff09;、哈希表&#xff08;Hashes&#xff09;、集合&#xff08;Sets&#xff09;和有序集合&#xff08;Sorted Sets&#xff09;。这些数据结…

springboot 旅游导航系统-计算机毕业设计源码69476

目 录 第 1 章 引 言 1.1 选题背景 1.2 研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系统性需求分析…

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

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

c#调用c++ dll库报错System.BadImageFormatException

System.BadImageFormatException:“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)” 1. dll需要选择release模式进行编译 2.选择相同位数&#xff0c;比如x64平台&#xff0c;c#也需要x64 3.不要设置c#不支持的函数供调用 比如&#xff1a; c可以输出到控制台…

Lumos学习王佩丰Excel第四讲:排序与选择

一、排序 1、简单排序&#xff1a;不要选中一列排序&#xff0c;不然只是局部排序&#xff0c;其他数据都会发生错乱。 2、多条件排序 3、2003版本中超过3个排序条件时如何处理&#xff1a;从最后一个条件到第一个条件倒着按照要求依次排序。 4、按颜色排序 5、自定义排序次序…

洛谷P10716【MX-X1-T4】「KDOI-05」简单的字符串问题(扩展kmp+set+二分+扫描线树状数组)

题目 思路来源 小羊肖恩 题解 羊神这个做法tql&#xff0c;当时只是机械地写&#xff0c;过了之后再想想&#xff0c;才觉得确实是nb 先扩展kmp&#xff08;Z函数&#xff09;预处理出来数组&#xff0c;记z[i]为i往后可以和前缀匹配的最大长度 对于每个询问(p,cnt)&#x…

Dify工作流中的变量聚合节点

一.定义 变量聚合节点&#xff08;原变量赋值节点&#xff09;负责整合不同分支的输出结果&#xff0c;确保无论哪个分支被执行&#xff0c;其结果都能通过一个统一的变量来引用和访问。这在多分支的情况下非常有用&#xff0c;可将不同分支下相同作用的变量映射为一个输出变量…

esp32硬件电路设计

ESP-IDF 入门指南 | 乐鑫科技 (espressif.com) ESP32-DevKitC V4 入门指南 - ESP32 - — ESP-IDF 编程指南 v5.1 文档 (espressif.com)