Как правильно изменить цвет стены XBim Standard в WPF - PullRequest
0 голосов
/ 07 июня 2018

Я был достаточно успешен, чтобы добавить новую стену (IfcWallStandardCase) к существующей модели IFC и отобразить ее в DrawingControl3D - с помощью образца Proper Wall 3D из XBim Toolkit, вот мой код добавленияцвет стены:

//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);

Теперь я пытаюсь изменить цвет этой стены при нажатии кнопки, используя способ, которым стиль (цвет) был добавлен в первую очередь, вот моя попытка сделать это:

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.Но не удачно.

Я искал в сети, как это сделать правильно, но не смог найти.Любые выводы о том, как этого добиться, очень ценятся.

1 Ответ

0 голосов
/ 17 июля 2019

хорошо, чтобы сделать это, вам нужно назначить новый IfcSurfaceStyle для вашей IfcExtrudedAreaSolid стены. Приведенный ниже код отлично работает для Proper Wall 3D примера и экспорта ifc из revit 2018.

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;
        }
...