получить плоские face-ы - solid.Faces.OfType<PlanarFace>()
- самую верхнюю и самую нижнюю горизонтальную поверхность (Face) куба
у плоской поверхности получить нормаль, если она BasisZ - то это горизонтальная верхняя поверхность, самая верхняя или нет - смотрим свойство face.Origin.Z, горизонтальная нижняя имеет нормаль -1*BasisZ
- получить все вертикальные и горизонтальные поверхности
с горизонтальными разобрались, вертикальные опять же проверяем нормаль: normal.DotProduct(XYZ.BasisZ) ~ 0
- как узнать что Face имеет отверстия внутри?
получаем все границы face.GetEdgesAsCurveLoops, дальше каждую из них тестируем методом IsCounterclockwise, которому передаем нормаль faсe-а, если результат false - значит, это отверстие