Revit二次开发 创建空心模型并与指定构件剪切

本文介绍了如何利用Revit API创建空心族以实现构件剪切功能。首先从结构梁中提取Solid,然后与墙的Solid进行交集运算,生成空心拉伸。接着,修改族参数以实现剪切,并加载到项目中。最后,通过InstanceVoidCutUtils执行剪切操作。此方法适用于精度要求高的项目和各种复杂的剪切需求。
摘要由CSDN通过智能技术生成

具体API可以查阅官方文档,这里提供剪切的关键词Void

总述

应用场景

在实际项目中,想要做一个族剪切构件,需要创建一个空心拉伸,然后执行剪切命令剪切掉我们希望剪切的模型构件
在算量的时候应用比较广执行连接/剪切命令,或者实际工程中的连接顺序
或是在精度要求高或者业主拖着不给结算的项目中也会出现一些稀奇古怪的要求,比如我遇到这个结构梁剪切建筑墙

基本逻辑

  1. 首先将结构链接模型中的结构梁的Solid取出
  2. 获取所有墙,与上一步获取的结构梁Solid做交集,取出相交Solid
  3. 第二步会产生两个方向
    [ ] 每个InsertSolid都作为一个族生成
    [x] 合并成一个大的InsetSolid几何,在一个族中执行相应的名称分别创建
  4. 生成空心形体之后(我这里使用的空心拉伸)修改族参数(加载时剪切的空心)到族中,这一步网络上的都是手动改无法契合这个功能的要求,所以下面我会提供一段代码
  5. 放置到指定位置执行构件间剪切的操作
  6. 完成

创建空心族

创建族文件

这一步代替的实际操作就是 File ->New File -> Category的操作,我们获取到族文档才能在文档中绘制形状和修改参数

我这里创建的是一个公制常规模型的族

var app = commandData.Application.Application;
            var rfaDoc = app
                .NewFamilyDocument(@"C:\ProgramData\Autodesk\RVT 2019\Family Templates\Chinese\公制常规模型.rft");

创建空心拉伸

  1. 这里用到的命令获取solids的交集
 var insert = BooleanOperationsUtils
                                .ExecuteBooleanOperation(wallSolid, solid, BooleanOperationsType.Intersect);
  1. 因为族中无法指定将Solid创建成实体(这里有办法的大佬可以告诉一下),因为剪切梁比较规则所以我们可以获取上下底面做一个空心拉伸即可,但是我这个项目可能比较简单,结构梁也不会出现其他的形状.如果我们想要获取管道和墙梁这些构件的洞口,我们这时就需要获得两个侧面做一个拉伸.

为了方便我们可以直接采用一个窗族,方便后期统计算量,但是窗族无法覆盖斜向的拉伸和弧形的交叉,所以暂时放弃窗族,采用统一的一个空心拉伸进行剪切

创建空心拉伸,bool值代表是实心还是空心

 var z =Math.Abs( face1.Evaluate(new UV(0, 0)).Z - face2.Evaluate(new UV(0, 0)).Z);
                        // 创建空心模型
                        var extrusion = rfaDoc.FamilyCreate.NewExtrusion(false, arrA, SketchPlane.Create(rfaDoc, array0[0].GetPlane()), z);

修改族参数 加载时剪切的空心

参数位置
在这里插入图片描述

这里我们需要先看一下族中每个数据代表的内容

  1. Family Type [Family Symobl]
    可以使用下面的命令创建,我们创建后就可以在里面添加一个参数比如材质
rfaDoc.FamilyManager.NewType("111")

我们在族中做的标注想要连接到这里面可以使用

 AssociateElementParameterToFamilyParameter(
      Autodesk.Revit.DB.Parameter elementParameter,
      FamilyParameter familyParameter)

连接到族参数中,这样就可以在项目文件中修改参数。
2. Family Parameters
此处族参数指的是上面Family Type的一些族参数,但是无法获取到我们希望修改的参数
在这里插入图片描述

  1. Owner Family
    这个是我们的目标值,他代表Revit中这个部分的值
    在这里插入图片描述
    在这里插入图片描述
    我们打开会发现这里有族的基础类别和我们在族属性界面看到的属性值,所以我们需要取到这一部分进行修改,这里布尔参数无法通过AsValueString修改直接赋值1/0即可
var para = rfaDoc.OwnerFamily.get_Parameter(BuiltInParameter.FAMILY_ALLOW_CUT_WITH_VOIDS);
                para.Set(1);

这样我们的族操作就完成了,下面需要将族载入到项目中,就完成空心族的创建

 var family = rfaDoc.LoadFamily(doc);

执行剪切操作

Revit中剪切命令和连接命令分别是
在这里插入图片描述
剪切

InstanceVoidCutUtils

连接

JoinGeometryUtils

如果全项目遍历的话,没有相交的墙如果直接点剪切报错需要过滤一下这样的墙体。这里可以按照实际操作修改代码。

代码

using (Transaction trans = new Transaction(doc, "Modify"))
            {
                trans.Start();
                BiMassUntil.Until.TaskDialog(walls.Count.ToString());
                foreach (var wall in walls)
                {
                    // BiMassUntil.Until.TaskDialog(can.ToString());
                    try
                    {
                        InstanceVoidCutUtils.AddInstanceVoidCut(doc, wall, instance);
                    }
                    catch (InvalidOperationException e)
                    {
                        Console.WriteLine(e);
                        continue;
                    }

                }

                trans.Commit();
            }
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您好!要在Revit中进行二次开发创建一条模型线,您可以按照以下步骤进行操作: 1. 首先,确保您已经安装了Revit软件并具备开发环境,例如Visual Studio。 2. 在Visual Studio中创建一个新的Revit插件项目。 3. 在项目中添加对Revit API的引用。右击项目名称,选择"添加引用",然后浏览到Revit安装目录下的"RevitAPI.dll"和"RevitAPIUI.dll"文件,将它们添加到项目中。 4. 打开项目的主类文件(通常是命名为"Command.cs"或类似的名称),在类的方法中添加创建模型线的代码。例如,您可以使用以下代码创建一条水平线: ```csharp public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) { // 获取Revit文档 Document doc = commandData.Application.ActiveUIDocument.Document; // 创建点 XYZ startPoint = new XYZ(0, 0, 0); XYZ endPoint = new XYZ(10, 0, 0); // 开始事务 using (Transaction trans = new Transaction(doc, "Create Model Line")) { trans.Start(); // 创建直线 Line line = Line.CreateBound(startPoint, endPoint); SketchPlane sketchPlane = SketchPlane.Create(doc, Plane.CreateByNormalAndOrigin(XYZ.BasisZ, XYZ.Zero)); ModelCurve modelCurve = doc.Create.NewModelCurve(line, sketchPlane); // 结束事务 trans.Commit(); } return Result.Succeeded; } ``` 请注意,这只是一个示例代码片段,您可能需要根据您的具体需求进行修改。 5. 编译并运行项目,然后在Revit中加载并执行插件。您应该能够看到创建模型线。 希望这能帮助到您!如果您有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值