Revit 二次开发 族的练习

Posted chenyanbin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Revit 二次开发 族的练习相关的知识,希望对你有一定的参考价值。

学习地址:https://www.bilibili.com/video/BV1mf4y1S72o?p=18

实例练习一(创建一个柱的族)

技术图片

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.ApplicationServices;

namespace FamilyAPI
{
    [TransactionAttribute(TransactionMode.Manual)]
    public class FamilyAPI : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            //族样板位置
            string rftPath = @"C:ProgramDataAutodeskRVT 2018Family TemplatesChinese公制柱.rft";
            UIApplication uiapp = commandData.Application;
            Application app = uiapp.Application;
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            //创建族文件
            Document faDoc = app.NewFamilyDocument(rftPath);
            //开启事务
            Transaction trans = new Transaction(faDoc,"创建族");
            trans.Start();
            //创建FamilyManager
            FamilyManager manager = faDoc.FamilyManager;
            //添加材质参数
            FamilyParameter mfp = manager.AddParameter("材质",BuiltInParameterGroup.PG_MATERIALS,ParameterType.Material,false);
            //创建拉伸
            CurveArrArray array = GetCurves();
            SketchPlane skplane = GetSketchPlane(faDoc);
            //创建Extrusion
            Extrusion extrusion = faDoc.FamilyCreate.NewExtrusion(true, array, skplane, 4000 / 304.8);
            faDoc.Regenerate();
            //创建约束
            Reference topFaceRef = null;
            //创建Options
            Options opt = new Options();
            opt.ComputeReferences = true;
            opt.DetailLevel = ViewDetailLevel.Fine;
            GeometryElement gelm = extrusion.get_Geometry(opt);
            foreach (GeometryObject gobj in gelm)
            {
                if (gobj is Solid)
                {
                    Solid s = gobj as Solid;
                    foreach (Face face in s.Faces) //找面
                    {
                        if (face.ComputeNormal(new UV()).IsAlmostEqualTo(new XYZ(0,0,1)))
                        {
                            topFaceRef = face.Reference;
                        }
                    }
                }
            }
            //创建View
            View v = GetView(faDoc);
            //创建Reference
            Reference r = GetTopLevel(faDoc);
            //创建
            Dimension d = faDoc.FamilyCreate.NewAlignment(v, r, topFaceRef);
            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 viewFilter = new FilteredElementCollector(faDoc);
            viewFilter.OfClass(typeof(View));
            View v = viewFilter.First(m => m.Name == "") as View;
            return v;
        }

        private SketchPlane GetSketchPlane(Document faDoc)
        {
            FilteredElementCollector temc = new FilteredElementCollector(faDoc);
            //过滤
            temc.OfClass(typeof(SketchPlane));
            SketchPlane sketchPlane = temc.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 ary = new CurveArrArray();
            CurveArray arry = new CurveArray();
            arry.Append(l1);
            arry.Append(l2);
            arry.Append(l3);
            arry.Append(l4);
            ary.Append(arry);
            return ary;
        }
    }
}

 

以上是关于Revit 二次开发 族的练习的主要内容,如果未能解决你的问题,请参考以下文章

revit 二次开发之基于族获得实例

Revit 二次开发 元素创建与修改练习

Revit 二次开发 元素过滤练习

Revit 二次开发 交互及UIAPI之Ribbon菜单

Revit 二次开发 交互及UIAPI之TaskDialog

Revit API二次开发入门,完整学习流程,附源码