承接上两篇文章的讨论

第一篇:Revit—线管连接桥架

第二篇:Revit—Duct打断和Pipe打断

这篇文章讲一下实现桥架线管打断的思路,并提供可用方法代码

打断管线并不复杂,复杂的是要恢复原有管线的连接。桥架和线管有和水管不一样的特点,上面第一篇文章写了,它能连接成你“意想不到”的样子,要恢复这种连接,也就存在一些技巧了。

另外,根据文章二提到的Revit自带的两种管线打断方法测试可知,打断操作是保留原始管修改迹线,然后创建一个新的管补充到另外的区域。

保留哪部分区域?这里面就会涉及一个策略问题。我下面的方法的策略是,尽量保留连接多或者复杂的一端,创建连接少或简单的一端。

   直接上代码了,考出去就能用的那种(#^.^#)

/*-------------------------------------------------------------------------* 功能描述:ElectricalUtils* 作者:xulisong* 创建时间: 2019/8/4 10:57:29* 版本号:v1.0*  -------------------------------------------------------------------------*/
using Autodesk.Revit.DB;
using Autodesk.Revit.DB.Electrical;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace FWindSoft.Revit.Utils
{/// <summary>/// 电气工具类/// </summary>public static class ElectricalUtils{/// <summary>/// 使用指定点打断管线/// </summary>/// <param name="document"></param>/// <param name="cableTrayConduitBaseId"></param>/// <param name="ptBreak"></param>/// <returns></returns>public static ElementId BreakCurve(Document document, ElementId cableTrayConduitBaseId, XYZ ptBreak){#region 判断给定点的位置var cableTrayConduitBase = document.GetElement(cableTrayConduitBaseId) as CableTrayConduitBase;if (cableTrayConduitBase == null){return ElementId.InvalidElementId;}var location = ((cableTrayConduitBase.Location as LocationCurve).Curve as Line).Clone() as Line;var direction = location.Direction.Normalize();var useVector = ptBreak - location.GetEndPoint(0);var dotValue = useVector.DotProduct(direction);if (dotValue <= 0 || dotValue >= location.Length){//分割点不在迹线上return ElementId.InvalidElementId;}var realBreak = location.GetEndPoint(0) + dotValue * direction;#endregion#region 获取原始管道的连接信息List<Connector> nearStartConnectors = new List<Connector>();List<Connector> nearEndConnectors = new List<Connector>();foreach (Connector connector in cableTrayConduitBase.ConnectorManager.Connectors){//没有连接,则不进行统计if (connector == null || !connector.IsConnected)continue;var origin = connector.Origin;var tempVector = origin - realBreak;var tempDotValue = tempVector.DotProduct(direction);if (tempDotValue <= 0){nearStartConnectors.Add(connector);}else{//点乘值大于0,则在靠近管线结束点的位置nearEndConnectors.Add(connector);}}#endregion#region 复制管线,调整朝向var newId = ElementTransformUtils.CopyElement(document, cableTrayConduitBaseId, XYZ.Zero).FirstOrDefault();var newCableTrayConduitBase = document.GetElement(newId) as CableTrayConduitBase;if (newCableTrayConduitBase is CableTray cableTray){//处理朝向cableTray.CurveNormal = (cableTrayConduitBase as CableTray).CurveNormal;}#endregion#region 确定保留区域,删除区域var nearStarTupleInfo = nearStartConnectors.Select(c => new Tuple<Connector, Connector>(c, GetRefConnector(c))).ToList();var nearEndTupleInfo = nearEndConnectors.Select(c => new Tuple<Connector, Connector>(c, GetRefConnector(c))).ToList();//当两个Conector相等时,必然是end连接Endvar nearStartWeight = nearStarTupleInfo.Sum(tuple => tuple.Item1.ConnectorType == tuple.Item2.ConnectorType ? 1 : 2);var nearEndWeight = nearEndTupleInfo.Sum(tuple => tuple.Item1.ConnectorType == tuple.Item2.ConnectorType ? 1 : 2);List<Tuple<Connector, Connector>> needResetConnectors = null;CableTrayConduitBase start = null,end=null;if (nearStartWeight> nearEndWeight){//保留靠近Start的部分,因为这样对整个模型改动比较小needResetConnectors = nearEndTupleInfo;start = cableTrayConduitBase;end = newCableTrayConduitBase;}else{needResetConnectors = nearStarTupleInfo;start = newCableTrayConduitBase ;end = cableTrayConduitBase;}List<ConnectorJoinItem> joinItems = new List<ConnectorJoinItem>();foreach (var connectorTuple in needResetConnectors){//断开连接后,Curve就不起作用了var baseConnector = connectorTuple.Item1;var refConnector = connectorTuple.Item2;ConnectorJoinItem joinItem = new ConnectorJoinItem(newCableTrayConduitBase, baseConnector.Origin);#region 确定连接类型if (baseConnector.ConnectorType == ConnectorType.End){joinItem.JoinType = refConnector.ConnectorType == ConnectorType.Curve ? ConnectorJoinType.EndToCurve : ConnectorJoinType.EndToEnd;}else if (baseConnector.ConnectorType == ConnectorType.Curve){joinItem.JoinType = ConnectorJoinType.CurveToEnd;}#endregion#region 确定RefConnectorif(refConnector.ConnectorType==ConnectorType.End){joinItem.RefConnector = refConnector;}if(refConnector.ConnectorType == ConnectorType.Curve){joinItem.RefConnector = ConnectorJoinItem.GetFarnessEndConnector(refConnector.Owner as MEPCurve,refConnector.Origin);}#endregionjoinItems.Add(joinItem);connectorTuple.Item1.DisconnectFrom(connectorTuple.Item2);}(start.Location as LocationCurve).Curve = Line.CreateBound(location.GetEndPoint(0), realBreak);(end.Location as LocationCurve).Curve = Line.CreateBound(realBreak, location.GetEndPoint(1));#endregion#region 恢复新创建管线所在位置的连接//document.Regenerate();joinItems.ForEach(c => c.Connect());#endregionreturn newCableTrayConduitBase?.Id;}#region 内部方法和类型/// <summary>/// 获取关联的Connector/// </summary>/// <param name="connector"></param>/// <returns></returns>private static Connector GetRefConnector(Connector connector){if (!connector.IsConnected){return null;}foreach (Connector refConnector in connector.AllRefs){if (refConnector.Owner.Id != connector.Owner.Id){return refConnector;}}return null;}/// <summary>/// Connector连接数据/// </summary>private class ConnectorJoinItem{public ConnectorJoinItem(MEPCurve baseCurve, XYZ basePoint){BaseMepCurve = baseCurve;BasePoint = basePoint;}/// <summary>/// Connector连接类型/// </summary>public ConnectorJoinType JoinType { get; set; }/// <summary>/// 关联的Connector/// </summary>public Connector RefConnector { get; set; }/// <summary>/// 基础连接管线/// </summary>public MEPCurve BaseMepCurve { get; private set; }/// <summary>/// 基础的位置/// </summary>public XYZ BasePoint { get; private set; }/// <summary>/// 执行连接功能/// </summary>public void Connect(){if (RefConnector == null){return;}Connector baseConnector = null;switch (JoinType){case ConnectorJoinType.EndToEnd:baseConnector = GetNearnessEndConnector(BaseMepCurve, BasePoint);baseConnector.ConnectTo(RefConnector);break;case ConnectorJoinType.EndToCurve:baseConnector = GetNearnessEndConnector(BaseMepCurve, BasePoint);baseConnector.Owner.Document.Create.NewTeeFitting(RefConnector, RefConnector, baseConnector);break;case ConnectorJoinType.CurveToEnd:baseConnector = GetFarnessEndConnector(BaseMepCurve, BasePoint);baseConnector.Owner.Document.Create.NewTeeFitting(baseConnector, baseConnector, RefConnector);break;}}/// <summary>/// 获取mepCurve上距离指定location最远的end类型Connector/// </summary>/// <param name="mepCurve"></param>/// <param name="point"></param>/// <returns></returns>public static Connector GetFarnessEndConnector(MEPCurve mepCurve, XYZ point){Connector useConnector = null;if (mepCurve == null){return useConnector;}double maxDistance = -1d;foreach (Connector connector in mepCurve.ConnectorManager.Connectors){if (connector == null || connector.ConnectorType != ConnectorType.End)continue;var origin = connector.Origin;var tempDistance = (origin - point).GetLength();if (tempDistance > maxDistance){maxDistance = tempDistance;useConnector = connector;}}return useConnector;}/// <summary>/// 获取mepCurve上距离指定location最近的end类型Connector/// </summary>/// <param name="mepCurve"></param>/// <param name="point"></param>/// <returns></returns>public static Connector GetNearnessEndConnector(MEPCurve mepCurve, XYZ point){Connector useConnector = null;if (mepCurve == null){return useConnector;}double minDistance = double.MaxValue;foreach (Connector connector in mepCurve.ConnectorManager.Connectors){if (connector == null || connector.ConnectorType != ConnectorType.End)continue;var origin = connector.Origin;var tempDistance = (origin - point).GetLength();if (tempDistance < minDistance){minDistance = tempDistance;useConnector = connector;}}return useConnector;}}private enum ConnectorJoinType{/// <summary>/// 点对点连接/// </summary>EndToEnd,/// <summary>/// 点对线连接/// </summary>EndToCurve,/// <summary>/// 线对点连接/// </summary>CurveToEnd,} #endregion}
}

Revit—CableTray and Conduit 桥架线管打断相关推荐

  1. Nothing spreads like fear——电影《传染病》观后感

    Nothing spreads like fear 美国<娱乐周刊>说,这是一部能吓死人的传染病题材惊悚片,看完影片后一定会有想要洗手的强迫症. 但看完之后感觉并没有这么强烈,特别是对于正 ...

  2. Revit—线管连接桥架

    Revit中,是支持线管连接桥架和无配件桥架与桥架之间相互连接的. 如果你项目中需要类似的功能,这篇文章大概率能解决你的问题.Revit没有显示的API进行类似的操作.但是在一些你可能熟悉的API中提 ...

  3. revit二次开发创建桥架、线管

    创建桥架.线管 创建桥架 通过过滤器获取桥架类型 选择点 得到活跃视图标高 创建桥架 修改宽.高 完整代码 创建线管 获取线管类型 获取标高 获取点 创建 修改直径 完整代码 创建桥架 /// < ...

  4. 机电revit的【桥架转化】功能,识别CAD图纸点击转化

    机电revit的[桥架转化]功能,识别CAD图纸点击转化.机电是revit建模中重要的一个部分,对电器模型运维和管理有着不可或缺的地位.在机电revit中的CAD转化识别,之前已经和大家分享过风管,立 ...

  5. Revit二次开发_修改快捷键

    目录 示例代码 Revit 2019命令ID 快捷键设置规则 保留的快捷键 Revit官方的似乎并没有提供修改快捷键的api,感谢@魏无忌的这篇博文--Revit开发之快捷键相关类_魏无忌的博客-CS ...

  6. 新新新~Revit插件【建模助手】7大模块介绍

    年底了,大家是不是都在喝茶.聊天.等跨年:而我,建模助手,则在--总结.规划.PPT. 不盘不知道,一盘可吓了我一大跳!没想到咱们在过去一年居然建设了这么多丰功伟绩: 说点标志性的,在2022年,建模 ...

  7. Revit单构件导出IFC

    Revit单构件导出IFC 对revit模型的应用中,由于模型过大,不得不进行模型拆分导出.本文针对模型单构件导出ifc,写了个小功能.revit支持只仅导出视图可见的模型,窗口操作如下图: 我们要用 ...

  8. Revit中MEP避让功能的实现

    看到已经有大神实现了,MEP构建避让的功能,我也试着写了一下插件.但是,因为能力有限暂时还不能生成相应的弯头,我后面会补上的!!! 下面直接上代码: using System; using Syste ...

  9. Revit插件“管线分割”功能,比破解版的还好用

    Revit插件"管线分割"比破解版的还好用,小编以前用过一些破解版的revit插件,时不时就崩溃,被锁,工作做一半就不能用,非常恼火,今天和大家分享一款正版插件365/年,以&qu ...

最新文章

  1. html扩展名用于保存清单文件,HTML5 manifest ApplicationCache
  2. [一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...
  3. SharePoint 2013中的视频体验增强(1)——把大象装进冰箱
  4. docker中使用systemctl启动服务
  5. python中rim的用法_Python笔记(六)_函数
  6. 清除webBrowser 缓存和Cookie的解决方案
  7. FFmpeg 音视频处理总纲
  8. solr 的maven_使用Maven运行Solr
  9. CentOS 6.3 下编译Nginx(笔记整理)
  10. “约见”面试官系列之常见面试题之第一百零二篇之vue-router的两种模式(建议收藏)
  11. 2015软件测试面试题第二篇
  12. 蓝宝石显卡bios_狼神矿卡烤机89°C!强刷蓝宝石RX570超白金显卡BIOS降温75°教程...
  13. 区块链项目开发最容易受区块链技术影响的行业
  14. Python爬虫入门学习线路图2019最新版
  15. 蓝桥杯 后缀字符串 map
  16. KindEditor上传图片word
  17. unity材质球英文翻译
  18. 手机怎样设置每年自动生日提醒
  19. 双efi分区同时引导失败修复经验
  20. linux iso镜像怎么用u盘装,如何使用U盘安装ISO系统镜像?

热门文章

  1. 前端面试之--网络相关
  2. 万向肖风:区块链和数字货币就是新一代数字金融体系(全文)
  3. 在家陪爸妈玩斗地主的一些感受
  4. 一款学习用的App需要具备哪些功能?
  5. 水深6到9米有鱼吗_再战洪门水库,总有钓不完的鱼,让人爱恨交加
  6. Linux操作系统综合实验
  7. Elk环境篇 --- 本地快速搭建你的ElasticSearch及Kibana
  8. 软件测试-等价类作业
  9. 贝叶斯相关(概率论)论文
  10. AI绘图实战(三):手绘出图机甲狂暴男 | Stable Diffusion成为设计师生产力工具