下载app免费领取会员
随着BIM技术与应用深度的不断发展,对BIM模型的数据准确性要求也越来越高,所以常常会需要对构件的各项数据信息进行逐一检查,笔者最近在利用国内使用频率较高的Revit检查构件信息时发现,软件无法快速的区分“已经查看”与“还未查看”的构件,这是因为Revit没有提供快速标记(这里的标记,是指快速的将一类构件的不同实例进行区分)的功能。
目前对构件的标记,通常是利用“替换视图中的图形”功能,以修改“视图专有图元图形”的方法来实现,也就是说,每次对某视图中的构件进行改色改线性改填充等工作,都需要进行一系列的重复操作,虽然可以通过设置选择集等方法优化,但仍然费时费力。
有没有办法解决这个无论什么专业都需要常常使用的问题呢?
JZFZBIM:有!
所以今天就给大家分享一下如何利用Revit提供的API接口,实现快速修改构件在视图中的各项显示内容。为了方便没有开发经验的用户使用,我们这次通过Revit宏命令来实现上述功能,无需额外安装任何编程工具,对于宏命令在Revit中应用不熟悉的朋友们也可以借这个机会了解一下。(Revit宏命令API与RevitAPI一致,故以下代码可直接用于Revit平台的二次开发以实现更多功能。)
Revit中宏命令的位置是在“管理”选项卡中的“宏模块”,点击宏管理器即可进入,如下图所示。
进入宏管理器后,依次点击“模块”“宏”命令以创建新的宏(详细信息可参考相关教程),如下图所示(可点击图片查看大图)。
之后即可进入程序编辑界面,如下图可以看到,编辑器中已经自动生成了用于生成插件的基础代码,我们只需要将我们用于实现功能的代码加进去即可。
整个插件的开发流程如下图所示,整个插件主要是利用RevitAPI中提供的Document类中的Pickobject方法实现选择功能以及OverrideGraphicSettings类用于实现替换视图显示功能。文章末尾会附上该插件的完整源代码,有兴趣的朋友可参考查看。如果不想深究代码的意义,可直接复制粘贴源代码,把命名空间与类的名称改成您自己的,即可使用对构件进行变色标记的功能。另外,可以通过修改一些变量可以实现更多的应用(例如修改color1变量为其他颜色,修改patternElementName变量为其他填充类型名称等)。编辑完成后,鼠标在“解决方案”位置点击右键,选择重新生成解决方案即可完成开发工作。
顺利生成插件以后,选择对应的插件名称,点击“运行”就可以快速的进行构件变色、变填充的操作了。
运行插件以前:
运行插件以后:
这些代码,也可灵活运用于根据构件的数据快速的自动生成图面表达(例如根据楼板标高对楼板进行不同的图案填充)等。
源代码代码如下:
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);
}
}
}
}
}
本文版权归腿腿教学网及原创作者所有,未经授权,谢绝转载。