以下是在revit中C#编写的创建结构柱的代码,支持在当前平面鼠标选取任意点创建结构柱,并可持续创建多个结构柱,直到监测到用户使用esc退出。

using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.UI.Selection;

[Transaction(TransactionMode.Manual)]
public class CreateColumnCommand : IExternalCommand
{
    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        UIApplication uiApp = commandData.Application;
        UIDocument uiDoc = uiApp.ActiveUIDocument;
        Document doc = uiDoc.Document;
        
        // 获取当前视图的标高
        View view = uiDoc.ActiveView;
        Level level = doc.GetElement(view.GenLevelId) as Level;
        double elevation = level.ProjectElevation;

        // 创建事务
        Transaction trans = new Transaction(doc, "Create Column");
        trans.Start();

        try
        {
            // 创建结构柱
            FamilySymbol columnSymbol = GetColumnSymbol(doc);
            Reference reference = uiDoc.Selection.PickObject(ObjectType.PointOnElement, "Pick a point to place column");
            XYZ point = reference.GlobalPoint;
            FamilyInstance column = doc.Create.NewFamilyInstance(point, columnSymbol, level, StructuralType.Column);

            // 设置结构柱的顶部高度
            Parameter elevationParam = column.get_Parameter(BuiltInParameter.SCHEDULE_LEVEL_PARAM);
            elevationParam.Set(elevation + level.Elevation);

            // 提交事务
            trans.Commit();
        }
        catch (Autodesk.Revit.Exceptions.OperationCanceledException)
        {
            // 如果用户取消操作,则回滚事务
            trans.RollBack();
            return Result.Cancelled;
        }

        return Result.Succeeded;
    }

    // 获取结构柱族类型
    private FamilySymbol GetColumnSymbol(Document doc)
    {
        FilteredElementCollector collector = new FilteredElementCollector(doc);
        collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralColumns);
        FamilySymbol symbol = collector.FirstElement() as FamilySymbol;

        return symbol;
    }
}

要使代码支持连续创建多个结构柱,可以在创建单个结构柱后继续循环执行创建结构柱的代码,直到用户使用esc退出循环。

using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.UI.Selection;

[Transaction(TransactionMode.Manual)]
public class CreateColumnCommand : IExternalCommand
{
    public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
    {
        UIApplication uiApp = commandData.Application;
        UIDocument uiDoc = uiApp.ActiveUIDocument;
        Document doc = uiDoc.Document;
        
        // 获取当前视图的标高
        View view = uiDoc.ActiveView;
        Level level = doc.GetElement(view.GenLevelId) as Level;
        double elevation = level.ProjectElevation;

        // 循环创建结构柱
        while (true)
        {
            // 创建事务
            Transaction trans = new Transaction(doc, "Create Column");
            trans.Start();

            try
            {
                // 创建结构柱
                FamilySymbol columnSymbol = GetColumnSymbol(doc);
                Reference reference = uiDoc.Selection.PickObject(ObjectType.PointOnElement, "Pick a point to place column");
                XYZ point = reference.GlobalPoint;
                FamilyInstance column = doc.Create.NewFamilyInstance(point, columnSymbol, level, StructuralType.Column);

                // 设置结构柱的顶部高度
                Parameter elevationParam = column.get_Parameter(BuiltInParameter.SCHEDULE_LEVEL_PARAM);
                elevationParam.Set(elevation + level.Elevation);

                // 提交事务
                trans.Commit();
            }
            catch (Autodesk.Revit.Exceptions.OperationCanceledException)
            {
                // 如果用户取消操作,则回滚事务
                trans.RollBack();
                break;
            }
        }

        return Result.Succeeded;
    }

    // 获取结构柱族类型
    private FamilySymbol GetColumnSymbol(Document doc)
    {
        FilteredElementCollector collector = new FilteredElementCollector(doc);
        collector.OfClass(typeof(FamilySymbol)).OfCategory(BuiltInCategory.OST_StructuralColumns);
        FamilySymbol symbol = collector.FirstElement() as FamilySymbol;

        return symbol;
    }
}
在revit中C#写的在当前平面鼠标选取任意点创建当前平面到上层平面的结构柱的代码可以持续创建多个结构柱直到监测到用户使用esc退出

原文地址: https://www.cveoy.top/t/topic/bqla 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录