首页/技术分享

Revit技巧 | 如何显示隐藏的Revit构件?BIM硬货!快速实现修改视图中构件显示(Revit宏命令)

发布于:2024-09-30 10:59:19
44人 分享

    随着BIM技术与应用深度的不断发展,对BIM模型的数据准确性要求也越来越高,所以常常会需要对构件的各项数据信息进行逐一检查,笔者最近在利用国内使用频率较高的Revit检查构件信息时发现,软件无法快速的区分“已经查看”与“还未查看”的构件,这是因为Revit没有提供快速标记(这里的标记,是指快速的将一类构件的不同实例进行区分)的功能。

    目前对构件的标记,通常是利用“替换视图中的图形”功能,以修改“视图专有图元图形”的方法来实现,也就是说,每次对某视图中的构件进行改色改线性改填充等工作,都需要进行一系列的重复操作,虽然可以通过设置选择集等方法优化,但仍然费时费力。

image.png

image.png

    有没有办法解决这个无论什么专业都需要常常使用的问题呢?

    JZFZBIM:有!

    所以今天就给大家分享一下如何利用Revit提供的API接口,实现快速修改构件在视图中的各项显示内容。为了方便没有开发经验的用户使用,我们这次通过Revit宏命令来实现上述功能,无需额外安装任何编程工具,对于宏命令在Revit中应用不熟悉的朋友们也可以借这个机会了解一下。(Revit宏命令API与RevitAPI一致,故以下代码可直接用于Revit平台的二次开发以实现更多功能。)

    Revit中宏命令的位置是在“管理”选项卡中的“宏模块”,点击宏管理器即可进入,如下图所示。

image.png

    进入宏管理器后,依次点击“模块”“宏”命令以创建新的宏(详细信息可参考相关教程),如下图所示(可点击图片查看大图)。

image.png

    之后即可进入程序编辑界面,如下图可以看到,编辑器中已经自动生成了用于生成插件的基础代码,我们只需要将我们用于实现功能的代码加进去即可。

image.png

    整个插件的开发流程如下图所示,整个插件主要是利用RevitAPI中提供的Document类中的Pickobject方法实现选择功能以及OverrideGraphicSettings类用于实现替换视图显示功能。文章末尾会附上该插件的完整源代码,有兴趣的朋友可参考查看。如果不想深究代码的意义,可直接复制粘贴源代码,把命名空间与类的名称改成您自己的,即可使用对构件进行变色标记的功能。另外,可以通过修改一些变量可以实现更多的应用(例如修改color1变量为其他颜色,修改patternElementName变量为其他填充类型名称等)。编辑完成后,鼠标在“解决方案”位置点击右键,选择重新生成解决方案即可完成开发工作。

image.png

    顺利生成插件以后,选择对应的插件名称,点击“运行”就可以快速的进行构件变色、变填充的操作了。

    运行插件以前:

image.png

    运行插件以后:

image.png

    这些代码,也可灵活运用于根据构件的数据快速的自动生成图面表达(例如根据楼板标高对楼板进行不同的图案填充)等。


    源代码代码如下:

using System;

 using Autodesk.Revit.UI;

 using Autodesk.Revit.DB;

 using Autodesk.Revit.UI.ion;

 using System.Collections.Generic;

 using System.Linq;

 

 namespace 选择改色ByJZFZ

 {

     [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]

     [Autodesk.Revit.DB.Macros.AddInId("DEDEAD0E-736B-4698-81EC-150146BEF142")]

     public partial class ThisApplication

     {

         Document m_doc;

         ion m_sel;

         Color color1 = new Color(255, 0, 0);//指定颜色为红色

         string patternElementName  = "实体填充";//指定填充类型的名称,需保证在文档中存在

         private void Module_Startup(object sender, EventArgs e)

         {

             m_doc  = ActiveUIDocument.Document;

             m_sel  = ActiveUIDocument.ion;

         }

 

         private void Module_Shutdown(object sender, EventArgs e)

         {

             

         }

 

         #region Revit  Macros generated code

         private void InternalStartup()

         {

             this.Startup += new System.EventHandler(Module_Startup);

             this.Shutdown += new System.EventHandler(Module_Shutdown);

         }

         #endregion

         public void ChangeToRed()

         {  

             

             Transaction  transaction = new Transaction(this.m_doc, "testChangeColor");

             try

             { 

                  IList<ElementId> theIds  = new List<ElementId>();

                  IList<Reference> listRfs  = null;

                 if (m_sel.GetElementIds().Count > 0) //检查用户是否已经选中构件

                 {

                     foreach (ElementId eleId in m_sel.GetElementIds())

                     {

                         theIds.Add(eleId);

                     }

                 }

                 else

                 { 

                     listRfs  = this.m_sel.PickObjects(Autodesk.Revit.UI.ion.ObjectType.Face,"请选择需要改变颜色的构件");

                     foreach (Reference rf1 in  listRfs)

                         {

                             Element  ele = m_doc.GetElement(rf1);

                             if(ele != null)

                             {

                                 theIds.Add(ele.Id);

                             }

                         }

                 }

                 transaction.Start();

                 SetColorOverrideByElement(m_doc.ActiveView, theIds,color1, GetPatternElementId());

                 transaction.Commit();

             }

             catch (OperationCanceledException)

                 {

                     transaction.RollBack();

                 }

             catch (Exception)

                 {

                     transaction.RollBack();

                 }

         }

     

         private ElementId GetPatternElementId()//得到本项目中的填充图案类型


        {

             ElementId  PatternElementId = ElementId.InvalidElementId;

             IList<Element> list  = new FilteredElementCollector(m_doc).OfClass(typeof(FillPatternElement)).ToElements();

             foreach (Element element in list)

             {

                 if (element.Name == patternElementName)

                 {

                     PatternElementId  = element.Id;

                     break;

                 }

             }

             return PatternElementId;

         }

         public void SetColorOverrideByElement(View  view, ICollection<ElementId> ids, Color color,ElementId  PatternElementId, int type  = 2)

         {

             if (view == null)

             {

                 throw new ArgumentNullException("请在视图中执行本命令");

             }

             if (ids != null)

             {

                 foreach (ElementId id in ids)

                 {

                     OverrideGraphicSettings  elementOverrides = view.GetElementOverrides(id);

                     if (type != 1)

                     {

                         elementOverrides.SetCutLineColor(color);

                         elementOverrides.SetCutFillColor(color);

                         elementOverrides.SetProjectionLineColor(new Autodesk.Revit.DB.Color(0, 0, 0));

                         elementOverrides.SetProjectionLinePatternId(ElementId.InvalidElementId);

                         elementOverrides.SetProjectionFillColor(color);

                         elementOverrides.SetProjectionFillPatternId(PatternElementId);

                         elementOverrides.SetCutFillPatternId(PatternElementId);

                     }

                     if (type != 2)

                     {

                         elementOverrides.SetProjectionLineColor(color);

                     }

                     view.SetElementOverrides(id, elementOverrides);

                 }

             }

         }

     }

 }


转载请注明来源本文地址:https://www.tuituisoft/blog/14514.html

上一篇:

CAD教程 | 寻找CAD建筑图标的最佳途径

下一篇:

Revit技巧 | Revit桥架如何布置?Revit桥架设置及相关小技巧