Revit二次开发入门:第十章族API
族简介:
- 族是一个包含通用属性(称作参数)集和相关图形表示的图元组
- 同一个族都具有相关的图形表示和一组相同的参数(族类型参数)
- 在API中,提供了一系列的类和方法来提供管理组文档,包括族类型和组参数的管理、几何图元的管理、几何图元的可见性管理、组文档和工程文档交互(编辑族和载入族)等
相关的主要API类:
- 族类型和族参数的管理
- FamilyManager
- FamilyType
- FamilyParameter
- 几何图元的管理
- FamilyItemFactory
- 几何图元的可见性管理
- FamilyElementVisibility
1.创建几何形体
族创建相关的类:
-
Document:
- Family OwnerFamily
- FamilyManager FamilyManager
- FamilyItemFactory FamilyCreate
- 拉伸
Extrusion e=new Extrusion(bool isSolid, CurveArrArray profile, SketchPlane sketchPlane, double end);
- 融合
Blend NewBlend(bool isSolid, CurveArray topProfile, CurveArray baseProfile, SketchPlane sketchPlane);
- 旋转
Revolution NewRevolution(bool isSolid, CurveArrArray profile, SketchPlane sketchPlane, Line axis,double startAngle, double endAngle);
- 放样
Sweep NewSweep(bool isSolid, ReferenceArray path, SweepProfile profile, int profileLocationCurveIndex,ProfilePlaneLocation profilePlaneLocation); Sweep NewSweep(bool isSolid, ReferenceArray path,SketchPlane pathPlane,SweepProfile profile, int profileLocationCurveIndex,ProfilePlaneLocation profilePlaneLocation);
- 放样融合
SweptBlend NewSwptBlend(bool isSolid, Referrence path, SweepProfile bottonProfile, SweepProfile topProfile); SweptBlend NewSwptBlend(bool isSolid, Curve path, SketchPlane pathPlane,SweepProfile bottonProfile, SweepProfile topProfile);
- 拉伸
- bool IsFamilyDocument
- Family OwnerFamily
2.创建参考平面
-
Document.FamilyCreate
- NewReferencePlane
ReferencePlane NewReferencePlane(XYZ bubbleEnd, XYZ freeEnd, XYZ cutVec, View pView);
注意:需要调用Document.Regenerate()函数!
3.创建尺寸标注
-
Document.FamilyCreate
- NewLinearDimension
- NewAngularDimension
- NewRadialDimension
- NewDiameterDimension
- NewArcLenthDimension
-
绑定参数
Dimension.FamilyLabel=FamilyParameter
4.创建约束
- Document.FamilyCreate
Dimension NewDimension(View view, Reference reference1, Reference reference2);
- 注意:调用之前要确保两个reference位置重叠
5.创建组参数
- Document.FamilyManager:一个管理类,用于管理所有族类型相关的编辑行为
FamilyParameter AddParameter(string paramenterName, BuiltInParameterGroup parameterGroup,ParameterType parameterTpye, bool isInstance);
6.创建族类型
- Document.FamilyManager
FamilyType NewType(string typeName);
-
设置族参数:
-
Document.FamilyManager
void Set(FamilyParameter familyParameter, ElementId value); void Set(FamilyParameter familyParameter, double value); void Set(FamilyParameter familyParameter, string value); void Set(FamilyParameter familyParameter, int value);
-
注意:新建族类型之后,当前族类型默认变诶新建的族类型
-
-
实力参数修改
-
类型参数修改
7.加载族
- Document.LoadFamily
Family LoadFamily(Document targetDocument, IFamilyLoadOptions familyLoadOptions); Family LoadFamily(Document targetDocument);
- IFamilyLoadOptions接口
8.实例练习
-
创建一个柱的族
- 创建族文件
- 添加材质参数
- 创建拉伸
- 创建约束
- 关联材质参数
using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB; using Autodesk.Revit.UI; using System.Linq; namespace FamilyCteate1 { [TransactionAttribute(TransactionMode.Manual)] [RegenerationAttribute(RegenerationOption.Manual)] public class FamilyCreateTest : IExternalCommand { public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { UIDocument uiDoc = commandData.Application.ActiveUIDocument; Document doc = uiDoc.Document; UIApplication uiApp = commandData.Application; Application app = uiApp.Application; string rfePath = @"C:\ProgramData\Autodesk\RVT 2020\Family Templates\Chinese\公制柱.rft"; Document faDoc = app.NewFamilyDocument(rfePath); Transaction trans = new Transaction(faDoc, "创建族"); trans.Start(); FamilyManager manager = faDoc.FamilyManager; FamilyParameter mfp = manager.AddParameter("材质", BuiltInParameterGroup.PG_MATERIALS, ParameterType.Material, false); CurveArrArray arrArray = GetCurves(); SketchPlane sketchPlane = GetSketchPlane(faDoc); Extrusion extrusion = faDoc.FamilyCreate.NewExtrusion(true, arrArray, sketchPlane, 4000 / 304.8); faDoc.Regenerate(); Reference topFaceReference = null; Options opt = new Options { ComputeReferences = true, DetailLevel = ViewDetailLevel.Fine }; GeometryElement geometry = extrusion.get_Geometry(opt); foreach (GeometryObject o in geometry) { if (o is Solid) { Solid s = o as Solid; foreach (Face face in s.Faces) { if (face.ComputeNormal(new UV()).IsAlmostEqualTo(new XYZ(0, 0, 1))) { topFaceReference = face.Reference; } } } } View v = GetView(faDoc); Reference r = GetTopLevel(faDoc); Dimension d = faDoc.FamilyCreate.NewAlignment(v, r, topFaceReference); d.IsLocked = true; faDoc.Regenerate(); Parameter p = extrusion.get_Parameter(BuiltInParameter.MATERIAL_ID_PARAM); manager.AssociateElementParameterToFamilyParameter(p, mfp); trans.Commit(); Family fa = faDoc.LoadFamily(doc); faDoc.Close(false); trans = new Transaction(doc, "创建柱"); trans.Start(); fa.Name = "我的柱子"; trans.Commit(); return Result.Succeeded; } private Reference GetTopLevel(Document faDoc) { FilteredElementCollector temc = new FilteredElementCollector(faDoc); temc.OfClass(typeof(Level)); Level lvl = temc.First(m => m.Name == "高于参照标高") as Level; return new Reference(lvl); } private View GetView(Document faDoc) { FilteredElementCollector viewCollector = new FilteredElementCollector(faDoc); viewCollector.OfClass(typeof(View)); View v = viewCollector.First(m => m.Name == "前") as View; return v; } private SketchPlane GetSketchPlane(Document faDoc) { FilteredElementCollector teme = new FilteredElementCollector(faDoc); teme.OfClass(typeof(SketchPlane)); SketchPlane sketchPlane = teme.First(m => m.Name == "低于参照标高") as SketchPlane; return sketchPlane; } private CurveArrArray GetCurves() { double len = 300 / 304.8; XYZ p1 = new XYZ(-len, -len, 0); XYZ p2 = new XYZ(len, -len, 0); XYZ p3 = new XYZ(len, len, 0); XYZ p4 = new XYZ(-len, len, 0); Line l1 = Line.CreateBound(p1, p2); Line l2 = Line.CreateBound(p2, p3); Line l3 = Line.CreateBound(p3, p4); Line l4 = Line.CreateBound(p4, p1); CurveArrArray arr = new CurveArrArray(); CurveArray ar = new CurveArray(); ar.Append(l1); ar.Append(l2); ar.Append(l3); ar.Append(l4); arr.Append(ar); return arr; } } }