start

[Transaction(TransactionMode.Manual)]
[Regeneration(RegenerationOption.Manual)]
public class cmd : IExternalCommand
{
    /// <summary>
    /// 取得风管两端连接器
    /// </summary>
    /// <param name="duct"></param>
    /// <returns></returns>
    private List<Connector> getConn(Duct duct)
    {
        List<Connector> listConn = new List<Connector>();
        ConnectorSetIterator csi = duct.ConnectorManager.Connectors.ForwardIterator();
        while (csi.MoveNext())
        {
            Connector conn = csi.Current as Connector;
            if (ConnectorType.End == conn.ConnectorType)
            {
                listConn.Add(conn);
            }
            else if (ConnectorType.Curve == conn.ConnectorType)
            {
                //return conn;
            }
        }
        return listConn;
    }
    public Result Execute(ExternalCommandData cmdData, ref string msg, ElementSet elements)
    {
        UIDocument uiDoc = cmdData.Application.ActiveUIDocument;
        UIApplication uiApp = cmdData.Application;
        Document doc = uiDoc.Document;
        Selection sel = uiDoc.Selection;         Transaction ts = new Transaction(doc, "http://revit.5d6d.com");
        ts.Start();
        try
        {
            Element elDuct0 = doc.GetElement(sel.PickObject(ObjectType.Element, "选择风管1:"));
            Element elDuct1 = doc.GetElement(sel.PickObject(ObjectType.Element, "选择风管2:"));
            Duct duct0 = elDuct0 as Duct;
            Duct duct1 = elDuct1 as Duct;
            List<Connector> listConn0 = getConn(duct0);
            List<Connector> listConn1 = getConn(duct1);
            Line line0 = Line.get_Bound(listConn0[].Origin, listConn0[].Origin);
            Line line1 = Line.get_Bound(listConn1[].Origin, listConn1[].Origin);
            double dDis = line1.Distance(line0.get_EndPoint());//直接间距
            XYZ xyzVector = GetXYVector(line0, line1);
            LocationCurve lc = elDuct1.Location as LocationCurve;
            lc.Move(dDis * xyzVector);
            ts.Commit();
        }
        catch (Autodesk.Revit.Exceptions.OperationCanceledException)
        {
            ts.RollBack();
            return Result.Cancelled;
        }
        catch (Exception ex)
        {
            ts.RollBack();
        }         return Result.Succeeded;
    }     /// <summary>
    /// 取得平行线的单位向量
    /// </summary>
    /// <param name="line0"></param>
    /// <param name="line1"></param>
    /// <returns></returns>
    public XYZ GetXYVector(Line line0, Line line1)
    {
        //基准
        XYZ startPoint0 = line0.get_EndPoint();
        XYZ endPoint0 = line0.get_EndPoint();
        //参照
        XYZ startPoint1 = line1.get_EndPoint();
        XYZ endPoint1 = line1.get_EndPoint();
        //
        XYZ resultVector = new XYZ(, , );         XYZ zStart = new XYZ(startPoint1.X, startPoint1.Y, );
        XYZ zEnd = new XYZ(endPoint1.X, endPoint1.Y, );         Line line = Line.get_Bound(new XYZ(startPoint0.X, startPoint0.Y, ), new XYZ(endPoint0.X, endPoint0.Y, ));
        line.MakeUnbound();         //取得一条直线所在直线相垂直的直线
        XYZ tPoint = zStart - zEnd;
        XYZ zVector = new XYZ(, , );
        XYZ nPoint = tPoint.CrossProduct(zVector).Normalize() + zStart;
        Line lineN = Line.get_Bound(zStart, nPoint);
        lineN.MakeUnbound();         //与另外一条风管的交点
        IntersectionResultArray intersectionR = new IntersectionResultArray();
        SetComparisonResult comparisonR;         comparisonR = line.Intersect(lineN, out intersectionR);         if (SetComparisonResult.Disjoint != comparisonR)
        {
            if (!intersectionR.IsEmpty)
            {
                resultVector = intersectionR.get_Item().XYZPoint;
            }
        }         if (!zStart.IsAlmostEqualTo(resultVector))
        {
            resultVector = (resultVector - zStart).Normalize();
        }         return resultVector;
    }
}

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

Revit API风管对齐的更多相关文章

  1. Revit API判断直线相交关系移动风管

    start )             );         )) )) );         XYZ xyz12 = lCurve1.Curve.get_EndPoint();         XY ...

  2. Revit利用对正工具快速修改风管对齐方式

    绘制风管的时候,可以对风管的对正方式进行设置,水平方向可以设置左对齐或者中心对齐或者右对齐,垂直方向可以设置为顶对齐或者中心对齐或者低对齐,如果需要对原来的对齐方式进行修改的时候应该如何操作呢?比如, ...

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

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

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

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

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

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

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

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

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

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

  8. Revit Family API 添加对齐

    没测试成功,留待以后研究. [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)] ; ; i < nV ...

  9. Revit API画垂直于风管的风管

    start /// <summary> /// 选择风管与风管外一点,画与风管垂直的风管. /// </summary> [Transaction(TransactionMod ...

随机推荐

  1. 【Udacity并行计算课程笔记】- lesson 1 The GPU Programming Model

    一.传统的提高计算速度的方法 faster clocks (设置更快的时钟) more work over per clock cycle(每个时钟周期做更多的工作) more processors( ...

  2. 浅介HTML DOM

    什么是DOM? DOM是Document Object Model(文档对象模型)的缩写. DOM是W3C(万维网联盟)的标准. DOM定义了访问HTML和XML文档的标准: “W3C文档对象模型(D ...

  3. java iterator

    list l = new ArrayList(); l.add("aa"); l.add("bb"); l.add("cc"); for ( ...

  4. Shiro:ajax的session超时处理

    本问题解决方案参照网站多篇文章融合解决,在此表示感谢! 环境:springboot+shiro+jquery-easyui 问题:在ajax请求时,如果此时session已经失效,系统没有自动跳转到登 ...

  5. Android安全系列之:如何在native层保存关键信息

    相信大家在日常开发中都要安全层面的需求,最典型的莫过于加密.而apk是脆弱的,反编译拿到你的源码轻而易举,这时候我们就需要更保险的手段来保存密钥之类的关键信息.本文就细致地讲解简单却实用的native ...

  6. Singleton单例对象的使用

    namespace www{ public abstract class SingletonManager<T> : ISingletonManager where T : class, ...

  7. 关于vim复制剪贴粘贴命令的总结

    最近在使用vim,感觉很好很强大,但是在使用复制剪切粘贴命令是,碰到了一些小困惑,网上找了一些资料感觉很不全,讲的也不好,遂自己进行实践并总结了. 首先是剪切(删除): 剪切其实也就顺带删除了所选择的 ...

  8. 【论文阅读】Batch Feature Erasing for Person Re-identification and Beyond

    转载请注明出处:https://www.cnblogs.com/White-xzx/ 原文地址:https://arxiv.org/abs/1811.07130 如有不准确或错误的地方,欢迎交流~ [ ...

  9. JavaScript——双向链表实现

    本文版权归博客园和作者吴双本人共同所有,转载和爬虫请注明原文链接 http://www.cnblogs.com/tdws/ 下午分享了JavaScript实现单向链表,晚上就来补充下双向链表吧.对链表 ...

  10. linux-who

    在终端输入who查看当前登录服务器的ip.登录时间.登录用户 查看登录用户的pid who   -aH 杀掉登录用户PID kill   -9   PID