按梁高给给梁设置不同的颜色
在没有插件的情况下,要给不同梁高的梁设置不同的颜色需要在过滤器里面设置。有了这个样的插件以后就可以更加方便的设置了。下面上代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.UI.Selection;
namespace 自动添加梁材质
{
[Autodesk.Revit.Attributes.Transaction(TransactionMode.Manual)]
[Autodesk.Revit.Attributes.Regeneration(RegenerationOption.Manual)]
[Autodesk.Revit.Attributes.Journaling(JournalingMode.UsingCommandData)]
public class Command:IExternalCommand
{
public Result Execute(ExternalCommandData commandData,ref string message,ElementSet elementSet)
{
UIDocument uidoc = commandData.Application.ActiveUIDocument;
Document doc = uidoc.Document;
Selection selection = uidoc.Selection;
View v = doc.ActiveView;
FilteredElementCollector collector = new FilteredElementCollector(doc);
IList<ElementId> ids= collector.OfCategory(BuiltInCategory.OST_StructuralFraming).WhereElementIsNotElementType().ToElementIds() as List<ElementId>;
Dictionary<string, List<ElementId>> idDictionary = GetElementsId(ids, doc);
using (Transaction ts = new Transaction(doc, "创建颜色填充"))
{
ts.Start();
CreateFillPattern(doc, idDictionary);
ts.Commit();
}
return Result.Succeeded;
}
/// <summary>
/// 收集每一个类型的梁
/// </summary>
/// <param name="ids"></param>
/// <param name="doc"></param>
/// <returns></returns>
public static Dictionary<string,List<ElementId>>GetElementsId(IList<ElementId> ids,Document doc)
{
Dictionary<string, List<ElementId>> idDictionary = new Dictionary<string, List<ElementId>>();
foreach (ElementId id in ids)
{
string name = doc.GetElement(id).Name;
if (idDictionary.ContainsKey(name))
{
idDictionary[name].Add(id);
}
else
{
idDictionary.Add(name, (new List<ElementId>()));
idDictionary[name].Add(id);
}
}
return idDictionary;
}
/// <summary>
/// 创建颜色填充
/// </summary>
/// <param name="doc"></param>
/// <param name="ids"></param>
/// <param name="color"></param>
public static void CreateFillPattern(Document doc,Dictionary<string,List<ElementId>> ids)
{
//遍历字典
foreach(string key in ids.Keys)
{
Random r = new Random();
Color cl = new Color((byte)r.Next(0, 255), (byte)r.Next(0, 255), (byte)r.Next(0, 255));
foreach (ElementId id in ids[key])
{
CreateColor(doc, id, cl);
}
}
}
/// <summary>
/// 创建颜色
/// </summary>
/// <param name="doc"></param>
/// <param name="id"></param>
/// <param name="color"></param>
public static void CreateColor(Document doc,ElementId id,Color color)
{
FilteredElementCollector fillFilter = new FilteredElementCollector(doc);
fillFilter.OfClass(typeof(FillPatternElement));
//获取实体
FillPatternElement fp = fillFilter.First(m => (m as FillPatternElement).GetFillPattern().IsSolidFill) as FillPatternElement;
OverrideGraphicSettings ogs = doc.ActiveView.GetElementOverrides(id);
//填充图案
ogs.SetProjectionFillPatternId(fp.Id);
//颜色
ogs.SetProjectionFillColor(color);
//应用到视图
doc.ActiveView.SetElementOverrides(id, ogs);
}
}
}
效果如下:
点我看效果