zoukankan      html  css  js  c++  java
  • Revit 二次开发 几何计算练习

    学习地址:https://www.bilibili.com/video/BV1mf4y1S72o?p=8

    达到目标一

    • 从一个元素中得到实体
    • 从实体得到面,计算面积与体积
    • Solid、Face、Mesh、Triangle之间的关系

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Autodesk.Revit.UI;
    using Autodesk.Revit.DB;
    using Autodesk.Revit.ApplicationServices;
    using Autodesk.Revit.Attributes;
    using System.Windows.Forms;
    using Autodesk.Revit.UI.Selection;
    
    namespace RevitDevTV
    {
        /// <summary>
        /// 几何计算
        /// </summary>
        [TransactionAttribute(TransactionMode.Manual)]
        [RegenerationAttribute(RegenerationOption.Manual)]
        public class SolidPractise : IExternalCommand
        {
            public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
            {
                //获取UIDocument
                UIDocument uiDoc = commandData.Application.ActiveUIDocument;
                Autodesk.Revit.DB.Document revitDoc = uiDoc.Document;
                //收集Document的id
                ICollection<ElementId> ids = uiDoc.Selection.GetElementIds(); //获取选择到的元素的ID
                Element selElem = uiDoc.Document.GetElement(ids.First()); //获取选择的第一个元素
                GeometryElement ge = selElem.get_Geometry(new Options());
                double area = 0; //面积
                double volume = 0; //体积
                int triangleCount = 0; //三角网格数
                foreach (GeometryObject gObj in ge)
                {
                    if (gObj is Solid) //判断是否是实体
                    {
                        Solid sd = gObj as Solid; //如果是实体,都是sd
                        foreach (Face face in sd.Faces) //获取所有面
                        {
                            area += face.Area*0.3048*0.3048;
                            Mesh mesh = face.Triangulate(0.5);
                            triangleCount += mesh.NumTriangles; //获取网格数量
                        }
                        volume += sd.Volume * 0.3048 * 0.3048 * 0.3048;
                    }
                }
                TaskDialog.Show("计算", "面积总和为:"+area.ToString()+";平方米"+"
    "+"体积为:"+volume.ToString("0.000")+"立方米"+"
    "+"三角网格数:"+triangleCount.ToString()+"");
                return Result.Succeeded;
            }
        }
    }

    达到目标二

    交点立柱

    • 计算轴线间的交点
    • 在交点处放置柱子

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Autodesk.Revit.UI;
    using Autodesk.Revit.DB;
    using Autodesk.Revit.ApplicationServices;
    using Autodesk.Revit.Attributes;
    using System.Windows.Forms;
    using Autodesk.Revit.UI.Selection;
    
    namespace RevitDevTV
    {
        /// <summary>
        /// 交点立柱
        /// </summary>
        [TransactionAttribute(TransactionMode.Manual)]
        [RegenerationAttribute(RegenerationOption.Manual)]
        public class GridPractise : IExternalCommand
        {
            public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
            {
                UIDocument uiDoc = commandData.Application.ActiveUIDocument;
                Document revitDoc = uiDoc.Document;
                //创建一个收集器,从uiDoc.Document中获取
                FilteredElementCollector coll = new FilteredElementCollector(revitDoc);
                //创建一个轴网过滤器,从grid(网格)中收集
                ElementClassFilter gridFilter = new ElementClassFilter(typeof(Grid));
                //将过滤的轴网,放入list
                List<Element> grid = coll.WherePasses(gridFilter).ToElements().ToList();
                //收集线
                List<Line> gridLines = new List<Line>();
                //创建交点
                List<XYZ> intPos = new List<XYZ>();
                //找到轴网的交点
                foreach (Grid gri in grid)
                {
                    gridLines.Add(gri.Curve as Line);
    
                }
                foreach (Line ln1 in gridLines)
                {
                    foreach (Line ln2 in gridLines)
                    {
                        XYZ normal1 = ln1.Direction;
                        XYZ normal2 = ln2.Direction;
                        if (normal1.IsAlmostEqualTo(normal2)) continue;
                        IntersectionResultArray results;
                        SetComparisonResult intRst = ln1.Intersect(ln2, out results);
                        if (intRst==SetComparisonResult.Overlap && results.Size==1)
                        {
                            XYZ tp = results.get_Item(0).XYZPoint;
                            if (intPos.Where(m=>m.IsAlmostEqualTo(tp)).Count()==0)
                            {
                                intPos.Add(tp);
                            }
                        }
                    }
                }
                Level level = revitDoc.GetElement(new ElementId(331)) as Level;
                FamilySymbol familysymb = revitDoc.GetElement(new ElementId(52557)) as FamilySymbol;
                //在交点处放置52557的柱子
                using (Transaction trans=new Transaction(revitDoc))
                {
                    trans.Start("dfs");
                    if (!familysymb.IsActive)
                    {
                        familysymb.Activate();
                    }
                    foreach (XYZ p in intPos)
                    {
                        //使用创建方法
                        FamilyInstance familyInstance = revitDoc.Create.NewFamilyInstance(p,familysymb,level,Autodesk.Revit.DB.Structure.StructuralType.NonStructural);
                    }
                    trans.Commit();
                }
                    return Result.Succeeded;
            }
        }
    }
  • 相关阅读:
    命名规范
    操作文件和目录
    使用本地shadow socks代理
    发送邮件
    sql参数化
    定义常量
    获取嵌套字典值的方法
    通过字符串调用函数
    用字典优化过长的if 语句
    操作文件和目录
  • 原文地址:https://www.cnblogs.com/chenyanbin/p/13283346.html
Copyright © 2011-2022 走看看