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(1, 1, 0) * 200 / 304.8;
        XYZ xyz2 = xyz + new XYZ(1, -1, 0) * 200 / 304.8;
        XYZ xyz3 = xyz + new XYZ(-1, -1, 0) * 200 / 304.8;
        XYZ xyz4 = xyz + new XYZ(-1, 1, 0) * 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(0, 0, -1)) < 0.01)//数值在0到PI之间
                        {
                            normalFace = face;
                        }
                    }
                }
            }
        }
        return normalFace;
    }
}

url:http://greatverve.cnblogs.com/p/revit-api-FloorOpening.html

Revit API 楼板开洞的更多相关文章

  1. 【Revit API】梁构件支座检查算法

    一.前言         应该是第二次写关于Revit API的博文了.虽然在BIM企业中工作,从事桌面BIM软件开发,但是我是不怎么喜欢写Revit API相关的代码.平时更多的是在写界面展示,架构 ...

  2. Revit API 判断一个构件在某个视图中的可见性

    查看 Revit API.发现有Element::IsHidden这个方法.通过UI创建一个element,注意要使得这个element在某些视图可见,但是在另一些视图不可见.运行下面的方法,你会发现 ...

  3. Revit API 操作共享参数和项目参数

    1.获取共享参数 private string GetSharInfo(Autodesk.Revit.ApplicationServices.Application revitApp) { Strin ...

  4. Revit API射线法读取空间中相交的元素

    Revit API提供根据射线来寻找经过的元素.方法是固定模式,没什么好说.关键代码:doc.FindReferencesWithContextByDirection(ptStart, (ptEnd  ...

  5. Revit API 加载族并生成实例图元

    在Revit API中加载族可以使用Doc.LoadFamily方法,传入要加载的族文件路径名,但是这种方式有一种缺点,就是如果族文件在当前工程中没有加载的话则返回成功,如果已经加载过,则返回失败,也 ...

  6. Revit API根据链接文件开洞

    开洞信息数据: ]);             ;                     ;                     ;                     ;          ...

  7. Revit API遍历全部风管,找到与风管相关的墙开洞

    涉及向量计算,求相交等相关技术. )                 {                     foreach (Face face in solid.Faces)          ...

  8. Revit API 获取某墙上洞口的尺寸和位置

    [Transaction(TransactionMode.Manual)] [Regeneration(RegenerationOption.Manual)] public class cmd2012 ...

  9. 【Revit API】调用Revit内部命令PostableCommand

    Revit内置了一些命令,直接调用Revit操作方式. 可以去API文档查询PostableCommand枚举,还是很多的. 话不多说,直接上代码 var commandId = RevitComma ...

随机推荐

  1. apache.http.client.HttpClient

    前言 HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 java net包中已经提 ...

  2. [MongoDB]Mongodb攻略

    -------------------------------------------------------------------------------------------- [基础] 1. ...

  3. 由struts错误使用引发的漏洞,使用参数作为返回的文件路径或文件名,作为返回result 值

    该错误可以导致他人任意访问该路径下的任何文件. struts 文件 <?xml version="1.0" encoding="UTF-8" ?> ...

  4. Web开发中的主要概念

    一.Web开发中的主要概念1.静态资源:一成不变的.html.js.css2.动态资源:JavaWeb.输出或产生静态资源.(用户用浏览器看到的页面永远都是静态资源) 3.JavaEE:十三种技术的集 ...

  5. 傅盛谈管理的本质zz

    管理的本质就是树立一个核心的业务,让这个业务带着所有的员工和组织构架往前走,而不是去构建一个四平八稳的组织,让所有的业务井井有条. 今天,整个互联网都在回归本原.它让以前看上去极简单的点产生爆发,而不 ...

  6. 12.我们不是在真空里谈软件工程, 软件要运行在硬件芯片上面, 下面看看一个计算机芯片的发展历史: http://perspectives.mvdirona.com/2014/09/august-21-2014-computer-history-museum-presentation/ http://mvdirona.com/jrh/TalksAndPapers/DileepBhandar

    电脑芯片的诞生和发展是20世纪最伟大的发明之一,芯片技术决定了计算机升级换代的速度,决定了计算机小型化实现的程度,决定了计算机智能化的程度,决定了计算机普及化的应用深度. 1971年11月15日,英特 ...

  7. SQL中Where与Having的区别

    “Where” 是一个约束声明,使用Where来约束来之数据库的数据,Where是在结果返回之前起作用的,且Where中不能使用聚合函数. “Having”是一个过滤声明,是在查询返回结果集以后对查询 ...

  8. 【笔记】DOM探索基础篇(一)

    #DOM探索(前端课程学习笔记)http://www.imooc.com/video/9502 DOM = document + object + model ECMAScript 编写js应遵守的标 ...

  9. 学习WCF之——wcf程序的创建

    这是我参考的主要资料——wcf学习之旅:http://www.cnblogs.com/artech/archive/2007/02/26/656901.html 首先,如博客上介绍的一样,创建空白的项 ...

  10. 关于QT的系统总结

    编译环境与开发流程 开发QT有两种IDE可以使用,一种是使用 VS + Qt 的插件,另一种就是使用QtCreator工具.前一种是微软的工具,用的都比较多容易上手,缺点是信号槽的支持不太好,需要手写 ...