具体API可以查阅官方文档,这里提供剪切的关键词Void
总述
应用场景
在实际项目中,想要做一个族剪切构件,需要创建一个空心拉伸,然后执行剪切命令剪切掉我们希望剪切的模型构件
在算量的时候应用比较广执行连接/剪切命令,或者实际工程中的连接顺序
或是在精度要求高或者业主拖着不给结算的项目中也会出现一些稀奇古怪的要求,比如我遇到这个结构梁剪切建筑墙
基本逻辑
- 首先将结构链接模型中的结构梁的Solid取出
- 获取所有墙,与上一步获取的结构梁Solid做交集,取出相交Solid
- 第二步会产生两个方向
[ ] 每个InsertSolid都作为一个族生成
[x] 合并成一个大的InsetSolid几何,在一个族中执行相应的名称分别创建 - 生成空心形体之后(我这里使用的空心拉伸)修改族参数(加载时剪切的空心)到族中,这一步网络上的都是手动改无法契合这个功能的要求,所以下面我会提供一段代码
- 放置到指定位置执行构件间剪切的操作
- 完成
创建空心族
创建族文件
这一步代替的实际操作就是 File ->New File -> Category的操作,我们获取到族文档才能在文档中绘制形状和修改参数
我这里创建的是一个公制常规模型的族
var app = commandData.Application.Application;
var rfaDoc = app
.NewFamilyDocument(@"C:\ProgramData\Autodesk\RVT 2019\Family Templates\Chinese\公制常规模型.rft");
创建空心拉伸
- 这里用到的命令获取solids的交集
var insert = BooleanOperationsUtils
.ExecuteBooleanOperation(wallSolid, solid, BooleanOperationsType.Intersect);
- 因为族中无法指定将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);
修改族参数 加载时剪切的空心
参数位置
这里我们需要先看一下族中每个数据代表的内容
- Family Type [Family Symobl]
可以使用下面的命令创建,我们创建后就可以在里面添加一个参数比如材质
rfaDoc.FamilyManager.NewType("111")
我们在族中做的标注想要连接到这里面可以使用
AssociateElementParameterToFamilyParameter(
Autodesk.Revit.DB.Parameter elementParameter,
FamilyParameter familyParameter)
连接到族参数中,这样就可以在项目文件中修改参数。
2. Family Parameters
此处族参数指的是上面Family Type的一些族参数,但是无法获取到我们希望修改的参数
- 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();
}