Revit二次开发
中洲少年
一个深爱神国传统文化的男人,对身为神族人而骄傲。毕生为汉服复兴而努力。v:13535543524
展开
-
Revit二次开发,C#:gltf转glb格式,如何编译glTF-CSharp-Loader
问题:使用C#代码将.gltf格式如何转为.glb格式?本文先不讲如何转,先讲如何编译这个源码项目。将.gltf格式转.glb格式,需要用到一个gltfLoader的Nuget包。1.我们先下载这个源码包glTF-CSharp-Loader网址在:https://github.com/KhronosGroup/glTF-CSharp-Loader2.无法编译下载后,你会发现,无法直接编译通过。仔细阅读他的文档,他会告诉我们,需要先运行Generator项目,通过运行这个项目才会自动原创 2021-08-02 09:30:08 · 1677 阅读 · 1 评论 -
Revit二次开发,如何判断机械设备所属的专业类型
截止目前2021.7.12,我找遍全网,应该是没人说过这个问题。所以,你如果来到了这里,那么本文可能是你的唯一答案。在Revit中,是有很机械设备的,通常我们并不需要知道这些设备是属于什么专业的?但是万一你恰好需要知道呢?那如何判断呢?如下图,比如一台空调机,他的族分类是机械设备,你怎么判断他是属于“暖通”专业,还是属于“机电”专业呢?这里可以用到该族实例(FamilyInstance)的MEPModel属性。通过它的Domain属性,我们可以做一个大略的判断。如...原创 2021-07-12 18:45:25 · 792 阅读 · 0 评论 -
Revit二次开发,怎么判断2个向量之间是平行还是垂直?
已知向量a(x1,y1,z1)、b(x2,y2,z2)判断垂直,需要点积为0。公式为:a*b=x1x2+y1y2+z1z2=0在Revit中,原创 2021-06-01 11:36:38 · 1109 阅读 · 0 评论 -
Revit二次开发,如何解析系统族的几何信息?如墙、风管等
如何解析系统族的几何信息?如墙、风管等。一、系统族的继承特征系统族,如Wall、Duct等,它们有一个父级继承,就是都来自于HostObject,这可能就是系统族的标志。知道这个信息很有用。二、编写获取系统族的几何信息的代码Autodesk.Revit.DB.Options opt = new Options();SolidToMesh solidToMesh = new SolidToMesh();Autodesk.Revit.DB.GeometryElement geomEle原创 2021-05-26 14:58:33 · 578 阅读 · 0 评论 -
Revit二次开发,判断参数的值类型
怎么判断Revit的参数Parameter的值类型呢?方法一、通过StorageType判断,请看下图:使用StorageType,可以进行判断。StorageType一共分以下几种:None = 0,Integer = 1,Double = 2,String = 3,ElementId = 4从字面意思是比较好理解的。其中None的话,我也不知道在什么条件下触发。ElementId就是元素id,你可以当成是一个Int值。提供一个简单类: /// <summary原创 2021-05-26 09:45:09 · 555 阅读 · 0 评论 -
Revit二次开发,判断3点围绕方向是顺时针还是逆时针
已经空间任意3点a,b,c,如何判断他们的环绕顺序是顺时针还是逆时针呢?直接给出代码: /// <summary> /// 判断3点组成的方式是顺时针还是逆时针 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <param原创 2021-03-04 15:38:54 · 660 阅读 · 2 评论 -
Revit二次开发,取三角面片坐标数据,并还原生成图形
如何在revit中得到一个项目的三角面片坐标数据?以生成这个桌子为例子。文章开始前,先看下gif效果图:1.打开个Revit项目,该项目就上图一张桌子,执行下面程序将会生成一个文件,位置在:E:\gra.txt/// <summary>/// 三角面片/// </summary>public void DrawMesh(){ StreamWriter sw = new StreamWriter(@"E:\gra.txt", false);原创 2021-01-26 17:24:45 · 1486 阅读 · 1 评论 -
Revit二次开发,已知一个族类型,需要复制一份族类型后使用
已知一个族类型,需要复制一份该族类型,然后使用该新的族类型。可以使用Duplicate得到复制后的对象。var symbol = this.Document.FindFamilySymbol("机械设备", "运煤", "B=1200");var newSymbol = symbol.Duplicate("C=1200") as FamilySymbol;其中FindFamilySymbol是查找“B=1200”的族类型,这个方法您懂的。得到了族类型对象symbol后,使用Duplicate原创 2020-12-23 14:07:23 · 1600 阅读 · 0 评论 -
Revit二次开发,那些自己挖的坑,你都会想摔键盘
Revit二开,是个很神奇的东西,因为它会发生一些你意想不到,超脱你正常认知的范围一、静态变量惹的祸如上图,这种问题是极少发生的,估计也一般不会有人能遇到的,只有奇葩的我遇到了。错误描述是“The referenced object is not valid, possibly because it has been deleted from the database, or its creation was undone.”。那么这个错误是怎么来的呢?我是测试了很久很久,才找出原因所在,就原创 2020-12-03 09:50:07 · 1266 阅读 · 13 评论 -
Revit二次开发,求线段上任意一点的坐标
如下图,已知三维空间一条线段ab,已知c点在线段ab上,且已知ac的长度,求:c点坐标。解法一:通过比例尺计算private void Eval(){ XYZ a = new XYZ(4, 0, 0); XYZ b = new XYZ(5, 0, 0); Autodesk.Revit.DB.Line line = Autodesk.Revit.DB.Line.CreateBound(a, b); double acLength = 0.4; XYZ原创 2020-11-24 14:39:52 · 1575 阅读 · 0 评论 -
Revit二次开发,更改图元颜色,设置图元外观
效果图如下:代码如下:OverrideGraphicSettings overrideGraphicSettings = new OverrideGraphicSettings();overrideGraphicSettings = this.Document.ActiveView.GetElementOverrides(instance.Id);//红色255,0,0overrideGraphicSettings.SetProjectionLineColor(new Autodesk.原创 2020-11-24 13:52:31 · 1613 阅读 · 0 评论 -
Revit二次开发,获取族的实例参数和类型参数
在Revit中,如何获取族的实例参数和类型参数?这两种的获取方式有些区别。一、实例参数如上图,左侧的是实例参数,我们如何取“标高”这个参数呢?答:直接使用LookupParameter方法即可实现。Element element = new Element();var parameter = element.LookupParameter("标高");var value = parameter.AsValueString();二、类型参数这个有点小麻烦,不过我们可以通原创 2020-11-23 16:57:54 · 4279 阅读 · 1 评论 -
Revit二次开发,求线段的中点坐标
如上图,已知空间两点坐标a、b,求该线段的中点坐标h。解答使用上图的红圈方法即可,代码如下:Autodesk.Revit.DB.Line line = Autodesk.Revit.DB.Line.CreateBound(XYZ.Zero, new XYZ(1, 1, 1));XYZ pntCenter = line.Evaluate(0.5, true);上述代码的运行效果如下:结果应该是符合我们的预期的。祝您用餐愉快。...原创 2020-11-19 08:47:34 · 1172 阅读 · 0 评论 -
Revit二次开发,求任意一点到直线的垂直交点坐标
题目:已经空间任意两点a、b形成一条直线,求空间第3点在该条直线上的垂直交点坐标。可能字面描述是不好理解的,请看图。情况1:如上图,已经a点b点,求空间c点在ab直线上的投影坐标h点。ch直线将会垂直于ab直线。情况2:如上图,ab所连成的线段,会有延长线,c点是ab线的延长线进行投影得到h点。ch直线将会垂直于ab直线。解答:先声明一条无限延长线ab:Autodesk.Revit.DB.Line ab = Autodesk.Revit.DB.Line...原创 2020-11-18 15:10:57 · 1677 阅读 · 1 评论 -
Revit二次开发,获取详图线的起点和终点
如何获取Revit中详细线的起点和终点?代码中使用的是硬编码,您实际编写业务时,自行处理。//可以得到实际的点var @object = this.Selection.PickObject(Autodesk.Revit.UI.Selection.ObjectType.Element, "请选择一条线");//得到详情线的对象Autodesk.Revit.DB.DetailLine detailLine = this.Document.GetElement(@object.Eleme.原创 2020-11-17 16:18:05 · 1826 阅读 · 0 评论 -
Revit二次开发,求3点之间的夹角,即求两条线段之间的夹角
如下图,在Revit中,已知abc三点,求它们之间的夹角。这个问题等于求线段ab、bc之间的夹角。解法://定义ab线段var ab = Autodesk.Revit.DB.Line.CreateBound(a, b);//求ab线段的矢量方向var abDirection = ab.Direction;//定义bc线段var bc = Autodesk.Revit.DB.Line.CreateBound(b, c);//求bc线段的矢量方向var bcDirection = b原创 2020-10-28 16:36:36 · 772 阅读 · 0 评论 -
Revit二次开发,通过xml或者json等文件自动生成菜单
先看下Revit菜单的样子:我们知道,要给上面的Revit菜单添加新的自定义菜单的话,需要扩展IExternalApplication接口,然后编写代码创建菜单即可。本文通过抽象,编写了一份实际生产项目中可以使用的,通过xml文件或者json文件去配置Revit菜单的功能。源码价值较高,在附件可下载。通过xml文件配置Revit菜单,可以不用去编写C#代码,也不用去编译C#代码,直接修改xml文件覆盖后,重启Revit即可立刻生效。一、添加对IExternalApplication的接口原创 2020-10-27 15:22:33 · 1252 阅读 · 1 评论 -
Revit二次开发,已知ab直线,求经过a点并垂直于ab的垂线,然后与cd线相交得到交点e
如上图,有abcd四个点,求经过ab直线上的a点的垂线。然后求该垂线与cd直线的交点e。//cd直线,注意要使用线段,否则获取交点e将偏差Autodesk.Revit.DB.Line cd = Autodesk.Revit.DB.Line.CreateBound(c, d);//求ab直线上经过a点的垂线var dir = (b - a).Normalize();var vdir = dir.CrossProduct(XYZ.BasisZ);//生成垂线,注意,垂线必须是无限延长线..原创 2020-10-16 16:34:16 · 1082 阅读 · 0 评论 -
Revit二次开发,获取柱子、梁等的两端坐标
Revit获取柱、梁等图元的坐标时,可以使用下面的代码:using Autodesk.Revit.DB;using Autodesk.Revit.DB.Architecture;using Autodesk.Revit.DB.Structure;using Autodesk.Revit.UI;using Autodesk.Revit.UI.Selection;using System;using System.Collections.Generic;using System.Diagno原创 2020-10-13 15:57:30 · 2120 阅读 · 2 评论 -
Revit二次开发,在winform中制作3d预览效果。完整项目可生产中实例运用。
目前,见到使用的三维预览,是以二维平面生成的线段,类似如:那么如何做到真正的三维效果呢?我们知道,要在winform中生成三维,那一般得需要有3d引擎。但我们不太可能为了某一个功能,跑去开发一个3d引擎,如果真能开发出3d引擎,那么你自己就可以开一家公司了,光3d引擎技术就够你吃香的喝辣的了。言归正传,本文是使用Revit的三维效果,嵌入到winfrom中实现的。正文开始之前,先看下最终效果:请注意,此三维预览,是在winform中先预览,然后才去Revit中,生成你的实际效果。而不原创 2020-10-09 09:51:33 · 3146 阅读 · 2 评论 -
Revit二次开发,基于图元中心点,批量旋转指定角度
如上图,有时候,我们需要对图元批量旋转指定角度,并且从图元的中心点旋转。他的原理是使用api:ElementTransformUtils,可以实现您的意图,api详情如下:using System.Collections.Generic;namespace Autodesk.Revit.DB{ public static class ElementTransformUtils { public static bool CanMirrorElement(Do..原创 2020-09-30 11:24:06 · 1198 阅读 · 0 评论 -
Revit二次开发,无限选点操作后,当按下Esc键取消无限循环时,如何让已经发生的作业保持完成?
这其实是Revit的事务接受问题,只要想办法确保当按下Esc键时,让他提交事务即可。我们知道,在执行IExternalCommand的指令过程中,如果你按下Esc键的话,正常情况下会产生下面的提示框:该提示框的意思是说,用户取消了选点操作。当Revit弹出这个对话框的时候 ,已经发生的操作,由于事务终止的原因,将全部还原。产生这个对话框的原因,是因为发生了以下的异常:但有时候,我们在项目的实际运用中,由于不知道用户到底要选几个点,当然强制用户使用确定的选点数量也是可以的。但我们希原创 2020-09-23 16:18:14 · 1150 阅读 · 1 评论 -
Revit二次开发,创建任意视角的3d视图
如何在Revit中创建一个任意视角的3d视图?先看下Revit提供的3d视图api通过这个api,我们可以创建各种参数条件的3d视图。View3D view3D;using (Transaction tran = new Transaction(document, Guid.NewGuid().ToString())){ tran.Start(); XYZ eye = XYZ.Zero; XYZ up = VectorFromAngles(45, 45 + 9原创 2020-09-23 09:13:11 · 2484 阅读 · 0 评论 -
Revit二次开发,取视图列表,以及可打印的视图列表
在一些场景中,我们需要获取所有的视图列表,以便判断是否有该视图,然后进行后续的操作。在一些场景中,我们可能仅仅只需要那些可打印视图。这些可打印视图是可以在Revit中可视化的。using Autodesk.Revit.DB;using Autodesk.Revit.DB.Architecture;using Autodesk.Revit.UI;using Autodesk.Revit.UI.Selection;using System;using System.Collections.G原创 2020-09-23 08:42:09 · 964 阅读 · 0 评论 -
Revit二次开发,如何选点,如何在Revit界面中选点
对于新手第一次做Revit二开来讲,有时候搞不清楚怎么选点。别人是不是这样我不知道,至少我当时是这样的。如上图所示,这是Revit的选择器Api,位于Autodesk.Revit.UI.Selection.Selection中,从上面可以看到,不仅是选点,还可以选物选框选盒子。另外中国程序员通常不太注意的一件事:该选择器是非托管资源,也就是你不释放的话,是会使得内存不断提升的。即所谓的内存泄露。使用Selection选择器后,要及时释放。本文仅以选点来举例说明,选点是最常用的,相对而言也较简原创 2020-09-23 08:25:31 · 2064 阅读 · 0 评论 -
Revit二次开发,创建系统默认的3D视图,以及3d视图的盒子
Revit提供了一个PostableCommand指令集,通过该指令集可以创建很多Revit支持的默认指令。using Autodesk.Revit.DB;using Autodesk.Revit.DB.Architecture;using Autodesk.Revit.UI;using System;using System.Collections.Generic;using System.Linq;using System.Runtime.CompilerServices;using原创 2020-09-22 09:29:52 · 1439 阅读 · 0 评论 -
Revit二次开发,新手接入IExternalCommand、IExternalApplication,如何使用它们!
本文适合初入Revit二次开发的读者,如何使用IExternalCommand、IExternalApplication接口。原创 2020-09-21 17:22:55 · 1990 阅读 · 0 评论