批量生成墙的装饰面,自动连接,先看成果,通过这个方法还可以扩展梁、板、基础的装修面, 用来出装修的装饰装修的量,扩展就留给你们吧。
直接上代码
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
UIApplication uiapp = commandData.Application;
UIDocument uidoc = uiapp.ActiveUIDocument;
Document doc = uidoc.Document;
var sel = uidoc.Selection;
try
{
// 批量选择墙
var walls = sel.PickObjects(ObjectType.Element).Select(doc.GetElement).OfType<Wall>().ToList();
var wallsolids = walls.Select(x => x.GetElementSolids().FirstOrDefault()).ToList();
Solid unionsolid = null;
for (int i = 0; i < wallsolids.Count; i++)
{
if (wallsolids.Count - 1 == i)
break;
Solid solid = wallsolids[i];
if (unionsolid == null)
unionsolid = solid;
var nextsolid = wallsolids[i + 1];
unionsolid = BooleanOperationsUtils.ExecuteBooleanOperation(unionsolid,nextsolid, BooleanOperationsType.Union);//墙体实体合并
}
var solidfaces = unionsolid.GetSolidFaces()
.OfType<PlanarFace>()
.ToList()
.FindAll(x => !(x.FaceNormal.IsAlmostEqualTo(XYZ.BasisZ, 0.001) || x.FaceNormal.IsAlmostEqualTo(-XYZ.BasisZ, 0.001)));//获取合并墙的Solid所有面,然后排除上下面
using (Transaction trans = new Transaction(doc, "Create Wall face"))
{
trans.Start();
foreach (PlanarFace Planarface in solidfaces)
{
foreach (EdgeArray edgeloops in Planarface.EdgeLoops)
{
List<Curve> curves = new List<Curve>();
foreach (Edge item in edgeloops)
{
curves.Add(item.AsCurve());
}
//创建墙
var level = doc.GetElements<Level>(x => x is Level).FirstOrDefault();
ElementId walltypeId = new ElementId(407058);//墙类型ID
Wall wall = Wall.Create(doc, curves, walltypeId, level.Id, false);// 创建墙
ElementTransformUtils.MoveElement(doc, wall.Id, Planarface.FaceNormal.Multiply(wall.Width / 2));//偏移墙位置
}
}
trans.Commit();
}
}
分享一个自制Revit插件,本人是个BIM工程师,该插件是根据自己做工程一些经验和对插件功能的频繁度,自己整合开发功能,初衷是提高效率。
目前MagicTools的功能包括通用功能、土建、机电、审图、出图功能。还有好多功能都想做,如果有好的需求也可以提,后续有新增继续增加上去,努力弄个实用的插件,希望能帮到真正有需要的BIMer。
如有需要的可以加企鹅群:630552940
插件下载地址,免费试用
链接:https://pan.baidu.com/s/1GDnHeWwZ5r_HrnT3Mo7twA?pwd=jhlt
提取码:jhlt