- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report
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,
Solved! Go to Solution.