revit二次开发 提取模型线边缘并将之变成模型线

提取模型线边缘并将之变成模型线主要是为了方便建桥梁的护栏,因为选择护栏的路线必须是在平面上,这点暂时不好解决。

但是前一个问题还是可以解决的。


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);
            Transaction tra = new Transaction(revitDoc);
            tra.Start("revit");
            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)
                    {
                        
                        foreach (Edge edge in solid2.Edges)
                        {
                            Curve curve = edge.AsCurve();
                            //TaskDialog.Show("revit",edge.AsCurve().GetType().ToString());                            


                            CreatModelLine2(revitDoc, curve, revitApp);
                            //SketchPlane plane =SketchPlane.Create(revitDoc,new Plane(normal,curve.GetEndPoint(0)));
                            //ModelCurve modelCurve = revitDoc.Create.NewModelCurve(curve,);
                            
                        }
                        






                        //FindBottomFace(solid2);
                        //FindEdge(solid2);
                        //FindLine(solid2);
                        //FindPoint(solid2);
                        //transformPointAndUaPoint(solid2, insTransform);
                        //TaskDialog.Show("呵呵", "在这里");
                    }
                }
            }
            tra.Commit();
            return Result.Succeeded;
        }


        public void CreatModelLine(Document revitDoc, Curve curve, Application revitApp)
        {
            XYZ p1 = GeomUtil.SubXYZ(curve.GetEndPoint(0), curve.GetEndPoint(1));
            XYZ p2 = GeomUtil.SubXYZ(curve.GetEndPoint(0), new XYZ(3, 29, 37));
            XYZ normal = GeomUtil.CrossMatrix(p1, p2);
            SketchPlane modelSketch = SketchPlane.Create(revitDoc, revitApp.Create.NewPlane(normal, curve.GetEndPoint(0)));
            ModelCurve modelcurve = revitDoc.FamilyCreate.NewModelCurve(curve, modelSketch);


        }
        /// <summary>
        /// 在项目中建模型线
        /// </summary>
        /// <param name="revitDoc"></param>
        /// <param name="curve"></param>
        /// <param name="revitApp"></param>
        public void CreatModelLine2(Document revitDoc, Curve curve, Application revitApp)
        {
            
            try
            {
                XYZ p1 = GeomUtil.SubXYZ(curve.GetEndPoint(0), curve.GetEndPoint(1));
                XYZ p2 = GeomUtil.SubXYZ(curve.GetEndPoint(0), new XYZ(3, 29, 37));
                XYZ normal = GeomUtil.CrossMatrix(p1, p2);
                SketchPlane modelSketch = SketchPlane.Create(revitDoc, revitApp.Create.NewPlane(normal, curve.GetEndPoint(0)));
                ModelCurve modelcurve = revitDoc.Create.NewModelCurve(curve, modelSketch);
            }
            catch
            {
                XYZ p1 = GeomUtil.SubXYZ(curve.Tessellate()[0], curve.Tessellate()[1]);
                XYZ p2 = GeomUtil.SubXYZ(curve.GetEndPoint(0), curve.Tessellate()[2]);
                XYZ normal = GeomUtil.CrossMatrix(p1, p2);
                SketchPlane modelSketch = SketchPlane.Create(revitDoc, revitApp.Create.NewPlane(normal, curve.GetEndPoint(0)));
                ModelCurve modelcurve = revitDoc.Create.NewModelCurve(curve, modelSketch);
            }
            
        }

}

Revit API 中,CurveLoop 是一个表示封闭曲线路径的类,用于表示详图线等几何图形中的封闭路径。CurveLoop 类继承自 IList<Curve> 接口,因此可以使用列表的方式来访问 CurveLoop 中的每个 Curve 对象。 CurveLoop 中的 Curve 对象可以是 Line、Arc、Ellipse 等类型的曲线,在 CurveLoop 中这些曲线对象按照一定的顺序排列,形成一个封闭的曲线路径。CurveLoop 对象本身也是封闭的,即 CurveLoop 中的最后一个 Curve 对象的终点坐标和第一个 Curve 对象的起点坐标是重合的。 CurveLoop 可以用于表示详图线、房间边界等封闭曲线路径,可以在几何计算、图形绘制等场景中使用。 以下是一个示例代码,展示如何创建一个 CurveLoop 对象并添加多个 Curve 对象: ```csharp // 创建 CurveLoop 对象 CurveLoop curveLoop = new CurveLoop(); // 添加 Line 对象 Line line = Line.CreateBound(new XYZ(0, 0, 0), new XYZ(10, 0, 0)); curveLoop.Append(line); // 添加 Arc 对象 XYZ centerPoint = new XYZ(5, 5, 0); double radius = 5; double startAngle = 0; double endAngle = Math.PI / 2; Arc arc = Arc.Create(centerPoint, radius, startAngle, endAngle, new XYZ(0, 1, 0), new XYZ(1, 0, 0)); curveLoop.Append(arc); // 判断 CurveLoop 是否闭合 if (curveLoop.IsClosed()) { // CurveLoop 闭合 } else { // CurveLoop 不闭合 } ``` 在以上代码中,首先创建了一个 CurveLoop 对象,然后向其中添加了一个 Line 对象和一个 Arc 对象。最后通过调用 IsClosed 方法判断 CurveLoop 是否闭合。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值