Revit二次开发入门:第五章几何

本章内容

1.什么是几何

几何数据就是代表一个构件的几何模型。

在Autodesk.Revit.DB命名空间里包含了一些几何图形相关的类型,他们在API中用于几何图形的标识和处理。

从基类基础的情况分,API提供了三大种几何类型来描述和存储几何信息,分别是:

2.属性参数

OPtions决定具体返回的具体值

3.几何对象与关系

几何对象:

4.几何基元类

几何基元类在API中描述图形表示,由基类GeometryObject派生,主要有如下的类型:

5.几何辅助类

API有一些辅助类来帮助表示某些元素的几何信息,比如视图的裁剪是由BoundingBoxXYZ对象来定义的。

6.几何集合类

API提供了下面一些几何类用来存储或者遍历稽核数据,所有这些类的方法和属性是类似的。

7.几何运算与工具集

Intersect Curve Face Solid
Curve
Face
Solid
Project XYZ Curve Face Solid
XYZ /
Curve
Face
Solid

8.实例练习1:几何计算

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Linq;

namespace SolidPractise {
    [TransactionAttribute(TransactionMode.Manual)]
    [RegenerationAttribute(RegenerationOption.Manual)]
    public class SolidTest : IExternalCommand {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) {
            UIDocument uiDoc = commandData.Application.ActiveUIDocument;
            Document doc = uiDoc.Document;
            ICollection<ElementId> ids = uiDoc.Selection.GetElementIds();
            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 o in ge) {
                if (o is Solid) {
                    Solid sd = o as Solid;
                    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() + "平方米\n" +
                                  "体积为:" + volume.ToString("0.000") + "立方米\n" +
                                  "三角网格数为:" + triangleCount.ToString());

            return Result.Succeeded;
        }
    }
}

9.实例练习2:交点立柱

using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Structure;
using Autodesk.Revit.UI;
using System.Collections.Generic;
using System.Linq;

namespace GridPractise {
    [TransactionAttribute(TransactionMode.Manual)]
    [RegenerationAttribute(RegenerationOption.Manual)]
    public class GridTest : IExternalCommand {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements) {
            UIDocument uiDoc = commandData.Application.ActiveUIDocument;
            Document doc = uiDoc.Document;
            FilteredElementCollector coll = new FilteredElementCollector(doc);
            ElementClassFilter gridFilter = new ElementClassFilter(typeof(Grid));
            List<Element> grid = coll.WherePasses(gridFilter).ToElements().ToList();
            List<Line> gridLines = new List<Line>();
            List<XYZ> intXyzs = new List<XYZ>();
            foreach (Grid g in grid) {
                gridLines.Add(g.Curve as Line);
            }

            foreach (Line line1 in gridLines) {
                foreach (Line line2 in gridLines) {
                    XYZ normal1 = line1.Direction;
                    XYZ normal2 = line2.Direction;
                    if (normal1.IsAlmostEqualTo(normal2)) {
                        continue;
                    }

                    SetComparisonResult intRst = line1.Intersect(line2, out IntersectionResultArray results);
                    if (intRst == SetComparisonResult.Overlap && results.Size == 1) {
                        XYZ tp = results.get_Item(0).XYZPoint;
                        if (intXyzs.Where(m => m.IsAlmostEqualTo(tp)).Count() == 0) {
                            intXyzs.Add(tp);
                        }
                    }
                }
            }

            Level level = doc.GetElement(new ElementId(311)) as Level;
            FamilySymbol familySymbol = doc.GetElement(new ElementId(338370)) as FamilySymbol;
            using (Transaction tr = new Transaction(doc)) {
                tr.Start("Clomn");
                if (!familySymbol.IsActive) {
                    familySymbol.Activate();
                }

                foreach (XYZ xyz in intXyzs) {
                    FamilyInstance familyInstance =
                        doc.Create.NewFamilyInstance(xyz, familySymbol, level, StructuralType.NonStructural);
                }

                tr.Commit();
            }

            return Result.Succeeded;
        }
    }
}