首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在WPF中正确更改XBim标准墙体颜色

如何在WPF中正确更改XBim标准墙体颜色
EN

Stack Overflow用户
提问于 2018-06-07 15:17:14
回答 1查看 677关注 0票数 2

我成功地将新墙(IfcWallStandardCase)添加到现有的国际金融公司模型中,并将其显示在DrawingControl3D中-在XBim工具包的Proper Wall 3D示例的帮助下,以下是我为墙添加颜色的代码:

代码语言:javascript
复制
//add color to the proper wall
var orange = model.Instances.New<IfcColourRgb>();
orange.Red = (255.0 / 255.0);                   
orange.Green = (69.0 / 255.0);                  
orange.Blue = (0.0 / 255.0);                     

var newStyleRendering = model.Instances.New<IfcSurfaceStyleRendering>();
newStyleRendering.SurfaceColour = orange;

var newSurfaceStyle = model.Instances.New<IfcSurfaceStyle>();
newSurfaceStyle.Styles.Add(newStyleRendering);

var newStyleAssignment = model.Instances.New<IfcPresentationStyleAssignment>();
newStyleAssignment.Styles.Add(newSurfaceStyle);

var newStyledItem = model.Instances.New<IfcStyledItem>();
newStyledItem.Name = "Standard Wall Styling";
newStyledItem.Item = body;
newStyledItem.Styles.Add(newStyleAssignment);

现在,我正尝试在点击按钮时更改墙的颜色,首先使用样式(颜色)是如何添加的,以下是我的尝试:

代码语言:javascript
复制
var walls = model.Instances.OfType<IfcStyledItem>();
var _newWall = walls.Where(w => w.Name == "Standard Wall Styling").FirstOrDefault();

if (_newWall != null)
{

    var newColour = model.Instances.New<IfcColourRgb>();
    newColour.Red = (24 / 255.0);
    newColour.Green = (24 / 255.0);
    newColour.Blue = (24 / 255.0);

    var newStyleRendering = model.Instances.New<IfcSurfaceStyleRendering>();
    newStyleRendering.SurfaceColour = newColour;

    _newWall.Styles[0].SurfaceStyles.FirstOrDefault().Styles.Clear();
    _newWall.Styles[0].SurfaceStyles.FirstOrDefault().Styles.Add(newStyleRendering);

    txn.Commit();
    DrawingControl.ReloadModel();
}

我通过名称查询获得了命名的"IfcStyledItem“,并遍历到它的"SurfaceStyle”来替换之前设置的"ColourRGB“,然后重新加载DrawingControl3D模型。但并不成功。

我一直在网上寻找如何正确地做到这一点,但没有找到任何东西。任何关于如何实现这一点的线索都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2019-07-17 14:43:34

好的,为了做到这一点,你需要分配一个新的IfcSurfaceStyle到你的IfcExtrudedAreaSolid的wall.the代码下面工作很好的Proper Wall 3D示例和ifc从revit 2018导出。

代码语言:javascript
复制
private bool AddNewSurfaceStyle(IfcBuildingElement element)
        {
            var representations = element.Representation.Representations;
            if (representations.Count == 0) return false;
            var body = representations.FirstOrDefault(a => a.RepresentationType == "SweptSolid");
            if (body == null) return false;
            var extrudedAreaSolid = body.Items.FirstOrDefault(a => a is IIfcExtrudedAreaSolid);
            if (extrudedAreaSolid == null) return false;
            var elementStyle = extrudedAreaSolid.StyledByItem.FirstOrDefault();
            using (var txn = element.Model.BeginTransaction("Create Style"))
            {
                var styleAssignment = element.Model.Instances.New<IfcPresentationStyleAssignment>();
                var surfaceStyle = element.Model.Instances.New<IfcSurfaceStyle>();
                var surfaceStyleRedering = element.Model.Instances.New<IfcSurfaceStyleRendering>();
                var colourRGB = element.Model.Instances.New<IfcColourRgb>();
                colourRGB.Blue = 1;
                colourRGB.Red = 1;
                colourRGB.Green = 0;
                surfaceStyleRedering.Transparency = 0;
                surfaceStyleRedering.SurfaceColour = colourRGB;
                surfaceStyle.Styles.Add(surfaceStyleRedering);
                styleAssignment.Styles.Add(surfaceStyle);
                elementStyle.Styles.Clear();
                elementStyle.Styles.Add(styleAssignment);
                txn.Commit();
            }
            return true;
        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50735087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档