Getting CompoundStructure of wall in RvtLink

Getting CompoundStructure of wall in RvtLink

sgrimsley
Explorer Explorer
853 Views
1 Reply
Message 1 of 2

Getting CompoundStructure of wall in RvtLink

sgrimsley
Explorer
Explorer

Hi All,

 

I have been facing a problems with trying to get an Element Hosted on a RvtLink to give up information about the Wall in the RvtLink.

 

Below is the code I have used to grab the hosted wall in the RvtLink. This works correctly, but when I try to get info about the CompoundStructureLayers in the Wall, It defaults to calling it a "Basic" wall and says it has no layers or materials. When I inspect the Wall in Revit, it is rich with this information, So why is it not reflected in the data returned by the API?

 

Below is the code I have used to interrogate the walls:

 

                string o = "";

                //test wall revit links
                var id = Info.UIDOC.Selection.GetElementIds().First();
                var el = Info.DOC.GetElement(id);
                var host = (el as FamilyInstance).Host;

                List<Document> links = new List<Document>();
                var rr = (el as FamilyInstance).HostFace.LinkedElementId;

                FilteredElementCollector link_coll = new FilteredElementCollector(Info.DOC);
                var link_ids = link_coll.OfCategory(BuiltInCategory.OST_RvtLinks).ToElementIds();

                link_ids.ToList().ForEach(x => {
                     RevitLinkInstance rli = Info.DOC.GetElement(x) as RevitLinkInstance;
                     if(rli != null) links.Add(rli.GetLinkDocument());
                });

                List<Element> final_link_els = new List<Element>();
                links.ForEach(x => {
                    Element el = x.GetElement(rr);
                    if(el != null) final_link_els.Add(el);
                });

                var fel = final_link_els.First();
                Info.UIDOC.Selection.SetElementIds(final_link_els.Select(x => x.Id).ToArray());

                //WALL TEST FAILS ON LINKED WALLS
                // FilteredElementCollector wall_coll = new FilteredElementCollector(Info.DOC);
                // var walls = wall_coll.OfClass(typeof(Wall)).ToElements().ToList();

                // foreach(var w_el in walls)
                // {
                //     Wall wall = w_el as Wall;
                //     WallType type = wall.WallType;

                //     var c_struct = type.GetCompoundStructure();
                //     var layers = c_struct == null ? c_struct.GetLayers().ToList() : null;
                //     layers = layers ?? new List<CompoundStructureLayer>();

                //     List<Material> wall_mats = new List<Material>();
                //     layers.ToList().ForEach(x => {
                //         var el = Info.DOC.GetElement(x.MaterialId) as Material;
                //         if(el != null) wall_mats.Add(el);
                //     });

                //     o += "--------------------\n";
                //     o += type.Name + "\n";
                //     o += type.FamilyName + "\n";
                //     o += Enum.GetName(typeof(WallKind), type.Kind) + "\n";
                //     o += "MATS:\n";

                //     wall_mats.ForEach(x => o += x.Name + "\n");
                //     o += "--------------------\n";
                // }

                // WALL TEST PASSES ON LINKED WALLS
                foreach(var d in links)
                {
                    FilteredElementCollector wc = new FilteredElementCollector(d);

                    var link_walls = wc.OfClass(typeof(Wall)).ToElements().ToList();

                    foreach(var w_el in link_walls)
                    {
                        Wall wall = w_el as Wall;
                        WallType type = wall.WallType;

                        var c_struct = type.GetCompoundStructure();
                        var layers = c_struct == null ? c_struct.GetLayers().ToList() : null;
                        layers = layers ?? new List<CompoundStructureLayer>();

                        List<CompoundStructureLayer> wall_layers = new List<CompoundStructureLayer>();
                        layers.ToList().ForEach(x => wall_layers.Add(x));

                        List<Material> mats = new List<Material>();
                        foreach(var wall_layer in wall_layers)
                        {
                            var mat = d.GetElement(wall_layer.MaterialId);
                            if(mat != null) mats.Add(mat as Material);
                        }


                        o += "--------------------\n";
                        o += type.Name + "\n";
                        o += type.FamilyName + "\n";
                        o += Enum.GetName(typeof(WallKind), type.Kind) + "\n";
                        o += "MATS:\n";

                        if(mats.Any()) mats.ForEach(x => o += x.Name + "\n");
                        else o += "fail\n";
                        o += "--------------------\n";
                    }
                }

                File.WriteAllText("C:\\Users\\{HOHOTHOUGHTYOUHADMYUSER!}\\Desktop\\test.txt", o);

 

Below is a sample of the output of the test.txt file at the end:

 

--------------------
UA-WA-EXT-CONCRETE-BRICK-LEDGE-8
Basic Wall
Basic
MATS:
fail
--------------------
--------------------
UA-WA-EXT-CONCRETE-BRICK-LEDGE-8
Basic Wall
Basic
MATS:
fail
--------------------
--------------------
UA-WA-EXT-CONCRETE-BRICK-LEDGE-8
Basic Wall
Basic
MATS:
fail
--------------------
--------------------
UA-WA-EXT-CONCRETE-BRICK-LEDGE-8
Basic Wall
Basic
MATS:
fail
--------------------
--------------------
UA-WA-EXT-CONCRETE-BRICK-LEDGE-8
Basic Wall
Basic
MATS:
fail
--------------------
--------------------
UA-WA-EXT-CONCRETE-BRICK-LEDGE-8
Basic Wall
Basic
MATS:
fail
--------------------
--------------------
UA-WA-EXT-CONCRETE-BRICK-LEDGE-8
Basic Wall
Basic
MATS:
fail
--------------------
--------------------
UA-WA-EXT-CONCRETE-BRICK-LEDGE-8
Basic Wall
Basic
MATS:
fail
--------------------
--------------------
UA-WA-EXT-CONCRETE-BRICK-LEDGE-8
Basic Wall
Basic
MATS:
fail
--------------------
--------------------
UA-WA-EXT-CONCRETE-BRICK-LEDGE-8
Basic Wall
Basic
MATS:
fail
--------------------

 

If anyone could shed light on this problem I would be grateful.

 

Thanks,

 

0 Likes
Accepted solutions (1)
854 Views
1 Reply
Reply (1)
Message 2 of 2

sgrimsley
Explorer
Explorer
Accepted solution

I figured it out. Needed to call GetMaterialIds(false) to get the correct Material ID's I guess.

 

This Doesn't work:

 

var layers = wall.GetCompoundStructure().GetLayers();
var mats = new List<Material>();
foreach(var wall_layer in layers)
{
    var mat = LINKEDDOCUMENT.GetElement(wall_layer.MaterialId);
    if(mat != null) mats.Add(mat as Material);
}

 

But This Does:

 

List<Material> mats = wall.GetMaterialIds(false).ToList().Select(x => d.GetElement(x) as Material).ToList();

 

0 Likes