24. Revit API: 几何对象(五)- (Sur)Face

一、前言

虽然Face是GeometryObject的子类,Surface不是,但这两者之间还是挺有关联的,每个Face都有一个对应的Surface,类似于EdgeCurve的关系。

Surface是数学意义上的面,纯定义。

Face是几何形状(实体)上的面,是Surface上截取了一块区域,有边界。

所以,Revit种面、线、点之类的关系的计算,都是在Face上,而Surface主要是对“抽象”面的定义。


二、Face

Face及其子类都没有构造函数,只能通过Solid获取。类方法,就是常规的相交、投影、计算面上点的法向、切向等方法。

2.1. 方法

// UV
public BoundingBoxUV GetBoundingBox();  // 面UV包围盒
// 点坐标、法向、切向
public Transform ComputeDerivatives(UV point);  // 一阶导。可得点坐标、法向、切向
public XYZ ComputeNormal(UV point);	// 计算法向,上面方法的简化版
public XYZ Evaluate(UV params);  // 计算点坐标public FaceSecondDerivatives ComputeSecondDerivatives(UV point);  // 二阶导// 获取边、面
public IList<CurveLoop> GetEdgesAsCurveLoops(); 
public Surface GetSurface();// 点、面、线关系
public IntersectionResult Project(XYZ point); // 点在面上的投影public FaceIntersectionFaceResult Intersect(Face face);  // 面-面相交
public SetComparisonResult Intersect(Curve curve);  // 面-线相交public bool IsInside(UV point);  // 指定UV是否在面上// 三角细分
public Mesh Triangulate(double levelOfDetail)

UV咋解释呢,模型贴图知道吧,把图片映射到模型上。怎么让图片贴准呢,建模软件里有个叫“展UV”的功能。

讲不来讲不来,看【Wiki】。

下图是方正的、填满了UV的,还有那种没填满的,有的区域是无映射的。

下面模型/贴图来自【sketchfab.com】

2.2. 属性

属性如下:

  • OrientationMatchesSurfaceOrientation:表示面朝向与其Surface的是否为同向,用到Surface时需要依此判断。
  • (Has/Get)Region:这个“Region”没有接触过,具体是个什么东西还不知道。查了好一会儿,才在【这篇】中找到一点信息,但测试发现,这只是在平面图中创建填充(FilledRegion)的方法,与面没有关系😑。

三、Surface

Revit中,有这些面:

FaceSurface
平面PlanarFacePlane
圆柱面CylindricalFaceCylindricalSurface
圆锥面ConicalFaceConicalSurface
旋转面RevolvedFaceRevolvedSurface
直纹(曲)面RuledFaceRuledSurface
埃尔米特曲面HermiteFaceHermiteSurface
Nurbs简化为其它类型的面NurbsSurface(Data)

前面6种面都是从某个类派生的,最后的 NurbsSurface 则是例外,它只有NurbsSurfaceData这个数据类,且只在BRepBuilderSurfaceGeometry中使用,最后创建出的面,也会被简化,由其它类型表示。

Face没有构造函数,Surface的属性也会出现在其对应的Face中,就直接看Surface。

在Revit几何对象中,都有使用Frame,用以确定局部坐标系,在18. Revit API: 元素位置与变换这篇写过。

3.1. 平面(Plane)

平面有属性:面原点、面法向、X轴向、Y轴向。

构造方法:

  1. 由Frame创建
  2. 由面法向,和面上原点创建
  3. 由原点,和X、Y轴创建,法向为 Vector3.Corss(dir_x,dir_y)
  4. 由面上三点创建,面方向按点顺序和右手螺旋确定,原点为第一个点。

warning:三点创建时,X轴的方向是怎么确定的?

尝试了几种方式,算到的和读取的都不一样,不清楚Revit三点创建平面时,XY轴的确定方式。

3.2. 圆柱面(CylindricalSurface)

定义: S(u, v) = center + radius*cos(u)*xVec + radius*sin(u)*yVec + v*zVec

圆柱面比较简单,属性:圆半径、坐标系原点、中心轴、X轴向、Y轴向

后四个组合就算一个Frame。

构造方法:

  • 由 Frame + 半径 创建。

3.3. 圆锥面(ConicalSurface)

定义:S(u, v) = center + v*[sin(halfAngle)(cos(u)*xVec + sin(u)*yVec) + cos(halfAngle)*zVec]

圆锥面属性:半角(弧度制)、顶点、中心轴、X轴、Y轴

构造方法:

  • 由 Frame + 半角 创建

3.4. 旋转面(RevolvedSurface)

吐槽:就一个旋转方程,现在的我已经看不懂了,现在我只是个API调用仔。

旋转面的属性:原点、轴、X、Y,方法中获取旋转轮廓。

构造方法

  • 从Frame(或类似表示方位的东西)创建
  • 可以设置旋转的起始和终点角度

Info:①构造方法返回的是Surface类型,可能简化为其它类型的面;②可以设置起始角度,即不转满1圈。但属性中没有没有角度信息。

  1. 返回类型很好理解,比如:当轮廓为直线且与旋转轴平行时,就算创建一个圆柱面。
  2. 起始角度计算:
// 1. 从Surface本身无法获得,如下:Curve curve = Line.CreateBound(new XYZ(10, 0, 0), new XYZ(9, 0, 10));
Surface revolvedSurface = RevolvedSurface.Create(new Frame(), curve, 0, Math.PI / 2); // 1/4 PIArc arc = Arc.Create(XYZ.Zero, 10, 0, Math.PI * 2, XYZ.BasisX, XYZ.BasisY); // 2 PI
IList<XYZ> points = arc.Tessellate();string msg = string.Empty;
for (int i = 0; i < points.Count; i++)
{revolvedSurface.Project(points[i], out UV uv, out double dis);  // 期望有1/4的点投影距离为0,msg += $"{i}\t {dis.Round(5)}\t {uv.Round(4)}\r\n";
}
TaskDialog.Show("project", msg);// 实际所有的 dis 全部 0,表示投影计算时,是投影到“完整转一圈”的面上
// 2. 如果是从Face上获取的旋转面,可以计算出该面的旋转角度Reference faceRef = this.Selection.PickObject(ObjectType.Face);
GeometryObject geoObj = this.Document.GetElement(faceRef).GetGeometryObjectFromReference(faceRef);
RevolvedFace revolvedFace = geoObj as RevolvedFace;XYZ startDir = revolvedFace.get_Radius(0);  // 这个获取起点轴方向 (Xvec)
// XYZ endDir = revolvedFace.get_Radius(1);  // YvecUV startUV = new UV(startDir.X, startDir.Y);
//UV endUV = new UV(endDir.X, endDir.Y);double startAngle = UV.BasisU.AngleTo(startUV).RadToDeg();
//double endAngle = UV.BasisU.AngleTo(endUV).RadToDeg();BoundingBoxUV uvBounding = revolvedFace.GetBoundingBox();double rangeAngle = (uvBounding.Max.U - uvBounding.Min.U).RadToDeg();
double endAngle = startAngle + rangeAngle;TaskDialog.Show("Revolved", $"RevolvedFace info:\r\n" +$"min:{uvBounding.Min}\r\n" +$"max:{uvBounding.Max}\r\n" +$"Xvec:{revolvedFace.get_Radius(0)}\r\n" +$"Yvec:{revolvedFace.get_Radius(1)}\r\n" +$"startAngle:{startAngle}\r\n" +$"range:{rangeAngle}\r\n" +$"endAngle:{endAngle}");

RevolvedFace上的Radius属性,表示的不是直径信息,而是(当前的)X轴向量和Y轴向量。

3.5. 直纹面(RuledSurface)

直纹(曲)面【Wiki】,没啥特殊的属性,创建结果可能简化为其它类型的面。

它有2类形式:① 两条Curve,② 点+Curve。

2个轨道,一根棍子搭在轨道上向前滚(按长度比例),滚过的区域就是直纹面。

结合Revit里的定义:S(u,v) = C1(u) + v⋅(C2(u)−C1(u))

3.6. NurbsSurface(Data)

Tips:NurbSpline叫非均匀有理样条线,参照这个问题链接。

Revit中并不支持NurbsSurface(会被简化),而是提供了一个对应的数据类NurbsSurfaceData

NurbsSurfaceData

① 该类只在BRepBuilderSurfaceGeometry中使用;

② 在ExportUtils工具类中提供了一个由面获取近似NurbsSurface数据的方法,只支持HermiteFaceRuledFace

我对这东西一知半解,就不多写了。

使用示例,请查看SDK下的示例“SDKSample/BRepBuilderExample/CreateNURBS.cs”,或者看【GitHub】,生成的模型长下面的样子。


四、总结

这篇,补充了几何对象中 Face、Surface 相关的内容,由于Face没有构造方法,主要写的是Surface。

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

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

相关文章

css如何设置间距

在CSS中设置间距是非常常见的需求&#xff0c;可以通过多种属性来实现。以下是一些常用的CSS属性及其用法&#xff0c;用于设置元素之间的间距&#xff1a; 内边距&#xff08;Padding&#xff09; padding 属性用于设置元素内容与元素边框之间的距离。可以分别设置四个方向的…

视频质量评价SimpleVQA

目录 一、研究意义 例子 二、介绍 三、文章解读 3.1 论文动机 3.2论文思路 3.3方法 3.3.1网络框架 3.3.2公式解读 3.3.3核心创新 3.3.4理解 &#xff01;&#xff01;&#xff01;作者对模型的改进 本人算法框体 3.3.5实验细节&#xff1a; 四、代码复现 4.1代码文件简介 4.2数…

leetcode第二十六题:删去有序数组的重复项

给你一个 非严格递增排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素的数量为 k &#xff0c;你…

C++之STL—vector容器基础篇

头文件 #include <vector> //vector容器 #include <algorithm> //算法 基本用法&&概念 vector<int> v; v.push_back(10); vector<int >::iterator v.begin(); v.end(); 三种遍历方式 #include <vector> #include <algorithm>…

Leetcode3289. 数字小镇中的捣蛋鬼

Every day a Leetcode 题目来源&#xff1a;3289. 数字小镇中的捣蛋鬼 解法1&#xff1a;哈希 代码&#xff1a; /** lc appleetcode.cn id3289 langcpp** [3289] 数字小镇中的捣蛋鬼*/// lc codestart class Solution { public:vector<int> getSneakyNumbers(vector…

在线文档搜索服务测试报告

目录 1. 项目背景: 2. 项目功能: 3. 测试计划: 1. 项目背景: 1.1 在线搜索服务的前端主要一下几个功能, 分别是进入搜索引擎界面(有提示输入关键词信息); 进行输入关键词的界面, 以及显示有关关键词的文档url, 点击跳转至目标文档的界面; 1.2 该在线搜索服务的文档可以实现用…

精彩回顾|博睿数据Bonree ONE 3.0产品发布会圆满落幕:三城联动 共襄盛举!

在金秋九月的璀璨时刻&#xff0c;博睿数据于9月20日在北京圆满举办了Bonree ONE 3.0产品发布会的收官之站。此前&#xff0c;这一盛会已在上海、广州相继绽放光彩&#xff0c;三城联动&#xff0c;共襄盛举&#xff0c;不仅展现了博睿数据在可观测性领域的深厚积淀与前瞻视野&…

一行命令,一分钟轻松搞定SSL证书自动续期

httpsok 是一个便捷的 HTTPS 证书自动续签工具&#xff0c;专为 Nginx 服务器设计。已服务众多中小企业&#xff0c;稳定、安全、可靠。现在的网站SSL免费证书有效期只有3个月&#xff0c;所以就会有经常更快SSL证书的需求&#xff0c;如果手上需要更换的SSL证书比较多的情况下…

leetcode第80题:删除有序数组的重复项(||)

给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 说明&…

【第十一章:Sentosa_DSML社区版-机器学习之分类】

目录 11.1 逻辑回归分类 11.2 决策树分类 11.3 梯度提升决策树分类 11.4 XGBoost分类 11.5 随机森林分类 11.6 朴素贝叶斯分类 11.7 支持向量机分类 11.8 多层感知机分类 11.9 LightGBM分类 11.10 因子分解机分类 11.11 AdaBoost分类 11.12 KNN分类 【第十一章&…

【毕业论文+源码】基于ASP的课程指导平台的开发

引 言 随着全球信息化技术的兴起&#xff0c;特别是Internet的日益普及&#xff0c;解决了信息Internet上传递的问题&#xff0c;建立了一个组织得很好的信息结构框架&#xff0c;使得Internet用户能够在Internet上的任何一个终端&#xff0c;以一种简单、统一的方式来访问超…

软考中级系统集成项目管理证书好考吗

系统集成项目管理工程师证书是中国计算机技术职业资格&#xff08;水平&#xff09;考试&#xff08;简称软考&#xff09;中的中级资格之一。该证书是由人社部和工信部共同颁发&#xff0c;且证书上有这两个国家部门的印章&#xff0c;具有较高的职业认可度和市场价值。 系统…

调用JS惰性函数问题

第一次调用这个函数时 console.log(a) 会被执行&#xff0c;打印出 a&#xff0c;全局变量 a 被重定义并被赋予了新的函数&#xff0c;当再一次调用时&#xff0c;console.log(b) 被执行。 用处&#xff1a;因为各浏览器之间的行为差异&#xff0c;经常会在函数中包含了大量的…

从决策树到GBDT、随机森林

何为决策树 决策树&#xff08;Decision Tree&#xff09;&#xff0c;它是一种以树形数据结构来展示决策规则和分类结果的模型&#xff0c;作为一种归纳学习算法&#xff0c;其重点是将看似无序、杂乱的已知数据&#xff0c;通过某种技术手段将它们转化成可以预测未知数据的树…

以题为例浅谈反序列化漏洞

什么是反序列化漏洞 反序列化漏洞是基于序列化和反序列化的操作&#xff0c;在反序列化——unserialize()时存在用户可控参数&#xff0c;而反序列化会自动调用一些魔术方法&#xff0c;如果魔术方法内存在一些敏感操作例如eval()函数&#xff0c;而且参数是通过反序列化产生的…

三菱FX5U CPU模块的初始化“(格式化PLC)”

1、连接FX5U PLC 1、使用以太网电缆连接计算机与CPU模块。 2、从工程工具的菜单选择[在线]中[当前连接目标]。 3、在“简易连接目标设置 Connection”画面中&#xff0c;在与CPU模块的直接连接方法中选择[以太网]。点击[通信测试]按钮&#xff0c;确认能否与CPU模块连接。 FX5…

黑马头条day3-2 自媒体文章管理

前边还有一个 素材列表查询 没什么难度 就略过了 查询所有频道和查询自媒体文章也是和素材列表查询类似 就是普通的查询 所以略过了 文章发布 这个其实挺复杂的 一共三张表 一个文章表 一个素材表 一个文章和素材的关联表 区分修改与新增就是看是否存在id 如果是保存草稿…

数据结构和算法之树形结构(3)

文章出处&#xff1a;数据结构和算法之树形结构(3) 关注码农爱刷题&#xff0c;看更多技术文章&#xff01;&#xff01; 四、平衡二叉树(接前篇) 上一章节讲到为了避免二叉查找树退化成链表后的极度不平衡带来的低效率而衍生出了平衡二叉树&#xff0c;平衡二叉树的严格定义…

力扣上刷题之C语言实现-Days1

一. 简介 本文记录一下力扣的逻辑题。主要是数组方面的&#xff0c;使用 C语言实现。 二. 涉及数组的 C语言逻辑题 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target的那 两个 整数&#xff0c;并返回它们的…

vmware 虚拟机多屏幕或添加屏幕

vmware 虚拟机多屏幕或添加屏幕 前置条件 vmware 安装 vmware tools 虚拟机系统支持多屏幕 物理上有至少两个屏幕&#xff0c;就是物理机上接至少一个屏幕 方法 虚拟机上点设置&#xff0c;需要在虚拟机关机时进行 ctrl alt enter 让当前虚拟机全屏 鼠标移动到屏幕虚拟机…