Revit开发随笔
文章平均质量分 65
魏无忌
Revit二次开发
展开
-
Revit开发IExternalCommandAvailability的使用
在Revil里大部分命令在没有打开文档的时候是禁用的,有的在没有打开文档也是可以使用的。而又一些在平面视图是禁用的如 标高,有的在3D视图里是禁用的 如 标高和轴网,而这些是否可用我们是可以自己控制的在PushButton的属性里有一个AvailabilityClassName属性,通过这个就可实现命令在什么时候可用,禁用的控制。这个属性是个string,它需要设置为一个实现了IE原创 2017-09-30 14:04:29 · 1319 阅读 · 1 评论 -
Revit开发之AddInManager安装包简单制作
Revit的AddinManager在2014以后就不提供安装包了,而是要用户自己手动去配置,对于有Revit开发经验的人来说是比较简单的,但是新手总是会遇到这样或那样的问题,在我的博客前面已经有讲过怎么手动配置,这篇博客主要是探索一下,能不能也做一个像2014一样的安装包呢?想一下,大概应该包括下面几个过程1.获取当前安装了的Revit版本这个可以通过 Re原创 2016-11-26 22:49:33 · 3280 阅读 · 0 评论 -
Revit开发柱附着和分离
在Revit里当我们选中一个柱子的时候,会出现附着和分离两个命令,那在API里应该怎么实现呢?API里提供了一个ColumnAttachment 类来实现柱的附着和分离功能下面是一个小例子: UIDocument uidoc = commandData.Application.ActiveUIDocument; Document原创 2016-12-07 13:27:14 · 3200 阅读 · 0 评论 -
Revit开发RibbonPanel底部添加命令
Revit的结构Tab下面有一个结构RibbonPanel,这个RibbonPanel底部有一个小箭头,点击这个箭头可以运行结构设置这个命令,那我们怎么来给RibbonPanel来添加一个这样的命令呢?下面是一个小例子,在构件RibbonPanel下添加一个创建墙的命令 添加AdWindows.dll using adWin = Autodesk.Windows;原创 2016-12-07 12:58:00 · 1585 阅读 · 1 评论 -
Revit开发创建部件和部件视图
在Revit里可以把一部分构件组合起来创建为一个部件,然后可以创建一些针对这个部件的视图通过API来创建主要用到两个类AssemblyInstance AssemblyViewUtils 下面是一个小例子:Command: public Result Execute(ExternalCommandData commandData, re原创 2016-11-15 17:40:05 · 4247 阅读 · 1 评论 -
Revit开发设置模型线颜色
Revit里要设置模型线的颜色有2中方法一种是设置线的样式一种是设置OverrideGraphicSettings第一种需要设置新建线的样式,然后通过模型线的线样式参数设置第二种是通过替换视图中的图形,它是基于视图的,颜色只在当前视图有效下面是关键代码:新建线样式 Category tCat = doc.Settings.Categ原创 2016-10-05 19:26:08 · 7561 阅读 · 0 评论 -
Revit开发读取CAD信息
在Revit里链接的CAD通过API能获取到到图层信息和图层里的几何信息文字信息目前应该是还获取不到的几何信息可以直接通过Geometry来获取图形信息可以通过GeometryObject的GraphicsStyle来获取GraphicsStyle里有一个GraphicsStyleCategory而这个Category的名字和图层是一样的当然这个Cate原创 2016-10-04 11:28:39 · 5875 阅读 · 1 评论 -
Revit开发之射线法ReferenceIntersector
Revit开发里有一个ReferenceIntersector 类,通过这个类可以找到某一条射线方向上的所有Element的Reference这个类有四种构造函数 NameDescription ReferenceIntersector(View3D)Constructs a ReferenceIntersecto原创 2016-10-03 10:46:06 · 2897 阅读 · 0 评论 -
Revit开发之调用过滤器设置窗体设置过滤器
在Revit可以给视图添加过滤器的功能,这个添加过滤器,有一个比较完善的界面,可以添加各种各样的过滤器,现在我们在API里也可调用这个界面了,为API创建过滤器提供了不少方便。更多信息请查看:FilterDialog 下面是一个简单的例子,用这个FilterDialog个当前视图添加一个过滤器: Document原创 2016-10-16 13:35:40 · 1628 阅读 · 0 评论 -
Revit开发获取房间内的构件
获取房间内的构件,大致思路如下房间是有边界和高度的,所以我们可以得到房间的边界和高度来构造一个Solid,然后用过滤和这个Solid相交的构件Revit API 提供了SpatialElementGeometryCalculator 这个类可以方便的获取到房间的Solid注意:这个Solid无法过滤到房间内部为房间边界的构件,如建筑柱勾选了房间边界后就过滤不到了代码如下:原创 2016-10-26 12:52:16 · 3358 阅读 · 2 评论 -
Revit开发之选项对话框扩展
Revit里有一个选项界面这个选项界面里默认包括了:常规、用户界面、图形、文件位置、等等其实这个界面是可以扩展的直接上代码: public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)原创 2016-09-30 13:17:45 · 2829 阅读 · 0 评论 -
Revit开发之可停靠窗口应用
Revit 里提供了一个IDockablePaneProvider接口,通过这个接口,可以做一个和Revit里的属性对话框,相似的界面具体过程是:先创建一个Page,然后实现这个接口,然后创建一个DockablePaneId,再用这个Id 和Page来注册接口,然后在通过Id来调用这个可停靠窗口如果想要实现在Revit里选择一个构件,然后在可停靠窗口里显示一原创 2016-09-29 13:54:55 · 3367 阅读 · 3 评论 -
Revit开发通过轴网创建柱子
[Regeneration(RegenerationOption.Manual)] [Transaction(TransactionMode.Manual)] public class Class1:IExternalCommand { public Result Execute(ExternalCommandData commandData, re原创 2016-11-02 14:46:49 · 3809 阅读 · 0 评论 -
Revit开发之放弃重做操作
在Revit的界面里有撤销按钮,但是在Revit提供的API里没有对应的方法,如果我们要在API里实现撤销怎么办呢?在Revit安装包里有一个UIFrameworkServices.dll,这里有 一个QuickAccessToolBarService类通过QuickAccessToolBarService.performMultipleUndoRedoOperatio原创 2016-11-03 13:11:02 · 2451 阅读 · 0 评论 -
Revit开发之获取房间边界
获取房间的边界可以用Room里的public IListIListBoundarySegment>> GetBoundarySegments( SpatialElementBoundaryOptions options)这个方法返回了所有Room的边界信息。BoundarySegment 这里面包含了没一个边界的信息,它主要包括: Nam原创 2016-09-28 15:56:38 · 5845 阅读 · 0 评论 -
Revit开发通过Category设置构件颜色
在Revit的视图里可以通过 可见性/图形替换来设置构件的显示颜色,里面有一个通过模型类别设置构件颜色的方法,在API里也是可以实现这一操作的。下面是一个设置墙类别构件颜色的小例子注意:此颜色在真实模式下不显示 Document doc = commandData.Application.ActiveUIDocument.Document;原创 2016-10-24 13:31:09 · 3192 阅读 · 2 评论 -
Revit开发之设置剖面框
在Revit里有一个剖面框功能这个功能在API里对应了SetSectionBox这个函数这个函数要传一个BoundingBoxXYZ 的参数下面是一个简单的例子,实现用户选择一个构件,然后用这个构建的BoundingBoxXYZ来创建一个剖面框,关键代码如下: BoundingBoxXYZ box = elem.get_Bounding原创 2016-09-27 13:10:24 · 7599 阅读 · 0 评论 -
Revit开发AddinManager原理探索
Revit开发中AddinManager是一个非常好用的工具,它可以快速的运行我们写好的命令并且生成addin文件,最近突然好奇,它是怎么实现这些功能的,然后研究了一下,发现这里面似乎是通过反射来实现的,他能运行我们的写的命令最关键的是因为下面的代码 IExternalCommand externalCommand = assembly.CreateInstan原创 2016-11-26 23:28:41 · 2116 阅读 · 0 评论 -
Revit开发之梁柱分段
在Revit里我们常常需要对梁或者柱进行 ,但是在Revit2017之前API里没有提供分段的函数如果要分段,都要重新画一个,然后重新设置位置,但是在Revit 2017里API提供了直接分段的函数:FamilyInstance.Split( double param)它会返回新创建的FamilyInstance的Idparam是分割点在FamilyInstance两原创 2016-11-27 22:01:53 · 2429 阅读 · 1 评论 -
Revit开发管道风管分段
Revit2017的API 里提供了水管和风管分段的方法,如果开发者在要写分段的功能就大大的方便了主要是提供了 PlumbingUtils(Pipe分段)MechanicalUtils(Duct分段)两个类下面是个小测试 Reference r = uidoc.Selection.PickObject(ObjectType.Point原创 2016-11-27 22:30:43 · 4083 阅读 · 0 评论 -
Revit开发ImageView
在Revit里可以创建渲染,其实这个视图里显示的是光栅图像里的图片。这个视图对应的类是ImageView,如果要创建一个这样的视图,可以用这个类的Create静态方法, public static ImageView Create(Document document, string imageFileName);下面是一个导出当前视图图像,并创建一个Image原创 2017-09-26 18:21:22 · 821 阅读 · 0 评论 -
Revit开发BuildingEnvelopeAnalyzer
Revit API 里有个BuildingEnvelopeAnalyzer类,帮助文档里对它描述如下:This class uses a combination of ray-casting and flood-fill algorithms in order to find the building elements that are exposed to the outside of th原创 2017-09-26 18:12:19 · 649 阅读 · 0 评论 -
Revit开发区分基本墙,幕墙,叠层墙
在Revit里墙有3个族,但是都是对应一个Wall类型,如果要区分这3种墙可以用WallType 的Kind属性这个属性是一个枚举包括以下类容:Member nameDescriptionUnknownThe basic type is not known.BasicA standard wall.CurtainA原创 2017-05-18 14:57:17 · 4865 阅读 · 1 评论 -
Revit开发之管段
在API里管段对应了一个PipeSegment类,要获取可以用Class过滤去来过滤如果要创建管段可以使用PipeSegment的Create方法来创建,这是个静态方法public static PipeSegment Create( Document ADocument, ElementId MaterialId, ElementId ScheduleId, ICollect原创 2017-05-28 14:56:26 · 1784 阅读 · 0 评论 -
Revit开发之管道的布管系统配置
Revit的管道,在编辑类型里有一个布管系统配置,里面有一些自动创建管件的设置。这里的类容可以通过PipeType.RoutingPreferenceManager来设置和获取,下面写个获取管段和管段的最小尺寸和最大尺寸的例子,其他类型同理。 Pipe p = doc.PickObject();//选择一个管道,这是作者写的扩展函数。 P原创 2017-05-27 13:50:10 · 5865 阅读 · 0 评论 -
Revit开发关于创建Tab的问题
在RevitAPI里创建Tab有一个限制就是数量不能超过20个Autodesk.Revit.Exceptions..::..InvalidOperationExceptionToo many custom tabs have been created in this session. (Maximum is 20).那有没有可能创建第21个Tab呢?当然是可原创 2017-04-22 14:13:07 · 1918 阅读 · 0 评论 -
Revit开发自定义警告
在Revit里操作的时候,如果操作有一些问题,Revit会给用户弹一些警告,Revit里有大量的类型警告,当然我们也是可以自定义警告的下面是个小例子: //定义警告,需在Application里 Guid guid = new Guid("F4385BA5-EB24-4612-805B-51207CFD8680"); Failu原创 2017-05-02 18:01:28 · 934 阅读 · 0 评论 -
Revit开发之快捷键相关类
快捷键相关程序集和相关类,有兴趣的可以自己了解下UIFrameWork.dllShortcutKeyManagerShortcutsHelperShortcutWindow原创 2017-04-14 15:13:36 · 1256 阅读 · 0 评论 -
Revit开发之调用Revit命令的另一种方法
在Revit的UIFramework.dll里有一个CommandUtility,里面有一个Execute(RibbonCommandItem btn)方法,看起来像是一个调用Revit命令的方法,下面来测试一下,有一个问题是这个类不是public的所以调用要用反射下面是个测试代码: adWin.RibbonControl control = adWin.Comp原创 2017-04-14 15:08:06 · 3524 阅读 · 1 评论 -
Revit开发获取梁的宽和高
在Revit里梁的宽和高一般都会有对应的参数,要获取大多数情况可以使用GetParameter,但这个参数名称是用户自己定义的,不同的梁对应的参数名不一样,所以可以考虑通过梁的截面Face来获取 FamilyInstance inst = doc.GetElement(uidoc.Selection.PickObject(ObjectType.Element)) as原创 2017-04-17 17:44:10 · 3260 阅读 · 2 评论 -
Revit开发之多线程
关于Revit开发其实是可以使用多线程的,但是是有限制的,目前发现只要在其他线程里启用Transaction,基本Revit就崩溃了,但是在其他线程里不启用Transaction还是可以使用的,比如说我们要在Revit里检索一些东西,但这些东西又很多,需要的时间比较长,这种情况我们就可以把检索的任务给其他线程,然后用户先可以先进行其他操作,下面说一个简单的例子,在Task里检索建筑柱的原创 2017-02-27 19:56:25 · 2479 阅读 · 0 评论 -
Revit开发将WPF的Ower设置为Revit窗体
在Revit开发中如果使用modeless的对话框,经常容易被Revit窗体覆盖,但是如果将窗体设为Topmost的话,当Revit失去焦点后,它又会遮住其他程序的界面,那怎么解决这个问题呢?其实只需要将Revit的窗体设置为弹出窗体的Ower就可以了,这样也不需要设置topmost关键代码如下: myWin = new SingleWin();原创 2017-02-06 13:26:04 · 1922 阅读 · 2 评论 -
Revit开发楼梯创建
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Autodesk.Revit.Attributes;using Autodesk.Revit.DB;using Autodesk.Revi原创 2016-12-20 13:08:34 · 2416 阅读 · 2 评论 -
Revit开发通过API 创建族
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using Autodesk.Revit.UI;using Autodesk.Revit.DB;using Autodesk.Revit.Attrib原创 2016-12-19 18:11:49 · 7178 阅读 · 4 评论 -
Revit开发之标注创建
在Revit项目文件里创建标注可以用 NewDimension这个方法有两个重载,一个使用默认的标注类型,一个可以指定标注类型在项目文件和在族文件能创建的标注种类是不一样的,读者可以自己研究研究下面是一个标注墙的小例子: UIDocument uidoc = commandData.Application.ActiveUIDocument;原创 2016-12-15 17:33:38 · 4028 阅读 · 0 评论 -
Revit开发之警告和错误处理
在Revit 里很多操作都会弹出警告和错误提示,比如墙的高度降低,墙顶部的窗出现在墙的外面这个会弹一个错误提示框,比如在同一个位置创建两面墙,会弹出一个警告提示框如果在自己写的程序里出现了这种弹窗,会影响到用户体验,其实API里提供一些错误和警告的处理,下面提供一个例子解决上面的两种情况,关键代码如下: public cla原创 2016-11-04 21:56:49 · 6339 阅读 · 0 评论 -
Revit开发之剪切InstanceVoidCutUtils
Revit API里有一个剪切的类InstanceVoidCutUtilspublic static void AddInstanceVoidCut( Document document, Element element, Element cuttingInstance上面这个函数就是创建剪切的函数element是被剪切的element,但是不是所有的eleme原创 2016-09-25 20:49:51 · 5878 阅读 · 1 评论 -
Revit开发之判断参数是否为项目参数
Revit里有一种参数叫项目参数,如果要判断一个参数是否是项目参数,RevitAPI里没有直接提供方法,那到底有没有方法来判断一个参数是否是项目参数呢? 下面来做一些尝试:首先通过Document.ParameterBindings发现这里面包括了项目参数和共享参数那如果一个参数不是共享参数,而又包含在这里面,那它是不是就是项目参数呢?经过简单测试,发现可以原创 2016-10-11 13:40:35 · 2205 阅读 · 0 评论 -
Revit开发调用UI上的命令
在Revit API中我们可以在IExternalCommand里调用Revit界面上的命令,方法就用:PostCommand在Revit的界面上的每一个功能按钮,都是有一个Id的,其实都是可以用这个方法来调用的。比如墙:建筑 功能的ID为 "ID_OBJECTS_WALL"对应的RevitCommandId 就是RevitCommandId .Lo原创 2016-09-22 00:30:23 · 4375 阅读 · 0 评论 -
Revit开发之ElementParameterFilter
我们在Revit中,如果想要通过参数来过滤构件,可以用ElementParameterFilter,但是这个过滤器,是一个慢速过滤,所以最好配合快速过滤器一起用,以提高过滤效率。比如说,我想得到项目中所有标记大于3的窗,下面是关键代码: private void m_ElementParameterFilter() {原创 2016-09-09 20:54:59 · 2240 阅读 · 0 评论