前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Revit二次开发——创建墙体(2)(第十一期)

Revit二次开发——创建墙体(2)(第十一期)

作者头像
一席青衣卧龙城
发布2022-04-21 12:13:08
6100
发布2022-04-21 12:13:08
举报
文章被收录于专栏:Revit二次开发

上一期我们学了一下最简单的墙体创建的代码,这期我们来学复杂的墙体创建,我们学习二次开发的原因就是要辅助设计提高效率,翻模的话能够插件自动翻模,因此我们的墙体不可能会是默认墙体那么简单,需要有各种不同的尺寸,不同的样子,好了不多说我们开始学习吧。


接着上期来说,我们来学墙体的第三个重载方法Create(Document, IList(Curve), ElementId, ElementId, Boolean),相信这个就已经能满足大部分的墙体需求了,再过复杂的墙体不多,一般我们手动去画会更快捷。

下面讲一下我们需要的几种材料吧:

1.Document doc在模板里已经有了,不多说了。

2. IList(Curve),需要我们准备墙的曲线:

代码语言:javascript
复制
 IList<Curve> cu = new List<Curve>();//墙的线条
            cu.Add(Line.CreateBound(new XYZ(100, 20, 0), new XYZ(100, -20, 0)));//线条
            cu.Add(Line.CreateBound(new XYZ(100, -20, 0), new XYZ(100, -20, 10)));
            cu.Add(Line.CreateBound(new XYZ(100, -20, 10), new XYZ(100, 20, 10)));
            cu.Add(Line.CreateBound(new XYZ(100, 20, 10), new XYZ(100, 20, 0)));

3. 这里第一个ElementId 是WalltypeId 需要一个墙类型的ID,只要我们建好的墙类型都存储在doc里,我们只要按类别去把它挑选出来就可以了:

代码语言:javascript
复制
 FilteredElementCollector fill = new FilteredElementCollector(doc);
            fill.OfClass(typeof(WallType));
            ElementId idd = null;//记录墙的ID
            foreach (WallType wa in fill)//查找墙的类型
            {
                if (wa.FamilyName.Contains("基本墙")&&wa.Width*304.8==200)//找到基本墙且墙宽200
                {
                    idd = wa.Id;//记录墙的类型
                }
            }

4.ElementId,是需要levelId,在上期我们已经讲过了代码如下:

代码语言:javascript
复制
 FilteredElementCollector fil = new FilteredElementCollector(doc);
            fil.OfClass(typeof(Level));
  foreach (Level ll in fil)//找标高
            {
                if (ll.Name.Contains("一层"))//找到一层标高
                {
                    ElementId id = new ElementId(ll.Id.IntegerValue);//记录标高ID
}
5.Boolean  是否是结构,我们选 false,也和上期一样,我们不需要做结构受力分析所以选择否。

后面我们就把代码串起来:

代码语言:javascript
复制
FilteredElementCollector fil = new FilteredElementCollector(doc);
            fil.OfClass(typeof(Level));
            FilteredElementCollector fill = new FilteredElementCollector(doc);
            fill.OfClass(typeof(WallType));
            ElementId idd = null;//记录墙的ID
            foreach (WallType wa in fill)//查找墙的类型
            {
                if (wa.FamilyName.Contains("基本墙")&&wa.Width*304.8==200)//找到基本墙且墙宽200
                {
                    idd = wa.Id;//记录墙的类型
                }
            }
            IList<Curve> cu = new List<Curve>();//墙的线条
            cu.Add(Line.CreateBound(new XYZ(100, 20, 0), new XYZ(100, -20, 0)));//线条
            cu.Add(Line.CreateBound(new XYZ(100, -20, 0), new XYZ(100, -20, 10)));
            cu.Add(Line.CreateBound(new XYZ(100, -20, 10), new XYZ(100, 20, 10)));
            cu.Add(Line.CreateBound(new XYZ(100, 20, 10), new XYZ(100, 20, 0)));
            foreach (Level ll in fil)//找标高
            {
                if (ll.Name.Contains("一层"))//找到一层标高
                {
                    ElementId id = new ElementId(ll.Id.IntegerValue);//记录标高ID
                    Wall wa = Wall.Create(doc, cu,idd, id, false);//画墙
                }
            }

运行一下效果:

可以看见是基本墙200在一层标高处绘制,墙的线型轮廓可以随便改哦。注意:如果你筛选墙的ID发生错误,请检查你的墙筛选的条件是否符合多个墙的要求,调试找出错误是学习快速进步的一个方法哦。


一纸清墨书过往,谁人勘破这离殇。

精讲Revit二次开发,望与君交。


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精讲Revit二次开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档