IfcOpenShell正确设置几何体的坐标

news2024/9/23 1:28:18

在之前的文章中,我们使用 IfcOpenShell (IOS) 读取 ifc 几何并将其转换为 brep。 当我们读取 wikilab.ifc文件时,一切似乎都是正确的,但真的如此吗?

当你在项目中使用 BIM 时,坐标始终是正确讨论的主题。 就此而言,我建议你阅读 Dion Moult 的文章 IFC Coordinate Reference Systems and Revit 以及文章中引用的参考资料。

本教程使用的 IfcOpenShell 版本:0.6.0a1,教程中的完整代码可以从这里下载。

1、IFC 中的Placement

几何体通常有自己的局部坐标系 (LCS)。 为什么 ?

以航站楼为例。 你经常在一个项目中使用几种类型的风道末端。 在每个空间中多次复制相同的航站楼几何形状。 如果你的几何图形是使用世界坐标系 (WCS) 定义的,则需要为每个几何体定义一个新几何图形。 如果你的几何图形在其自己的 LCS 中定义,则可以在任何地方使用相同的几何图形,并给出其相对于另一个参考的位置。

在 ifc 规范中,通风终端是 IfcAirTerminal (IFC4) 或 IfcFlowTerminal (IFC2x3)。 两者都继承自IfcProduct(如墙、窗、管道等),它具有 IfcObjectPlacement 类型的 ObjectPlacement 属性。

ObjectPlacement属性描述产品在空间中的放置,放置可以是绝对的(相对于世界坐标系)、相对的(相对于另一个产品的对象放置)或约束(例如相对于网格轴)。 它由 IfcObjectPlacement 的各种子类型决定,其中包括用于确定对象坐标系变换的轴放置信息。 — IFC 文档中的ObjectPlacement属性定义
IfcLocalPlacement 子类型,我认为是最常见的,有 2 个属性:

  • #1 - IfcObjectPlacement 类型的 PlacementRelTo。 如果填充位置是相对的。 如果空放置使用 WCS。
  • #2 - RelativePlacement 基本上是一个 2D 或 3D 坐标。
    可以链接相对位置,例如: AirTerminal << space << buildingstorey << building << Site。 要检索相对于 WCS 的对象放置,需要通过完整链转换第一个相对放置。

2、IfcOpenShell 中的Placement

IfcOpenShell 可用作解析器以获取与 IfcSchema 中定义的完全相同的位置。 然而,它也有方便的工具来避免抓取整个相对放置链。 要了解这一点的选项是 USE_WORLD_COORDS :

/// Specifies whether to apply the local placements of building elements
/// directly to the coordinates of the representation mesh rather than
/// to represent the local placement in the 4x3 matrix, which will in that
/// case be the identity matrix.
USE_WORLD_COORDS = 1 << 1,

当你像我们在之前的文章中所做的那样显示几何体时,坐标是使用几何体的局部坐标系 给出的。 它不可见,因为我们的墙放置在坐标 0,0,0 处。 现在让我们使用来自 ifcopenshell academy 的脚本来生成一个放置在 20,10,3 的新墙。 默认情况下,脚本还会在 0,0,0 处生成一堵墙。 要修改它的相对位置,我们需要修改以下行:

wall_placement = create_ifclocalplacement(ifcfile, relative_to=storey_placement)

考虑到函数定义,我们需要将这一行替换为:

wall_placement = create_ifclocalplacement(ifcfile, point=(20., 10., 3.), relative_to=storey_placement)

现在,如果你尝试根据我们之前的脚本从这个新创建的 hello_wall.ifc 加载几何图形,将看到墙仍然位于 0,0,0,这是错误的。

在这里插入图片描述

为了正确放置它,我们有 2 个选项:使用矩阵变换和 USE_WORLD_COORDINATES 设置。

3、使用Placement矩阵

正如你在创建几何体时在其源代码中所述,它的位置由一个 4×3 矩阵给出。 但要注意,当显示为元组时,IfcOpenShell 矩阵和 FreeCAD 矩阵是转置的:

  • IfcOpenShell 矩阵值是 4 个连续向量的 xyz 的元组。格式 : (v1.x, v1.y, v1.z, v2.x, v2.y …, v4.z)
  • FreeCAD 矩阵构造函数最多占用 16 个浮点数。 按 x、y、z 值分组的 4 个向量。格式 : (v1.x, v2.x, v3.x, v4.x, v1.y, …, v4.z, 0, 0, 0, 1)

关于 FreeCAD 矩阵的最后 0、0、0、1。 正如 OpenGL 教程的矩阵章节中所述:

这很快就会变得更加清楚,但现在,请记住这一点:
如果 W == 1,则向量 (X,Y,Z,1) 是空间中的一个位置。
如果 W == 0,则向量 (X,Y,Z,0) 是一个方向。
(事实上 ,永远记住这一点。) - OpenGL Tutorial Matrices Chapter

所以我们将使用一个函数将 IfcOpenShell 矩阵转置为 FreeCAD 矩阵:

def ios_to_fc_matrix(ios_matrix):
    m_l = list()
    for i in range(3):
        line = list(ios_matrix[i::3])
        line[-1] *= SCALE
        m_l.extend(line)
    return FreeCAD.Matrix(*m_l)

在几何形状创建之后,我们调用它来设置对象的位置:

    # Create FreeCAD shape from Open Cascade BREP
    fc_shape = Part.Shape()
    fc_shape.importBrepFromString(occ_shape)
    
    # Ifc lenght internal unit : meter. FreeCAD internal unit : mm.
    fc_shape.scale(SCALE)
    # Shape scale must be applied before shape placement else placement scale would be doubled
    fc_shape.Placement = ios_shape_to_fc_placement(ios_shape)

这样我们就得到了正确放置的墙:
在这里插入图片描述

4、USE_WORLD_COORDINATES

定义设置仍然是相同的过程:

settings.set(settings.USE_WORLD_COORDS, True)

我们可以保留相同的代码库,因为它将应用不会改变任何内容的单位矩阵。 通过运行脚本,你将再次获得正确放置的墙,但这次位置仍然是 0, 0, 0,这意味着几何顶点坐标是用它们的绝对坐标定义的:

在这里插入图片描述

出于在第一部分中解释的原因,我倾向于说此解决方案不是 HVAC 领域中 CAD/BIM 工作的最佳选择。 目前 FreeCAD 以这种方式导入和导出 ifc 我将调查原因并可能在论坛上发布此主题。


原文链接:IfcOpenShell坐标问题 — BimAnt

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

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

相关文章

Android开发如何使用Docker为Jenkins持续集成助力

Android开发如何使用Docker为持续集成助力 为什么使用Docker 我为啥要使用到Docker呢&#xff1f;其实也是被动的&#xff0c;因为公司的项目托管在Coding上面&#xff0c;然后Jenkins集成也用的是Coding的&#xff0c;Coding默认提供了Android-29&#xff0c;JDK-8的构建环境…

【JAVA进阶】多态,内部类

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;JAVASE基础 目录 一、多态 1.多态的概述 2.多态的优势 3.类型转换问题 二、内部类 1.内部类概述[了解] 2.静态内部类[了解] 3.成员内部类[了解] 4.匿名内部类概述[重点] 一、多态 1.多态…

树状数组经典例题

目录 1.数星星 2.小朋友排队 3.求逆序对 1.数星星 题目描述 天空中有一些星星,这些星星都是在不同的位置,每个星星都有一个坐标。 如果一个星星的左下方(包含正左和正下)有k颗星星,就说这颗星星是k级的。 例如,上图中星星5是3级的(1,2,4在它的左下),星星2,4是1级的。…

idea中推送本地仓库和远程仓库后代码回退

本地仓库代码提交后回退 提交到本地仓库后 点击提交后会保存在本地仓库 本地仓库的回撤 找到git的提交记录 右键选择撤销还原 撤销还原后会出现提交文件&#xff0c;成功将本地仓库的文件移除&#xff0c;但是本地的错误代码仍然存在 如果想撤销提交到本地仓库的错误文…

SOLID 设计原则 - 这篇最容易消化

面向对象设计原则 SOLID 应该是职业程序员必须掌握的基本原则&#xff0c;每个程序员都应该了然于胸&#xff0c;遵守这 5 个原则可以帮助我们写出易维护、易拓展的高内聚低耦合的代码。 它是由罗伯特C马丁(知名的 Rob 大叔)21世纪初期 (准确来说&#xff0c;2000年在他的论文…

DevOps实战系列【第十章】:详解Jenkins Pipeline基本概念和语法

个人亲自录制全套DevOps系列实战教程 &#xff1a;手把手教你玩转DevOps全栈技术 流水线基本概念 官方中文手册&#xff1a; https://www.jenkins.io/zh/doc/book/pipeline 我们最好在结合英文文档去看&#xff0c;因为翻译过来的中文比较乱。 Jenkins pipeline是一套插件&…

MySQL 日志,难怪被模仿

一.前言 日志是mysql数据库的重要组成部分&#xff0c;记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。 通过分析日志&#xff0c;我们可以优化数据库性能&#xff0c;排除故障&#xff0c;甚至能够还原数…

中文文献检索网站

1. 中国知网 网址&#xff1a; https://www.cnki.net/ 中国知网被称众多科研人称国内文献论文最全最权威的中文文献库&#xff0c;知网提供中国学术文献、外文文献、学位论文、报纸、会议、年鉴、工具书等各类资源统一检索、统一导航、在线阅读和下载服务。 2. 掌桥科研 网址…

25.Django大型电商项目之地址管理——如何使用三级联动菜单数据加载地址、保存数据、动态获取数据、设置默认值

1. 地址管理基本页面 1.1 概述 1.2 流程 修改templates的跳转链接center.html <ul><li><a href"/userapp/address/">地址管理</a></li> </ul>templates {% extends base.html %} {% block title %}用户中心{% endblock %} {…

东北大学数据结构第八周(排序)

7-1 快速排序 作者 朱允刚 单位 吉林大学 给定包含n个元素的整型数组a[1],a[2],…,a[n]&#xff0c;利用快速排序算法对其进行递增排序&#xff0c;请输出排序过程&#xff0c;即每次Partition之后的数组。每次选择所处理的子数组的第一个元素作为基准元素。 输入格式: 输入为…

MapReduce 序列化案例

文章目录MapReduce 序列化案例一、案例需求二、案例分析map 阶段Reduce 阶段三、代码实现1、编写流量统计的Bean对象2、Mapper阶段代码MapReduce 序列化案例 一、案例需求 1、需求&#xff1a; 统计每一个手机号耗费的总上行流量&#xff0c;下行流量&#xff0c;总流量 2、输…

二、ZFNet可视化卷积神经网络——可解释性机器学习(DataWhale组队学习)

目录引言ZFNet的网络结构可视化反卷积反池化反激活反卷积训练细节特征可视化特征演化特征不变性局部遮挡测试敏感性分析相关性分析消融实验宽度影响深度影响迁移学习能力有效性分析总结引言 纽约大学ZFNet&#xff0c;2013年ImageNet图像分类竞赛冠军模型。对AlexNet进行改进的…

AOP 操作

AOP 操作AOP 操作&#xff08;准备&#xff09;1. Spring 框架一般是基于 AspectJ 实现 AOP 操作&#xff08;1&#xff09;什么是 AspectJ2. 基于 AspectJ 实现 AOP 操作3. 在项目工程里面引入 AOP 先关的依赖4. 切入点表达式举例1&#xff1a;对 com.fairykunkun.dao.UserDao…

谈谈自己对依赖注入的理解

1. 絮絮叨叨 1.1 想学习Google Guice 在工作的过程中&#xff0c;发现有名的大数据组件Presto大量使用Google Guice实现各种Module的构建 很多bind(interface).to(implementClass).in(scope)语句&#xff0c;实现接口与实现类的绑定&#xff0c;并指定实现类是单例还是多例 /…

Service的绑定过程

前言 Service的绑定过程将分为两个部分来进行讲解&#xff1b;分别是Contextlmpl到AMS的调用过程和Service的绑定过程。 frameworks/base/core/java/android/content/ContextWrapper.javapublic boolean bindService(Intent service, ServiceConnection conn,int flags) {ret…

计算机毕设Python+Vue-新型冠状病毒防控咨询网站(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

根据端口划分虚拟局域、集线器、中继器、交换机、路由器、网桥----计算机网络

集线器&#xff1a; 连接计算机和交换机&#xff0c;类似于多台中继器。 实现多台电脑的同时使用一个进线接口来上网或组成局域网 中继器&#xff1a; 连接两条电缆&#xff0c;作用是放大前一条电缆里面的信号并传入下一条电缆。 是对接收到的信息进行再生放大&#xff0c;以…

Jenkins + Jmeter + Ant 持续集成

搭建提前安装好&#xff1a;ant Jenkins 环境 一、Jenkins 安装 Ant 插件&#xff1a; 进入Jenkins 配置插件页面&#xff0c;安装ant 插件&#xff1a; 打开插件配置页面&#xff0c;如下图&#xff1a; 点击“Available” 在输入框搜索 ant 安装即可&#xff1a; 二、安装…

计算机毕业设计springboot+vue基本微信小程序的透析耗材管理系统

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理程序应运而生,各行各业相继进入信息管理时代,透析耗材管理小程序就是信息时代变革中的产物之一。 任何程序都要遵循…

vue前端案例教学:动态获取最新疫情数据展示(代码详解)

【辰兮要努力】&#xff1a;hello你好我是辰兮&#xff0c;很高兴你能来阅读&#xff0c;昵称是希望自己能不断精进&#xff0c;向着优秀程序员前行&#xff01; 博客来源于项目以及编程中遇到的问题总结&#xff0c;偶尔会有读书分享&#xff0c;我会陆续更新Java前端、后台、…