IfcOpenShell简明教程【BIM】

news2024/11/28 6:34:43

IFC 是用于存储 BIM 数据的 ISO 标准格式。 IfcOpenShell 是一个包含 Python 库的项目,可以用来解析 IFC 文件。
在这里插入图片描述

1、下载安装IfcOpenShell

首先,我们需要下载并安装 IfcOpenShell python。 目前没有 IfcOpenShell 的 API 文档,但考虑到它主要源自 IFC 规范,因此这个问题不难解决。

在解析 IFC 文件时,如果你想使用 Linux、Windows 和 Mac 上可用的开源查看器查看 IFC 文件,可以参考文章《如何在 Linux 上查看 BIM IFC 文件》。 这些查看器是开源的并且相对严格,这与像 Revit 这样的商业查看器相反,后者在正确解析 IFC 方面做得非常糟糕,或者像 Solibri 这样的查看器对他们的解析非常宽松并且促进了结构不良的 IFC。

下面的示例使用 2X3版本,因为现在假设大多数 IFC 文件都是 2X3,但这些原则仍然适用于 IFC4。 在撰写本文时,IfcOpenShell 根据编译时标志确定 IFC2X3 或 IFC4 解析,该标志默认设置为 IFC2X3。 如果你希望使用 IFC4,则需要使用 USE_IFC4=Y 编译 IfcOpenShell。

2、加载IFC文件

让我们从加载 IFC 文件开始:

import ifcopenshell
ifc_file = ifcopenshell.open('/path/to/your/file.ifc')

获取所有类型的 IFC 类,并列出它们是什么:

products = ifc_file.by_type('IfcProduct')
for product in products:
    print(product.is_a())

打印 IFC 字符串:

print(product) # Prints #38=IfcWall('3OFfnkBQ0HwPPAt4e_Z09T',#5,'Wall','',$,#35,#37,$)

is_a() 函数也可以用作布尔值:

ifc_file.by_type('IfcWall')[0].is_a('IfcWall') # True
ifc_file.by_type('IfcWall')[0].is_a('IfcSlab') # False

这种 pythonic 小写下划线命名约定以 by_type() 和 is_a() 结尾。 所有其余参数都是从使用 CapsCase 的 IFC 模式生成的。 其余的命名也不遵循通用的编程约定(例如,像 is 这样的谓词前缀应该只返回布尔值)。可能会发现令人困惑的命名参数,这些参数暗示布尔值或其他,但可能会返回一个集合或其他一些值。

3、读取IFC属性数据

通过简单的点符号可以获取任何 IFC 数据的属性。 参数名称与 IFC 模式中显示的完全匹配,包括 CapsCase 约定。

wall = ifc_file.by_type('IfcWall')[0]
print(wall.GlobalId)
print(wall.Name)

该参数还返回集合和关系,例如在下面的示例中,我们要列出与墙关联的属性集。 根据 IfcWall 规范:

与 IfcWall 相关的属性集由 IfcPropertySet 定义并由 IfcRelDefinesByProperties 关系附加。 它可以通过反向 IsDefinedBy 关系访问。
因此我们可以使用 IsDefinedBy 关系,它返回一个 IfcRelDefines FOR RelatedObjects 集合。 IfcRelDefines 是一个抽象超类型,因此在这种特定情况下(属性集关系),我们期望具有 RelatingPropertyDefinition 的 IfcRelDefinesByProperties 来存储属性集本身。 此属性集是一个 IfcPropertySetDefinition。 同样,它是一个抽象超类型,但至少它在这个级别指定了一个 Name 参数。 这是属性集的名称。

wall = ifc_file.by_type('IfcWall')[0]
for definition in wall.IsDefinedBy:
    # To support IFC2X3, we need to filter our results.
    if definition.is_a('IfcRelDefinesByProperties'):
        property_set = definition.RelatingPropertyDefinition
        print(property_set.Name) # Might return Pset_WallCommon

在这种情况下,抽象超类型 IfcPropertySetDefinition 仅由 IfcPropertySet 进行子类型化,IfcPropertySet 具有一个容易混淆 HasProperties 参数,该参数包含一组 IfcProperty。 IfcProperty 的类型各不相同,我们可以使用 is_a() 检查。

for property in property_set.HasProperties:
    if property.is_a('IfcPropertySingleValue'):
        print(property.Name)
        print(property.NominalValue.wrappedValue)

其他的数据,比如数量使用,也是使用了 isDefinedBy关系,但是我们可以使用 is_a()来区分。

wall = ifc_file.by_type('IfcWall')[0]
for definition in wall.IsDefinedBy:
    related_data = definition.RelatingPropertyDefinition
    if related_data.is_a('IfcPropertySet'):
        pass
    elif related_data.is_a('IfcElementQuantity'):
        print_element_quantities(related_data)

IFC 数量的类型很多,所以我们必须小心处理它们。 但是这个例子只处理 IfcQuantityLength:

def print_element_quantities(element_quantity):
    for quantity in element_quantity.Quantities:
        print(quantity.Name)
        if quantity.is_a('IfcQuantityLength'):
            print(quantity.lengthValue)

你还可以获取几何数据,从任何 IFC 元素的放置开始。 IFC 对象放置很复杂,因此你应该注意查看坐标是如何从 IFC 中的各种空间容器派生的。

if wall.ObjectPlacement.PlacementRelTo:
    # Inherit the coordinates of its parents
    pass
local_coordinates = wall.ObjectPlacement.RelativePlacement.Location[0]

4、读取IFC几何数据

最后,你也可以获得 IFC 元素的实际几何表示。 就像展示位置一样,IFC 表示也很复杂。 有多种类型,一个 IFC 元素在不同的上下文中可能有多种表示形式。 这超出了快速演示的范围。 在这个例子中,我们不会详细介绍,只是简单地处理一个典型的从轴上挤出的对象,这是一种非常常见的对象类型,如下所示。

在这里插入图片描述

我们还将看到如何访问在挤出中使用的基础配置文件,如下所示:
在这里插入图片描述

在这种情况下,我们处理 OuterCurve,这是一条封闭的填充曲线。此代码将访问相关的几何数据:

geometry = wall.Representation.Representations[0].Items[0] # An IfcExtrudedAreaSolid in this example
print(geometry.Position.Location[0]) # The centroid of the wall, so if the wall axis goes from (0, 0, 0) to (4, 0, 0) it will be (2, 0, 0)
print(geometry.ExtrudeDirection) # A vector pointing up (0, 0, 1)
print(geometry.Depth) # The height of the wall, say 3000
print(geometry.SweptArea) # A closed and filled area curve that can be extruded into a manifold, solid object
print(geometry.SweptArea.OuterCurve.Points) # the list of points that are in the polyline

这些点(即 geometry.SweptArea.OuterCurve.Points)给出了相对于 geometry.Position.Location[0] 的坐标。
在这里插入图片描述

上图中,点是相对于配置文件位置给出的。

几何非常微妙,我不鼓励尝试大胆和手工编辑它,除非你想要头痛。 有很多工具可以帮助你做到这一点,或者可视化几何体。

有关更多示例,可以在此处查看用于构建简单查看器的 IfcOpenShell 示例。

原文链接:IfcOpenShell简明教程 — BimAnt

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

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

相关文章

Vector源码解析

Vector源码解析 简介 Vector 是一个古老的 线程安全(内部的核心方法都加了synchronized) 的容器,在 JDK1.0 时就已经存在,到如今已经很少使用。 基本结构与 ArrayList 类似,可以认为是线程安全版本的 ArrayList,但因为 Vector …

BCN-PEG-FITC 环丙烷环辛炔聚乙二醇荧光素 BCN-PEG-荧光素

双环[6,1,0]壬炔 (BCN) (环丙烷环辛炔)可以通过无铜的点击化学与叠氮化物标记的分子或生物分子反应生成稳定的三氮唑连接。 产品名称 BCN-PEG-FITC 环丙烷环辛炔聚乙二醇荧光素 中文名称 环丙烷环辛炔聚乙二醇荧光素 英文名称 BCN-PEG-FITC 分子…

基于Android的二维码识别系统的研究 与实现

XXXX 本科生毕业设计(论文) 学院(系): XX 专 业: XX 学 生: XX 指导教师: XX XX 完成日期 年 月 XXX本科生毕业设计(论文) 基于Android的二维码识别系统的研究 与实现 Research and Implementati…

防重放、防篡改攻击的实现(Java版)

文章目录一、问题描述1、什么是重放攻击、篡改攻击?2、如何模拟重放攻击、篡改攻击?2.1、重放攻击模拟方式2.2、篡改攻击模拟方式二、解决方案三、在项目中使用1、项目简介2、项目实践一、问题描述 1、什么是重放攻击、篡改攻击? 1、重放攻击…

【SSM框架】为集合类型属性赋值

🍓个人主页:个人主页 🍒系列专栏:SSM框架 目录 1.为集合类型属性赋值 ①为List集合类型属性赋值 ②为Map集合类型属性赋值 2.p命名空间 3.引入外部属性文件 1.为集合类型属性赋值 ①为List集合类型属性赋值 在Clazz类中添加…

中国三大主流开源Linux操作系统社区及其产品生态

作者:IT圈黎俊杰 操作系统是基础软件的核心,是科技研发必备的底层支撑产品,它的核心技术至今仍然由美国为代表的西方国家所掌控着。由于以前国产操作系统产业长期处于“多、小、散”的状态,未能建立起完善的生态、未能研发出真正好…

python笔记(一)

文章目录字节对象与字符转换动态爬虫实施辅助工具python 部分内置方法示例:python虚拟环境的创建与激活执行多个.py程序获取当前系统默认浏览器名称反编译小程序PC端小程序(wxapkg)解密:反编译字节对象与字符转换 data1 babc # …

计算机系统实验-BombLab

一.实验题目及目的 1.实验题目 程序运行在linux环境中。程序运行中有6个关卡(6个phase),每个phase需要用户在终端上输入特定的字符或者数字才能通关,否则将会引爆炸弹。需要通过分析汇编代码,使用gdb调试等方式找到正…

oracle入门-19c 安装详细教程

我们知道学习一门技术,第一件事情就是搭建对应的环境。本教程将详细教大家如何安装oracle。 目录一、虚拟机创建二、挂载镜像、安装及系统配置三、 软件包传输四、数据库安装五、 图形化向导建库一、虚拟机创建 处理器数量根据自己的机器配置进行调整(4 …

Android IPC机制

本文首发于个人博客 “胖蔡叨叨叨”,更多相关信息可点击查看《Android IPC机制》​​​​​​​ IPC IPC(Inter Process Communication) 进程间通信,是指系统中运行的不同进程间的信息交互过程。Android IPC通常用于应用间、或同应用不同进程间的数据通…

3分钟读懂数据可视化如何帮助企业智慧管理,提升管理水平

随着大数据时代的到来,企业管理的决策越来越倚重数据指标,通过数据指标了解公司运作的情况,产品生产销售情况,收入与支出情况等等,更大的作用是对商业趋势预测提供了决策依据,使公司提前布局未来&#xff0…

Q-Automation:基于ATX的自动化测试管理软件

Softing Q-Automation是基于ATX的自动化测试管理软件,用于测试电子控制单元(ECU)。该软件支持诊断协议层测试和诊断功能测试,并且只需填写Excel表格,即可实现半自动化测试需求,从而缩短了用户的测试周期。同…

2022年终Java编程技术总结

目录 00 总体脑图 第一章、基础篇 01 计算机基础 ## 1.1 操作系统 1.1.1 基本知识 略 1.1.2 常见Linux命令 目录文件内容搜索系统类网络权限cdcp/scpvi/vimfind: find . -name xxkillnetstat -anchmodlsmvcatgrep: ps -efgrep xxlsof: lsof-i:portmkdirrmtailwhereistopp…

web前端期末大作业 ——电影主题介绍 你好,李焕英 ——html+css+javascript网页设计实例

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

Win11电脑蓝屏怎么办?Win11电脑蓝屏的修复方法

Win11电脑蓝屏怎么办?电脑蓝屏是最为常见的系统故障问题之一,当电脑出现蓝屏时一般分为可以开机以及无法开机的情况,针对这两种情况,下面小编分别准备了对应的解决方法,有需要的朋友们欢迎收藏慢慢看哦。 方法一&#…

家居类小红书达人投放总结,kol执行策略

在小红书平台上,许多品牌方都做了达人投放,但结果却反响平平,最后才发现是达人挑选出了问题,而发现这个问题的代价就是错失先机,也耗费大量成本来试错,今天为大家分享一下小红书达人投放总结以及超硬干货。…

多线程安全问题原理和4种解决办法

摘要:多线程访问了共享的数据,会产生线程安全问题。本文分享自华为云社区《多线程安全问题原理和解决办法Synchronized和ReentrantLock使用与区别》,作者:共饮一杯无。 线程安全问题概述 卖票问题分析 单窗口卖票一个窗口(单线程)卖100张票…

大数据学习 -- 利用Java API 将文件写入HDFS

利用API写入文件写入HDFS文件(1)将数据直接写入HDFS文件(2)将本地文件写入HDFS文件写入HDFS文件 类似于HDFS Shell里的hdfs dfs -put命令在net.zwh.hdfs包里创建WriteFileOnHDFS类 (1)将数据直接写入HDFS…

【记录】ChatGPT|注册流程、使用技巧与应用推荐(更新至2022年12月14日)

昨天,2022年12月13日,在下午和晚上,ChatGPT 就开始因为请求过多而写到一半就崩溃,出现network error,可见它的关注度确实是越来越可观了。 正好最近世界杯,有博客活动,干脆也总结一下 ChatGPT 目…

大白话讲懂word2vec原理和如何使用

前言 做自然语言处理(Natural Language Processing,NLP)这个领域的小伙伴们肯定对word2vec这个模型很熟悉了,它就是一种最为常见的文本表示的算法,是将文本数据转换成计算机能够运算的数字或者向量。在自然语言处理领…