Revit二次开发第九回:获取梁的截面宽和高

最简单的办法是,通过类型参数,获取梁的截面参数: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;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }

你可能感兴趣的:(Revit二次开发,C#)