zoukankan      html  css  js  c++  java
  • Revit API 楼板开洞

    start
    [Transaction(TransactionMode.Manual)]
    [Regeneration(RegenerationOption.Manual)]
    public class cmdFloorOpening : IExternalCommand
    {
        public Result Execute(ExternalCommandData cmdData, ref string msg, ElementSet elements)
        {
            UIDocument uiDoc = cmdData.Application.ActiveUIDocument;
            Document doc = uiDoc.Document;
            Selection sel = uiDoc.Selection;
            Autodesk.Revit.Creation.Application aCreate = cmdData.Application.Application.Create;

            Transaction ts = new Transaction(doc, "www");
            ts.Start();
            //楼板
            Reference refFloor = sel.PickObject(ObjectType.Element, "floor");
            Floor floor = doc.GetElement(refFloor) as Floor;
            Face face = FindFloorFace(floor);
            CurveArray curves = aCreate.NewCurveArray();
            //风管
            Reference refDuct = sel.PickObject(ObjectType.Element, "duct");
            Duct duct = doc.GetElement(refDuct) as Duct;
            Curve curve = FindDuctCurve(duct);
            //求交点
            XYZ xyz = FindFaceCurve(face, curve);
            /*开矩形洞*/
            XYZ xyz1 = xyz + new XYZ(110) * 200 / 304.8;
            XYZ xyz2 = xyz + new XYZ(1, -10) * 200 / 304.8;
            XYZ xyz3 = xyz + new XYZ(-1, -10) * 200 / 304.8;
            XYZ xyz4 = xyz + new XYZ(-110) * 200 / 304.8;
            Curve c1 = aCreate.NewLine(xyz1, xyz2, true);
            Curve c2 = aCreate.NewLine(xyz2, xyz3, true);
            Curve c3 = aCreate.NewLine(xyz3, xyz4, true);
            Curve c4 = aCreate.NewLine(xyz4, xyz1, true);
            curves.Append(c1);
            curves.Append(c2);
            curves.Append(c3);
            curves.Append(c4);

            /*开圆形洞
            double startAngle = 0;
            double midAngle = Math.PI;
            double endAngle = 2 * Math.PI;

            XYZ xAxis = XYZ.BasisX;
            XYZ yAxis = XYZ.BasisY;
            double radius = 180 / 304.8;

            Arc arc1 = aCreate.NewArc(xyz, radius, startAngle, midAngle, xAxis, yAxis);
            Arc arc2 = aCreate.NewArc(xyz, radius, midAngle, endAngle, xAxis, yAxis);

            curves.Append(arc1);
            curves.Append(arc2);
    */

            doc.Create.NewOpening(floor, curves, true);

            ts.Commit();

            return Result.Succeeded;
        }
        //求线和面的交点
        public XYZ FindFaceCurve(Face face, Curve curve)
        {
            //求交点
            IntersectionResultArray intersectionR = new IntersectionResultArray();//交点集合
            SetComparisonResult comparisonR;//Comparison比较
            comparisonR = face.Intersect(curve, out intersectionR);
            XYZ intersectionResult = null;//交点坐标
            if (SetComparisonResult.Disjoint != comparisonR)//Disjoint不交
            {
                if (!intersectionR.IsEmpty)
                {
                    intersectionResult = intersectionR.get_Item(0).XYZPoint;
                }
            }
            return intersectionResult;
        }
        //找到风管对应的曲线
        public Curve FindDuctCurve(Duct duct)
        {
            //得到风管曲线
            IList<XYZ> list = new List<XYZ>();
            ConnectorSetIterator csi = duct.ConnectorManager.Connectors.ForwardIterator();
            while (csi.MoveNext())
            {
                Connector conn = csi.Current as Connector;
                list.Add(conn.Origin);
            }
            Curve curve = Line.get_Bound(list.ElementAt(0), list.ElementAt(1)) as Curve;
            curve.MakeUnbound();
            return curve;
        }
        //找到楼板的面
        public Face FindFloorFace(Floor floor)
        {
            Face normalFace = null;
            //
            Options opt = new Options();
            opt.ComputeReferences = true;
            opt.DetailLevel = Autodesk.Revit.DB.DetailLevels.Medium;
            //
            GeometryElement e = floor.get_Geometry(opt);
            /*下版改进
            IEnumerator<GeometryObject> enm = e.GetEnumerator();
            while (enm.MoveNext())
            {
                Solid solid = enm.Current as Solid;
            }
    */
            foreach (GeometryObject obj in e.Objects)//待改2013
            {
                Solid solid = obj as Solid;
                if (solid != null && solid.Faces.Size > 0)
                {
                    foreach (Face face in solid.Faces)
                    {
                        PlanarFace pf = face as PlanarFace;
                        if (pf != null)
                        {
                            if (pf.Normal.AngleTo(new XYZ(00, -1)) < 0.01)//数值在0到PI之间
                            {
                                normalFace = face;
                            }
                        }
                    }
                }
            }
            return normalFace;
        }
    }

    url:http://greatverve.cnblogs.com/p/revit-api-FloorOpening.html
  • 相关阅读:
    _ 下划线 Underscores __init__
    Page not found (404) 不被Django的exception中间件捕捉 中间件
    从装修儿童房时的门锁说起
    欧拉定理 费马小定理的推广
    线性运算 非线性运算
    Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
    Avoiding Full Table Scans
    批量的单向的ssh 认证
    批量的单向的ssh 认证
    Corrupted MAC on input at /usr/local/perl/lib/site_perl/5.22.1/x86_64-linux/Net/SSH/Perl/Packet.pm l
  • 原文地址:https://www.cnblogs.com/greatverve/p/revit-api-FloorOpening.html
Copyright © 2011-2022 走看看