• C#Revit二次开发之-一键切换构件连接顺序 SwitchJoinOrder


      在Revit建筑结构模型中正确的梁板柱连接关系应该是柱切梁,梁切板,但实际建模过程中经常会碰到梁板柱连接关系混乱的情况,当模型较大时,将梁板柱连接顺序调整至正确的关系需要花费大量人工。因此使用需要使用一些开发手段解决此类问题。

    以下是解决此问题的相关代码

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Autodesk.Revit.Attributes;
    using Autodesk.Revit.DB;
    using Autodesk.Revit.UI;
    
    namespace SwitchStructureConnection
    {
        [Transaction(TransactionMode.Manual)]
        public class ConnectionGeometry : IExternalCommand
        {
            public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
            {
                UIDocument uIDocument = commandData.Application.ActiveUIDocument;
                Document doc = uIDocument.Document;
                FilteredElementCollector list_column = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralColumns).OfClass(typeof(FamilyInstance));
                FilteredElementCollector list_beam = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_StructuralFraming).OfClass(typeof(FamilyInstance));
                Transaction transaction = new Transaction(doc, "连接几何关系");
                transaction.Start();
                foreach (Element column in list_column)
                {
                    List<Element> column_box_eles = Get_Boundingbox_eles(doc, column, 1.01);
                    //TaskDialog.Show("柱子", column_box_eles.Count.ToString());
                    foreach (Element ele in column_box_eles)
                    {
                        if(ele.Category.Name =="结构框架"|| ele.Category.Name == "楼板")
                        {
                            JudgeConnection(doc, column, ele);
                        }
                        
                    }
                }
                foreach (Element beam in list_beam)
                {
                    List<Element> beam_box_eles = Get_Boundingbox_eles(doc, beam, 1.01);
                    //TaskDialog.Show("梁", beam_box_eles.Count.ToString());
                    foreach (Element ele in beam_box_eles)
                    {
                        if (ele.Category.Name == "楼板")
                        {
                            JudgeConnection(doc, beam, ele);
                        }
                    }
                }
                transaction.Commit();
                return Result.Succeeded;
            }
    
            private static List<Element> Get_Boundingbox_eles(Document doc, Element element,double offset)
            {
                //获取元素boundingbox相交的元素
                List<Element> eles_list = new List<Element>();
                XYZ element_max_boundingBox = element.get_BoundingBox(doc.ActiveView).Max;
                XYZ element_min_boundingBox = element.get_BoundingBox(doc.ActiveView).Min;
                Outline element_Outline = new Outline(element_min_boundingBox, element_max_boundingBox);
                //element_Outline.Scale(offset);
                FilteredElementCollector element_collector = new FilteredElementCollector(doc);
                ElementClassFilter elementClassFilter_beam = new ElementClassFilter(typeof(FamilyInstance));
                ElementClassFilter elementClassFilter_floor = new ElementClassFilter(typeof(Floor));
                LogicalOrFilter logicalOr = new LogicalOrFilter(elementClassFilter_beam,elementClassFilter_floor);
                element_collector.WherePasses(logicalOr).WherePasses(new BoundingBoxIntersectsFilter(element_Outline,offset));
                foreach (Element near_ele in element_collector)
                {
                    eles_list.Add(near_ele as Element);
                }
                return eles_list;
            }
    
            private static void JudgeConnection(Document doc, Element ele1st, Element ele2st)
            {
                try
                {
                    //尝试连接几何
                    JoinGeometryUtils.JoinGeometry(doc, ele1st, ele2st);
                }
                catch
                {
                    Boolean ifJoined = JoinGeometryUtils.AreElementsJoined(doc, ele1st, ele2st);
                    if (ifJoined)
                    {
                        //判断连接关系是否正确,若不正确切换连接关系
                        Boolean if1stCut2st = JoinGeometryUtils.IsCuttingElementInJoin(doc, ele1st, ele2st);
                        if (if1stCut2st != true)
                        {
                            try
                            {
                                JoinGeometryUtils.SwitchJoinOrder(doc, ele2st, ele1st);
                            }
                            catch
                            {
                                //跳过----小帅帅呆了
                            }
                        }
                    }
                }
            }
        }
    }
  • 相关阅读:
    QuantLib 金融计算——案例之固息债的关键利率久期(KRD)
    Elasticsearch 最佳运维实践
    Ansible常用的Ansible Module
    中国七夕节( Chinese Valentine's Day)IT的浪漫情结
    Leetcode之C++刷题生死战
    无需Root可自动定时发送微信和短信的黑科技APP,支持跳过开屏启动广告
    tmp
    【整理中】可靠性基础_抽样检测
    【汇总】命名及标识
    Treelist父节点上下移
  • 原文地址:https://www.cnblogs.com/shuai1991/p/13942445.html
Copyright © 2020-2023  润新知