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