Revit二开--一键楼板功能 全解析 带源码

BIM Revit新功能“一键生成楼板”神器上线 新功能「一键生成板」智能插件,墙梁柱自动识别,闭合区域秒建楼板!"原本需要2小时的楼板建模,现在10分钟搞定!如果你正在寻找提效的工具,希望这个免费的功能商店能帮到你。"框选功能太实用了,特别是处理异形结构时" —— 某总承包单位BIM工程师。√ 20+楼板类型库 √ 结构属性开关 √ 高程偏移设置 √ 剖切面定位。点选创建楼板时,建议开启裁剪视图,减少当前视图中的可见实例的数量。自动捕捉墙/梁/柱形成的闭合区域,支持结构与非结构板识别。 阅读详情

Revit二开--一键楼板功能 全面解析


之前很多朋友问我 一键楼板的功能怎么做,今天有点时间把源码放出来。
github 地址: https://github.com/binbinstrong/tangsengjiewa

    /// <summary>
    /// 一键楼板
    /// </summary>
    namespace 唐僧解瓦.建筑
{
    /// <summary>
    /// 一键楼板
    /// </summary>
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    [Journaling(JournalingMode.UsingCommandData)]
    class Cmd_CreateFloorQukly : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIApplication uiapp = commandData.Application;
            UIDocument uidoc = uiapp.ActiveUIDocument;
            Document doc = uidoc.Document;
            Selection sel = uidoc.Selection;
            var acview = doc.ActiveView;
            var beamrefs = sel.PickObjects(ObjectType.Element,
                doc.GetSelectionFilter(m => m.Category.Id.IntegerValue == (int)BuiltInCategory.OST_StructuralFraming),
                "选择生成板的梁");
            var beams = beamrefs.Select(m => m.GetElement(doc));
            Transaction temtran = new Transaction(doc, "temtran");
            temtran.Start();
            foreach (Element beam in beams)
            {
                var joinedelements = JoinGeometryUtils.GetJoinedElements(doc, beam);
                if (joinedelements.Count > 0)
                {
                    foreach (var id in joinedelements)
                    {
                        var temele = id.GetElement(doc);
                        var isjoined = JoinGeometryUtils.AreElementsJoined(doc, beam, temele);
                        if (isjoined)
                        {
                            JoinGeometryUtils.UnjoinGeometry(doc, beam, temele);
                        }
                    }
                }
            }
            temtran.RollBack();
            var solidss = new List<GeometryObject>();
            foreach (var element in beams)
            {
                solidss.AddRange(element.Getsolids());
            }
            var joinedsolid = MergeSolids(solidss.Cast<Solid>().ToList());
            var upfaces = joinedsolid.Getupfaces();
            var edgeArrays = upfaces.First().EdgeLoops.Cast<EdgeArray>().ToList();
            var curveloops = upfaces.First().GetEdgesAsCurveLoops();
            var orderedcurveloops = curveloops.OrderBy(m => m.GetExactLength()).ToList();
            orderedcurveloops.RemoveAt(orderedcurveloops.Count - 1);
            curveloops = orderedcurveloops;
            var curvearrays = curveloops.Select(m => m.ToCurveArray());
            doc.Invoke(m =>
            {
                foreach (var curvearray in curvearrays)
                {
                    doc.Create.NewFloor(curvearray, false);
                }
            }, "一键楼板");
            return Result.Succeeded;
        }
        public Solid MergeSolids(Solid solid1, Solid solid2)
        {
            var result = default(Solid);
            try
            {
                result = BooleanOperationsUtils.ExecuteBooleanOperation(solid1, solid2, BooleanOperationsType.Union);
            }
            catch (Exception e)
            {
                result = null;
            }
            return result;
        }
        public Solid MergeSolids(List<Solid> solids)
        {
            var result = default(Solid);
            foreach (var solid in solids)
            {
                if (result == null)
                {
                    result = solid;
                }
                else
                {
                    var temsolid = MergeSolids(result, solid);
                    if (temsolid == null) continue;
                    result = temsolid;
                }
            }
            return result;
        }
    }
    public static class TemUtils
    {
        public static List<Face> Getupfaces(this Solid solid)
        {
            var upfaces = new List<Face>();
            var faces = solid.Faces;
            foreach (Face face in faces)
            {
                var normal = face.ComputeNormal(new UV());
                if (normal.IsSameDirection(XYZ.BasisZ))
                {
                    upfaces.Add(face);
                }
            }
            return upfaces;
        }
        public static List<Face> Getupfaces(this GeometryObject geoele)
        {
            var solids = geoele.Getsolids();
            var upfaces = new List<Face>();
            foreach (var solid in solids)
            {
                var temupfaces = solid.Getupfaces();
                if (temupfaces.Count > 0)
                {
                    upfaces.AddRange(temupfaces);
                }
            }
            return upfaces;
        }
        public static List<Solid> Getsolids(this GeometryObject geoobj)
        {
            var solids = new List<Solid>();
            if (geoobj is Solid solid)
            {
                solids.Add(solid);
            }
            else if (geoobj is GeometryInstance geoInstance)
            {
                var transform = geoInstance.Transform;
                var symbolgeometry = geoInstance.SymbolGeometry;
                var enu = symbolgeometry.GetEnumerator();
                while (enu.MoveNext())
                {
                    var temgeoobj = enu.Current as GeometryObject;
                    solids.AddRange(Getsolids(temgeoobj));
                }
            }
            else if (geoobj is GeometryElement geoElement)
            {
                var enu = geoElement.GetEnumerator();
                while (enu.MoveNext())
                {
                    var temgeoobj = enu.Current as GeometryObject;
                    solids.AddRange(Getsolids(temgeoobj));
                }
            }
            return solids;
        }
        public static List<Solid> Getsolids(this GeometryObject geoobj, Transform trs)
        {
            var solids = new List<Solid>();
            if (geoobj is Solid solid)
            {
                if (trs != null || trs != Transform.Identity)
                {
                    solid = SolidUtils.CreateTransformed(solid, trs);
                }
                solids.Add(solid);
            }
            else if (geoobj is GeometryInstance geoInstance)
            {
                var transform = geoInstance.Transform;
                var symbolgeometry = geoInstance.SymbolGeometry;
                var enu = symbolgeometry.GetEnumerator();
                while (enu.MoveNext())
                {
                    var temgeoobj = enu.Current as GeometryObject;
                    solids.AddRange(Getsolids(temgeoobj, transform));
                }
            }
            else if (geoobj is GeometryElement geoElement)
            {
                var enu = geoElement.GetEnumerator();
                while (enu.MoveNext())
                {
                    var temgeoobj = enu.Current as GeometryObject;
                    solids.AddRange(Getsolids(temgeoobj, trs));
                }
            }
            return solids;
        }
        public static List<GeometryObject> Getsolids(this Element element)
        {
            var result = new List<GeometryObject>();
            var geometryEle = element.get_Geometry(new Options() { DetailLevel = ViewDetailLevel.Fine });
            var enu = geometryEle.GetEnumerator();
            while (enu.MoveNext())
            {
                var curGeoobj = enu.Current;
                result.AddRange(curGeoobj.Getsolids(Transform.Identity));
            }
            return result;
        }
        public static CurveArray ToCurveArray(this CurveLoop curveloop)
        {
            var result = new CurveArray();
            foreach (Curve c in curveloop)
            {
                result.Append(c);
            }
            return result;
        }
    }
}

  • 一键楼板功能效果
  • 在这里插入图片描述

更多revit二开知识 请关注 唐僧课堂
唐僧课堂BIM开发


在这里插入图片描述

Revit接入大模型:26个工具实现AI驱动BIM建模 在建筑信息模型(BIM)与人工智能深度融合的浪潮下,如何让自然语言直接驱动三维建模软件成为工程数字化领域的热门方向。大模型凭借强大的语义理解与函数调用能力,能够将“建一堵墙”这类模糊指令解析为精确的参数化操作,而工具调用架构则成为连接AI与专业软件的桥梁。通过将Revit的建模、查询、修改、族实例等能力封装为结构化工具接口,AI不仅能按需生成构件,还能在流程中自我纠错,大幅降低重复性劳动。这一技术路径在方案推敲、批量布设、标准族库复用等场景中展现出显著效率优势,为BIM流程智能化升级提供了可行范式。本文剖析 阅读详情

相关推荐

Revit开发实战代码包:参数驱动建模、钢筋自动布置、几何实时更新与智能标注功能源码

这套Revit插件开发资源包提供开箱即用的功能源码,覆盖结构设计与建模中的高频需求。包含参数批量更新模块(UpdateParameter),支持族类型与实例参数的联动修改;几何修改功能(UpdateGeometry)可响应参数变化实时调整构件形状与位置;钢筋建模相关源码(AreaReinCurve、Rebar、CreateComplexAreaRein等)实现复杂区域配筋、曲线布筋及钢筋描述生成;自动标注逻辑(AutoTagRooms)完成房间编号与信息标签一键生成;同时集成空间区域自动划分(AddSpac

metaverse5vr的博客 235

revit常用土建插件的【一键成板】功能,批量成板

  revit常用土建插件的【一键成板】功能,批量成板。   平时我们revit土建建模中,建立一些称重构件(柱,梁)之后就需要进行板的布置。往往都需要做到不与柱梁重合,当然了,基础地板和上部楼板这些除外。但是要每一块板都要重新绘制一遍生成,这样会话费大量的时间,工作效率低下,有没有一次性生成呢?   今天就和大家分享revit常用土建插件的【一键成板】功能,可以点击成板和批量成板,具体操作如下:   建模助手的土建模块 → 一键成板   1.点击【一键成板】功能   2.两种模式:①批.

zh_BIM的博客 1273

DWG图纸秒变Revit模型:自动识别墙柱板洞口,无需CAD环境

Manicotti插件直接读取AutoCAD DWG文件,不依赖CAD软件,就能在Revit里批量生成墙体、结构柱、楼板和门窗开口。它靠识别DWG里的图层名、线型闭合区域、文字标注等几何与语义信息,按预设规则自动映射成对应Revit构件,并支持自定义图层命名规范、构件类型匹配逻辑和尺寸容差设置。配套提供多个实测DWG样例(Link_demo.dwg、Link_floor.dwg等)、测试族文件(Column_demo.rfa)、Dynamo辅助脚本(Demo.dyn)以及可视化配置界面(Configurat

u9v0w的博客 289

Revit二次开发 ---->创建楼板面层

1.获取房间 2.获取房间边界 3.创建楼板 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Autodesk.Revit.ApplicationServices; using Autodesk.Revit.Attributes; using Autodesk.Revit.DB.Architecture;

左如意的博客 1420

Revit 2019.2 SDK官方案例147例:从环境搭建到源码实战的完整指南

在建筑工程数字化转型的背景下,Revit二次开发已成为提升BIM建模效率的关键技能。其核心原理是通过API与Revit文档交互,借助FilteredElementCollector等类实现图元的精准查询、批量修改与自动创建。掌握这些技术,工程师能快速构建批量建模、族库管理、模型检查等工具,极大降低重复劳动。无论是刚入门的新手还是进阶开发者,系统研读官方SDK中的案例源码都是最有效的学习路径。本文围绕Revit 2019.2 SDK中147个官方示例,从环境配置到核心代码解析,提供一套完整的啃透路线,助力读者

weixin_35433448的博客 206

Revit二次开发-取到楼板轮廓

Revit二次开发-通过Transaction.RollBack();取到楼板轮廓

【Revit二次开发】RevitAPI布尔运算错误及解决方法

解决RevitAPI中布尔运算容易出错的问题

ghxccn的博客 672

Revit二次开发-取到构件所有的面

Revit二次开发

revit二次开发——自动生成模板(结构柱)

将结构柱的模板自动生成自动切掉结构梁和结构板的部分。不多说了直接上代码。

canwhite的博客 1103

Revit 2019.2 二次开发官方案例+源代码,147例

Revit 2019.2 二次开发官方案例,147例,含源代码,Revit二次开发必备资源。

华为2288H-V5服务器做raid的详细步骤

操作步骤 服务器启动界面 按del键进入设置输入密码,2288H-v5默认密码是Admin@9000 移动光标选择device manager 驱动管理选择configurationutility 配置管理 选择main menu 主菜单 选择第一个 configuration management 配置管理 选择create virtual driver 创建虚拟驱动选择select RAID level 选择RAID等级选择level-5 选择select drivers 选择驱......

weixin_46041124的博客 1万+

Revit二开--划线切板功能源码

Revit二开–划线切板功能源码 前一篇博客划线切板功能解析介绍了划线切板功能,今天把源码补充上 在Revit使用过程中,版的切割对用户来说不是很容易,Revit原生功能在板的分割上并不是十分友好。今天我在这里分享 楼板分割的方法(天花板切割原理类似)。 1.鼠标点选楼板。 2.调用画线命令,绘制一条直线。 3.用绘制的直线切割楼板。 代码详见github:https://github.com...

binbinstrong的博客 1334

使用STC15F104W产生PWM脉冲

最近的小项目中使用到了STC15F104W产生PWM脉冲

yeats1989的专栏 1万+

Revit族剪切失效?建模助手一键剪切功能原理与实战

在BIM参数化建模中,族(Family)作为核心构件,其与主体图元(如墙、楼板)的剪切(Cut)关系是实现开洞、布尔运算等设计意图的关键。这一功能依赖于族底层预定义的剪切属性,若属性未启用,即使几何形状正确,族也无法执行剪切操作。理解这一原理对于解决日常建模中族“切不动”的痛点至关重要。通过Revit API直接读写族实例的剪切参数,可以绕过繁琐的族编辑器操作,实现批量、精准的属性修正。这种技术方案尤其适用于处理大量自定义族或复杂嵌套族,能显著提升建筑、机电、结构等专业在门窗开洞、管道穿墙、预留孔洞等场景下

weixin_33884611的博客 617

【四季发财中线】通达信炒股指标副图指标使用图文教程,短线紫色柱线操作,与中线短柱线共振抓牛股妖股主升浪

如上图标记位置,对应的是副图指标的紫色柱线开始的位置,这个紫色柱线信号开始出现,也是短线进场做多的信号,紫色柱线的持续出现和加长,可以持股待涨,或行情继续上涨的可以在分时行情中逢低进场短线顺势做多。如上图标记部分,指标的主要部分信号,三行柱线-ZR-ZC -ZM,当出现这三行信号时,中线或波段看多做多,信号持续则中线顺势做多和持股待涨。不论是跟踪信号的出现先后进场和持股,或是在中线多头的行情中,找到短线转多信号进场做安全的短线操作机会,都是非常好的指标信号和辅助操作功能。

weixin_69760830的博客 1600

GEE入门之路(从【初学者】角度,大白话)——附海面风速插值代码

非常初级的GEE入门教程!大白话!有手就行!附海面风速插值代码,克里金插值,时间插值。

weixin_46812066的博客 4084

如何快速实现Revit模型Web可视化?Revit2GLTF的终极指南

在建筑信息建模(BIM)领域,Autodesk Revit是广泛使用的工具,但将复杂模型高效展示在Web端一直是行业痛点。**Revit2GLTF**作为一款免费开源的转换工具,能帮助用户将Revit模型一键转换为Web友好的GLTF格式,轻松实现跨平台3D可视化。无论是设计师、开发者还是学生,都能通过它快速打通Revit与Web之间的数据壁垒。 ## ???? 为什么选择Revit2GLTF?核心...

gitblog_01157的博客 1134

AMCL实战:如何用2D激光雷达在ROS中实现稳定重定位(附参数调优指南)

本文深入解析了在ROS中使用2D激光雷达实现稳定AMCL重定位的实战技巧与参数调优指南。针对粒子发散、位姿跳变等常见问题,文章从算法核心原理出发,系统讲解了初始化、粒子滤波、运动与观测模型等关键参数的分类与调优策略,并提供了一套经过验证的调优框架,帮助开发者提升移动机器人在已知地图环境下的定位鲁棒性和稳定性。

sql99的博客 133

Revit开发之参数的修改实例

Revit中的参数修改要通过Parameter的Set方法来设置, 但是Set()里面传的参数类型是和Parameter的类型 有关系的,判断参数类型,可以通过 Parameter.StorageType 这里列举了 Parameter值的5中类型, 对于IsReadOnly的parameter 是不能修改的 对None的Parameter 是不能用Set方法来设值的 对Int

The_Eyes的博客 5140

图神经网络实战(8)——图注意力网络(Graph Attention Networks, GAT)

图注意力网络 (Graph Attention Networks, GAT) 是对图卷积网络 (Graph Convolutional Network, GCN) 的改进,提出了一种通过自注意力 (self-attention) 过程计算的加权因子,而不是使用静态的归一化系数。在本节中,我们介绍了 GAT 架构。通过从线性变换到多头注意力的四个主要步骤,了解了 GAT 的工作原理,并在 NumPy 中从零开始构建了 GAT 层。最后,将 GAT 模型应用于 Cora 和 CiteSeer 数据集。

盼小辉丶的博客 1万+

Android 车联网——CarAudioService介绍(六)

CarAudioService 是 Android Automotive OS 中的一个重要组件,用于管理车辆中的音频功能。它是 Android Auto 的一部分,负责处理车辆音频的播放、控制和路由。CarAudioService 使用标准的 Android 组件架构,基于 Binder 通信机制,提供了一组 API,用于管理车辆音频。它包括以下主要功能:音频路由管理:CarAudioService 可以让开发者控制音频的路由,即将音频发送到不同的输出设备,例如车辆的扬声器、耳机等。

小旭的专栏 3199

BIM Revit新功能“类型尺寸自动更新”直接重命名修改类型名称,构件尺寸自动更新

功能开启关闭可在功能商店中搜索 "类型尺寸自动更新" 功能。当类型名称符合规则可自动更新尺寸参数。更多AI、MCP功能等你呦~根据这个功能优化目前已支持。墙,楼板,结构柱,结构框架。这个基础功能及源码项目展示。运行功能后查看窗口状态。

ZOZO_888的博客 481

LeetCode 热题 100 回顾

力扣最受刷题发烧友欢迎的 100 道题 LeetCode 热题 100 : 题目回顾、解题思路、复杂度分析、代码实现、验证算法

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

解锁Rhino.Inside.Revit:BIM工作流效率倍增指南

🔍 **痛点**:面对复杂的项目目录结构,如何快速定位关键功能模块?哪些组件真正影响日常BIM工作流? ### 核心模块功能速查表 | 目录路径 | 核心功能 | 用户价值 | |---------|---------|---------| | **src/RhinoInside.Revit.Loader** | 双阶段加载器(Stage 1: Revit插件注册,Stage 2: Rhin

gitblog_00132的博客 770

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Revit免费获取完整版终极指南:如何安全入门BIM而不踩破解陷阱

很多建筑专业的学生和刚入行的设计师,第一次听说 Revit 时都会先被它的价格吓一跳。想要学习这款 BIM 行业标准软件,却又暂时拿不出订阅费,于是"Revit免费下载完整版"、"Revit破解版"这些词就成了大家搜索的热门。网上也确实有不少号称提供破解资源的仓库,比如我们今天要聊的 **Revit-crk**——它自称能帮你免费拿到完整版 Revit,但真相真的这么简单吗?这篇文章会带你认清这类

gitblog_00248的博客 480

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Revit SDK 介绍:DisplacementElementAnimation

这个例子介绍了如何用 Revit 的置换图元功能做动画。 置换图元仅仅是用来显示的,不会修改原始构件。 通过它可以为各个构件创建一个置换图元,可以通过修改图元的位置,达到下面的效果。 选中通过 RevitLookup 可以看到,置换图元有自己的类型,DisplacementElement: 例子中只针对五种类型的结构构件做了处理: 主要逻辑 步骤:接口: 创建置换图元,注意可以设置父子关系: 其他逻辑可以参考源码:Revit 2021 SDK\Samples\DisplacementElementAni

极客BIM工作室 427

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: Revit二开--框选三维功能 全面解析
下一篇: Revit二开--管线分段解密
binbinstrong
博客等级 码龄16年 317粉丝 56原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值