浅析Revit体量创建的几种方式

随着项目经验的不断加深,可以发现在通过Revit进行开发过程中,创建体量是一个非常重要的工作,今天就在族文件中通过拉伸创建体量的几种方式进行说明以及简单示例,供大家参考。

体量创建API

  • 通过轮廓和拉伸向量创建体量
    NewExtrusionForm(bool isSolid, ReferenceArray profile, DB.XYZ direction);
  • 通过轮廓线生成面体量
    NewFormByCap(bool isSolid, ReferenceArray profile);
  • 通过面和拉伸向量生成体量
    NewFormByThickenSingleSurface(bool isSolid, Form singleSurfaceForm, DB.XYZ thickenDir);
  • 通过轮廓组生成体量
    NewLoftForm(bool isSolid, ReferenceArrayArray profiles);
  • 通过放样路径和轮廓组生成体量
    NewSweptBlendForm(bool isSolid, ReferenceArray path, ReferenceArrayArray profiles);

API使用说明及示例代码

定义初始线集合

List<Curve> curves = new List<Curve>()
{
 Line.CreateBound(XYZ.Zero,new XYZ(10,0,0)),
 Line.CreateBound(new XYZ(10,0,0),new XYZ(10,10,0)),
 Line.CreateBound(new XYZ(10,10,0),new XYZ(0,10,0)),
 Line.CreateBound(new XYZ(0,10,0),new XYZ(0,0,0))
};
public Family CreateForm(UIApplication UiApp, List<Curve> curves, string FileName)
        {
            Transaction transaction = null;
            Family fa = null;
            try
            {
            	var ProjectDoc = UiApp.ActiveUIDocument.Document;
            	//在族文件中创建拉伸体,需新建族文件,通过公制体量样板
                var path = @"...\path\公制体量.rft";
                var FamilyDoc = UiApp.Application.NewFamilyDocument(path);
                SketchPlane sp = null;
                ReferenceArray refers = new ReferenceArray();
                transaction = new Transaction(FamilyDoc);
                transaction.Start("Create Form");
                //定义轮廓1,因线的Refrence获取比较麻烦,可以通过创建ModelLine,然后通过获取ModelLine..GeometryCurve.Reference的方式来获取
                foreach (Curve cu in curves)
                {
                    if (sp == null)
                    { 
                    	//定义模型线创建的SP,因不同的轮廓而创建不同的Plane,此文就水平平面作为实例,根据实际情况进行修改
                        sp = SketchPlane.Create(FamilyDoc, Plane.CreateByOriginAndBasis(new XYZ(0, 0, cu.GetEndPoint(0).Z), XYZ.BasisX, XYZ.BasisY));
                    }
                    refers.Append(FamilyDoc.FamilyCreate.NewModelCurve(cu, sp).GeometryCurve.Reference);
                }
                sp = null;
                //定义轮廓2,将轮廓一坐标值缩小一倍并上移10个单位
                ReferenceArray refers1 = new ReferenceArray();
                foreach (Curve cu in curves)
                {
                    if (sp == null)
                    {
                    	//定义模型线创建的SP,因不同的轮廓而创建不同的Plane,此文就水平平面作为实例,根据实际情况进行修改
                        sp = SketchPlane.Create(FamilyDoc, Plane.CreateByOriginAndBasis(new XYZ(0, 0, cu.GetEndPoint(0).Z+10), XYZ.BasisX, XYZ.BasisY));
                    }
                    var start = cu.GetEndPoint(0) / 2 + new XYZ(0,0,10);
                    var end = cu.GetEndPoint(1) / 2 + new XYZ(0, 0, 10);
                    refers1.Append(FamilyDoc.FamilyCreate.NewModelCurve(Line.CreateBound(start,end), sp).GeometryCurve.Reference);
                }
                ReferenceArrayArray raa = new ReferenceArrayArray();
                raa.Append(refers);
                raa.Append(refers1);
                //通过轮廓和方向生成几何体
                FamilyDoc.FamilyCreate.NewExtrusionForm(true, refers, new XYZ(0, 0, 10));
                //通过轮廓线生成面
                var SigleFaceForm = FamilyDoc.FamilyCreate.NewFormByCap(true, refers);
                //通过面和向量生成体
                FamilyDoc.FamilyCreate.NewFormByThickenSingleSurface(true, SigleFaceForm,new XYZ(0,0,10));
                //通过轮廓组生成体
                FamilyDoc.FamilyCreate.NewLoftForm(true, raa);
                transaction.Commit();
                //将体量族载入项目
                SaveAsOptions sao = new SaveAsOptions();
                sao.OverwriteExistingFile = true;
                string SaveFilePath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + @"\" + FileName + ".rfa";
                FamilyDoc.SaveAs(SaveFilePath, sao);
                FamilyDoc.Close();
                transaction = new Transaction(ProjectDoc, "载入族");
                transaction.Start();
                ProjectDoc.LoadFamily(SaveFilePath, out fa);
                transaction.Commit();
            }
            catch (Exception ex)
            {
                TaskDialog.Show("错误", ex.Message);
                if (transaction != null && transaction.GetStatus() == TransactionStatus.Started)
                {
                    transaction.RollBack();
                }
            }
            finally
            {
                if (transaction != null && transaction.GetStatus() == TransactionStatus.Started)
                {
                    transaction.Commit();
                }
            }
            return fa;
        }

实现效果及关键问题说明

1.通过轮廓和方向生成几何体
FamilyDoc.FamilyCreate.NewExtrusionForm(true, refers, new XYZ(0, 0, 10))
定义底面轮廓后,向上拉伸10个单位。
生成效果如下:
通过轮廓和方向生成几何体

tips:传入的轮廓线必须闭合,但不一定要首尾相连如以下这种情况,也可以生成成功(很奇葩的是,手动绘制一样的线,用软件生成出来并不是闭合区域的轮廓,可能API对传入轮廓线进行了处理…)
在这里插入图片描述
2. 通过轮廓线生成面体量
NewFormByCap(bool isSolid, ReferenceArray profile)
传入闭合轮廓即可,生成效果如下:
在这里插入图片描述
3.通过面和向量生成体量
NewFormByThickenSingleSurface(bool isSolid, Form singleSurfaceForm, DB.XYZ thickenDir)
先通过轮廓线,使用 NewFormByCap创建出面体量后,对面进行拉伸,创建出带厚度的实体体量。将面向Z方向拉伸15个单位,实现效果如下:
在这里插入图片描述
4.通过轮廓组组合生成体量
Form NewLoftForm(bool isSolid, ReferenceArrayArray profiles)
轮廓组一般都是彼此不一样的面,如生成棱台,通过传入上下两个平行于XY平面的轮廓,API根据面与面的轮廓拉伸实体。实现效果如下:
在这里插入图片描述
5.通过放样路径和轮廓组生成体量
NewSweptBlendForm(bool isSolid, ReferenceArray path, ReferenceArrayArray profiles)
参数path代表意思为拉伸路径,可以为曲线;
轮廓集合为沿路径拉伸的每一段路径的轮廓集合,关于这种生成方式,可参考另外一篇博客:
REVIT体量环境或自适应族环境下的放样

作者简介

感谢各位的查阅,
作者:陈逼仔(464905795、464880906、983855234)


版权声明:本文为qq_43195707原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。