每个元素的重复端点
duplicate endpoints for every element
我正在努力导出所有墙的顶点。
我设法输出了结果,但是每面墙都有相同的一组顶点。
我使用了获取元素边缘的方法,但每面墙包含 92 个端点,这在我使用的基本墙上是不正确的。
然后我使用获取面孔并从中获取网格然后通过顶点 属性.
获取顶点的方法
这提供了 28 个顶点,这对于某些墙是正确的,但每个元素的坐标都是相同的。
我该如何以正确的方式处理这个问题?
我的代码:
FilteredElementCollector wallcollector = new FilteredElementCollector(doc).OfClass(typeof(Wall)).WhereElementIsNotElementType();
bool isconcrete = false;
foreach (var element in wallcollector.ToElements())
{
foreach (var mat in element.GetMaterialIds(false))
{
if (doc.GetElement(mat).Name.Contains("Concrete")) isconcrete = true;
}
if (isconcrete)
{
GeometryElement geo = element.get_Geometry(new Options());
if (geo != null)
{
foreach (var g in geo)
{
Solid geosolid = g as Solid;
if (geosolid != null)
{
foreach (Face f in geosolid.Faces)
{
Mesh mesh = f.Triangulate();
foreach (var xyz in mesh.Vertices)
{
FillDictionary(xyz, element);
}
}
}
}
}
}
}
我不认为我的迭代是错误的,因为我基本上只是 foreach 一切,但也许有一些我看不到的隐藏错误。
我使用字典来存储我的数据。
这是我的填写方式:
public void FillDictionary(XYZ point, Element element) {
if (element.Id.IntegerValue == formerid)
{
cornerByID[element.UniqueId].Add(ttr.OfPoint(point));
}
else
{
cornerlist.Clear();
cornerlist.Add(element.Name);
cornerlist.Add(element);
cornerlist.Add(element.Id);
cornerlist.Add(ttr.OfPoint(point));
cornerByID.Add(element.UniqueId, cornerlist);
formerid = element.Id.IntegerValue;
}
}
如果您使用带有 XYZ
个对象键的字典,您需要实现 fuzzy comparison to compare the keys.
我正在努力导出所有墙的顶点。
我设法输出了结果,但是每面墙都有相同的一组顶点。
我使用了获取元素边缘的方法,但每面墙包含 92 个端点,这在我使用的基本墙上是不正确的。
然后我使用获取面孔并从中获取网格然后通过顶点 属性.
获取顶点的方法
这提供了 28 个顶点,这对于某些墙是正确的,但每个元素的坐标都是相同的。
我该如何以正确的方式处理这个问题?
我的代码:
FilteredElementCollector wallcollector = new FilteredElementCollector(doc).OfClass(typeof(Wall)).WhereElementIsNotElementType();
bool isconcrete = false;
foreach (var element in wallcollector.ToElements())
{
foreach (var mat in element.GetMaterialIds(false))
{
if (doc.GetElement(mat).Name.Contains("Concrete")) isconcrete = true;
}
if (isconcrete)
{
GeometryElement geo = element.get_Geometry(new Options());
if (geo != null)
{
foreach (var g in geo)
{
Solid geosolid = g as Solid;
if (geosolid != null)
{
foreach (Face f in geosolid.Faces)
{
Mesh mesh = f.Triangulate();
foreach (var xyz in mesh.Vertices)
{
FillDictionary(xyz, element);
}
}
}
}
}
}
}
我不认为我的迭代是错误的,因为我基本上只是 foreach 一切,但也许有一些我看不到的隐藏错误。 我使用字典来存储我的数据。 这是我的填写方式:
public void FillDictionary(XYZ point, Element element) {
if (element.Id.IntegerValue == formerid)
{
cornerByID[element.UniqueId].Add(ttr.OfPoint(point));
}
else
{
cornerlist.Clear();
cornerlist.Add(element.Name);
cornerlist.Add(element);
cornerlist.Add(element.Id);
cornerlist.Add(ttr.OfPoint(point));
cornerByID.Add(element.UniqueId, cornerlist);
formerid = element.Id.IntegerValue;
}
}
如果您使用带有 XYZ
个对象键的字典,您需要实现 fuzzy comparison to compare the keys.