revit二次开发——从族实例中取得几何信息

本文介绍如何使用Revit API从族实例中提取几何信息,包括获取面、边、线和点等,并展示了具体的C#实现代码。适用于建筑信息模型(BIM)领域的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、可以从族实例中获得面、获得边、获得线、获得点,方法如下

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;
using Autodesk.Revit.ApplicationServices;
namespace 从族实例中获得几何信息
{
    [Autodesk.Revit.Attributes.Transaction(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    [Autodesk.Revit.Attributes.Journaling(Autodesk.Revit.Attributes.JournalingMode.NoCommandData)]
    [Autodesk.Revit.Attributes.Regeneration(Autodesk.Revit.Attributes.RegenerationOption.Manual)]
    public class Class1 : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {
            Document revitDoc = commandData.Application.ActiveUIDocument.Document //取得文档
            Application revitApp = commandData.Application.Application;             //取得应用程序
            UIDocument uiDoc = commandData.Application.ActiveUIDocument;
            Selection sel = uiDoc.Selection;
            Reference ref1 = sel.PickObject(ObjectType.Element, "选择一个族实例");
            Element elem = revitDoc.GetElement(ref1);
            FamilyInstance familyInstance = elem as FamilyInstance;
            Options opt = new Options();
            opt.ComputeReferences = true;
            opt.DetailLevel = ViewDetailLevel.Fine;
            GeometryElement e = familyInstance.get_Geometry(opt);
           
            foreach (GeometryObject obj in e)
            {
                    GeometryInstance geoInstance = obj as GeometryInstance;
                    GeometryElement geoElement = geoInstance.GetInstanceGeometry();
                    Transform insTransform = geoInstance.Transform;
                    foreach (GeometryObject obj2 in geoElement)
                    {
                           Solid solid2 = obj2 as Solid;
                         if (solid2.Faces.Size > 0)
                         {
                        //FindBottomFace(solid2);
                        //FindEdge(solid2);
                        //FindLine(solid2);
                        //FindPoint(solid2);
                        transformPointAndUaPoint(solid2, insTransform);
                        TaskDialog.Show("呵呵", "在这里");
                         }                      
                    }               
            }
            return Result.Succeeded;
        }
        /// <summary>
        /// 得到最底下的边的面积和原点坐标
        /// </summary>
        /// <param name="solid"></param>
        /// <returns></returns>
        Face FindBottomFace(Solid solid)
        {
            PlanarFace pf = null;
            foreach (Face face in solid.Faces)
            {
                pf = face as PlanarFace;
                if (null != pf)
                {
                    if (Math.Abs(pf.FaceNormal.X) < 0.01 && Math.Abs(pf.FaceNormal.Y) < 0.01 && pf.FaceNormal.Z < 0)
                    {
                        TaskDialog.Show("Wall Bottom Face", "Area is " + pf.Area.ToString() + "; Origin = (" + pf.Origin.X.ToString() + "  " + pf.Origin.Y.ToString() + "  " + pf.Origin.Z.ToString() + ")");
                        break;
                    }
                }
            }
            return pf;
        }
        /// <summary>
        /// 通过curve得到12个边的长度
        /// </summary>
        /// <param name="solid"></param>
        public void FindEdge(Solid solid)
        {
            string strParamInfo = null;
            foreach (Edge e in solid.Edges)
            {
                strParamInfo += e.ApproximateLength + "\n";
            }
            TaskDialog.Show("REVIT", strParamInfo);
        }
        /// <summary>
        /// 通过Line得到12个边的长度
        /// </summary>
        /// <param name="solid"></param>
        public void FindLine(Solid solid)
        {
            string strParamInfo = null;
            foreach (Edge e in solid.Edges)
            {
                Line line = e.AsCurve() as Line;
                strParamInfo += line.ApproximateLength + "\n";
            }
            TaskDialog.Show("REVIT", strParamInfo);
        }
        /// <summary>
        /// 通过curve或者line找到点
        /// </summary>
        /// <param name="solid"></param>
        public void FindPoint(Solid solid)
        {
            string strParamInfo1 = null;
            string strParamInfo2 = null;
            //string strParamInfo3 = null;
            foreach (Edge e in solid.Edges)
            {
                foreach(XYZ ii in e.Tessellate())
                {
                    XYZ point = ii;
                    strParamInfo1+=ii.X +","+ii.Y+","+ii.Z+ "\n";
                   
                 }
                Line line = e.AsCurve() as Line;
                foreach (XYZ ii in line.Tessellate())
                {
                    XYZ point = ii;
                    strParamInfo2 += ii.X + "," + ii.Y + "," + ii.Z + "\n";
                }
               
            }
            TaskDialog.Show("通过curve找到点的坐标", strParamInfo1);
            TaskDialog.Show("通过line找到点的坐标", strParamInfo2);
        }
        public void transformPointAndUaPoint(Solid solid,Transform insTransform)
        {
            string strParamInfo1 = null;
            string strParamInfo2 = null;
            //string strParamInfo3 = null;
            foreach (Edge e in solid.Edges)
            {
                foreach (XYZ ii in e.Tessellate())
                {
                    XYZ point = ii;
                    strParamInfo1 += point.X + "," + point.Y + "," + point.Z + "\n";
                    XYZ transformPoint = insTransform.OfPoint(point);
                    strParamInfo2 += transformPoint.X + "," + transformPoint.Y + "," + transformPoint.Z + "\n";
                }             
            }
            TaskDialog.Show("未经transform过转换的坐标", strParamInfo1);
            TaskDialog.Show("经过transform转换的坐标系", strParamInfo2);
        }
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值