Revit二次开发——构件颜色与构件材料颜色修改区别

我在改变构件的颜色时发现当我修改一个构件时,同一种材料的构件的颜色都被改变了,于是查找问题,答案如下:

(1)通过材料属性更改构件颜色

通过材料属性更改构件颜色主要关注点是材料的”材质“,而不是构件,所以不同构件只要材质相同,在修改它颜色时,文档中所有相同材质构件都会被修改。通过材质修改颜色是修改下图中着色中的颜色,修改后的颜色属性值可以通过Lookup查到。

Revit二次开发——构件颜色与构件材料颜色修改区别

代码:

            Element ele = doc.GetElement(sel.PickObject(ObjectType.Element, "选择元素"));          
            Transaction ts = new Transaction(doc, "12");
            ts.Start();
            Color color = new Color(250,200,100);
            Material material = doc.GetElement(ele.GetMaterialIds(false).First()) as Material;
            material.Color = color;
            ts.Commit();

 

(2)直接改变构件的颜色

直接改变构件的颜色是通过OverrideGraphicSettings类来设置覆盖视图中元素的显示。不会修改构件材质,其修改的颜色通过Lookup查找不到,可以通过OverrideGraphicSettings.ProjectionFillColor属性来获取修改的颜色值。

代码:

            //1.修改构件颜色
            Element ele = doc.GetElement(sel.PickObject(ObjectType.Element, "选择元素"));
            FilteredElementCollector fillPatternElementFilter = new FilteredElementCollector(doc);
            fillPatternElementFilter.OfClass(typeof(FillPatternElement));
            //获取实体填充
            Element ele = doc.GetElement(sel.PickObject(ObjectType.Element, "选择元素"));          
            Transaction ts = new Transaction(doc, "12");
            ts.Start();       
            FillPatternElement fillPatternElement = fillPatternElementFilter.First(f =>
            (f as FillPatternElement).GetFillPattern().IsSolidFill) as FillPatternElement;
            OverrideGraphicSettings overrideGraphicSettings = new OverrideGraphicSettings();
            overrideGraphicSettings = doc.ActiveView.GetElementOverrides(ele.Id);
            overrideGraphicSettings.SetSurfaceForegroundPatternId(fillPatternElement.Id);
            overrideGraphicSettings.SetSurfaceForegroundPatternColor(new Autodesk.Revit.DB.Color(250, 50, 10));
            uidoc.ActiveView.SetElementOverrides(ele.Id, overrideGraphicSettings);
            string red = overrideGraphicSettings.ProjectionFillColor.Red.ToString();
            string blue = overrideGraphicSettings.ProjectionFillColor.Blue.ToString();
            string green = overrideGraphicSettings.ProjectionFillColor.Green.ToString();
            TaskDialog.Show("1", red + "," + blue + "," + green);
            ts.Commit();