Revit二次开发十一 族
在Revit中,提供了一个供用户自定义的元素"族",在Revit所有的操作都围绕族这个元素进行。
-
族的分类
Revit将族分为系统族、内建族、标准构件族。
-
系统族:系统族是在 Autodesk Revit 中预定义的族,包含基本建筑构件,例如墙、窗和门。例如:基本墙系统族包含定义内墙、外墙、基础墙、常规墙和隔断墙样式的墙类型;可以复制和修改现有系统族,但不能创建新系统族;可以通过指定新参数定义新的族类型。
-
标准构件族:在默认情况下,在项目样板中载入标准构件族,但更多标准构件族存储在构件库中。使用族编辑器创建和修改构件。可以复制和修改现有构件族, 也可以根据各种族样板创建新的构件族。族样板可以是基于主体的样板, 也可以是独立的样板。基于主体的族包括需要主体的构件。例如:以墙族为主体的门族,独立族包括柱、树和家具;族样板有助于创建和操作构件族。标准构件族可以位于项目环境外,且具有 .rfa 扩展名,可以将它们载入项目,从一个项目传递到另一个项目,而且如果需要还可以从项目文件保存到您的库中。
-
内建族:内建族可以是特定项目中的模型构件,也可以是注释构件。只能在当前项目中创建内建族,因此它们仅可用于该项目特定的对象,例如:自定义墙的处理。创建内建族时,可以选择类别,且您使用的类别将决定构件在项目中的外观和显示控制。
而我们在Revit二次开发中,与Family相关的主要是标准构建族和内建族,系统族虽然也被统称为族,并没有Family的相关属性和特性。本章主要讲解Family的相关关系。如图1-1所示:
一个族(Famliy)在Revit系统中,是不允许独立存在,必须附属在一个族类别之上,族类别比族更加具体,族就像一个抽象类、族类型就是一个类,而族实例是一个实例化的对象元素。
-
-
族的访问
从族实例获取族类型FamilySymbol:
-
FamilySymbol symbol = familylnstance. Symbol FamilySymbol symbol = RevitDoc. GetElement(familyInstance.GetTypeId()) as FamilySymbol
-
从族类型获取族:
Family family = symbol. Family;
从族获取族类型:
FamilySymbolSet setOfSymbols = family. Symbols;
从族类型获取族实例
FamilylnstanceFilter familylnstanceFilter = new FamilyInstanceFilter(RevitDoc,symbol, Id); FilteredElementCollector filteredElements = new FilteredElementCollector(RevitDoc); filteredElements = filteredElements. WherePasses(familylnstanceFilter); foreach (Familylnstance element in filteredElements) { //各族实例 }
族实例的构建
-
分别通过doc.LoadFamily(file, out family);加载族,通过doc.Create.NewFamilyInstance创建一个族实例。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677/// <summary>
/// 创建一个门族的案例
/// </summary>
/// <param name="RevitDoc"></param>
/// <param name="doorTypeName"></param>
public
void
CreatDoorInstance(Document doc,
string
doorTypeName =
"0762 x 2032 mm"
)
{
FamilySymbol doorType =
null
;
string
file =
@"C:\ProgramData\Autodesk\RVT 2017\Libraries\Chinese_INTL\门\M_单-嵌板.rfa"
;
//获取族
Family family =
null
;
//加载指定的族
bool
loadSuccess = doc.LoadFamily(file,
out
family);
if
(loadSuccess)
{
//获取当前族所有的验证类型
foreach
(ElementId doorTypeId
in
family.GetValidTypes())
{
//获取当前的族类型
doorType = doc.GetElement(doorTypeId)
as
FamilySymbol;
//指定当前的族类型
if
(doorType !=
null
)
{
if
(doorType.Name == doorTypeName)
{
break
;
}
}
}
}
else
{
Autodesk.Revit.UI.TaskDialog.Show(
"失败"
,
"加载族失败"
);
}
// 使用族类型创建门
if
(doorType !=
null
)
{
// 首先找到线形的墙
ElementFilter wallFilter =
new
ElementClassFilter(
typeof
(Wall));
FilteredElementCollector filteredElements =
new
FilteredElementCollector(doc);
filteredElements = filteredElements.WherePasses(wallFilter);
Wall wall =
null
;
Line line =
null
;
foreach
(Wall element
in
filteredElements)
{
LocationCurve locationCurve = element.Location
as
LocationCurve;
if
(locationCurve !=
null
)
{
line = locationCurve.Curve
as
Line;
if
(line !=
null
)
{
wall = element;
break
;
}
}
}
// 在墙的中心位置创建一个门
if
(wall !=
null
)
{
XYZ midPoint = (line.GetEndPoint(0) + line.GetEndPoint(1)) / 2;
Level wallLevel = doc.GetElement(wall.LevelId)
as
Level;
//创建一个族实例
FamilyInstance door = doc.Create.NewFamilyInstance(midPoint, doorType, wall, wallLevel, Autodesk.Revit.DB.Structure.StructuralType.NonStructural);
Autodesk.Revit.UI.TaskDialog.Show(
"成功"
, door.Id.ToString());
System.Diagnostics.Trace.WriteLine(
"门创建完成: "
+ door.Id.ToString());
}
else
{
Autodesk.Revit.UI.TaskDialog.Show(
"元素不存在"
,
"没有找到符合条件的墙"
);
}
}
else
{
Autodesk.Revit.UI.TaskDialog.Show(
"族类型不存在"
,
"没有找到族类型'"
+ doorTypeName +
"'"
);
}
}
-
元素的编辑
元素的移动、旋转和镜像,当前对对象进行操作时需要注意以下几点,不管是移动和旋转镜像,需要当前族具有此类特性,如一些族限制了标高,则Z方向不管赋值是否,都无法产生移动,其代码如下:
public void ElementUtil(Document doc, FamilyInstance familyInstance) { //元素的移动 ElementTransformUtils.MoveElement(doc, familyInstance.Id, new XYZ(0, 0, 0)); ElementTransformUtils.RotateElement(doc, familyInstance.Id, Line.CreateBound(new XYZ(0, 0, 0), new XYZ(1, 1, 1)), 30); Plane plane = Plane.CreateByNormalAndOrigin(XYZ.BasisX, XYZ.Zero); ElementTransformUtils.MirrorElement(doc, familyInstance.Id, plane); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具