将结构柱的模板自动生成自动切掉结构梁和结构板的部分。不多说了直接上代码。
private double GetColumnTemplateArea(Element element)
{
Solid solidElem = GetElementSolid(element);//获取构件的Solid
List<Face> faceList = GetFacesFromSolid(solidElem);//获取Solid的所有的面
double TemplateArea = 0;//柱子模板的面积
using (var ts = new Transaction(doc, "创建模板"))
{
ts.Start();
//循环四个面对每个面都进行操作
foreach (var face in faceList)
{
var planarFace = face as PlanarFace;
//忽略掉顶面和底面
if (planarFace.FaceNormal.IsAlmostEqualTo(new XYZ(0, 0, 1))
|| planarFace.FaceNormal.IsAlmostEqualTo(new XYZ(0, 0, -1)))
{
continue;
}
//由face转变为拉伸所需要的截面profile
var profiles = planarFace.GetEdgesAsCurveLoops();
//生成拉伸体solid
var solid = GeometryCreationUtilities
.CreateExtrusionGeometry(profiles, planarFace.FaceNormal, 10 / 304.8);
//创建拉伸构件的类型
var ds = DirectShape.CreateElement(doc, new ElementId(-2000011));
//收集族和楼板和创建模板是否有接触
var collector = new FilteredElementCollector(doc).OfClass(typeof(FamilyInstance));
var collector2 = new FilteredElementCollector(doc).OfClass(typeof(Floor));
var solidFilter = new ElementIntersectsSolidFilter(solid);
collector.WherePasses(solidFilter);
collector2.WherePasses(solidFilter).ToElements().ToList();
//创建几个Soild周转和剪切出最后的Soild
Solid solid2 = null;
Solid solid3 = null;
if (collector.Count() > 0)
{
Solid solid1 = GetElementSolid((collector.First() as FamilyInstance));
solid2 = BooleanOperationsUtils.ExecuteBooleanOperation(solid, solid1, BooleanOperationsType.Difference);
}
if (collector2.Count() > 0)
{
List<Floor> floorList = collector2.OfClass(typeof(Floor)).Cast<Floor>().ToList();
foreach (var item in floorList)
{
Solid solid1 = GetElementSolid((item as Floor));
var ids = collector2.ToElementIds();
solid3 = BooleanOperationsUtils.ExecuteBooleanOperation(solid2, solid1, BooleanOperationsType.Difference);
solid2 = solid3;
}
}
//创建出模板,如果不创建屏蔽掉这一行或者不提交事件即可
ds.AppendShape(new List<GeometryObject> { solid2 });
//获取新的Solid的所有面
List<Face> solid2FaceList = GetFacesFromSolid(solid2);
//选出和柱子循环中同样向量的面把面积记录下来
foreach (PlanarFace S2face in solid2FaceList)
{
if (S2face.FaceNormal.IsAlmostEqualTo(planarFace.FaceNormal))
{
TemplateArea += S2face.Area;
break;
}
else
{
continue;
}
}
}
ts.Commit();
}
return TemplateArea;
}