1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Revit二次开发——结构模型构件自动扣减

Revit二次开发——结构模型构件自动扣减

时间:2018-09-29 21:18:15

相关推荐

Revit二次开发——结构模型构件自动扣减

**Revit二次开发实例——模型自动扣减**

本文章来源于微信公众号 '有福BIM’

有福BIM的第四篇原创文章!

阅读前望知悉:

我晓得各位读者和粉丝中不乏C#二开大佬

有福作为一个二开新手(编程泥腿子)

自知对编程的语法或定义的理解浅薄

故此文不敢称之‘教程’

仅作为‘技术分享’与‘学习笔记’之类尚可

这个系列被我称为《零基础Revit二次开发》

可有意思的事

从另一个角度来看

真正的零基础(不会C#、没有任何编程经验、Revit不熟悉)

是不可能搞好二次开发的

有福会在这里分享 有福插件 所有的源代码

并附详细注释供有需者参考

照抄代码也可实现目标功能是我所能保证的?️

而进行二开前的一些准备工作(开发环境部署、vs安装)等请自行上网搜索

(我始终认为这会过滤出一批真正想做好二开的有追求的的BIM狗子)

有福这里就不拉家常了

主程序代码分为A、B两部分

A

//有福提示!!!//以下代码中,‘//’后面的文字内容为注释部分,注释中有‘**’的表示编程所必须(照抄即可)using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Autodesk.Revit;using Autodesk.Revit.DB;using Autodesk.Revit.UI;using Autodesk.Revit.ApplicationServices;using Autodesk.Revit.Attributes;using System.Windows.Forms;using Application = Autodesk.Revit.ApplicationServices.Application;//**以上为引用(编程所必须)namespace LianJie//**新建一个命名空间 ‘LianJie’(名字可自行设定){[Transaction(TransactionMode.Manual)]//**设定事务为手动更新public class LianJcom : IExternalCommand//**实现外部命令的接口{public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)//**实现 Execute 方法重载{UIApplication uiApp = commandData.Application;Autodesk.Revit.ApplicationServices.Application app = uiApp.Application;Document doc = uiApp.ActiveUIDocument.Document;//**以上三行为获取DB级别和UI级别文档(以后会经常见到)Transaction trans = new Transaction(doc, "LianJie");//新建一个事务trans.Start();//开始事务

这里会弹出一个对话框与用户交互(弹出窗口的代码部分见C)

B

Form1 form1 = new Form1();//运行弹出窗口程序if (form1.ShowDialog() == DialogResult.OK)//将窗口输入的内容返回到主程序{}string loucen=form1.str;//将窗口输入内容赋值给新建的变量 ‘loucen’//获得所有结构柱图元FilteredElementCollector JGZfilteredElements = new FilteredElementCollector(doc);//新建一个收集器 ‘JGZfilteredElements’JGZfilteredElements.OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_StructuralColumns);//对所有图元应用过滤器‘.OfClass(typeof(FamilyInstance))’和‘.OfCategory(BuiltInCategory.OST_StructuralColumns)’//得到所有的结构柱图元,并存到收集器中var strcloumnElement = from element in JGZfilteredElementswhere element.get_Parameter(BuiltInParameter.DOOR_NUMBER).AsString() == loucenselect element;IList<Element> strcloumn = strcloumnElement.ToList<Element>();//得到所有标记值为‘loucen’的结构柱//以上前三行为LINQ语法,从所有结构柱图元中获取 标记值 等于 窗口输入值 的图元//意思是柱子的标记如果是‘1’,那么在窗口输入‘1’的话,这个柱子会被过滤出来//获得所有结构板图元(同获得所有结构柱图元)FilteredElementCollector BfilteredElements = new FilteredElementCollector(doc);BfilteredElements.OfClass(typeof(Floor));var strfloorElement = from element in BfilteredElementswhere element.get_Parameter(BuiltInParameter.DOOR_NUMBER).AsString() == loucenselect element;IList<Element> floor = strfloorElement.ToList<Element>();//获得所有梁图元(同获得所有结构柱图元)FilteredElementCollector LfilteredElements = new FilteredElementCollector(doc);LfilteredElements.OfClass(typeof(FamilyInstance)).OfCategory(BuiltInCategory.OST_StructuralFraming);var strframingElement = from element in LfilteredElementswhere element.get_Parameter(BuiltInParameter.DOOR_NUMBER).AsString() == loucenselect element;IList<Element> beam = strframingElement.ToList<Element>();//获得所有墙图元FilteredElementCollector QfilteredElements = new FilteredElementCollector(doc);QfilteredElements.OfClass(typeof(Wall));var wallElement = from element in QfilteredElementswhere element.get_Parameter(BuiltInParameter.DOOR_NUMBER).AsString() == loucenselect element;IList<Element> wall = wallElement.ToList<Element>();//(以上部分同获得所有结构柱图元)IList<Element> strwall = new List<Element>();//新建一个结构墙存储集合IList<Element> arcwall = new List<Element>();//新建一个建筑墙存储集合foreach (Element wall1 in wall)//遍历每一个墙{string strwallparameter = wall1.get_Parameter(BuiltInParameter.WALL_STRUCTURAL_SIGNIFICANT).AsValueString();//得到墙的‘BuiltInParameter.WALL_STRUCTURAL_SIGNIFICANT’属性(是否为结构)赋值给变量 ‘strwallparameter’if (strwallparameter == "是")//属性值为‘是’,将这个墙图元放到结构墙存储集合中strwall.Add(wall1);else//否则放到建筑墙存储集合arcwall.Add(wall1);}MessageBox.Show("该层模型共包含有:\n" + strcloumn.Count + "个结构柱\n" + floor.Count + "个结构板\n" + beam.Count + "个结构梁\n" + strwall.Count + "个结构墙\n" + arcwall.Count + "个建筑墙\n接下来有福会进行自动扣减,请耐心等待...");//弹出对话框//结构柱扣结构板foreach (Element strcloumn1 in strcloumn)//遍历,从结构柱存储集合取出每一个结构柱{foreach (Element floor1 in floor)//遍历,从板存储集合取出每一个板{QJ(doc, strcloumn1, floor1);//调用‘QJ’方法(在末尾),‘QJ’方法的功能是连接并扣减模型}}//结构柱扣梁(同结构柱扣结构板)foreach (Element strcloumn1 in strcloumn){foreach (Element beam1 in beam){QJ(doc, strcloumn1, beam1);}}//结构柱扣墙(同结构柱扣结构板)foreach (Element strcloumn1 in strcloumn){foreach (Element wall1 in wall){QJ(doc, strcloumn1, wall1);}}//结构墙扣板(同结构柱扣结构板)foreach (Element strwall1 in strwall){foreach (Element floor1 in floor){QJ(doc, strwall1, floor1);}}//结构墙扣梁(同结构柱扣结构板)foreach (Element strwall1 in strwall){foreach (Element beam1 in beam){QJ(doc, strwall1, beam1);}}//结构墙扣建筑墙(同结构柱扣结构板)foreach (Element strwall1 in strwall){foreach (Element arcwall1 in arcwall){QJ(doc, strwall1, arcwall1);}}//结构板扣梁(同结构柱扣结构板)foreach (Element floor1 in floor){foreach (Element beam1 in beam){QJ(doc, floor1, beam1);}}//板扣建筑墙(同结构柱扣结构板)foreach (Element floor1 in floor){foreach (Element arcwall1 in arcwall){QJ(doc, floor1, arcwall1);}}//梁扣建筑墙(同结构柱扣结构板)foreach (Element beam1 in beam){foreach (Element arcwall1 in arcwall){QJ(doc, beam1, arcwall1);}}MessageBox.Show("***************************\n该楼层构件已自动扣减完成.\n***************************\n此插件为 有福BIM 原创,完全免费,用于行业内技术交流\n如发现Bug或有功能优化建议可联系\n*微信号*qq1198677516\n*QQ号*1198677516\n*邮箱*1198677516@qq,com");//弹出对话框mit();//结束事务并提交return Result.Succeeded;//若成功执行则返回结果并结束程序}//‘QJ’方法,被主程序调用public void QJ(Document doc,Element a,Element b)//被调用的扣减程序{if (JoinGeometryUtils.AreElementsJoined(doc, a, b))//判断a、b是否连接(例:结构柱扣梁中,a、b在这里代表的是结构柱与梁){JoinGeometryUtils.UnjoinGeometry(doc, a, b);//a、b若已经连接则取消连接}try{JoinGeometryUtils.JoinGeometry(doc, a, b);//连接a、bif (!JoinGeometryUtils.IsCuttingElementInJoin(doc, a, b))//判断扣减效果是否为a扣减b(前面的会扣减后面的){JoinGeometryUtils.SwitchJoinOrder(doc, a, b);//否则的话则转换为a扣减b}}catch (Exception e){}}//调用结束,返回扣减成功的命令} }

这里是主程序代码华丽的分割线

以下是弹出窗口的代码部分

C

using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace LianJie//将命名空间名称改为一致{public partial class Form1 : System.Windows.Forms.Form{public Form1(){InitializeComponent();}//以上均为默认public string str;//设置一个传出变量(‘sttr’内的值会传回给主程序)string s1 = "这里输入标记栏内的楼层编码";//为变量s1赋值(文本框会灰色显示这个内容)public void Form1_Load(object sender, EventArgs e)//对话框主体设置(这部分可以最后看){this.textBox1.Text = s1;//文本框默认的内容为s1this.textBox1.MouseClick += textBox1_MouseClick;//设置鼠标点击时触发的事件this.textBox1.Leave += textBox1_Leave;//设置鼠标离开时触发的事件this.AcceptButton = button1;button1.Text = "确定";//将按钮命名为‘确定’并显示名称}public void Button1_Click(object sender, EventArgs e)//对话框内按钮设置{this.DialogResult = DialogResult.OK;str = textBox1.Text;//点击按钮时,将文本框中输入的内容传回主程序this.Close();//结束窗口}public void TextBox1_TextChanged(object sender, EventArgs e)//对话框内文本框设置{}void textBox1_MouseClick(object sender, MouseEventArgs e)//当鼠标点击文本框时的设置{if (this.textBox1.Text.Trim() == s1)//文本框内默认灰色显示s1{this.textBox1.Text = "";//鼠标点击时文本框清除默认值}}void textBox1_Leave(object sender, EventArgs e)//当鼠标离开文本框时的设置{if (this.textBox1.Text.Trim() == "")//鼠标离开文本框时{this.textBox1.Text = s1;//将输入的内容赋值给s1}}}}

担心大家搞不清楚窗口部分代码中的命名关系

最后po一张弹出窗口的设计图

文本框、按钮的名称同窗口代码注释

最最后

还是欢迎大佬多提意见

有福都真诚的欢迎且期待…

声明:

有福BIM致力于建筑行业内BIM基础软件、零基础Dyanmo、零基础BIM二次开发等知识的传播和…额…传播

为了建筑业信息化

有福将不懈努力

本文章来源于微信公众号 '有福BIM’

关注获取更多免费插件和二开实例教程!!!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。