С созданием новых объектов, наверное, вариант, но слишком много попутных нюансов возникает, когда вдруг стена StackedWall, например, плюс, вроде как обещали завести трапецевидные в поперечном сечении стенки.
Можно попробовать пойти твоим путём, почему бы и нет. Отредактированный профиль получаем методом ExporterIFCUtils.GetElevationProfile (проверив, что он вообще существует методом HasElevationProfile), там просто опознать отверстия не на краю, такие как окна. Думаю, ты уже с этим определился, просто отмечу для истории.
Теперь непосредственно к твоему вопросу. Можно попробовать сделать вот что:
1) Получаем геометрию стены, в Options устанавливаем IncludeNonVisibleObjects - показать невидимые объекты
2) Фильтруем в полученной геометрии стены Solid-ы c нулевым объемом, каждый такой Solid будет содержать одну поверхность
3) Фильтруем поверхности. Нам нужны такие, которые лежат в плоскости стены.
Итого тут ты получишь список из нескольких параллельных поверхностей, берешь любую, желательно ближайшую к плоскости профиля GetElevationProfile, дальше с ней работаешь.
Proof of concept, немножко говнокода для Iron Python Shell:
opt = Options()
opt.IncludeNonVisibleObjects = True
faces = s0.get_Geometry(opt).Cast[Solid]().Where(lambda x: x.Volume < 0.001).Select(lambda x: x.Faces.get_Item(0)).Where(lambda x: x.ComputeNormal(UV.Zero).CrossProduct(s0.Orientation).IsAlmostEqualTo(XYZ.Zero)).ToList()
print faces.Count
def DrawFace(face):
cl = face.GetEdgesAsCurveLoops().Single()
if not(cl.HasPlane()):
return
p = cl.GetPlane()
print p.Normal
sp = SketchPlane.Create(doc, p)
for c in cl:
doc.Create.NewModelCurve(c, sp)
tx = Transaction(doc, "test")
tx.Start()
for f in faces:
DrawFace(f)
tx.Commit()
![](https://i.postimg.cc/p90wn4Tk/Screenshot-2021-03-16-152733.png)