如何通过C#.NET API在Smart 3D中获取Footing对象的端口
在Smart 3D API中获取Footing底面/拓扑信息的正确方法
你遇到的问题核心是:Footing的AssemblyChildren成员是FoundationComponent类型,它并未实现IStructConnectable接口,因此无法用Slab的方式直接转换获取端口。以下是两种可行的解决方案:
方法1:直接获取Footing底面标高
如果仅需要底面标高,可直接访问Footing自身的BaseElevation属性(多数Smart 3D API版本均提供该属性),无需遍历AssemblyChildren:
Footing footing = bottom as Footing; if (footing != null) { double bottomElevation = footing.BaseElevation; // 使用标高值做后续处理 }
方法2:通过FoundationComponent获取拓扑面/端口
若需要完整的拓扑面或端口信息,需将AssemblyChild转为FoundationComponent,再通过其几何属性或拓扑方法获取:
Footing footing = bottom as Footing; ReadOnlyCollection<IAssemblyChild> assemblyChildren = footing.AssemblyChildren; foreach (IAssemblyChild assemblyChild in assemblyChildren) { FoundationComponent foundationComp = assemblyChild as FoundationComponent; if (foundationComp != null) { // 方式A:遍历几何面定位底面 if (foundationComp.Geometry is IFaceCollection faceCollection) { foreach (IFace face in faceCollection.Faces) { // 假设Z轴向上,底面法向量向下(接近-1) if (face.Normal.Z < -0.9) { // 获取底面拓扑端口(需确认IFace支持该方法) TopologyPort bottomPort = face.GetTopologyPort(); // 处理底面拓扑信息 break; } } } // 方式B:直接筛选指定类型的拓扑端口 IEnumerable<TopologyPort> facePorts = foundationComp.GetPorts(TopologyGeometryType.Face); foreach (TopologyPort port in facePorts) { if (port.ContextType == ContextTypes.Base) { // 找到目标底面端口 // 处理端口信息 break; } } break; } }
关键说明
FoundationComponent是Footing的底层组成部件,其设计逻辑与Slab的可连接部件不同,因此不支持IStructConnectable接口。- 不同版本的Smart 3D API可能存在成员差异,建议结合官方API文档确认
FoundationComponent的可用属性(如Geometry、GetPorts)和Footing的基础属性。
内容的提问来源于stack exchange,提问作者kingpin
相关产品推荐
相关产品推荐

