RevitAPI: 新建系统族类型并创建族实例

本文介绍如何使用Revit API创建系统族实例,具体演示了复制现有墙类型并创建新的墙实例的过程。通过使用WallType的Duplicate方法创建新的墙类型,并通过Wall.Create方法将新类型应用于实际墙体创建。

昨天有客户问到如何通过API实现下面的步骤:

1. 新建一个系统族,并修改参数

2. 使用该系统族创建一个族实例,例如创建墙。

回答:

1. 新建族实例我们可以使用ElementType.Duplicate(string)方法,因为系统族是不允许用户创建的,我们只能复制一个。

2. 创建系统族可以使用形如Wall.Create方法或者Document.Create.NewFloor这样的方法。

下面是复制墙类型并创建墙的例子:

public static Document RevitDoc;
public static Autodesk.Revit.ApplicationServices.Application RevitApp;
public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
{
    RevitApp = commandData.Application.Application;
    var uiDoc = commandData.Application.ActiveUIDocument;
    if (uiDoc == null)
    {
        message = "Please open a document";
        return Result.Failed;
    }

    RevitDoc = commandData.Application.ActiveUIDocument.Document;
    var uiSel = commandData.Application.ActiveUIDocument.Selection;

    Transaction transaction = new Transaction(RevitDoc, "TestScript.CreateNewInstanceWithNewType");
    transaction.Start();
    try
    {
        var typeFilter = new ElementClassFilter(typeof(WallType));
        FilteredElementCollector wallTypes = new FilteredElementCollector(RevitDoc);
        wallTypes = wallTypes.WherePasses(typeFilter);
        WallType walltype = null;
        foreach (WallType wallType in wallTypes)
        {
            walltype = wallType;
            break;
        }
        if (walltype != null)
        {
            //创建新的墙类型,使用Duplicate方法
            var newtype = walltype.Duplicate(walltype.Name + "_new");

            //可以在这里修改墙类型的参数,例如修改吸收率
            var para = walltype.get_Parameter(BuiltInParameter.ANALYTICAL_ABSORPTANCE);
            if (para != null && para.StorageType == StorageType.Double && para.IsReadOnly == false)
            {
                para.Set(2.0);
            }

            //找到一个标高
            Level level = null;
            var levelFilter = new ElementClassFilter(typeof(Level));
            FilteredElementCollector levels = new FilteredElementCollector(RevitDoc);
            levels = levels.WherePasses(levelFilter);
            foreach (Level element in levels)
            {
                level = element;
                break;
            }

            //创建墙
            var wall = Wall.Create(RevitDoc, Line.CreateBound(new XYZ(0, 0, 0), new XYZ(10, 0, 0)), 
                newtype.Id, level.Id, 20, 0, false, false);
            TaskDialog.Show("wall creation", "wall created, id = " + wall.Id);
        }
        transaction.Commit();
    }
    catch (Exception ex)
    {
        message = ex.ToString();
        transaction.RollBack();
        return Result.Failed;
    }

    return Result.Succeeded;
}


### 使用Revit API创建定义 通过Revit API进行二次开发,可以实现自动化创建和修改的功能。以下是关于如何利用Revit API创建定义的相关说明。 #### 1. 自定义的概念 在Revit中,分为三种主要类型系统、标准构件和内建[^3]。对于开发者而言,通常会关注标准构件和内建创建与修改。标准构件可以在项目之外单独存在被重复使用,而内建则限定于单个项目中。 #### 2. 开发环境准备 为了使用Revit API进行开发,需完成以下准备工作: - 安装适用于目标版本的Revit软件及其SDK(Software Development Kit)。 - 配置开发环境,推荐使用Visual Studio作为IDE,安装必要的.NET框架支持。 - 熟悉Revit API的核心组件,包括`RevitAPI.dll`和`RevitAPIUI.dll`两个核心库文件[^1]。 #### 3. 创建定义的过程 下面是一个简单的流程描述,展示如何通过Revit API创建一个新的: ##### (a) 新建实例 首先需要调用Revit API的方法来启动一个新创建过程。这一步类似于手动操作中的“新建”选项。 ```csharp // 获取当前文档对象 Document doc = this.ActiveUIDocument.Document; // 调用方法创建新的模板 FamilyTemplateSelector fts = new FamilyTemplateSelector(); if (!fts.ShowDialog()) { return; } // 加载选定的模板 Family family = fts.GetSelectedTemplate(doc); ``` 上述代码片段展示了如何弹出模板选择窗口,加载所选模板以初始化新的对象[^4]。 ##### (b) 添加几何图形 一旦有了基础的结构,就可以向其中添加具体的几何形状或其他属性。例如绘制矩形或圆柱体等基本实体。 ```csharp using Autodesk.Revit.DB; ... Transaction trans = new Transaction(doc, "Create Geometry"); trans.Start(); // 示例:创建立方体 XYZ pointA = new XYZ(0, 0, 0); XYZ pointB = new XYZ(5, 5, 5); Solid solidCube = GeometryCreationUtilities.CreateBox(pointA, pointB); doc.FamilyManager.AddMember(solidCube); trans.Commit(); ``` 此部分涉及到了事务管理机制,任何对模型数据的操作都必须包裹在一个有效的事务当中。 ##### (c) 设置参数 除了视觉上的表现形式外,还需要为该设置一些有意义的参数以便后续应用时能够灵活调整尺寸大小等功能特性。 ```csharp Parameter paramLength = doc.FamilyManager.AddParameter( "Length", BuiltInParameterGroup.PG_GEOMETRY, true); paramLength.Set(5); // 单位取决于项目的度量单位设定 Parameter paramWidth = doc.FamilyManager.AddParameter( "Width", BuiltInParameterGroup.PG_GEOMETRY, true); paramWidth.Set(3); ``` 这里演示了怎样新增用户可编辑类型的参数,赋予初始值。 #### 4. 测试与部署 完成编码之后,应该充分测试生成的结果是否满足预期需求。最后打包成插件分发给其他使用者或者集成至更大的工作流之中[^2]。 --- ###
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值