当前位置: 首页 > news >正文

Revit SDK:AutoJoin 自动合并体量

前言

Revit 有一套完整的几何造型能力,每一个体量都是一个GenericForm,这些体量可以通过拉伸、扫掠等创建。这个例子介绍如何将他们合并成一个体量。

内容

在这里插入图片描述
合并体量的关键接口:

// Autodesk.Revit.DB.Document
public GeomCombination CombineElements(CombinableElementArray members);

可以合并的实体,相关类的集成体系:
在这里插入图片描述
如何通过UI创建各种类型的实体,可以参考 Revit 官方文档:创建实心形状

case 1:手动选中了一些元素

核心逻辑:

  1. 遍历所有选中元素
  2. 确保元素是GenericForm,且是实体solid
  3. 确保都是 CombinableElementGenericForm集成自CombinableElement,这步有点多余)
  4. 合并符合条件的元素: doc.Document.CombineElements(solids)

核心代码:

// 遍历所有选中元素
foreach (Autodesk.Revit.DB.ElementId elementId in doc.Selection.GetElementIds())
{Autodesk.Revit.DB.Element element = doc.Document.GetElement(elementId);// 确保元素是`GenericForm`,且是实体solidGenericForm gf = element as GenericForm;if (null != gf && !gf.IsSolid)continue;// 确保都是 `CombinableElement` (`GenericForm`集成自`CombinableElement`,这步有点多余)CombinableElement ce = element as CombinableElement;if (null != ce)solids.Append(ce);
}
// 合并符合条件的元素
doc.Document.CombineElements(solids);

case 2:没有选中,则处理整个文档

核心逻辑:

  1. 过滤出所有的GenericFormGeomCombination
  2. 遍历过滤元素
  3. 确保元素是GenericForm,且是实体solid
  4. 确保都是 CombinableElementGenericForm集成自CombinableElement,这步有点多余)
  5. 对有重叠的元素进行几何合并:JoinOverlapping,判断是否重叠的逻辑在 IsOverlapped

核心代码:

// 过滤出所有的`GenericForm`和`GeomCombination`
LogicalOrFilter filter = new LogicalOrFilter(new ElementClassFilter(typeof(GenericForm)), new ElementClassFilter(typeof(GeomCombination)));
// 遍历过滤元素
FilteredElementIterator itor = (new FilteredElementCollector(document)).WherePasses(filter).GetElementIterator();
itor.Reset();
while (itor.MoveNext()){// 确保元素是`GenericForm`,且是实体solidGenericForm gf = itor.Current as GenericForm;if (null != gf && !gf.IsSolid)continue;// 确保都是 `CombinableElement` (`GenericForm`集成自`CombinableElement`,这步有点多余)CombinableElement ce = itor.Current as CombinableElement;if (null == ce)continue;m_elements.Add(ce);
}
// 对有重叠的元素进行几何合并
GeomCombination geomCombination = JoinOverlapping(m_elements, document);

JoinOverlapping 的核心逻辑在于判断是否重叠的逻辑, IsOverlapped

  1. 获取元素几何,GeometryElement get_Geometry(Options options)
  2. 获取GeometryObject所有Face
    类型是 Solid,通过接口 solid.Faces
    类型是 GeometryElement, 通过 GetEnumerator 接口递归调用
  3. 获取所有的线 GetAllCurves
    首先获取所有的 Face,通过 face.EdgeLoops 获取线的几何信息
  4. 判断线和面是否相交

部分核心代码:

// 获取元素几何
Options geOptions = Command.s_appCreation.NewGeometryOptions();
elementA.get_Geometry(geOptions);// 获取所有的 Face,需要递归调用
private static void GetAllFaces(GeometryElement geoElement, List<Face> faces){IEnumerator<GeometryObject> Objects = geoElement.GetEnumerator();while (Objects.MoveNext()){GeometryObject geObject = Objects.Current;GetAllFaces(geObject, faces);}
}
private static void GetAllFaces(Solid solid, List<Face> faces){foreach (Face face in solid.Faces){faces.Add(face);}
}
private static void GetAllFaces(GeometryObject geometry, List<Face> faces){if (geometry is GeometryElement){GetAllFaces(geometry as GeometryElement, faces);return;
}if (geometry is Solid){GetAllFaces(geometry as Solid, faces);return;}
}// 获取所有的 curve,类似,省略

其它

这个 sample 代码质量有些混乱,需自行整理分析。

http://www.lryc.cn/news/149452.html

相关文章:

  • MYSQL(索引、事务)
  • 部署问题集合(二十三)设置Docker容器内的中文字符集,解决某些情况下中文乱码的问题
  • Web AP—PC端网页特效
  • Spring线程池ThreadPoolTaskExecutor使用
  • spring mvc的执行流程
  • docker作业
  • java实现本地文件转文件流发送到前端
  • 2020ICPC南京站
  • Linux 中的 chsh 命令及示例
  • JavaScript 数组如何实现冒泡排序?
  • ZooKeeper集群环境搭建
  • 【跟小嘉学 Rust 编程】二十、进阶扩展
  • pytorch学习过程中一些基础语法
  • 判断聚类 n_clusters
  • 基于深度学习的网络异常检测方法研究
  • SSM 基于注解的整合实现
  • 工具类APP如何解决黏性差、停留短、打开率低等痛点?
  • 使用Java MVC开发高效、可扩展的Web应用
  • wandb安装方法及本地部署教程
  • stable diffusion实践操作-提示词插件安装与使用
  • 【SpringBoot】详细介绍SpringBoot中的bean
  • 【Nuxt实战】在Nuxt3项目中如何按需引入Element-plus
  • 专业制造一体化ERP系统,专注于制造工厂生产管理信息化,可定制-亿发
  • Linux工具
  • Java项目-苍穹外卖-Day07-redis缓存应用-SpringCache/购物车功能
  • 零知识证明(zk-SNARK)(一)
  • linux中打印数据的行缓冲模式
  • 香橙派OrangePi zero H2+ 驱动移远4G/5G模块
  • 自动驾驶——【规划】记忆泊车特殊学习路径拟合
  • 【跟小嘉学 Rust 编程】十六、无畏并发(Fearless Concurrency)