最简单的办法是,通过类型参数,获取梁的截面参数:FamilyInstance.Symbol.LookupParameter().AsValueString();
FamilyInstance familyInstance = beamFoundationList[0]; string Bname = familyInstance.Symbol.LookupParameter("b").AsValueString();//be careful to distinguish case from case
不过,因为每个族定义的名称都不一样,所以适用范围不广。
推荐以下方式(学习自:魏无忌大神的博客)
此处有几点需要学习:
1.之前也有过这样的需求,不过没实现过:就是想通过一个方法,得到2个返回值。
解决办法,新建一个类,在类中定义两个属性,用来接收需要的2个返回值。
然后通过类的实例get.Height和get.Width来获取需要的高和宽。
2.类也可以通过构造函数来初始化,并不是只有方法才可以。以前遇到的比如主函数和Winform之间需要传递参数,就是通过Winform窗口的构造类来实现的。
3.关于类中的字段和属性。
属性比字段高一级,可以在其中定义一些规则,比如年纪不能大于100之类的。而字段只是字段。
另外,如果只定义了属性而没有定义字段,其实默认就定义了属性对应的字段。如下例中,默认定义了:
private double width;
private double height;
GetProfileOfBeam get = new GetProfileOfBeam(familyInstance); TaskDialog.Show("asd", get.Heigth.ToString()); TaskDialog.Show("asd", get.Width.ToString());
public class GetProfileOfBeam { public double Heigth { get; set; } public double Width { get; set; } public GetProfileOfBeam(FamilyInstance familyInstance) { //求出梁的基线的方向 Line line = ((familyInstance.Location) as LocationCurve).Curve as Line; XYZ dir = line.Direction; //根据梁的几何信息,得到solid,face GeometryElement geometryElement = familyInstance.get_Geometry(new Options()); foreach (GeometryObject geoOb in geometryElement) { GeometryInstance gIn = geoOb as GeometryInstance; if (gIn != null) { GeometryElement ge = gIn.GetInstanceGeometry(); foreach (GeometryObject go in ge) { Solid solid = go as Solid; if (solid != null && solid.Volume > 0) { foreach (Face face in solid.Faces) { XYZ faceNormal = face.ComputeNormal(new UV()); if (faceNormal.IsAlmostEqualTo(dir) || faceNormal.IsAlmostEqualTo(-dir)) { BoundingBoxUV uvBox = face.GetBoundingBox(); XYZ min = face.Evaluate(uvBox.Min); XYZ max = face.Evaluate(uvBox.Max); Heigth = Math.Abs(max.Z - min.Z)*304.8; Heigth = Math.Round(Heigth); //h好求,但是宽度b不一定是x还是y,所以用了下面的方式 double l = max.DistanceTo(min)*304.8; Width = Math.Sqrt(l * l - Heigth * Heigth); Width = Math.Round(Width); break; } } } } } } } }