22. Revit API: 几何对象(三)- Solid操作

news2024/9/25 15:22:42

一、前言

几何对象中,Face就先跳过了,这里讲讲如何使用 Revit API 中 Solid 操作相关类。

  1. 使用SolidUtils,主要是复制和移动。
  2. 使用GeometryCreationUtilities,生成Solid。
  3. 使用SolidSolidCutUtilsBooleanOperationsUtils,进行Solid剪切个布尔操作(交并差)。
  4. 使用DirectShape,将Solid包装,放置到项目中。
  5. 使用BRepBuilder,基于边、面,生成任意形状的几何体。但是,该方法的使用相当笨拙和繁琐,它的设计初衷是将现有的几何体转换到 Revit 中,并对其进行相当彻底的输入几何体验证1。应该使用GeometryCreationUtilities工具类来生成模型。

二、SolidUtils

SolidUtils工具类,有5个方法。

Clone复制一个Solid
CreateTransformed对Solid应用变换矩阵。
Solid使用边和面表示,本身没有Transform。这里是对面和边进行变换。
SplitVoluems分割Solid。分割方式,未测试。
IsValidForTessellation
TessellateSolidOrShell
进行三角剖分。

这里提到了Shell,这是个啥玩意儿?


三、GeometryCreationUtilities

GeometryCreationUtilities是主要的创建Solid的手段。

这里,我们先了解一下Revit族创建工具栏上的指令:

  • 拉伸:Extrusion
  • 融合:Blend
  • 旋转:Revolution
  • 放样:Sweep
  • 放样融合:SweepBlend

以上接口,都派生自GenericForm类,只能在族文档中使用,是专门用来创建族的。

回到几何创建工具类,也就是采用这些操作生成Solid,不同的是,这里多了个创建Loft的方法。

3.1. Loft

使用方法CreateLoftGeometry创建。

public static Solid CreateLoftGeometry(
    IList<CurveLoop> profileLoops,
    SolidOptions solidOptions
)

我不知道这里的【Loft】怎么翻译的,但效果上有点像是直纹曲面(RuledSurfece),该方法也可以实现融合、放样的效果。

3.2. 拉伸

public static Solid CreateExtrusionGeometry(
	IList<CurveLoop> profileLoops,  // 轮廓
	XYZ extrusionDir,  // 仅表示方向,要求很宽松,不与轮廓面平行即可。
	double extrusionDist,  // 拉伸的长度
	SolidOptions solidOptions
)

注意:CurveLoop本身需要满足条件:①共面,②不存在线交叉。

轮廓中,多个CurveLoop也不能有交叉。

3.3. 放样

public static Solid CreateSweptGeometry(
	CurveLoop sweepPath,  // 放样路径
	int pathAttachmentCrvIdx,  // 轮廓面所在的路径段的下标
	double pathAttachmentParam,  // 轮廓面与路径段的交点,该点在线上的参数化值
	IList<CurveLoop> profileLoops,  // 轮廓
	SolidOptions solidOptions
)

这个方法复杂了一些,要求较多。

  1. 轮廓所在面需要与路径能够垂直(交点处垂直)
  2. 需要指定交点位于路径的第几条线上。
  3. 需要算到交点在该线上参数化值。关于参数化值,请看【这篇】。

虽然计算上比较简单,但为了方便生成,我们可以简单的将面放置到第1条线上,放在路径起点位置。

这么做还有一个原因,就是族编辑中的放样要求比较复杂,可以通过这样的计算简化一些。

族的Sweep没有构造函数,创建方法在Creation命名空间中,具体的使用,后面再讲。

3.4. 旋转

public static Solid CreateRevolvedGeometry(
	Frame coordinateFrame,  // (正交)坐标系,确定 XYZ 三个轴。
	IList<CurveLoop> profileLoops,  // 旋转轮廓
	double startAngle,  // 起始角度,从XZ面开始,绕Z轴逆时针旋转
	double endAngle,  // 终止角度
	SolidOptions solidOptions
)

这个方法的问题点主要在坐标系和轮廓上。

轮廓要求:①必须位于坐标系XZ面上,②必须在XZ面,X轴正方向那一侧。

给定 轮廓和旋转轴时(轴位于轮廓所在面上),一种计算方式:计算出一个Frame去配合轮廓。

  1. Frame.BaseZ:以旋转轴的方向作为Frame的Z轴;
  2. Frame.BaseY:以轮廓面的法向作为Frame的Y轴;
  3. Frame.BaseX:Y叉乘Z得到X轴;
  4. Frame.Origin:旋转轴上任意一点。
// 伪代码
var dirZ = line.Direction;
var dirY = curveloops.First().GetPlane().Normal;
var dirX = dirY.CrossProduct(dirZ);

Frame frame = new Frame(line.Origin, dirX, dirY, dirZ);

Solid solid = GeometryCreationUtilities.CreateRevolvedGeometry(frame, curveloops, start, end);

当给定的轴不在轮廓面上(无法满足轮廓位于XZ面),或者轴与轮廓有交叉(无法满足轮廓位于X轴正向),上面的计算就不行了。

此时非要生成的话,要么给轮廓投影,要么改旋转轴位置,然后用上面的方法。

3.4. 融合、放样融合

public static Solid CreateBlendGeometry(
	CurveLoop firstLoop,  // 轮廓1
	CurveLoop secondLoop,  // 轮廓2
	ICollection<VertexPair> vertexPairs,  // 轮廓间,点的配对关系,可为 null
	SolidOptions solidOptions
)

融合与放样融合,两者API使用上没什么差别,这里只看融合。

这里要吐槽了,CreateBlendGeometry(..)方法的要求比族编辑的Blend使用简单多了,Blend要求上下轮廓面平行,而这里就不需要了。

轮廓问题不大,重点是**VertexPair**的计算。

好在可以填null,大部分情况下Revit自己就可以处理,但对于诸如 扭曲、圆转方、上下轮廓边数不等 等情况时,自带处理的结果就不能满足需求了,那就得根据需求写匹配逻辑。

那么这里,就只讲点配对是怎么回事儿了。

3.4.1. 轮廓间点的匹配(VertexPair

这时一个圆轮廓和方轮廓的融合,左边的是我期望的,右边是vertexPairs参数填null的效果。

下图是融合时,轮廓上顶点之间的对应关系。

  1. 可以看出,上下轮廓都是4条边组成,即均有4个顶点。
  2. 点上的数字,表示的是轮廓上,顶点集合的下标。轮廓中第一条边的起点,即是第一个顶点。

所以,点的匹配关系是于轮廓的状态(边数目,第一条边起始位置)相关的。

在处理 弧轮廓与直线轮廓 的融合时,这里又有一个不太好的处理方法:直接将弧细分(Tessellate),然后不设置点对(null),这就完工了。

弊端是会出现很多的边,而且可能不会那么准确。


四、Solid 布尔操作

4.1. SolidSolidCutUtils

看名称,这就是个“剪切”操作API。对应于Revit工具栏上的剪切功能。

Revit工具栏上的剪切,是2个剪切工具类的集合:InstanceVoidCutUtilsSolidSolidCutUtils

连接,是类:JoinGeometryUtils

那么这个能进行Solid之间的布尔操作吗?答案是:不能。

那为啥要写在这里呢?答:这玩意儿名字取的好迷惑,写这儿提示下是用来做“剪切”的。

4.2. BooleanOperationsUtils

实体间的布尔操作,主要就两个方法:

CutWithHalfSpace:用一个平面去切
ExecuteBooleanOperation :两个Solid之间的交、并、差

Revit会对模型间的操作进行验证,在剪切或布尔操作时,很容易会出现这样的错误:

  • 无法从墙外剪切 [符号] 的实例。
  • 无法剪切具有实例的主体。
  • 屋顶无法剪切。
  • 无法剪切连接的图元。
  • 无法使图元保持连接。

这类错误,Revit将其归类为“切割或连接几何图形失败”,主要原因是操作后,产生了很短的边(小于0.79mm)。

一个不太好的处理方法,就是为 剪切体/被剪切体 添加一个小的偏移。


五、DirectShape

DirectShape用于将一个几何形状做成在Revit中展示出来,展示的同时还能够为其添加一个类型。

// 伪代码
Solid sphere = GeometryCreationUtilities.CreateRevolvedGeometry(frame, new CurveLoop[] { curveLoop }, 0, 2 * Math.PI, options);
using (Transaction t = new Transaction(doc, "Create sphere direct shape"))
{
    t.Start();
    // create direct shape and assign the sphere shape
    DirectShape ds = DirectShape.CreateElement(doc, new ElementId(BuiltInCategory.OST_GenericModel));
    //ds.ApplicationId = "Application id";
    //ds.ApplicationDataId = "Geometry object id";
    ds.SetShape(new GeometryObject[] { sphere });
    t.Commit();
}

上面的代码截取自Revti API文档,使用起来比较简单。

唯一需要注意的是,当传入多个Solid时,可能无法创建成功。原因可上面的一样,处理方式也一样。


六、总结

下一篇写BRepBuilder

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2126130.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 从入门到实战14(字符串相关操作)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了字符串进行简单说明。今天继续讨论字符…

斗地主之顺子

题目描述 在斗地主扑克牌游戏中&#xff0c;扑克牌由小到大的顺序为:3,4,5.6,7.8,9,10,J,Q,K,A,2&#xff0c;玩家可以出的扑克牌阵型有:单张、对子、顺子、飞机、炸弹等。 其中顺子的出牌规则为:由至少5张由小到大连续递增的扑克牌组成&#xff0c;且不能包含2。 例如:(3.4.…

【Windows系统工具】dll综合解决工具,解锁专业版功能!

电脑上经常会出现dll文件丢失的情况&#xff0c;那么面对这种情况&#xff0c;小白用户应该如何应对并且解决呢&#xff1f; 这时&#xff0c;不得不提出dll综合解决工具的重要性了。虽然电脑上有很多自带的工具可以使用&#xff0c;但是方法步骤都比较复杂&#xff0c;很多小白…

day4 QT

作业 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget), speech(new QTextToSpeech) {ui->setupUi(this);id startTimer(1000); }Widget::~Widget() {delete ui; }void Widget::tim…

从C语言过渡到C++

&#x1f4d4;个人主页&#x1f4da;&#xff1a;秋邱-CSDN博客☀️专属专栏✨&#xff1a;C &#x1f3c5;往期回顾&#x1f3c6;&#xff1a;单链表实现&#xff1a;从理论到代码-CSDN博客&#x1f31f;其他专栏&#x1f31f;&#xff1a;C语言_秋邱的博客-CSDN博客 目录 ​…

常用的 CMD 指令及其功能

目录 1&#xff1a;Win R命令。 2&#xff1a;cmd命令。 3&#xff1a;盘符名: 命令。 4: mkdir命令。 5&#xff1a;dir命令。 6: dir 名称。 7&#xff1a;Tab。 8&#xff1a;cd name。 9: copy con 文件的名字。 10: type 文件名。 11: cd .. 命令。 12&a…

分享 6 款在日常电脑办公中频繁使用的软件

分享6款经常能用到的电脑办公软件&#xff0c;个个功能强大又易用&#xff0c;装进电脑可以提高工作效率&#xff0c;让你每天准点下班~ 1、Dropit 这个软件真的很给力&#xff0c;特别适合我们这种平时电脑桌面上乱七八糟的人。你知道的&#xff0c;有时候下载各种东西&…

自然语言处理系列六十八》搜索引擎项目实战》搜索引擎系统架构设计

注&#xff1a;此文章内容均节选自充电了么创始人&#xff0c;CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》&#xff08;人工智能科学与技术丛书&#xff09;【陈敬雷编著】【清华大学出版社】 文章目录 自然语言处理系列六十八搜索引擎项目实战》搜索引擎系统架构设计…

【人工智能】Transformers之Pipeline(十七):文本分类(text-classification)

目录 一、引言 二、文本分类&#xff08;text-classification&#xff09; 2.1 概述 2.2 DistilBERT—BERT 的精简版&#xff1a;更小、更快、更便宜、更轻便 2.3 应用场景​​​​​​​ 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 …

布偶猫应该喂什么猫罐头:交响乐金罐、希喂、尾巴生活测评

布偶猫&#xff0c;萌宠界的甜心代表&#xff0c;爱撒娇又黏人。想让它健康成长&#xff1f;喂养是关键。选粮不当&#xff0c;健康受损。今日精选三款热门主食罐&#xff0c;依据布偶猫营养需求&#xff0c;直接评测&#xff0c;助你快速了解何为理想之选。无需繁琐&#xff0…

状态机按键消抖(学习笔记)

状态转移图&#xff1a; module key_filter(Clk,Reset_n,Key, // Key_P_Flag, // Key_R_Flag,Key_Flag,Key_state);input Clk;input Reset_n;input Key; // output reg Key_P_Flag; // output reg Key_R_Flag;output Key_Flag;output reg Key_state; reg Key_P_…

002 JavaClent操作RabbitMQ

Java Client操作RabbitMQ 文章目录 Java Client操作RabbitMQ1.pom依赖2.连接工具类3.简单模式4.工作队列模式&#xff08;work&#xff09;公平调度示例 5.发布/订阅模式&#xff08;fanout&#xff09;交换机绑定示例代码 6.路由模式&#xff08;direct&#xff09;7.Topic匹配…

RQ-RAG:提升检索增强生成模型的查询精炼能力

人工智能咨询培训老师叶梓 转载标明出处 大模型在面对未见场景时&#xff0c;往往会产生不准确或虚构的回答&#xff0c;这限制了它们的实用性。为了解决这一问题&#xff0c;香港科技大学、香港理工大学和麻省理工学院的研究团队提出了一种名为RQ-RAG&#xff08;Retrieval-A…

国产芯片LT8711HE:TYPE-C/DP1.2转HDMI2.0转换器,4k60Hz高分辨率

以下为LT8711HE芯片的简单介绍&#xff0c;如有介绍不尽之处&#xff0c;请指出 LT8711HE是一个高性能的Type-C/DP1.2到HDMI2.0转换器&#xff0c;用于连接USB Type-C源或DP1.2源到HDMI2.0接收器。 LT8711HE集成了一个DP1.2兼容的接收器和一个HDMI2.0兼容的发射器。另外&…

出处不详 取数游戏

目录 取数游戏题目描述背景输入输出数据范围 题解解法优化 打赏 取数游戏 题目描述 背景 两人将 n n n个正整数围成一个圆环&#xff0c;规则如下&#xff1a; 第一名玩家随意选取数字&#xff1b;第二名玩家从与第一名玩家相邻的两个数字中选择一个&#xff1b;而后依次在…

MOM成功实施分享(五)刨花板制造数字化聚焦业务场景

刨花板是一种人造板材&#xff0c;由木材或其他植物纤维原料制成。 在制造生产过程中目前存在以下痛点&#xff1a; 原材料质量不稳定&#xff1a;刨花板的质量很大程度上取决于原材料的质量&#xff0c;如果原材料的来源不稳定、质量参差不齐&#xff0c;会影响刨花板的性能…

从线段中搜寻提取闭合轮廓(三)

1.前言 做底层和数据的调试问题也是个麻烦事&#xff0c;如果没有方便的可视化工具辅助&#xff0c;那将令人感到痛苦&#xff0c;借助可视化的工具可以让我们高效、省心&#xff0c;进而心情舒畅&#xff0c;重要的是可以提高调试效率。 当然可视化工具也分不同层次的…

我对 monorepo 的一些思考

我对 monorepo 的一些思考 我对 monorepo 的一些思考 前言它的由来技术选型 管理工具语言与打包调试工具测试框架代码规范与质量控制本地引用与发包替换发包流程Github 相关配置部署 使用手册 功能特性总结如何使用&#xff1f;清除默认的包(可选)模板包介绍 packagesapps 更新…

25虾皮笔试shopee笔试测评sea笔试测评题型

虾皮笔试shopee笔试测评用的自己的笔试系统&#xff0c;全英文笔试&#xff1a; 1.Numerical Reasoning Test&#xff1a;10题&#xff0c;言语推断和数学计算 2. Verbal Reasoning Test&#xff1a;10题&#xff0c;言语理解&#xff0c;每题一段英文材料&#xff0c;选对错…

医院管理|基于java的医院管理系统小程序(源码+数据库+文档)

医院管理系统小程序 目录 基于java的医院管理系统小程序 一、前言 二、系统设计 三、系统功能设计 医生信息管理 排班信息管理 科室信息管理 科室预约 病历信息 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a;…