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


    start
    //风管对齐
    [TransactionAttribute(Autodesk.Revit.Attributes.TransactionMode.Manual)]
    public class cmdDuctAlign : IExternalCommand
    {
        private XYZ GetIntersection(Line line1, Line line2)
        {
            IntersectionResultArray results;

            SetComparisonResult result
                = line1.Intersect(line2, out results);
            //SetComparisonResult.Subset
            
    //SetComparisonResult.Superset 
            if (SetComparisonResult.Overlap == result)//没有交点,可能是平行,也可以是延长线相交。
                throw new InvalidOperationException(
                    "Overlap");
            if (SetComparisonResult.Disjoint == result)//不相交
                throw new InvalidOperationException(
                    "Disjoint");
            if (SetComparisonResult.Superset == result)//包含,子集
                throw new InvalidOperationException(
                    "Superset");
            if (SetComparisonResult.Subset == result)//交集
                throw new InvalidOperationException(
                    "Subset");
            if (results == null || results.Size != 1)
                throw new InvalidOperationException(
                    "Could not extract line intersection point.");

            IntersectionResult iResult
                = results.get_Item(0);

            return iResult.XYZPoint;
        }
        public Result Execute(ExternalCommandData commandData, ref string messages, ElementSet elements)
        {
            UIApplication app = commandData.Application;
            Document doc = app.ActiveUIDocument.Document;
            Selection sel = app.ActiveUIDocument.Selection;

            SplitButtonData splitButtonData = new SplitButtonData("""");
            PushButton pbtn = new PushButton();
            RibbonPanel rpanel = new RibbonPanel();
                

            Transaction ts = new Transaction(doc, "revit");
            ts.Start();

            IList<Reference> refDucts = sel.PickObjects(ObjectType.Element, "duct");
            Duct duct1 = doc.GetElement(refDucts.ElementAt(0)) as Duct;
            Duct duct2 = doc.GetElement(refDucts.ElementAt(1)) as Duct;
            LocationCurve lCurve1 = duct1.Location as LocationCurve;
            LocationCurve lCurve2 = duct1.Location as LocationCurve;
            XYZ xyz11 = lCurve1.Curve.get_EndPoint(0);
            XYZ xyz12 = lCurve1.Curve.get_EndPoint(1);
            XYZ xyz21 = lCurve2.Curve.get_EndPoint(0);
            XYZ xyz22 = lCurve2.Curve.get_EndPoint(1);
            //判断线段相交关系
            Line line1 = Line.get_Bound(xyz11, xyz12);
            Line line2 = Line.get_Bound(xyz21, xyz22);
            GetIntersection(line1, line2);

            #region 风管移动

            //转化到平面
            XYZ xyz1 = new XYZ(xyz11.X, xyz11.Y, 0);
            XYZ xyz2 = new XYZ(xyz12.X, xyz12.Y, 0);
            XYZ xyz3 = new XYZ(xyz21.X, xyz21.Y, 0);
            XYZ xyz4 = new XYZ(xyz22.X, xyz22.Y, 0);
            //找到与直线垂直的向量
            XYZ vec1 = xyz2 - xyz1;
            XYZ zVec = new XYZ(001);
            XYZ nVec = vec1.CrossProduct(zVec).Normalize();//两条线相交的面对应的向量
            TaskDialog.Show("vec", nVec.CrossProduct(zVec).Normalize().ToString());
            lCurve2.Move(nVec);

            #endregion

            ts.Commit();

            return Result.Succeeded;
        }
    }
    url: http://greatverve.cnblogs.com/p/revit-api-line-SetComparisonResult.html
    参考:
    http://revit.haotui.com/thread-171-1-32.html
    http://revit.haotui.com/thread-489-1-23.html
  • 相关阅读:
    Python单元测试unittest加载方式之二:加载测试套件
    Python单元测试unittest加载方式之二:加载测试套件
    Python单元测试unittest加载方式之一:unittestmain()启动单元测试模块
    和优秀的人相处
    耐心和恒心
    ubuntu下FTP文件目录共享
    一个不错的编译调试方法
    qt 程序异常崩溃
    minigui SetTimer(hwnd, id, speed)
    minigui 按钮点击弹窗外部 弹窗消失功能 WS_EX_TRANSPARENT
  • 原文地址:https://www.cnblogs.com/greatverve/p/revit-api-line-SetComparisonResult.html
Copyright © 2020-2023  润新知