计算楼梯体积

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.UI;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI.Selection;

namespace WorkingDymo
{
    /// <summary>
    /// 计算楼梯体积,本案例包含了element=》solid过程的数据提取
    /// </summary>
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    class 获取楼梯体积 : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;
            //获取楼梯元素
            Reference refer = null;
            try
            {
                refer = uidoc.Selection.PickObject(ObjectType.Element, "选择一个楼梯");
            }
            catch
            {

                return Result.Succeeded;
            }
            //获取元素
            Element ele = doc.GetElement(refer);
            List<Solid> solids = GetSolidsOfElement(ele);
            double volume = 0;
            foreach (Solid solid in solids)
            {
                volume += solid.Volume*0.3048*0.3048*0.3048;//获得体积并进行单位转换
            }
            TaskDialog.Show("楼梯体积", "获取体积是:" + volume);
            return Result.Succeeded;
        }


        #region GetSolidsOfElement:从element里面获取实体的方法
        public List<Solid>GetSolidsOfElement(Element ele)
        {
            //生成事件,指定返回数据的特征
            Options options = new Options();
            options.DetailLevel = ViewDetailLevel.Fine;
            options.ComputeReferences = true;
            options.IncludeNonVisibleObjects = true;
            //取得构件元素
            GeometryElement geoElement = ele.get_Geometry(options);
            List<GeometryObject> geoObj = new List<GeometryObject>();
            //递归获取集合元素的所有geometryobject
            GetAllObj(geoElement, ref geoObj);
            //转为solid的集合
            List<Solid> solids = geoObj.ConvertAll(m => m as Solid);
            return solids;
        }
        #endregion
        #region GetAllObj获得geometry的方法
        //获得geometryobject的递归算法
        public void GetAllObj(GeometryElement  gele,ref List<GeometryObject>gobjs)
        {
            if (gele==null)
            {
                return;
            }
            //遍历geometryelement里面的geometryobject
            IEnumerator<GeometryObject> enumerator = gele.GetEnumerator();
            while(enumerator.MoveNext())
            {
                GeometryObject geoObject = enumerator.Current;
                Type type = geoObject.GetType();
                //如果是嵌套的GeometryElement 
                if (type.Equals(typeof(GeometryElement)))
                {
                    //则递归
                    GetAllObj(geoObject as GeometryElement, ref gobjs);
                }
                //如果嵌套的geometryinstance
                else if (type.Equals(typeof(GeometryInstance)))
                {
                    //则用getinstancegeometry取得其中的geometryelement再递归
                    GetAllObj((geoObject as GeometryInstance).GetInstanceGeometry(), ref gobjs);
                }
                //如果是solid,则存入集合,递归结束
                else 
                {
                if(type.Equals(typeof(Solid)))
                    {
                        Solid solid = geoObject as Solid;
                        //去掉可能存在的空Solid
                        if (solid.Faces.Size>0||solid.Edges.Size>0)
                        {
                            gobjs.Add(geoObject);
                        }
                    }
                }
            }
        }
        #endregion


    }




}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值