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);
            }
            
        }

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值