zoukankan      html  css  js  c++  java
  • 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
                            {
                                //跳过----小帅帅呆了
                            }
                        }
                    }
                }
            }
        }
    }
  • 相关阅读:
    二、一切都是对象
    一、对象导论
    CSS 属性大全
    CSS颜色代码大全
    CSS Position 定位属性
    CSS Box Model 盒子模型
    ThreadLocal
    Java 模拟死锁
    byte 最小值为啥是最小是 -128 ;int最小值为啥是 -2147483648
    cmd 查看端口号占用情况
  • 原文地址:https://www.cnblogs.com/shuai1991/p/13942445.html
Copyright © 2011-2022 走看看